From 19b1c919d6f6c8acf72656e907087540abecdca1 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 1 Aug 2018 17:02:34 +0200 Subject: [PATCH] FileChooser, PathChooser: show current path in header (#4125) --- frontend/apps/filemanager/filemanager.lua | 13 +---- frontend/ui/widget/filechooser.lua | 1 + frontend/ui/widget/menu.lua | 54 +++++++++++++++++++-- frontend/ui/widget/pathchooser.lua | 1 + plugins/coverbrowser.koplugin/covermenu.lua | 3 ++ 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index ef9af6bed..97689fd70 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -24,7 +24,6 @@ local PluginLoader = require("pluginloader") local ReaderDictionary = require("apps/reader/modules/readerdictionary") local ReaderUI = require("apps/reader/readerui") local ReaderWikipedia = require("apps/reader/modules/readerwikipedia") -local RenderText = require("ui/rendertext") local Screenshoter = require("ui/widget/screenshoter") local Size = require("ui/size") local TextWidget = require("ui/widget/textwidget") @@ -47,17 +46,7 @@ local function restoreScreenMode() end local function truncatePath(text) - if not text then return "" end - local screen_width = Screen:getWidth() - local face = Font:getFace("xx_smallinfofont") - -- we want to truncate text on the left, so work with the reverse of text (which is fine as we don't use kerning) - local reversed_text = require("util").utf8Reverse(text) - local txt_width = RenderText:sizeUtf8Text(0, screen_width, face, reversed_text, false, false).x - if screen_width - 2 * Size.padding.small < txt_width then - reversed_text = RenderText:truncateTextByWidth(reversed_text, face, screen_width - 2 * Size.padding.small, false, false) - text = require("util").utf8Reverse(reversed_text) - end - return text + return FileChooser:truncatePath(text) end local FileManager = InputContainer:extend{ diff --git a/frontend/ui/widget/filechooser.lua b/frontend/ui/widget/filechooser.lua index 593368df7..41afff5a6 100644 --- a/frontend/ui/widget/filechooser.lua +++ b/frontend/ui/widget/filechooser.lua @@ -30,6 +30,7 @@ local FileChooser = Menu:extend{ cface = Font:getFace("smallinfofont"), no_title = true, path = lfs.currentdir(), + show_path = true, parent = nil, show_hidden = nil, exclude_dirs = {"%.sdr$"}, diff --git a/frontend/ui/widget/menu.lua b/frontend/ui/widget/menu.lua index 9dc174944..c365cc769 100644 --- a/frontend/ui/widget/menu.lua +++ b/frontend/ui/widget/menu.lua @@ -515,7 +515,7 @@ function Menu:_recalculateDimen() + 2 * Size.padding.button end if self.menu_title and not self.no_title then - top_height = self.menu_title:getSize().h + 2 * Size.padding.small + top_height = self.menu_title_group:getSize().h + 2 * Size.padding.small end height_dim = self.dimen.h - bottom_height - top_height self.item_dimen.h = math.floor(height_dim / self.perpage) @@ -543,10 +543,42 @@ function Menu:init() text = self.title, face = self.tface, } + local menu_title_container = CenterContainer:new{ + dimen = Geom:new{ + w = self.dimen.w, + h = self.menu_title:getSize().h, + }, + self.menu_title, + } + local path_text_container + + if self.show_path then + self.path_text = TextWidget:new{ + face = Font:getFace("xx_smallinfofont"), + text = self:truncatePath(self.path), + } + path_text_container = CenterContainer:new{ + dimen = Geom:new{ + w = self.dimen.w, + h = self.path_text:getSize().h, + }, + self.path_text, + } + self.menu_title_group = VerticalGroup:new{ + align = "center", + menu_title_container, + path_text_container, + } + else + self.menu_title_group = VerticalGroup:new{ + align = "center", + menu_title_container + } + end -- group for title bar self.title_bar = OverlapGroup:new{ - dimen = {w = self.dimen.w, h = self.menu_title:getSize().h}, - self.menu_title, + dimen = {w = self.dimen.w, h = self.menu_title_group:getSize().h}, + self.menu_title_group, } -- group for items self.item_group = VerticalGroup:new{} @@ -801,6 +833,19 @@ function Menu:init() end end +function Menu:truncatePath(text) + local screen_width = Screen:getWidth() + local face = Font:getFace("xx_smallinfofont") + -- we want to truncate text on the left, so work with the reverse of text (which is fine as we don't use kerning) + local reversed_text = require("util").utf8Reverse(text) + local txt_width = RenderText:sizeUtf8Text(0, screen_width, face, reversed_text, false, false).x + if screen_width - 2 * Size.padding.small < txt_width then + reversed_text = RenderText:truncateTextByWidth(reversed_text, face, screen_width - 2 * Size.padding.small, false, false) + text = require("util").utf8Reverse(reversed_text) + end + return text +end + function Menu:onCloseWidget() -- FIXME: -- we cannot refresh regionally using the dimen field @@ -901,6 +946,9 @@ function Menu:updateItems(select_number) end -- for c=1, self.perpage self:updatePageInfo(select_number) + if self.show_path then + self.path_text.text = self:truncatePath(self.path) + end UIManager:setDirty("all", function() local refresh_dimen = diff --git a/frontend/ui/widget/pathchooser.lua b/frontend/ui/widget/pathchooser.lua index 98d27c081..27d7a2817 100644 --- a/frontend/ui/widget/pathchooser.lua +++ b/frontend/ui/widget/pathchooser.lua @@ -7,6 +7,7 @@ local _ = require("gettext") local PathChooser = FileChooser:extend{ title = _("Choose Path"), no_title = false, + show_path = true, is_popout = false, covers_fullscreen = true, -- set it to false if you set is_popout = true is_borderless = true, diff --git a/plugins/coverbrowser.koplugin/covermenu.lua b/plugins/coverbrowser.koplugin/covermenu.lua index 3dd94988c..159a4235f 100644 --- a/plugins/coverbrowser.koplugin/covermenu.lua +++ b/plugins/coverbrowser.koplugin/covermenu.lua @@ -87,6 +87,9 @@ function CoverMenu:updateItems(select_number) -- As done in Menu:updateItems() self:updatePageInfo(select_number) + if self.show_path then + self.path_text.text = self:truncatePath(self.path) + end UIManager:setDirty("all", function() local refresh_dimen = old_dimen and old_dimen:combine(self.dimen)