Restore horizontal scroll position after scale change (#494)

* Restore horizontal scroll position after scale change

* Consider `View` horizontal size when restoring horizontal scroll

This is needed because `View:get_h_scrollable_size` includes the 
horizontal size, while `View.scroll.x` doesn't.
This commit is contained in:
Guldoman 2023-04-29 18:50:39 +02:00 committed by George Sokianos
parent 0766d804ba
commit f06580deee
1 changed files with 13 additions and 4 deletions

View File

@ -25,11 +25,16 @@ local function set_scale(scale)
scale = common.clamp(scale, 0.2, 6) scale = common.clamp(scale, 0.2, 6)
-- save scroll positions -- save scroll positions
local scrolls = {} local v_scrolls = {}
local h_scrolls = {}
for _, view in ipairs(core.root_view.root_node:get_children()) do for _, view in ipairs(core.root_view.root_node:get_children()) do
local n = view:get_scrollable_size() local n = view:get_scrollable_size()
if n ~= math.huge and not view:is(CommandView) and n > view.size.y then if n ~= math.huge and n > view.size.y then
scrolls[view] = view.scroll.y / (n - view.size.y) v_scrolls[view] = view.scroll.y / (n - view.size.y)
end
local hn = view:get_h_scrollable_size()
if hn ~= math.huge and hn > view.size.x then
h_scrolls[view] = view.scroll.x / (hn - view.size.x)
end end
end end
@ -59,10 +64,14 @@ local function set_scale(scale)
end end
-- restore scroll positions -- restore scroll positions
for view, n in pairs(scrolls) do for view, n in pairs(v_scrolls) do
view.scroll.y = n * (view:get_scrollable_size() - view.size.y) view.scroll.y = n * (view:get_scrollable_size() - view.size.y)
view.scroll.to.y = view.scroll.y view.scroll.to.y = view.scroll.y
end end
for view, hn in pairs(h_scrolls) do
view.scroll.x = hn * (view:get_h_scrollable_size() - view.size.x)
view.scroll.to.x = view.scroll.x
end
core.redraw = true core.redraw = true
end end