From 7c53fcd922add92538507b73bbce55af91dd4fef Mon Sep 17 00:00:00 2001 From: poire-z Date: Sun, 5 May 2019 10:15:13 +0200 Subject: [PATCH] CRe margins: hide bottom menu on change (#5000) So we can immediately see how's the bottom margin. --- .../apps/reader/modules/readertypeset.lua | 33 ++++--- frontend/ui/data/creoptions.lua | 6 +- frontend/ui/widget/configdialog.lua | 97 +++++++++++++------ .../ui/widget/container/inputcontainer.lua | 3 + frontend/ui/widget/toggleswitch.lua | 2 +- 5 files changed, 96 insertions(+), 45 deletions(-) diff --git a/frontend/apps/reader/modules/readertypeset.lua b/frontend/apps/reader/modules/readertypeset.lua index 401acd216..102d20564 100644 --- a/frontend/apps/reader/modules/readertypeset.lua +++ b/frontend/apps/reader/modules/readertypeset.lua @@ -71,7 +71,7 @@ function ReaderTypeset:onReadSettings(config) G_reader_settings:readSetting("copt_b_page_margin") or DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE self.unscaled_margins = { h_margins[1], t_margin, h_margins[2], b_margin } - self:onSetPageMargins(self.unscaled_margins, true) + self:onSetPageMargins(self.unscaled_margins) self.sync_t_b_page_margins = config:readSetting("copt_sync_t_b_page_margins") or G_reader_settings:readSetting("copt_sync_t_b_page_margins") or 0 self.sync_t_b_page_margins = self.sync_t_b_page_margins == 1 and true or false @@ -349,32 +349,32 @@ function ReaderTypeset:makeDefaultStyleSheet(css, text, touchmenu_instance) }) end -function ReaderTypeset:onSetPageHorizMargins(h_margins) +function ReaderTypeset:onSetPageHorizMargins(h_margins, refresh_callback) self.unscaled_margins = { h_margins[1], self.unscaled_margins[2], h_margins[2], self.unscaled_margins[4] } - self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins)) + self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins, refresh_callback)) end -function ReaderTypeset:onSetPageTopMargin(t_margin) +function ReaderTypeset:onSetPageTopMargin(t_margin, refresh_callback) self.unscaled_margins = { self.unscaled_margins[1], t_margin, self.unscaled_margins[3], self.unscaled_margins[4] } if self.sync_t_b_page_margins then self.unscaled_margins[4] = t_margin -- Let ConfigDialog know so it can update it on screen and have it saved on quit self.ui.document.configurable.b_page_margin = t_margin end - self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins)) + self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins, refresh_callback)) end -function ReaderTypeset:onSetPageBottomMargin(b_margin) +function ReaderTypeset:onSetPageBottomMargin(b_margin, refresh_callback) self.unscaled_margins = { self.unscaled_margins[1], self.unscaled_margins[2], self.unscaled_margins[3], b_margin } if self.sync_t_b_page_margins then self.unscaled_margins[2] = b_margin -- Let ConfigDialog know so it can update it on screen and have it saved on quit self.ui.document.configurable.t_page_margin = b_margin end - self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins)) + self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins, refresh_callback)) end -function ReaderTypeset:onSyncPageTopBottomMargins(toggle) +function ReaderTypeset:onSyncPageTopBottomMargins(toggle, refresh_callback) self.sync_t_b_page_margins = not self.sync_t_b_page_margins if self.sync_t_b_page_margins then -- Adjust current top and bottom margins if needed @@ -389,12 +389,16 @@ function ReaderTypeset:onSyncPageTopBottomMargins(toggle) self.ui.document.configurable.t_page_margin = mean_margin self.ui.document.configurable.b_page_margin = mean_margin self.unscaled_margins = { self.unscaled_margins[1], mean_margin, self.unscaled_margins[3], mean_margin } - self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins)) + self.ui:handleEvent(Event:new("SetPageMargins", self.unscaled_margins, refresh_callback)) + refresh_callback = nil end end + if refresh_callback then + refresh_callback() + end end -function ReaderTypeset:onSetPageMargins(margins, silent) +function ReaderTypeset:onSetPageMargins(margins, refresh_callback) local left = Screen:scaleBySize(margins[1]) local top = Screen:scaleBySize(margins[2]) local right = Screen:scaleBySize(margins[3]) @@ -406,16 +410,19 @@ function ReaderTypeset:onSetPageMargins(margins, silent) end self.ui.document:setPageMargins(left, top, right, bottom) self.ui:handleEvent(Event:new("UpdatePos")) - if not silent then + if refresh_callback then -- Show a toast on set, with the unscaled & scaled values UIManager:show(InfoMessage:new{ text = T(_([[ Margins set to: + horizontal: %1 (%2px) top: %3 (%4px) - bottom: %5 (%6px)]]), + bottom: %5 (%6px) + + Tap to dismiss.]]), margins[1], left, margins[2], top, margins[4], bottom), - timeout = 4, + dismiss_callback = refresh_callback, }) end return true diff --git a/frontend/ui/data/creoptions.lua b/frontend/ui/data/creoptions.lua index dd6c16fa4..3ef12cbbc 100644 --- a/frontend/ui/data/creoptions.lua +++ b/frontend/ui/data/creoptions.lua @@ -89,6 +89,7 @@ Note that this may not be ensured under some conditions: in scroll mode, when a DCREREADER_CONFIG_H_MARGIN_SIZES_X_HUGE, DCREREADER_CONFIG_H_MARGIN_SIZES_XX_HUGE, }, + delay_repaint = true, name_text_hold_callback = optionsutil.showValuesHMargins, }, { @@ -97,9 +98,10 @@ Note that this may not be ensured under some conditions: in scroll mode, when a toggle = {S.OFF, S.ON}, values = {0, 1}, default_value = 0, + event = "SyncPageTopBottomMargins", args = {false, true}, default_arg = false, - event = "SyncPageTopBottomMargins", + delay_repaint = true, name_text_hold_callback = optionsutil.showValues, help_text = _([[Keep top and bottom margins synchronized. - 'off' allows different top and bottom margins. @@ -137,6 +139,7 @@ In the top menu → Settings → Status bar, you can choose whether the bottom m DCREREADER_CONFIG_T_MARGIN_SIZES_X_HUGE, DCREREADER_CONFIG_T_MARGIN_SIZES_XX_HUGE, }, + delay_repaint = true, name_text_hold_callback = optionsutil.showValues, }, { @@ -169,6 +172,7 @@ In the top menu → Settings → Status bar, you can choose whether the bottom m DCREREADER_CONFIG_B_MARGIN_SIZES_X_HUGE, DCREREADER_CONFIG_B_MARGIN_SIZES_XX_HUGE, }, + delay_repaint = true, name_text_hold_callback = optionsutil.showValues, help_text = _([[In the top menu → Settings → Status bar, you can choose whether the bottom margin applies from the bottom of the screen, or from above the status bar.]]), }, diff --git a/frontend/ui/widget/configdialog.lua b/frontend/ui/widget/configdialog.lua index c43ae8046..0d407772e 100644 --- a/frontend/ui/widget/configdialog.lua +++ b/frontend/ui/widget/configdialog.lua @@ -514,6 +514,7 @@ function ConfigOption:init() args = self.options[c].args, event = self.options[c].event, events = self.options[c].events, + delay_repaint = self.options[c].delay_repaint, config = self.config, enabled = enabled, row_count = row_count, @@ -541,10 +542,10 @@ function ConfigOption:init() callback = function(arg) if arg == "-" or arg == "+" then self.config:onConfigFineTuneChoose(self.options[c].values, self.options[c].name, - self.options[c].event, self.options[c].args, self.options[c].events, arg) + self.options[c].event, self.options[c].args, self.options[c].events, arg, self.options[c].delay_repaint) else self.config:onConfigChoose(self.options[c].values, self.options[c].name, - self.options[c].event, self.options[c].args, self.options[c].events, arg) + self.options[c].event, self.options[c].args, self.options[c].events, arg, self.options[c].delay_repaint) end UIManager:setDirty(self.config, function() return "fast", switch.dimen @@ -855,8 +856,8 @@ function ConfigDialog:onConfigChoice(option_name, option_value) return true end -function ConfigDialog:onConfigEvent(option_event, option_arg) - self.ui:handleEvent(Event:new(option_event, option_arg)) +function ConfigDialog:onConfigEvent(option_event, option_arg, refresh_callback) + self.ui:handleEvent(Event:new(option_event, option_arg, refresh_callback)) return true end @@ -868,14 +869,41 @@ function ConfigDialog:onConfigEvents(option_events, arg_index) return true end -function ConfigDialog:onConfigChoose(values, name, event, args, events, position) +function ConfigDialog:onConfigChoose(values, name, event, args, events, position, delay_repaint) UIManager:tickAfterNext(function() + -- Repainting may be delayed depending on options + local refresh_dialog_func = function() + self.skip_paint = nil + if self.config_options.needs_redraw_on_change then + -- Some Kopt document event handlers just save their setting, + -- and need a full repaint for kopt to load these settings, + -- notice the change, and redraw the document + UIManager:setDirty("all", "partial") + else + -- CreDocument event handlers do their own refresh: + -- we can just redraw our frame + UIManager:setDirty(self, function() + return "ui", self.dialog_frame.dimen + end) + end + end + local refresh_callback = nil + if type(delay_repaint) == "number" then -- timeout + UIManager:scheduleIn(delay_repaint, refresh_dialog_func) + self.skip_paint = true + elseif delay_repaint then -- anything but nil or false: provide a callback + -- This needs the config option to have an "event" key + -- The event handler is responsible for calling this callback when + -- it considers it appropriate + refresh_callback = refresh_dialog_func + self.skip_paint = true + end if values then self:onConfigChoice(name, values[position]) end if event then args = args or {} - self:onConfigEvent(event, args[position]) + self:onConfigEvent(event, args[position], refresh_callback) end if events then self:onConfigEvents(events, position) @@ -885,24 +913,42 @@ function ConfigDialog:onConfigChoose(values, name, event, args, events, position -- toggles may have their state (enabled/disabled) modified -- after this toggle update. self:update() - if self.config_options.needs_redraw_on_change then - -- Some Kopt document event handlers just save their setting, - -- and need a full repaint for kopt to load these settings, - -- notice the change, and redraw the document - UIManager:setDirty("all", "partial") - else - -- CreDocument event handlers do their own refresh: - -- we can just redraw our frame - UIManager:setDirty(self, function() - return "ui", self.dialog_frame.dimen - end) + if not delay_repaint then -- immediate refresh + refresh_dialog_func() end end) end -- Tweaked variant used with the fine_tune variant of buttonprogress (direction can only be "-" or "+") -function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events, direction) +function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events, direction, delay_repaint) UIManager:tickAfterNext(function() + -- Repainting may be delayed depending on options + local refresh_dialog_func = function() + self.skip_paint = nil + if self.config_options.needs_redraw_on_change then + -- Some Kopt document event handlers just save their setting, + -- and need a full repaint for kopt to load these settings, + -- notice the change, and redraw the document + UIManager:setDirty("all", "partial") + else + -- CreDocument event handlers do their own refresh: + -- we can just redraw our frame + UIManager:setDirty(self, function() + return "ui", self.dialog_frame.dimen + end) + end + end + local refresh_callback = nil + if type(delay_repaint) == "number" then -- timeout + UIManager:scheduleIn(delay_repaint, refresh_dialog_func) + self.skip_paint = true + elseif delay_repaint then -- anything but nil or false: provide a callback + -- This needs the config option to have an "event" key + -- The event handler is responsible for calling this callback when + -- it considers it appropriate + refresh_callback = refresh_dialog_func + self.skip_paint = true + end if values then local value if direction == "-" then @@ -934,7 +980,7 @@ function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events, arg = arg + 1 end end - self:onConfigEvent(event, arg) + self:onConfigEvent(event, arg, refresh_callback) end if events then self:onConfigEvents(events, direction) @@ -944,17 +990,8 @@ function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events, -- toggles may have their state (enabled/disabled) modified -- after this toggle update. self:update() - if self.config_options.needs_redraw_on_change then - -- Some Kopt document event handlers just save their setting, - -- and need a full repaint for kopt to load these settings, - -- notice the change, and redraw the document - UIManager:setDirty("all", "partial") - else - -- CreDocument event handlers do their own refresh: - -- we can just redraw our frame - UIManager:setDirty(self, function() - return "ui", self.dialog_frame.dimen - end) + if not delay_repaint then -- immediate refresh + refresh_dialog_func() end end) end diff --git a/frontend/ui/widget/container/inputcontainer.lua b/frontend/ui/widget/container/inputcontainer.lua index dd5cbb0d4..2ad428c7d 100644 --- a/frontend/ui/widget/container/inputcontainer.lua +++ b/frontend/ui/widget/container/inputcontainer.lua @@ -68,6 +68,9 @@ function InputContainer:paintTo(bb, x, y) if self[1] == nil then return end + if self.skip_paint then + return + end if not self.dimen then local content_size = self[1]:getSize() diff --git a/frontend/ui/widget/toggleswitch.lua b/frontend/ui/widget/toggleswitch.lua index 4eb73ce3b..148dfe94d 100644 --- a/frontend/ui/widget/toggleswitch.lua +++ b/frontend/ui/widget/toggleswitch.lua @@ -202,7 +202,7 @@ function ToggleSwitch:onTapSelect(arg, gev) end --]] self.config:onConfigChoose(self.values, self.name, - self.event, self.args, self.events, self.position) + self.event, self.args, self.events, self.position, self.delay_repaint) UIManager:setDirty(self.config, function() return "ui", self.dimen end)