Dispatcher: use sections (#6364)

use `device` `filemanager` `rolling` and `paging` sections to organize the
dispatcher menu and allow the user to know when the action will apply

add events from ReaderGesture

allow profiles in FM
reviewable/pr6377/r1
yparitcher 4 years ago committed by GitHub
parent 4e5def4282
commit bda44a99ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -321,6 +321,7 @@ function ReaderFont:addToMainMenu(menu_items)
end end
function ReaderFont:gesToFontSize(ges) function ReaderFont:gesToFontSize(ges)
if type(ges) ~= "table" then return ges end
if ges.distance == nil then if ges.distance == nil then
ges.distance = 1 ges.distance = 1
end end

@ -58,6 +58,9 @@ if Device:hasFrontlight() then
-- direction -1 - decrease frontlight -- direction -1 - decrease frontlight
function DeviceListener:onChangeFlIntensity(ges, direction) function DeviceListener:onChangeFlIntensity(ges, direction)
local powerd = Device:getPowerDevice() local powerd = Device:getPowerDevice()
local delta_int
--received gesture
if type(ges) == "table" then
local gestureScale local gestureScale
local scale_multiplier local scale_multiplier
if ges.ges == "two_finger_swipe" then if ges.ges == "two_finger_swipe" then
@ -82,8 +85,7 @@ if Device:hasFrontlight() then
local steps_tbl = {} local steps_tbl = {}
local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6 local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6
for i = 1, #self.steps_fl, 1 for i = 1, #self.steps_fl, 1 do
do
steps_tbl[i] = math.ceil(self.steps_fl[i] * scale) steps_tbl[i] = math.ceil(self.steps_fl[i] * scale)
end end
@ -91,7 +93,11 @@ if Device:hasFrontlight() then
ges.distance = 1 ges.distance = 1
end end
local step = math.ceil(#steps_tbl * ges.distance / gestureScale) local step = math.ceil(#steps_tbl * ges.distance / gestureScale)
local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl] delta_int = steps_tbl[step] or steps_tbl[#steps_tbl]
else
-- received amount to change
delta_int = ges
end
if direction ~= -1 and direction ~= 1 then if direction ~= -1 and direction ~= 1 then
-- set default value (increase frontlight) -- set default value (increase frontlight)
direction = 1 direction = 1
@ -142,6 +148,9 @@ if Device:hasFrontlight() then
return true return true
end end
local delta_int
--received gesture
if type(ges) == "table" then
local gestureScale local gestureScale
local scale_multiplier local scale_multiplier
if ges.ges == "two_finger_swipe" then if ges.ges == "two_finger_swipe" then
@ -166,8 +175,7 @@ if Device:hasFrontlight() then
local steps_tbl = {} local steps_tbl = {}
local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6 local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6
for i = 1, #self.steps_fl, 1 for i = 1, #self.steps_fl, 1 do
do
steps_tbl[i] = math.ceil(self.steps_fl[i] * scale) steps_tbl[i] = math.ceil(self.steps_fl[i] * scale)
end end
@ -176,13 +184,16 @@ if Device:hasFrontlight() then
end end
local step = math.ceil(#steps_tbl * ges.distance / gestureScale) local step = math.ceil(#steps_tbl * ges.distance / gestureScale)
local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl] delta_int = steps_tbl[step] or steps_tbl[#steps_tbl]
local warmth else
-- received amount to change
delta_int = ges
end
if direction ~= -1 and direction ~= 1 then if direction ~= -1 and direction ~= 1 then
-- set default value (increase frontlight) -- set default value (increase frontlight)
direction = 1 direction = 1
end end
warmth = powerd.fl_warmth + direction * delta_int local warmth = powerd.fl_warmth + direction * delta_int
if warmth > 100 then if warmth > 100 then
warmth = 100 warmth = 100
elseif warmth < 0 then elseif warmth < 0 then

@ -1,4 +1,5 @@
local CreOptions = require("ui/data/creoptions") local CreOptions = require("ui/data/creoptions")
local Device = require("device")
local Event = require("ui/event") local Event = require("ui/event")
local Screen = require("device").screen local Screen = require("device").screen
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
@ -12,37 +13,242 @@ local Dispatcher = {
--[[-- --[[--
contains a list of a dispatchable settings contains a list of a dispatchable settings
each setting contains: each setting contains:
category: one of none, toggle, absolutenumber, incrementalnumber, or string. category: one of
none: a direct event call
arg: a event that expects a gesture object or an argument
absolutenumber: event that sets a number
incrementalnumber: event that increments a number & accepts a gesture object
string: event with a list of arguments to chose from
event: what to call. event: what to call.
title: for use in ui. title: for use in ui.
section: under which menu to display (currently: device, filemanager, rolling, paging)
and optionally and optionally
min/max: for number min/max: for number
default default
args: allowed values for string. args: allowed values for string.
toggle: display name for args toggle: display name for args
separator: put a separator after in the menu list
--]]-- --]]--
local settingsList = { local settingsList = {
--CreOptions -- Device settings
rotation_mode = {category="string"}, show_frontlight_dialog = { category="none", event="ShowFlDialog", title=_("Show frontlight dialog"), device=true, condition=Device:hasFrontlight(),},
visible_pages = {category="string"}, toggle_frontlight = { category="none", event="ToggleFrontlight", title=_("Toggle frontlight"), device=true, condition=Device:hasFrontlight(),},
h_page_margins = {category="string"}, increase_frontlight = { category="incrementalnumber", event="IncreaseFlIntensity", min=1, max=Device:getPowerDevice().fl_max, title=_("Increase frontlight brightness"), device=true, condition=Device:hasFrontlight(),},
sync_t_b_page_margins = {category="string"}, decrease_frontlight = { category="incrementalnumber", event="DecreaseFlIntensity", min=1, max=Device:getPowerDevice().fl_max, title=_("Decrease frontlight brightness"), device=true, condition=Device:hasFrontlight(),},
t_page_margin = {category="absolutenumber"}, increase_frontlight_warmth = { category="incrementalnumber", event="IncreaseFlWarmth", min=1, max=Device:getPowerDevice().fl_warmth_max, title=_("Increase frontlight warmth"), device=true, condition=Device:hasNaturalLight(),},
b_page_margin = {category="absolutenumber"}, decrease_frontlight_warmth = { category="incrementalnumber", event="DecreaseFlWarmth", min=1, max=Device:getPowerDevice().fl_warmth_max, title=_("Decrease frontlight warmth"), device=true, condition=Device:hasNaturalLight(),},
view_mode = {category="string", title="View Mode (CRengine)"}, toggle_gsensor = { category="none", event="ToggleGSensor", title=_("Toggle accelerometer"), device=true, condition=Device:canToggleGSensor(),},
block_rendering_mode = {category="string"}, wifi_on = { category="none", event="InfoWifiOn", title=_("Turn on Wi-Fi"), device=true, condition=Device:hasWifiToggle(),},
render_dpi = {category="string"}, wifi_off = { category="none", event="InfoWifiOff", title=_("Turn off Wi-Fi"), device=true, condition=Device:hasWifiToggle(),},
line_spacing = {category="absolutenumber"}, toggle_wifi = { category="none", event="ToggleWifi", title=_("Toggle Wi-Fi"), device=true, condition=Device:hasWifiToggle(),},
font_size = {category="absolutenumber", title="Font Size (CRengine)"}, reading_progress = { category="none", event="ShowReaderProgress", title=_("Reading progress"), device=true,},
font_weight = {category="string"}, stats_calendar_view = { category="none", event="ShowCalendarView", title=_("Statistics calendar view"), device=true,},
--font_gamma = {category="string"}, history = { category="none", event="ShowHist", title=_("History"), device=true,},
font_hinting = {category="string"}, open_previous_document = { category="none", event="OpenLastDoc", title=_("Open previous document"), device=true,},
font_kerning = {category="string"}, filemanager = { category="none", event="Home", title=_("File browser"), device=true,},
status_line = {category="string"}, dictionary_lookup = { category="none", event="ShowDictionaryLookup", title=_("Dictionary lookup"), device=true,},
embedded_css = {category="string"}, wikipedia_lookup = { category="none", event="ShowWikipediaLookup", title=_("Wikipedia lookup"), device=true,},
embedded_fonts = {category="string"}, fulltext_search = { category="none", event="ShowFulltextSearchInput", title=_("Fulltext search"), device=true,},
smooth_scaling = {category="string"}, file_search = { category="none", event="ShowFileSearch", title=_("File search"), device=true,},
nightmode_images = {category="string"}, full_refresh = { category="none", event="FullRefresh", title=_("Full screen refresh"), device=true,},
night_mode = { category="none", event="ToggleNightMode", title=_("Night mode"), device=true,},
suspend = { category="none", event="SuspendEvent", title=_("Suspend"), device=true,},
exit = { category="none", event="Exit", title=_("Exit KOReader"), device=true,},
restart = { category="none", event="Restart", title=_("Restart KOReader"), device=true, condition=Device:canRestart(),},
reboot = { category="none", event="Reboot", title=_("Reboot the device"), device=true, condition=Device:canReboot(),},
poweroff = { category="none", event="PowerOff", title=_("Power off"), device=true, condition=Device:canPowerOff(),},
show_menu = { category="none", event="ShowMenu", title=_("Show menu"), device=true,},
toggle_hold_corners = { category="none", event="IgnoreHoldCorners", title=_("Toggle hold corners"), device=true,},
toggle_rotation = { category="none", event="ToggleRotation", title=_("Toggle rotation"), device=true,},
wallabag_download = { category="none", event="SynchronizeWallabag", title=_("Wallabag retrieval"), device=true,},
calibre_search = { category="none", event="CalibreSearch", title=_("Search in calibre metadata"), device=true,},
calibre_browse_tags = { category="none", event="CalibreBrowseTags", title=_("Browse all calibre tags"), device=true,},
calibre_browse_series = { category="none", event="CalibreBrowseSeries", title=_("Browse all calibre series"), device=true,},
favorites = { category="arg", event="ShowColl", arg="favorites", title=_("Favorites"), device=true,},
-- filemanager settings
folder_up = { category="none", event="FolderUp", title=_("Folder up"), filemanager=true},
show_plus_menu = { category="none", event="ShowPlusMenu", title=_("Show plus menu"), filemanager=true},
folder_shortcuts = { category="none", event="ShowFolderShortcutsDialog", title=_("Folder shortcuts"), filemanager=true},
-- reader settings
prev_chapter = { category="none", event="GotoPrevChapter", title=_("Previous chapter"), rolling=true, paging=true,},
next_chapter = { category="none", event="GotoNextChapter", title=_("Next chapter"), rolling=true, paging=true,},
first_page = { category="none", event="GoToBeginning", title=_("First page"), rolling=true, paging=true,},
last_page = { category="none", event="GoToEnd", title=_("Last page"), rolling=true, paging=true,},
prev_bookmark = { category="none", event="GotoPreviousBookmarkFromPage", title=_("Previous bookmark"), rolling=true, paging=true,},
next_bookmark = { category="none", event="GotoNextBookmarkFromPage", title=_("Next bookmark"), rolling=true, paging=true,},
go_to = { category="none", event="ShowGotoDialog", title=_("Go to"), rolling=true, paging=true,},
skim = { category="none", event="ShowSkimtoDialog", title=_("Skim"), rolling=true, paging=true,},
back = { category="none", event="Back", title=_("Back"), rolling=true, paging=true,},
previous_location = { category="arg", event="GoBackLink", arg=true, title=_("Back to previous location"), rolling=true, paging=true,},
latest_bookmark = { category="none", event="GoToLatestBookmark", title=_("Go to latest bookmark"), rolling=true, paging=true,},
follow_nearest_link = { category="arg", event="GoToPageLink", arg={pos={x=0,y=0}}, title=_("Follow nearest link"), rolling=true, paging=true,},
follow_nearest_internal_link = { category="arg", event="GoToInternalPageLink", arg={pos={x=0,y=0}}, title=_("Follow nearest internal link"), rolling=true, paging=true,},
clear_location_history = { category="arg", event="ClearLocationStack", arg=true, title=_("Clear location history"), rolling=true, paging=true,},
toc = { category="none", event="ShowToc", title=_("Table of contents"), rolling=true, paging=true,},
bookmarks = { category="none", event="ShowBookmark", title=_("Bookmarks"), rolling=true, paging=true,},
book_statistics = { category="none", event="ShowBookStats", title=_("Book statistics"), rolling=true, paging=true,},
book_status = { category="none", event="ShowBookStatus", title=_("Book status"), rolling=true, paging=true,},
book_info = { category="none", event="ShowBookInfo", title=_("Book information"), rolling=true, paging=true,},
book_description = { category="none", event="ShowBookDescription", title=_("Book description"), rolling=true, paging=true,},
book_cover = { category="none", event="ShowBookCover", title=_("Book cover"), rolling=true, paging=true,},
show_config_menu = { category="none", event="ShowConfigMenu", title=_("Show bottom menu"), rolling=true, paging=true,},
toggle_bookmark = { category="none", event="ToggleBookmark", title=_("Toggle bookmark"), rolling=true, paging=true,},
toggle_inverse_reading_order = { category="none", event="ToggleReadingOrder", title=_("Toggle page turn direction"), rolling=true, paging=true,},
cycle_highlight_action = { category="none", event="CycleHighlightAction", title=_("Cycle highlight action"), rolling=true, paging=true,},
cycle_highlight_style = { category="none", event="CycleHighlightStyle", title=_("Cycle highlight style"), rolling=true, paging=true,},
kosync_push_progress = { category="none", event="KOSyncPushProgress", title=_("Push progress from this device"), rolling=true, paging=true,},
kosync_pull_progress = { category="none", event="KOSyncPullProgress", title=_("Pull progress from other devices"), rolling=true, paging=true,},
page_jmp = { category="absolutenumber", event="GotoViewRel", min=-100, max=100, title=_("Go X pages"), rolling=true, paging=true,},
-- rolling reader settings
increase_font = { category="incrementalnumber", event="IncreaseFontSize", min=1, max=255, title=_("Increase font size"), rolling=true,},
decrease_font = { category="incrementalnumber", event="DecreaseFontSize", min=1, max=255, title=_("Decrease font size"), rolling=true,},
-- paging reader settings
toggle_page_flipping = { category="none", event="TogglePageFlipping", title=_("Toggle page flipping"), paging=true,},
toggle_reflow = { category="none", event="ToggleReflow", title=_("Toggle reflow"), paging=true,},
zoom = { category="string", event="SetZoomMode", title=_("Zoom to"), args={"contentwidth", "contentheight", "pagewidth", "pageheight", "column", "content", "page"}, toggle={"content width", "content height", "page width", "page height", "column", "content", "page"}, paging=true,},
-- parsed from CreOptions
-- the rest of the table elements are built from their counterparts in CreOptions
rotation_mode = {category="string", device=true},
visible_pages = {category="string", rolling=true},
h_page_margins = {category="string", rolling=true},
sync_t_b_page_margins = {category="string", rolling=true},
t_page_margin = {category="absolutenumber", rolling=true},
b_page_margin = {category="absolutenumber", rolling=true},
view_mode = {category="string", rolling=true},
block_rendering_mode = {category="string", rolling=true},
render_dpi = {category="string", rolling=true},
line_spacing = {category="absolutenumber", rolling=true},
font_size = {category="absolutenumber", title="Font Size", rolling=true},
font_weight = {category="string", rolling=true},
--font_gamma = {category="string", rolling=true},
font_hinting = {category="string", rolling=true},
font_kerning = {category="string", rolling=true},
status_line = {category="string", rolling=true},
embedded_css = {category="string", rolling=true},
embedded_fonts = {category="string", rolling=true},
smooth_scaling = {category="string", rolling=true},
nightmode_images = {category="string", rolling=true},
}
-- array for item order in menu
local dispatcher_menu_order = {
-- device
"reading_progress",
"history",
"open_previous_document",
"favorites",
"filemanager",
"stats_calendar_view",
"dictionary_lookup",
"wikipedia_lookup",
"fulltext_search",
"file_search",
"full_refresh",
"night_mode",
"suspend",
"exit",
"restart",
"reboot",
"poweroff",
"show_menu",
"show_config_menu",
"show_frontlight_dialog",
"toggle_frontlight",
"increase_frontlight",
"decrease_frontlight",
"increase_frontlight_warmth",
"decrease_frontlight_warmth",
"toggle_hold_corners",
"toggle_gsensor",
"toggle_rotation",
"wifi_on",
"wifi_off",
"toggle_wifi",
"wallabag_download",
"calibre_search",
"calibre_browse_tags",
"calibre_browse_series",
"rotation_mode",
-- filemanager
"folder_up",
"show_plus_menu",
"folder_shortcuts",
-- reader
"page_jmp",
"prev_chapter",
"next_chapter",
"first_page",
"last_page",
"prev_bookmark",
"next_bookmark",
"go_to",
"skim",
"back",
"previous_location",
"latest_bookmark",
"follow_nearest_link",
"follow_nearest_internal_link",
"clear_location_history",
"toc",
"bookmarks",
"book_statistics",
"book_status",
"book_info",
"book_description",
"book_cover",
"increase_font",
"decrease_font",
"font_size",
--"font_gamma",
"font_weight",
"font_hinting",
"font_kerning",
"toggle_bookmark",
"toggle_page_flipping",
"toggle_reflow",
"toggle_inverse_reading_order",
"zoom",
"cycle_highlight_action",
"cycle_highlight_style",
"kosync_push_progress",
"kosync_pull_progress",
"visible_pages",
"h_page_margins",
"sync_t_b_page_margins",
"t_page_margin",
"b_page_margin",
"view_mode",
"block_rendering_mode",
"render_dpi",
"line_spacing",
"status_line",
"embedded_css",
"embedded_fonts",
"smooth_scaling",
"nightmode_images",
} }
--[[-- --[[--
@ -94,84 +300,50 @@ function Dispatcher:init()
Dispatcher.initialized = true Dispatcher.initialized = true
end end
--[[-- function Dispatcher.addItem(caller, menu, location, settings, section)
Add a submenu to edit which items are dispatched for _, k in ipairs(dispatcher_menu_order) do
arguments are: if settingsList[k][section] == true and
1) self (settingsList[k].condition == nil or settingsList[k].condition)
2) the table representing the submenu (can be empty) then
3) the name of the parent of the settings table (must be a child of self) if settingsList[k].category == "none" or settingsList[k].category == "arg" then
4) the name of the settings table
example usage:
Dispatcher.addSubMenu(self, sub_items, "profiles", "profile1")
--]]--
function Dispatcher:addSubMenu(menu, location, settings)
if not Dispatcher.initialized then Dispatcher:init() end
table.insert(menu, {
text = _("None"),
separator = true,
checked_func = function()
return next(self[location][settings]) == nil
end,
callback = function(touchmenu_instance)
self[location][settings] = {}
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
})
for k, v in pairs(settingsList) do
if settingsList[k].category == "none" then
table.insert(menu, { table.insert(menu, {
text = settingsList[k].title, text = settingsList[k].title,
checked_func = function() checked_func = function()
return self[location][settings] ~= nil and self[location][settings][k] ~= nil return caller[location][settings] ~= nil and caller[location][settings][k] ~= nil
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
if self[location][settings] ~= nil if caller[location][settings] ~= nil
and self[location][settings][k] then and caller[location][settings][k]
self[location][settings][k] = nil then
caller[location][settings][k] = nil
else else
self[location][settings][k] = true caller[location][settings][k] = true
end end
if touchmenu_instance then touchmenu_instance:updateItems() end if touchmenu_instance then touchmenu_instance:updateItems() end
end, end,
}) separator = settingsList[k].separator,
elseif settingsList[k].category == "toggle" then
table.insert(menu, {
text_func = function()
return T(settingsList[k].title, self[location][settings][k])
end,
checked_func = function()
return self[location][settings] ~= nil and self[location][settings][k] ~= nil
end,
callback = function(touchmenu_instance)
self[location][settings][k] = not self[location][settings][k]
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
hold_callback = function(touchmenu_instance)
self[location][settings][k] = nil
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
}) })
elseif settingsList[k].category == "absolutenumber" then elseif settingsList[k].category == "absolutenumber" then
table.insert(menu, { table.insert(menu, {
text_func = function() text_func = function()
return T(settingsList[k].title, self[location][settings][k] or "") return T(settingsList[k].title, caller[location][settings][k] or "")
end, end,
checked_func = function() checked_func = function()
return self[location][settings] ~= nil and self[location][settings][k] ~= nil return caller[location][settings] ~= nil and caller[location][settings][k] ~= nil
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget") local SpinWidget = require("ui/widget/spinwidget")
local items = SpinWidget:new{ local items = SpinWidget:new{
width = Screen:getWidth() * 0.6, width = Screen:getWidth() * 0.6,
value = self[location][settings][k] or settingsList[k].default or 0, value = caller[location][settings][k] or settingsList[k].default or 0,
value_min = settingsList[k].min, value_min = settingsList[k].min,
value_step = 1, value_step = 1,
value_hold_step = 2, value_hold_step = 2,
value_max = settingsList[k].max, value_max = settingsList[k].max,
default_value = 0, default_value = 0,
title_text = T(settingsList[k].title, self[location][settings][k] or ""), title_text = T(settingsList[k].title, caller[location][settings][k] or ""),
callback = function(spin) callback = function(spin)
self[location][settings][k] = spin.value caller[location][settings][k] = spin.value
if touchmenu_instance then if touchmenu_instance then
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
end end
@ -180,32 +352,34 @@ function Dispatcher:addSubMenu(menu, location, settings)
UIManager:show(items) UIManager:show(items)
end, end,
hold_callback = function(touchmenu_instance) hold_callback = function(touchmenu_instance)
self[location][settings][k] = nil caller[location][settings][k] = nil
if touchmenu_instance then touchmenu_instance:updateItems() end if touchmenu_instance then touchmenu_instance:updateItems() end
end, end,
separator = settingsList[k].separator,
}) })
elseif settingsList[k].category == "incrementalnumber" then elseif settingsList[k].category == "incrementalnumber" then
table.insert(menu, { table.insert(menu, {
text_func = function() text_func = function()
return T(settingsList[k].title, self[location][settings][k] or "") return T(settingsList[k].title, caller[location][settings][k] or "")
end, end,
checked_func = function() checked_func = function()
return self[location][settings] ~= nil and self[location][settings][k] ~= nil return caller[location][settings] ~= nil and caller[location][settings][k] ~= nil
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local _ = require("gettext")
local SpinWidget = require("ui/widget/spinwidget") local SpinWidget = require("ui/widget/spinwidget")
local items = SpinWidget:new{ local items = SpinWidget:new{
width = Screen:getWidth() * 0.6, width = Screen:getWidth() * 0.6,
value = self[location][settings][k] or 0, value = caller[location][settings][k] or 0,
value_min = settingsList[k].min, value_min = settingsList[k].min,
value_step = 1, value_step = 1,
value_hold_step = 2, value_hold_step = 2,
value_max = settingsList[k].max, value_max = settingsList[k].max,
default_value = 0, default_value = 0,
title_text = T(settingsList[k].title, self[location][settings][k] or ""), title_text = T(settingsList[k].title, caller[location][settings][k] or ""),
text = _([[If set to 0 and called by a gesture the amount of the gesture will be used]]), info_text = _([[If called by a gesture the amount of the gesture will be used]]),
callback = function(spin) callback = function(spin)
self[location][settings][k] = spin.value caller[location][settings][k] = spin.value
if touchmenu_instance then if touchmenu_instance then
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
end end
@ -214,11 +388,12 @@ function Dispatcher:addSubMenu(menu, location, settings)
UIManager:show(items) UIManager:show(items)
end, end,
hold_callback = function(touchmenu_instance) hold_callback = function(touchmenu_instance)
self[location][settings][k] = nil caller[location][settings][k] = nil
if touchmenu_instance then if touchmenu_instance then
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
end end
end, end,
separator = settingsList[k].separator,
}) })
elseif settingsList[k].category == "string" then elseif settingsList[k].category == "string" then
local sub_item_table = {} local sub_item_table = {}
@ -226,35 +401,81 @@ function Dispatcher:addSubMenu(menu, location, settings)
table.insert(sub_item_table, { table.insert(sub_item_table, {
text = tostring(settingsList[k].toggle[i]), text = tostring(settingsList[k].toggle[i]),
checked_func = function() checked_func = function()
return self[location][settings] ~= nil return caller[location][settings] ~= nil
and self[location][settings][k] ~= nil and caller[location][settings][k] ~= nil
and self[location][settings][k] == settingsList[k].args[i] and caller[location][settings][k] == settingsList[k].args[i]
end, end,
callback = function() callback = function()
self[location][settings][k] = settingsList[k].args[i] caller[location][settings][k] = settingsList[k].args[i]
end, end,
}) })
end end
table.insert(menu, { table.insert(menu, {
text_func = function() text_func = function()
return T(settingsList[k].title, self[location][settings][k]) return T(settingsList[k].title, caller[location][settings][k])
end, end,
checked_func = function() checked_func = function()
return self[location][settings] ~= nil return caller[location][settings] ~= nil
and self[location][settings][k] ~= nil and caller[location][settings][k] ~= nil
end, end,
sub_item_table = sub_item_table, sub_item_table = sub_item_table,
keep_menu_open = true, keep_menu_open = true,
hold_callback = function(touchmenu_instance) hold_callback = function(touchmenu_instance)
self[location][settings][k] = nil caller[location][settings][k] = nil
if touchmenu_instance then if touchmenu_instance then
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
end end
end, end,
separator = settingsList[k].separator,
}) })
end end
end end
end end
end
--[[--
Add a submenu to edit which items are dispatched
arguments are:
1) the caller
2) the table representing the submenu (can be empty)
3) the name of the parent of the settings table (must be a child of self)
4) the name of the settings table
example usage:
Dispatcher.addSubMenu(self, sub_items, "profiles", "profile1")
Must be executed in the context of the caller to add items to the callers menu.
therefore declared as Dispatcher.addSubMenu(caller, menu, location, settings)
but should be called as Dispatcher.addSubMenu(self, menu, location, settings)
--]]--
function Dispatcher.addSubMenu(caller, menu, location, settings)
if not Dispatcher.initialized then Dispatcher:init() end
table.insert(menu, {
text = _("None"),
separator = true,
checked_func = function()
return next(caller[location][settings]) == nil
end,
callback = function(touchmenu_instance)
caller[location][settings] = {}
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
})
local section_list = {
{"device", _("Device")},
{"filemanager", _("Filemanager")},
{"rolling", _("Reflowable documents (epub, fb2, txt…)")},
{"paging", _("Fixed layout documents (pdf, djvu, pics…)")},
}
for _, section in ipairs(section_list) do
local submenu = {}
-- pass caller's context
Dispatcher.addItem(caller, submenu, location, settings, section[1])
table.insert(menu, {
text = section[2],
sub_item_table = submenu,
})
end
end
function Dispatcher:execute(settings, gesture) function Dispatcher:execute(settings, gesture)
for k, v in pairs(settings) do for k, v in pairs(settings) do
@ -262,17 +483,20 @@ function Dispatcher:execute(settings, gesture)
if settingsList[k].category == "none" then if settingsList[k].category == "none" then
self.ui:handleEvent(Event:new(settingsList[k].event)) self.ui:handleEvent(Event:new(settingsList[k].event))
end end
if settingsList[k].category == "toggle" if settingsList[k].category == "absolutenumber"
or settingsList[k].category == "absolutenumber" or settingsList[k].category == "string"
or settingsList[k].category == "string" then then
self.ui:handleEvent(Event:new(settingsList[k].event, v)) self.ui:handleEvent(Event:new(settingsList[k].event, v))
end end
if settingsList[k].category == "incrementalnumber" then -- the event can accept a gesture object or an argument
if v then if settingsList[k].category == "arg" then
self.ui:handleEvent(Event:new(settingsList[k].event, v)) local arg = gesture or settingsList[k].arg
else self.ui:handleEvent(Event:new(settingsList[k].event, arg))
self.ui:handleEvent(Event:new(settingsList[k].event, gesture))
end end
-- the event can accept a gesture object or a number
if settingsList[k].category == "incrementalnumber" then
local arg = gesture or v
self.ui:handleEvent(Event:new(settingsList[k].event, arg))
end end
end end
end end

@ -100,6 +100,7 @@ local order = {
"news_downloader", "news_downloader",
"send2ebook", "send2ebook",
"text_editor", "text_editor",
"profiles",
"----------------------------", "----------------------------",
"more_tools", "more_tools",
}, },

@ -6,12 +6,12 @@ local InputDialog = require("ui/widget/inputdialog")
local LuaSettings = require("luasettings") local LuaSettings = require("luasettings")
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
local WidgetContainer = require("ui/widget/container/widgetcontainer") local WidgetContainer = require("ui/widget/container/widgetcontainer")
local orderedPairs = require("ffi/util").orderedPairs
local _ = require("gettext") local _ = require("gettext")
local T = require("ffi/util").template local T = require("ffi/util").template
local Profiles = WidgetContainer:new{ local Profiles = WidgetContainer:new{
name = "profiles", name = "profiles",
is_doc_only = true,
profiles_file = DataStorage:getSettingsDir() .. "/profiles.lua", profiles_file = DataStorage:getSettingsDir() .. "/profiles.lua",
profiles = nil, profiles = nil,
data = nil, data = nil,
@ -86,7 +86,7 @@ function Profiles:getSubMenuItems()
separator = true, separator = true,
} }
} }
for k,v in pairs(self.data) do for k,v in orderedPairs(self.data) do
local sub_items = { local sub_items = {
{ {
text = _("Delete profile"), text = _("Delete profile"),
@ -110,7 +110,7 @@ function Profiles:getSubMenuItems()
hold_keep_menu_open = false, hold_keep_menu_open = false,
sub_item_table = sub_items, sub_item_table = sub_items,
hold_callback = function() hold_callback = function()
Dispatcher.execute(self, v) Dispatcher.execute(self, self.data[k])
end, end,
}) })
end end

Loading…
Cancel
Save