2
0
mirror of https://github.com/koreader/koreader synced 2024-11-18 03:25:46 +00:00
koreader/frontend/apps/filemanager/filemanagershortcuts.lua
Frans de Jonge 294c92fdc7
[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.
2019-03-09 13:55:03 +01:00

228 lines
8.0 KiB
Lua

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
local UIManager = require("ui/uimanager")
local util = require("ffi/util")
local _ = require("gettext")
local T = require("ffi/util").template
local FileManagerShortcuts = InputContainer:extend{}
function FileManagerShortcuts:updateItemTable()
local item_table = {}
local folder_shortcuts = G_reader_settings:readSetting("folder_shortcuts") or {}
table.insert(item_table, {
text = _("Add new folder shortcut"),
callback = function()
self:addNewFolder()
end,
})
for _, item in ipairs(folder_shortcuts) do
table.insert(item_table, {
text = string.format("%s (%s)", item.text, item.folder),
folder = item.folder,
friendly_name = item.text,
deletable = true,
editable = true,
callback = function()
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
-- 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()
local PathChooser = require("ui/widget/pathchooser")
local path_chooser = PathChooser:new{
select_directory = true,
select_file = false,
path = self.fm_bookmark.curr_path,
onConfirm = function(path)
local add_folder_input
local friendly_name = util.basename(path) or _("my folder")
add_folder_input = InputDialog:new{
title = self.title,
input = friendly_name,
input_type = "text",
description = T(_("Title for selected folder:\n%1"), path),
buttons = {
{
{
text = _("Cancel"),
callback = function()
UIManager:close(add_folder_input)
end,
},
{
text = _("Add"),
is_enter_default = true,
callback = function()
self:addFolderFromInput(add_folder_input:getInputValue(), path)
UIManager:close(add_folder_input)
end,
},
}
},
}
UIManager:show(add_folder_input)
add_folder_input:onShowKeyboard()
end
}
UIManager:show(path_chooser)
end
function FileManagerShortcuts:addFolderFromInput(friendly_name, folder)
for __, item in ipairs(G_reader_settings:readSetting("folder_shortcuts") or {}) do
if item.text == friendly_name and item.folder == folder then
UIManager:show(InfoMessage:new{
text = _("A shortcut to this folder already exists."),
})
return
end
end
local folder_shortcuts = G_reader_settings:readSetting("folder_shortcuts") or {}
table.insert(folder_shortcuts, {
text = friendly_name,
folder = folder,
})
G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts)
self:updateItemTable()
end
function FileManagerShortcuts:onMenuHold(item)
if item.deletable or item.editable then
local folder_shortcuts_dialog
folder_shortcuts_dialog = ButtonDialog:new{
buttons = {
{
{
text = _("Edit"),
enabled = item.editable,
callback = function()
UIManager:close(folder_shortcuts_dialog)
self._manager:editFolderShortcut(item)
end
},
{
text = _("Delete"),
enabled = item.deletable,
callback = function()
UIManager:close(folder_shortcuts_dialog)
self._manager:deleteFolderShortcut(item)
end
},
},
}
}
UIManager:show(folder_shortcuts_dialog)
return true
end
end
function FileManagerShortcuts:editFolderShortcut(item)
local edit_folder_input
edit_folder_input = InputDialog:new {
title = _("Edit friendly name"),
input = item.friendly_name,
input_type = "text",
description = T(_("Rename title for selected folder:\n%1"), item.folder),
buttons = {
{
{
text = _("Cancel"),
callback = function()
UIManager:close(edit_folder_input)
end,
},
{
text = _("Apply"),
is_enter_default = true,
callback = function()
self:renameFolderShortcut(item, edit_folder_input:getInputText())
UIManager:close(edit_folder_input)
end,
},
}
},
}
UIManager:show(edit_folder_input)
edit_folder_input:onShowKeyboard()
end
function FileManagerShortcuts:renameFolderShortcut(item, new_name)
local folder_shortcuts = {}
for _, element in ipairs(G_reader_settings:readSetting("folder_shortcuts") or {}) do
if element.text == item.friendly_name and element.folder == item.folder then
element.text = new_name
end
table.insert(folder_shortcuts, element)
end
G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts)
self:updateItemTable()
end
function FileManagerShortcuts:deleteFolderShortcut(item)
local folder_shortcuts = {}
for _, element in ipairs(G_reader_settings:readSetting("folder_shortcuts") or {}) do
if element.text ~= item.friendly_name or element.folder ~= item.folder then
table.insert(folder_shortcuts, element)
end
end
G_reader_settings:saveSetting("folder_shortcuts", folder_shortcuts)
self:updateItemTable()
end
function FileManagerShortcuts:onSetDimensions(dimen)
self.dimen = dimen
end
function FileManagerShortcuts:onShowFolderShortcutsDialog()
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(),
onMenuHold = self.onMenuHold,
_manager = self,
}
self:updateItemTable()
UIManager:show(self.fm_bookmark)
end
return FileManagerShortcuts