ReaderGesture: cleanup (#6292)

convert all gesture actions to use events for better modularity
add network event handlers and device event handlers
This commit is contained in:
yparitcher
2020-07-12 14:47:49 -04:00
committed by GitHub
parent f4dad2fae8
commit 70f89c4df1
26 changed files with 585 additions and 595 deletions

View File

@@ -819,7 +819,7 @@ function ReaderDictionary:showDict(word, results, box, link)
refresh_callback = function()
if self.view then
-- update info in footer (time, battery, etc)
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
end
end,
html_dictionary_link_tapped_callback = function(dictionary, html_link)

View File

@@ -320,31 +320,32 @@ function ReaderFont:addToMainMenu(menu_items)
}
end
-- direction +1 - increase font size
-- direction -1 - decrease font size
function ReaderFont:onAdjustFontSize(ges, direction)
function ReaderFont:gesToFontSize(ges)
if ges.distance == nil then
ges.distance = 1
end
if direction ~= -1 and direction ~= 1 then
-- set default value (increase font size)
direction = 1
end
local step = math.ceil(2 * #self.steps * ges.distance / self.gestureScale)
local delta_int = self.steps[step] or self.steps[#self.steps]
if direction == 1 then
local info = Notification:new{text = _("Increasing font size…")}
UIManager:show(info)
UIManager:forceRePaint()
self:onChangeSize("increase", delta_int)
UIManager:close(info)
else
local info = Notification:new{text = _("Decreasing font size…")}
UIManager:show(info)
UIManager:forceRePaint()
self:onChangeSize("decrease", delta_int)
UIManager:close(info)
end
return delta_int
end
function ReaderFont:onIncreaseFontSize(ges)
local delta_int = self:gesToFontSize(ges)
local info = Notification:new{text = _("Increasing font size…")}
UIManager:show(info)
UIManager:forceRePaint()
self:onChangeSize("increase", delta_int)
UIManager:close(info)
return true
end
function ReaderFont:onDecreaseFontSize(ges)
local delta_int = self:gesToFontSize(ges)
local info = Notification:new{text = _("Decreasing font size…")}
UIManager:show(info)
UIManager:forceRePaint()
self:onChangeSize("decrease", delta_int)
UIManager:close(info)
return true
end

View File

@@ -557,7 +557,7 @@ end
function ReaderFooter:setupAutoRefreshTime()
if not self.autoRefreshTime then
self.autoRefreshTime = function()
self:updateFooter(true)
self:onUpdateFooter(true)
UIManager:scheduleIn(61 - tonumber(os.date("%S")), self.autoRefreshTime)
end
end
@@ -839,7 +839,7 @@ function ReaderFooter:addToMainMenu(menu_items)
self.settings.order = self.mode_index
G_reader_settings:saveSetting("footer", self.settings)
self:updateFooterTextGenerator()
self:updateFooter()
self:onUpdateFooter()
UIManager:setDirty(nil, "ui")
end
}
@@ -1686,7 +1686,7 @@ function ReaderFooter:getDataFromStatistics(title, pages)
return title .. sec
end
function ReaderFooter:updateFooter(force_repaint, force_recompute)
function ReaderFooter:onUpdateFooter(force_repaint, force_recompute)
if self.pageno then
self:updateFooterPage(force_repaint, force_recompute)
else
@@ -1811,7 +1811,7 @@ function ReaderFooter:onReaderReady()
self:resetLayout(self.settings.progress_margin_width) -- set widget dimen
self:setTocMarkers()
self.updateFooterText = self._updateFooterText
self:updateFooter()
self:onUpdateFooter()
end
function ReaderFooter:onReadSettings(config)
@@ -1894,7 +1894,7 @@ function ReaderFooter:onTapFooter(ges)
local percentage = (pos.x - dimen.x)/dimen.w
self.ui:handleEvent(Event:new("GotoPercentage", percentage))
end
self:updateFooter(true)
self:onUpdateFooter(true)
return true
end
if self.has_no_mode or (self.settings.lock_tap and not ignore_lock) then
@@ -1921,7 +1921,7 @@ function ReaderFooter:onTapFooter(ges)
end
self:applyFooterMode()
G_reader_settings:saveSetting("reader_footer_mode", self.mode)
self:updateFooter(true)
self:onUpdateFooter(true)
return true
end
@@ -1949,14 +1949,14 @@ function ReaderFooter:refreshFooter(refresh, signal)
self:resetLayout(true)
-- If we signal, the event we send will trigger a full repaint anyway, so we should be able to skip this one.
-- We *do* need to ensure we at least re-compute the footer layout, though, especially when going from visible to invisible...
self:updateFooter(refresh and not signal, refresh and signal)
self:onUpdateFooter(refresh and not signal, refresh and signal)
if signal then
self.ui:handleEvent(Event:new("SetPageBottomMargin", self.view.document.configurable.b_page_margin))
end
end
function ReaderFooter:onResume()
self:updateFooter()
self:onUpdateFooter()
if self.settings.auto_refresh_time then
self:setupAutoRefreshTime()
end
@@ -1971,7 +1971,7 @@ end
function ReaderFooter:onFrontlightStateChanged()
if self.settings.frontlight then
self:updateFooter(true)
self:onUpdateFooter(true)
end
end

View File

@@ -1,192 +0,0 @@
local InputContainer = require("ui/widget/container/inputcontainer")
local Notification = require("ui/widget/notification")
local UIManager = require("ui/uimanager")
local Screen = require("device").screen
local Device = require("device")
local T = require("ffi/util").template
local _ = require("gettext")
local ReaderFrontLight = InputContainer:new{
steps_fl = { 0.1, 0.1, 0.2, 0.4, 0.7, 1.1, 1.6, 2.2, 2.9, 3.7, 4.6, 5.6, 6.7, 7.9, 9.2, 10.6, },
gestureScale = Screen:getWidth() * FRONTLIGHT_SENSITIVITY_DECREASE,
}
-- direction +1 - increase frontlight
-- direction -1 - decrease frontlight
function ReaderFrontLight:onChangeFlIntensity(ges, direction)
local powerd = Device:getPowerDevice()
local gestureScale
local scale_multiplier
if ges.ges == "two_finger_swipe" then
-- for backward compatibility
scale_multiplier = FRONTLIGHT_SENSITIVITY_DECREASE * 0.8
elseif ges.ges == "swipe" then
scale_multiplier = 0.8
else
scale_multiplier = 1
end
if ges.direction == "south" or ges.direction == "north" then
gestureScale = Screen:getHeight() * scale_multiplier
elseif ges.direction == "west" or ges.direction == "east" then
gestureScale = Screen:getWidth() * scale_multiplier
else
local width = Screen:getWidth()
local height = Screen:getHeight()
-- diagonal
gestureScale = math.sqrt(width * width + height * height) * scale_multiplier
end
if powerd.fl_intensity == nil then return false end
local steps_tbl = {}
local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6
for i = 1, #self.steps_fl, 1
do
steps_tbl[i] = math.ceil(self.steps_fl[i] * scale)
end
if ges.distance == nil then
ges.distance = 1
end
local step = math.ceil(#steps_tbl * ges.distance / gestureScale)
local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl]
if direction ~= -1 and direction ~= 1 then
-- set default value (increase frontlight)
direction = 1
end
local new_intensity = powerd.fl_intensity + direction * delta_int
if new_intensity == nil then return true end
-- when new_intensity <=0, toggle light off
if new_intensity <= 0 then
powerd:turnOffFrontlight()
else
powerd:setIntensity(new_intensity)
end
self:onShowIntensity()
if self.view and self.view.footer_visible and self.view.footer.settings.frontlight then
self.view.footer:updateFooter()
end
return true
end
-- direction +1 - increase frontlight warmth
-- direction -1 - decrease frontlight warmth
function ReaderFrontLight:onChangeFlWarmth(ges, direction)
local powerd = Device:getPowerDevice()
if powerd.fl_warmth == nil then return false end
if powerd.auto_warmth then
UIManager:show(Notification:new{
text = _("Warmth is handled automatically."),
timeout = 1.0,
})
return true
end
local gestureScale
local scale_multiplier
if ges.ges == "two_finger_swipe" then
-- for backward compatibility
scale_multiplier = FRONTLIGHT_SENSITIVITY_DECREASE * 0.8
elseif ges.ges == "swipe" then
scale_multiplier = 0.8
else
scale_multiplier = 1
end
if ges.direction == "south" or ges.direction == "north" then
gestureScale = Screen:getHeight() * scale_multiplier
elseif ges.direction == "west" or ges.direction == "east" then
gestureScale = Screen:getWidth() * scale_multiplier
else
local width = Screen:getWidth()
local height = Screen:getHeight()
-- diagonal
gestureScale = math.sqrt(width * width + height * height) * scale_multiplier
end
local steps_tbl = {}
local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6
for i = 1, #self.steps_fl, 1
do
steps_tbl[i] = math.ceil(self.steps_fl[i] * scale)
end
if ges.distance == nil then
ges.distance = 1
end
local step = math.ceil(#steps_tbl * ges.distance / gestureScale)
local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl]
local warmth
if direction ~= -1 and direction ~= 1 then
-- set default value (increase frontlight)
direction = 1
end
warmth = powerd.fl_warmth + direction * delta_int
if warmth > 100 then
warmth = 100
elseif warmth < 0 then
warmth = 0
end
powerd:setWarmth(warmth)
self:onShowWarmth()
return true
end
function ReaderFrontLight:onShowOnOff()
local powerd = Device:getPowerDevice()
local new_text
if powerd.is_fl_on then
new_text = _("Frontlight enabled.")
else
new_text = _("Frontlight disabled.")
end
UIManager:show(Notification:new{
text = new_text,
timeout = 1.0,
})
return true
end
function ReaderFrontLight:onShowIntensity()
if not Device:hasFrontlight() then return true end
local powerd = Device:getPowerDevice()
local new_text
if powerd:isFrontlightOff() then
new_text = _("Frontlight disabled.")
else
new_text = T(_("Frontlight intensity set to %1."), powerd:frontlightIntensity())
end
UIManager:show(Notification:new{
text = new_text,
timeout = 1,
})
return true
end
function ReaderFrontLight:onShowWarmth(value)
local powerd = Device:getPowerDevice()
if powerd.fl_warmth ~= nil then
UIManager:show(Notification:new{
text = T(_("Warmth set to %1."), powerd.fl_warmth),
timeout = 1.0,
})
end
return true
end
function ReaderFrontLight:onShowFlDialog()
local FrontLightWidget = require("ui/widget/frontlightwidget")
UIManager:show(FrontLightWidget:new{
use_system_fl = Device:hasLightLevelFallback()
})
end
function ReaderFrontLight:close()
self.fl_dialog:onClose()
UIManager:close(self.fl_dialog)
end
return ReaderFrontLight

View File

@@ -1,5 +1,4 @@
local BD = require("ui/bidi")
local bit = require("bit")
local ConfirmBox = require("ui/widget/confirmbox")
local DataStorage = require("datastorage")
local Device = require("device")
@@ -10,7 +9,6 @@ local InfoMessage = require("ui/widget/infomessage")
local InputContainer = require("ui/widget/container/inputcontainer")
local InputDialog = require("ui/widget/inputdialog")
local LuaData = require("luadata")
local Notification = require("ui/widget/notification")
local Screen = require("device").screen
local UIManager = require("ui/uimanager")
local T = require("ffi/util").template
@@ -774,7 +772,7 @@ function ReaderGesture:buildMenu(ges, default)
{"toc", not self.is_docless},
{"bookmarks", not self.is_docless},
{"reading_progress", ReaderGesture.getReaderProgress ~= nil},
{"reading_progress", not self.is_docless},
{"book_statistics", not self.is_docless},
{"book_status", not self.is_docless},
@@ -812,7 +810,7 @@ function ReaderGesture:buildMenu(ges, default)
{"toggle_hold_corners", true},
{"toggle_gsensor", Device:canToggleGSensor()},
{"toggle_rotation", not self.is_docless, true},
{"toggle_rotation", true, true},
{"wifi_on", Device:hasWifiToggle()},
{"wifi_off", Device:hasWifiToggle()},
@@ -1344,33 +1342,22 @@ function ReaderGesture:registerGesture(ges, action, ges_type, zone, overrides, d
})
end
local function lightFrontlight()
return Device:hasLightLevelFallback() and G_reader_settings:nilOrTrue("light_fallback")
end
function ReaderGesture:gestureAction(action, ges)
if action == "ignore"
or (ges.ges == "hold" and self.ignore_hold_corners) then
return
elseif action == "reading_progress" and ReaderGesture.getReaderProgress then
UIManager:show(ReaderGesture.getReaderProgress())
elseif action == "book_statistics" and ReaderGesture.getBookStats then
UIManager:show(ReaderGesture.getBookStats())
elseif action == "stats_calendar_view" and ReaderGesture.getCalendarView then
UIManager:show(ReaderGesture.getCalendarView())
elseif action == "reading_progress" then
self.ui:handleEvent(Event:new("ShowReaderProgress"))
elseif action == "book_statistics" then
self.ui:handleEvent(Event:new("ShowBookStats"))
elseif action == "stats_calendar_view" then
self.ui:handleEvent(Event:new("ShowCalendarView"))
elseif action == "toc" then
self.ui:handleEvent(Event:new("ShowToc"))
elseif action == "night_mode" then
local night_mode = G_reader_settings:isTrue("night_mode")
Screen:toggleNightMode()
UIManager:setDirty("all", "full")
G_reader_settings:saveSetting("night_mode", not night_mode)
self.ui:handleEvent(Event:new("ToggleNightMode"))
elseif action == "full_refresh" then
if self.view then
-- update footer (time & battery)
self.view.footer:updateFooter()
end
UIManager:setDirty("all", "full")
self.ui:handleEvent(Event:new("FullRefresh"))
elseif action == "bookmarks" then
self.ui:handleEvent(Event:new("ShowBookmark"))
elseif action == "history" then
@@ -1386,21 +1373,19 @@ function ReaderGesture:gestureAction(action, ges)
elseif action == "book_status" then
self.ui:handleEvent(Event:new("ShowBookStatus"))
elseif action == "page_jmp_fwd_10" then
self:pageUpdate(10)
self.ui:handleEvent(Event:new("GotoRelativePage", 10))
elseif action == "page_jmp_fwd_1" then
self.ui:handleEvent(Event:new("GotoViewRel", 1))
elseif action == "page_jmp_back_10" then
self:pageUpdate(-10)
self.ui:handleEvent(Event:new("GotoRelativePage", -10))
elseif action == "page_jmp_back_1" then
self.ui:handleEvent(Event:new("GotoViewRel", -1))
elseif action == "next_chapter" then
self.ui:handleEvent(Event:new("GotoNextChapter"))
elseif action == "first_page" then
self.ui:handleEvent(Event:new("GotoPage", 1))
self.ui:handleEvent(Event:new("GoToBeginning"))
elseif action == "last_page" then
if self.view.document then
self.ui:handleEvent(Event:new("GotoPage", self.view.document:getPageCount()))
end
self.ui:handleEvent(Event:new("GoToEnd"))
elseif action == "prev_chapter" then
self.ui:handleEvent(Event:new("GotoPrevChapter"))
elseif action == "next_bookmark" then
@@ -1418,35 +1403,23 @@ function ReaderGesture:gestureAction(action, ges)
elseif action == "latest_bookmark" then
self.ui:handleEvent(Event:new("GoToLatestBookmark"))
elseif action == "follow_nearest_link" then
self.ui:handleEvent(Event:new("GoToPageLink", ges, false, G_reader_settings:isTrue("footnote_link_in_popup")))
self.ui:handleEvent(Event:new("GoToPageLink", ges))
elseif action == "follow_nearest_internal_link" then
self.ui:handleEvent(Event:new("GoToPageLink", ges, true, G_reader_settings:isTrue("footnote_link_in_popup")))
self.ui:handleEvent(Event:new("GoToInternalPageLink", ges))
elseif action == "clear_location_history" then
self.ui:handleEvent(Event:new("ClearLocationStack", true)) -- show_notification
elseif action == "filemanager" then
self.ui:onClose()
self.ui:showFileManager()
self.ui:handleEvent(Event:new("Home"))
elseif action == "file_search" then
if self.ges_mode == "gesture_fm" then
self.ui:handleEvent(Event:new("ShowFileSearch", self.ui.file_chooser.path))
else
local last_dir = self.ui:getLastDirFile()
self.ui:handleEvent(Event:new("ShowFileSearch", last_dir))
end
self.ui:handleEvent(Event:new("ShowFileSearch"))
elseif action == "folder_up" then
self.ui.file_chooser:changeToPath(string.format("%s/..", self.ui.file_chooser.path))
self.ui:handleEvent(Event:new("FolderUp"))
elseif action == "show_plus_menu" then
self.ui:handleEvent(Event:new("ShowPlusMenu"))
elseif action == "folder_shortcuts" then
self.ui:handleEvent(Event:new("ShowFolderShortcutsDialog"))
elseif action == "open_previous_document" then
-- FileManager
if self.ui.menu.openLastDoc and G_reader_settings:readSetting("lastfile") ~= nil then
self.ui.menu:openLastDoc()
-- ReaderUI
elseif self.ui.switchDocument and self.ui.menu then
self.ui:switchDocument(self.ui.menu:getPreviousFile())
end
self.ui:handleEvent(Event:new("OpenLastDoc"))
elseif action == "dictionary_lookup" then
self.ui:handleEvent(Event:new("ShowDictionaryLookup"))
elseif action == "wikipedia_lookup" then
@@ -1454,187 +1427,55 @@ function ReaderGesture:gestureAction(action, ges)
elseif action == "fulltext_search" then
self.ui:handleEvent(Event:new("ShowFulltextSearchInput"))
elseif action == "show_menu" then
if self.ges_mode == "gesture_fm" then
self.ui:handleEvent(Event:new("ShowMenu"))
else
self.ui:handleEvent(Event:new("ShowReaderMenu"))
end
self.ui:handleEvent(Event:new("ShowMenu"))
elseif action == "show_config_menu" then
self.ui:handleEvent(Event:new("ShowConfigMenu"))
elseif action == "show_frontlight_dialog" then
if self.ges_mode == "gesture_fm" then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
ReaderFrontLight:onShowFlDialog()
else
self.ui:handleEvent(Event:new("ShowFlDialog"))
end
self.ui:handleEvent(Event:new("ShowFlDialog"))
elseif action == "increase_frontlight" then
-- when using frontlight system settings
if lightFrontlight() then
UIManager:show(Notification:new{
text = _("Frontlight controlled by system settings."),
timeout = 2.5,
})
return true
end
if self.ges_mode == "gesture_fm" then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
ReaderFrontLight:onChangeFlIntensity(ges, 1)
else
self.ui:handleEvent(Event:new("ChangeFlIntensity", ges, 1))
end
self.ui:handleEvent(Event:new("IncreaseFlIntensity", ges))
elseif action == "decrease_frontlight" then
-- when using frontlight system settings
if lightFrontlight() then
UIManager:show(Notification:new{
text = _("Frontlight controlled by system settings."),
timeout = 2.5,
})
return true
end
if self.ges_mode == "gesture_fm" then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
ReaderFrontLight:onChangeFlIntensity(ges, -1)
else
self.ui:handleEvent(Event:new("ChangeFlIntensity", ges, -1))
end
self.ui:handleEvent(Event:new("DecreaseFlIntensity", ges))
elseif action == "increase_frontlight_warmth" then
if self.ges_mode == "gesture_fm" then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
ReaderFrontLight:onChangeFlWarmth(ges, 1)
else
self.ui:handleEvent(Event:new("ChangeFlWarmth", ges, 1))
end
self.ui:handleEvent(Event:new("IncreaseFlWarmth", ges))
elseif action == "decrease_frontlight_warmth" then
if self.ges_mode == "gesture_fm" then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
ReaderFrontLight:onChangeFlWarmth(ges, -1)
else
self.ui:handleEvent(Event:new("ChangeFlWarmth", ges, -1))
end
self.ui:handleEvent(Event:new("DecreaseFlWarmth", ges))
elseif action == "toggle_bookmark" then
self.ui:handleEvent(Event:new("ToggleBookmark"))
elseif action == "toggle_inverse_reading_order" then
self:onToggleReadingOrder()
self.ui:handleEvent(Event:new("ToggleReadingOrder"))
elseif action == "toggle_frontlight" then
-- when using frontlight system settings
if lightFrontlight() then
UIManager:show(Notification:new{
text = _("Frontlight controlled by system settings."),
timeout = 2.5,
})
return true
end
Device:getPowerDevice():toggleFrontlight()
self:onShowFLOnOff()
self.ui:handleEvent(Event:new("ToggleFrontlight"))
elseif action == "toggle_hold_corners" then
self:onIgnoreHoldCorners()
elseif action == "toggle_gsensor" then
G_reader_settings:flipNilOrFalse("input_ignore_gsensor")
Device:toggleGSensor(not G_reader_settings:isTrue("input_ignore_gsensor"))
self:onGSensorToggle()
self.ui:handleEvent(Event:new("ToggleGSensor"))
elseif action == "toggle_page_flipping" then
if not self.ui.document.info.has_pages then
-- ReaderRolling has no support (yet) for onTogglePageFlipping,
-- so don't make that top left tap area unusable (and allow
-- taping on links there)
return false
end
self.ui:handleEvent(Event:new("TogglePageFlipping"))
elseif action == "toggle_reflow" then
if not self.document.info.has_pages then return end
if self.document.configurable.text_wrap == 1 then
self.document.configurable.text_wrap = 0
else
self.document.configurable.text_wrap = 1
end
self.ui:handleEvent(Event:new("RedrawCurrentPage"))
self.ui:handleEvent(Event:new("RestoreZoomMode"))
self.ui:handleEvent(Event:new("InitScrollPageStates"))
self.ui:handleEvent(Event:new("ToggleReflow"))
elseif action == "toggle_rotation" then
local arg = bit.band((Screen:getRotationMode() + 1), 3)
self.ui:handleEvent(Event:new("SetRotationMode", arg))
self.ui:handleEvent(Event:new("ToggleRotation"))
elseif action == "toggle_wifi" then
local NetworkMgr = require("ui/network/manager")
if not NetworkMgr:isOnline() then
UIManager:show(InfoMessage:new{
text = _("Turning on Wi-Fi…"),
timeout = 1,
})
-- NB Normal widgets should use NetworkMgr:promptWifiOn()
-- This is specifically the toggle wifi action, so consent is implied.
NetworkMgr:turnOnWifi()
else
NetworkMgr:turnOffWifi()
UIManager:show(InfoMessage:new{
text = _("Wi-Fi off."),
timeout = 1,
})
end
self.ui:handleEvent(Event:new("ToggleWifi"))
elseif action == "wifi_off" then
local NetworkMgr = require("ui/network/manager")
-- can't hurt
NetworkMgr:turnOffWifi()
UIManager:show(InfoMessage:new{
text = _("Wi-Fi off."),
timeout = 1,
})
self.ui:handleEvent(Event:new("InfoWifiOff"))
elseif action == "wifi_on" then
local NetworkMgr = require("ui/network/manager")
if not NetworkMgr:isOnline() then
UIManager:show(InfoMessage:new{
text = _("Enabling wifi…"),
timeout = 1,
})
-- NB Normal widgets should use NetworkMgr:promptWifiOn()
-- This is specifically the toggle Wi-Fi action, so consent is implied.
NetworkMgr:turnOnWifi()
else
local info_text
local current_network = NetworkMgr:getCurrentNetwork()
-- this method is only available for some implementations
if current_network and current_network.ssid then
info_text = T(_("Already connected to network %1."), BD.wrap(current_network.ssid))
else
info_text = _("Already connected.")
end
UIManager:show(InfoMessage:new{
text = info_text,
timeout = 1,
})
end
self.ui:handleEvent(Event:new("InfoWifiOn"))
elseif action == "increase_font" then
self.ui:handleEvent(Event:new("AdjustFontSize", ges, 1))
self.ui:handleEvent(Event:new("IncreaseFontSize", ges))
elseif action == "decrease_font" then
self.ui:handleEvent(Event:new("AdjustFontSize", ges, -1))
self.ui:handleEvent(Event:new("DecreaseFontSize", ges))
elseif action == "suspend" then
UIManager:suspend()
self.ui:handleEvent(Event:new("SuspendEvent"))
elseif action == "exit" then
self.ui.menu:exitOrRestart()
self.ui:handleEvent(Event:new("Exit"))
elseif action == "restart" then
self.ui.menu:exitOrRestart(function() UIManager:restartKOReader() end)
self.ui:handleEvent(Event:new("Restart"))
elseif action == "reboot" then
UIManager:show(ConfirmBox:new{
text = _("Are you sure you want to reboot the device?"),
ok_text = _("Reboot"),
ok_callback = function()
UIManager:nextTick(UIManager.reboot_action)
end,
})
self.ui:handleEvent(Event:new("Reboot"))
elseif action == "poweroff" then
UIManager:show(ConfirmBox:new{
text = _("Are you sure you want to power off the device?"),
ok_text = _("Power off"),
ok_callback = function()
UIManager:nextTick(UIManager.poweroff_action)
end,
})
self.ui:handleEvent(Event:new("PowerOff"))
elseif action == "zoom_contentwidth" then
self.ui:handleEvent(Event:new("SetZoomMode", "contentwidth"))
elseif action == "zoom_contentheight" then
@@ -1679,15 +1520,6 @@ function ReaderGesture:multiswipeAction(multiswipe_directions, ges)
end
end
function ReaderGesture:pageUpdate(page)
local curr_page = self.ui:getCurrentPage()
if curr_page and page then
curr_page = curr_page + page
self.ui:handleEvent(Event:new("GotoPage", curr_page))
end
end
function ReaderGesture:onIgnoreHoldCorners(ignore_hold_corners)
if ignore_hold_corners == nil then
G_reader_settings:flipNilOrFalse("ignore_hold_corners")
@@ -1698,48 +1530,4 @@ function ReaderGesture:onIgnoreHoldCorners(ignore_hold_corners)
return true
end
function ReaderGesture:onShowFLOnOff()
local powerd = Device:getPowerDevice()
local new_text
if powerd.is_fl_on then
new_text = _("Frontlight on.")
else
new_text = _("Frontlight off.")
end
UIManager:show(Notification:new{
text = new_text,
timeout = 1.0,
})
return true
end
function ReaderGesture:onGSensorToggle()
local new_text
if G_reader_settings:isTrue("input_ignore_gsensor") then
new_text = _("Accelerometer rotation events off.")
else
new_text = _("Accelerometer rotation events on.")
end
UIManager:show(Notification:new{
text = new_text,
timeout = 1.0,
})
return true
end
function ReaderGesture:onToggleReadingOrder()
local document_module = self.ui.document.info.has_pages and self.ui.paging or self.ui.rolling
document_module.inverse_reading_order = not document_module.inverse_reading_order
document_module:setupTouchZones()
local is_rtl = BD.mirroredUILayout()
if document_module.inverse_reading_order then
is_rtl = not is_rtl
end
UIManager:show(Notification:new{
text = is_rtl and _("RTL page turning.") or _("LTR page turning."),
timeout = 2.5,
})
return true
end
return ReaderGesture

