From 294c92fdc7dba8c242292d85251b26a56df62a4b Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Sat, 9 Mar 2019 13:55:03 +0100 Subject: [PATCH] [fix] FileManagerShortcuts: prevent interference with general Menu class (#4764) The widget system doesn't really do multi-inheritance as well as it should at the moment. Instead of diving into the internals with release upcoming, this commit rewrites the shortcuts to behave better. Also fixes an older bug in that changing the friendly name didn't actually do anything on first adding a shortcut. Fixes #4763. --- .../apps/filemanager/filemanagershortcuts.lua | 96 ++++++++++--------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/frontend/apps/filemanager/filemanagershortcuts.lua b/frontend/apps/filemanager/filemanagershortcuts.lua index 11b1faba3..dd5595266 100644 --- a/frontend/apps/filemanager/filemanagershortcuts.lua +++ b/frontend/apps/filemanager/filemanagershortcuts.lua @@ -1,5 +1,6 @@ local ButtonDialog = require("ui/widget/buttondialog") local InfoMessage = require("ui/widget/infomessage") +local InputContainer = require("ui/widget/container/inputcontainer") local InputDialog = require("ui/widget/inputdialog") local Menu = require("ui/widget/menu") local Screen = require("device").screen @@ -8,22 +9,9 @@ local util = require("ffi/util") local _ = require("gettext") local T = require("ffi/util").template -local FileManagerShortcuts = Menu:extend{ - width = Screen:getWidth(), - height = Screen:getHeight(), - no_title = false, - parent = nil, - has_close_button = true, - is_popout = false, - is_borderless = true, -} - -function FileManagerShortcuts:init() - self.item_table = self:genItemTableFromRoot() - Menu.init(self) -end +local FileManagerShortcuts = InputContainer:extend{} -function FileManagerShortcuts:genItemTableFromRoot() +function FileManagerShortcuts:updateItemTable() local item_table = {} local folder_shortcuts = G_reader_settings:readSetting("folder_shortcuts") or {} table.insert(item_table, { @@ -40,12 +28,36 @@ function FileManagerShortcuts:genItemTableFromRoot() deletable = true, editable = true, callback = function() - UIManager:close(self) - self.goFolder(item.folder) + UIManager:close(self.fm_bookmark) + + local folder = item.folder + if folder ~= nil and lfs.attributes(folder, "mode") == "directory" then + if self.ui.file_chooser then + self.ui.file_chooser:changeToPath(folder) + else -- called from Reader + local FileManager = require("apps/filemanager/filemanager") + + self.ui:onClose() + if FileManager.instance then + FileManager.instance:reinit(folder) + else + FileManager:showFiles(folder) + end + end + end end, }) end - return item_table + + -- try to stay on current page + local select_number = nil + + if self.fm_bookmark.page and self.fm_bookmark.perpage then + select_number = (self.fm_bookmark.page - 1) * self.fm_bookmark.perpage + 1 + end + + self.fm_bookmark:switchItemTable(nil, + item_table, select_number) end function FileManagerShortcuts:addNewFolder() @@ -53,7 +65,7 @@ function FileManagerShortcuts:addNewFolder() local path_chooser = PathChooser:new{ select_directory = true, select_file = false, - path = self.curr_path, + path = self.fm_bookmark.curr_path, onConfirm = function(path) local add_folder_input local friendly_name = util.basename(path) or _("my folder") @@ -74,7 +86,7 @@ function FileManagerShortcuts:addNewFolder() text = _("Add"), is_enter_default = true, callback = function() - self:addFolderFromInput(friendly_name, path) + self:addFolderFromInput(add_folder_input:getInputValue(), path) UIManager:close(add_folder_input) end, }, @@ -103,7 +115,7 @@ function FileManagerShortcuts:addFolderFromInput(friendly_name, folder) folder = folder, }) G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts) - self:init() + self:updateItemTable() end function FileManagerShortcuts:onMenuHold(item) @@ -117,7 +129,7 @@ function FileManagerShortcuts:onMenuHold(item) enabled = item.editable, callback = function() UIManager:close(folder_shortcuts_dialog) - self:editFolderShortcut(item) + self._manager:editFolderShortcut(item) end }, { @@ -125,7 +137,7 @@ function FileManagerShortcuts:onMenuHold(item) enabled = item.deletable, callback = function() UIManager:close(folder_shortcuts_dialog) - self:deleteFolderShortcut(item) + self._manager:deleteFolderShortcut(item) end }, }, @@ -175,7 +187,7 @@ function FileManagerShortcuts:renameFolderShortcut(item, new_name) table.insert(folder_shortcuts, element) end G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts) - self:init() + self:updateItemTable() end function FileManagerShortcuts:deleteFolderShortcut(item) @@ -186,32 +198,30 @@ function FileManagerShortcuts:deleteFolderShortcut(item) end end G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts) - self:init() + self:updateItemTable() +end + +function FileManagerShortcuts:onSetDimensions(dimen) + self.dimen = dimen end function FileManagerShortcuts:onShowFolderShortcutsDialog() - local fm_bookmark = self:new{ + self.fm_bookmark = Menu:new{ title = _("Folder shortcuts"), show_parent = self.ui, + width = Screen:getWidth(), + height = Screen:getHeight(), + no_title = false, + parent = nil, + has_close_button = true, + is_popout = false, + is_borderless = true, curr_path = self.ui.file_chooser and self.ui.file_chooser.path or self.ui:getLastDirFile(), - goFolder = function(folder) - if folder ~= nil and lfs.attributes(folder, "mode") == "directory" then - if self.ui.file_chooser then - self.ui.file_chooser:changeToPath(folder) - else -- called from Reader - local FileManager = require("apps/filemanager/filemanager") - - self.ui:onClose() - if FileManager.instance then - FileManager.instance:reinit(folder) - else - FileManager:showFiles(folder) - end - end - end - end, + onMenuHold = self.onMenuHold, + _manager = self, } - UIManager:show(fm_bookmark) + self:updateItemTable() + UIManager:show(self.fm_bookmark) end return FileManagerShortcuts