View File

@@ -426,7 +426,7 @@ function ReaderLink:onTap(_, ges)
-- screen DPI if the user has set another one).
max_distance = Screen:scaleByDPI(30)
end
return self:onGoToPageLink(ges, isTapIgnoreExternalLinksEnabled(), allow_footnote_popup, max_distance)
return self:onGoToPageLink(ges, isTapIgnoreExternalLinksEnabled(), max_distance)
end
end
@@ -724,7 +724,7 @@ function ReaderLink:onSwipe(arg, ges)
elseif direction == "west" then
local ret = false
if isSwipeToFollowNearestLinkEnabled() then
ret = self:onGoToPageLink(ges, isSwipeIgnoreExternalLinksEnabled(), isFootnoteLinkInPopupEnabled())
ret = self:onGoToPageLink(ges, isSwipeIgnoreExternalLinksEnabled())
end
-- If no link found, or no follow link option enabled,
-- jump to latest bookmark (if enabled)
@@ -736,7 +736,7 @@ function ReaderLink:onSwipe(arg, ges)
end
--- Goes to link nearest to the gesture (or first link in page)
function ReaderLink:onGoToPageLink(ges, internal_links_only, allow_footnote_popup, max_distance)
function ReaderLink:onGoToPageLink(ges, internal_links_only, max_distance)
local selected_link = nil
local selected_distance2 = nil
-- We use squares of distances all along the calculations, no need
@@ -928,11 +928,15 @@ function ReaderLink:onGoToPageLink(ges, internal_links_only, allow_footnote_popu
if max_distance and selected_distance2 and selected_distance2 > math.pow(max_distance, 2) then
logger.dbg("nearest link is further than max distance, ignoring it")
else
return self:onGotoLink(selected_link, false, allow_footnote_popup)
return self:onGotoLink(selected_link, false, isFootnoteLinkInPopupEnabled())
end
end
end
function ReaderLink:onGoToInternalPageLink(ges)
self:onGoToPageLink(ges, true)
end
function ReaderLink:onGoToLatestBookmark(ges)
local latest_bookmark = self.ui.bookmark:getLatestBookmark()
if latest_bookmark then

View File

@@ -65,9 +65,9 @@ function ReaderMenu:init()
else
-- map menu key to only top menu because bottom menu is only
-- designed for touch devices
self.key_events.ShowReaderMenu = { { "Menu" }, doc = "show menu", }
self.key_events.ShowMenu = { { "Menu" }, doc = "show menu", }
if Device:hasFewKeys() then
self.key_events.ShowReaderMenu = { { { "Menu", "Right" } }, doc = "show menu", }
self.key_events.ShowMenu = { { { "Menu", "Right" } }, doc = "show menu", }
end
end
end
@@ -231,7 +231,7 @@ function ReaderMenu:setUpdateItemTable()
return self:getPreviousFile() ~= nil
end,
callback = function()
self.ui:switchDocument(self:getPreviousFile())
self.ui:onOpenLastDoc()
end,
hold_callback = function()
local previous_file = self:getPreviousFile()
@@ -293,7 +293,7 @@ function ReaderMenu:exitOrRestart(callback)
end
end
function ReaderMenu:onShowReaderMenu(tab_index)
function ReaderMenu:onShowMenu(tab_index)
if self.tab_item_table == nil then
self:setUpdateItemTable()
end
@@ -386,7 +386,7 @@ function ReaderMenu:onSwipeShowMenu(ges)
if G_reader_settings:nilOrTrue("show_bottom_menu") then
self.ui:handleEvent(Event:new("ShowConfigMenu"))
end
self.ui:handleEvent(Event:new("ShowReaderMenu", self:_getTabIndexFromLocation(ges)))
self.ui:handleEvent(Event:new("ShowMenu", self:_getTabIndexFromLocation(ges)))
return true
end
end
@@ -396,7 +396,7 @@ function ReaderMenu:onTapShowMenu(ges)
if G_reader_settings:nilOrTrue("show_bottom_menu") then
self.ui:handleEvent(Event:new("ShowConfigMenu"))
end
self.ui:handleEvent(Event:new("ShowReaderMenu", self:_getTabIndexFromLocation(ges)))
self.ui:handleEvent(Event:new("ShowMenu", self:_getTabIndexFromLocation(ges)))
return true
end
end

View File

@@ -326,7 +326,7 @@ function ReaderPageMap:addToMainMenu(menu_items)
self.ui.doc_settings:saveSetting("pagemap_use_page_labels", self.use_page_labels)
-- Reset a few stuff that may use page labels
self.ui.toc:resetToc()
self.ui.view.footer:updateFooter()
self.ui.view.footer:onUpdateFooter()
UIManager:setDirty(self.view.dialog, "partial")
end,
hold_callback = function(touchmenu_instance)

View File

@@ -5,7 +5,9 @@ local Geom = require("ui/geometry")
local InputContainer = require("ui/widget/container/inputcontainer")
local Math = require("optmath")
local MultiConfirmBox = require("ui/widget/multiconfirmbox")
local Notification = require("ui/widget/notification")
local UIManager = require("ui/uimanager")
local bit = require("bit")
local logger = require("logger")
local _ = require("gettext")
local Screen = Device.screen
@@ -422,7 +424,7 @@ function ReaderPaging:onSwipe(_, ges)
end
else
-- update footer (time & battery)
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
-- trigger full refresh
UIManager:setDirty(nil, "full")
end
@@ -977,7 +979,7 @@ function ReaderPaging:_gotoPage(number, orig_mode)
if number == self.current_page or not number then
-- update footer even if we stay on the same page (like when
-- viewing the bottom part of a page from a top part view)
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
return true
end
if number > self.number_of_pages then
@@ -1031,4 +1033,26 @@ function ReaderPaging:onGotoPrevChapter()
return true
end
function ReaderPaging:onToggleReflow()
self.view.document.configurable.text_wrap = bit.bxor(self.view.document.configurable.text_wrap, 1)
self.ui:handleEvent(Event:new("RedrawCurrentPage"))
self.ui:handleEvent(Event:new("RestoreZoomMode"))
self.ui:handleEvent(Event:new("InitScrollPageStates"))
end
-- Duplicated in ReaderRolling
function ReaderPaging:onToggleReadingOrder()
self.inverse_reading_order = not self.inverse_reading_order
self:setupTouchZones()
local is_rtl = BD.mirroredUILayout()
if self.inverse_reading_order then
is_rtl = not is_rtl
end
UIManager:show(Notification:new{
text = is_rtl and _("RTL page turning.") or _("LTR page turning."),
timeout = 2.5,
})
return true
end
return ReaderPaging

View File

@@ -5,6 +5,7 @@ local Device = require("device")
local Event = require("ui/event")
local InputContainer = require("ui/widget/container/inputcontainer")
local MultiConfirmBox = require("ui/widget/multiconfirmbox")
local Notification = require("ui/widget/notification")
local ProgressWidget = require("ui/widget/progresswidget")
local ReaderPanning = require("apps/reader/modules/readerpanning")
local Size = require("ui/size")
@@ -484,7 +485,7 @@ function ReaderRolling:onSwipe(_, ges)
end
else
-- update footer (time & battery)
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
-- trigger full refresh
UIManager:setDirty(nil, "full")
end
@@ -786,7 +787,7 @@ function ReaderRolling:updatePos()
self.old_doc_height = new_height
self.old_page = new_page
self.ui:handleEvent(Event:new("UpdateToc"))
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
end
self:updateTopStatusBarMarkers()
UIManager:setDirty(self.view.dialog, "partial")
@@ -1298,4 +1299,19 @@ Note that %1 (out of %2) xpaths from your bookmarks and highlights have been nor
})
end
-- Duplicated in ReaderPaging
function ReaderRolling:onToggleReadingOrder()
self.inverse_reading_order = not self.inverse_reading_order
self:setupTouchZones()
local is_rtl = BD.mirroredUILayout()
if self.inverse_reading_order then
is_rtl = not is_rtl
end
UIManager:show(Notification:new{
text = is_rtl and _("RTL page turning.") or _("LTR page turning."),
timeout = 2.5,
})
return true
end
return ReaderRolling

View File

@@ -659,7 +659,7 @@ function ReaderToc:addToMainMenu(menu_items)
self.ui.doc_settings:saveSetting("alternative_toc", true)
self:onShowToc()
self.view.footer:setTocMarkers(true)
self.view.footer:updateFooter()
self.view.footer:onUpdateFooter()
end,
})
end