diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 254462b58..b6454ed68 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -293,7 +293,7 @@ function FileManager:setupLayout() table.insert(buttons, {}) -- separator table.insert(buttons, { filemanagerutil.genResetSettingsButton(doc_settings_or_file, close_dialog_refresh_callback), - file_manager.collections:genAddToCollectionButton(file, close_dialog_callback), + file_manager.collections:genAddToCollectionButton(file, close_dialog_callback, refresh_callback), }) end table.insert(buttons, { diff --git a/frontend/apps/filemanager/filemanagerhistory.lua b/frontend/apps/filemanager/filemanagerhistory.lua index 5593e1436..d360ba744 100644 --- a/frontend/apps/filemanager/filemanagerhistory.lua +++ b/frontend/apps/filemanager/filemanagerhistory.lua @@ -70,8 +70,14 @@ function FileManagerHistory:updateItemTable() local item_table = {} for _, v in ipairs(require("readhistory").hist) do if self:isItemMatch(v) then - v.mandatory_dim = (self.is_frozen and v.status == "complete") and true or nil - table.insert(item_table, v) + local item = util.tableDeepCopy(v) + if item.select_enabled and ReadCollection:isFileInCollections(item.file) then + item.mandatory = "☆ " .. item.mandatory + end + if self.is_frozen and item.status == "complete" then + item.mandatory_dim = true + end + table.insert(item_table, item) end if self.statuses_fetched then self.count[v.status] = self.count[v.status] + 1 @@ -150,6 +156,9 @@ function FileManagerHistory:onMenuHold(item) self._manager:updateItemTable() self._manager.files_updated = true -- sidecar folder may be created/deleted end + local function update_callback() + self._manager:updateItemTable() + end local is_currently_opened = file == (self.ui.document and self.ui.document.file) local buttons = {} @@ -178,7 +187,7 @@ function FileManagerHistory:onMenuHold(item) end table.insert(buttons, { filemanagerutil.genResetSettingsButton(doc_settings_or_file, close_dialog_update_callback, is_currently_opened), - self._manager.ui.collections:genAddToCollectionButton(file, close_dialog_callback, nil, item.dim), + self._manager.ui.collections:genAddToCollectionButton(file, close_dialog_callback, update_callback, item.dim), }) table.insert(buttons, { { diff --git a/frontend/ui/widget/filechooser.lua b/frontend/ui/widget/filechooser.lua index c4718cd3f..48e1c862b 100644 --- a/frontend/ui/widget/filechooser.lua +++ b/frontend/ui/widget/filechooser.lua @@ -6,6 +6,7 @@ local DocumentRegistry = require("document/documentregistry") local FileManagerShortcuts = require("apps/filemanager/filemanagershortcuts") local filemanagerutil = require("apps/filemanager/filemanagerutil") local Menu = require("ui/widget/menu") +local ReadCollection = require("readcollection") local UIManager = require("ui/uimanager") local ffi = require("ffi") local ffiUtil = require("ffi/util") @@ -475,6 +476,9 @@ function FileChooser:getMenuItemMandatory(item, collate) else text = util.getFriendlySize(item.attr.size or 0) end + if ReadCollection:isFileInCollections(item.path) then + text = "☆ " .. text + end else -- folder, count number of folders and files inside it local sub_dirs, dir_files = self:getList(item.path) text = T("%1 \u{F016}", #dir_files) diff --git a/plugins/coverbrowser.koplugin/mosaicmenu.lua b/plugins/coverbrowser.koplugin/mosaicmenu.lua index 1dc2ffc81..df4bc7ea3 100644 --- a/plugins/coverbrowser.koplugin/mosaicmenu.lua +++ b/plugins/coverbrowser.koplugin/mosaicmenu.lua @@ -14,8 +14,9 @@ local IconWidget = require("ui/widget/iconwidget") local ImageWidget = require("ui/widget/imagewidget") local InputContainer = require("ui/widget/container/inputcontainer") local LeftContainer = require("ui/widget/container/leftcontainer") -local ProgressWidget = require("ui/widget/progresswidget") local OverlapGroup = require("ui/widget/overlapgroup") +local ProgressWidget = require("ui/widget/progresswidget") +local ReadCollection = require("readcollection") local Size = require("ui/size") local TextBoxWidget = require("ui/widget/textboxwidget") local TextWidget = require("ui/widget/textwidget") @@ -37,13 +38,14 @@ local BookInfoManager = require("bookinfomanager") -- We will show a rotated dogear at bottom right corner of cover widget for -- opened files (the dogear will make it look like a "used book") --- The ImageWidget Will be created when we know the available height (and +-- The ImageWidget will be created when we know the available height (and -- recreated if height changes) -local corner_mark_size = -1 +local corner_mark_size local corner_mark local reading_mark local abandoned_mark local complete_mark +local collection_mark local progress_widget -- ItemShortCutIcon (for keyboard navigation) is private to menu.lua and can't be accessed, @@ -89,10 +91,9 @@ function ItemShortCutIcon:init() } end - -- We may find a better algorithm, or just a set of -- nice looking combinations of 3 sizes to iterate thru --- The rendering of the TextBoxWidget we're doing below +-- the rendering of the TextBoxWidget we're doing below -- with decreasing font sizes till it fits is quite expensive. local FakeCover = FrameContainer:extend{ @@ -349,8 +350,6 @@ local MosaicMenuItem = InputContainer:extend{ text = nil, show_parent = nil, dimen = nil, - shortcut = nil, - shortcut_style = "square", _underline_container = nil, do_cover_image = false, do_hint_opened = false, @@ -737,16 +736,35 @@ function MosaicMenuItem:paintTo(bb, x, y) self.shortcut_icon:paintTo(bb, x+ix, y+iy) end + -- other paintings are anchored to the sub-widget (cover image) + local target = self[1][1][1] + + if self.entry.order == nil -- File manager, History + and ReadCollection:isFileInCollections(self.filepath) then + -- top right corner + local ix, rect_ix + if BD.mirroredUILayout() then + ix = math.floor((self.width - target.dimen.w)/2) + rect_ix = target.bordersize + else + ix = self.width - math.ceil((self.width - target.dimen.w)/2) - corner_mark_size + rect_ix = 0 + end + local iy = 0 + local rect_size = corner_mark_size - target.bordersize + bb:paintRect(x+ix+rect_ix, y+target.bordersize, rect_size, rect_size, Blitbuffer.COLOR_GRAY) + collection_mark:paintTo(bb, x+ix, y+iy) + end + if self.do_hint_opened and self.been_opened then - -- align it on bottom right corner of sub-widget - local target = self[1][1][1] + -- bottom right corner local ix if BD.mirroredUILayout() then ix = math.floor((self.width - target.dimen.w)/2) else - ix = self.width - math.ceil((self.width - target.dimen.w)/2) - corner_mark:getSize().w + ix = self.width - math.ceil((self.width - target.dimen.w)/2) - corner_mark_size end - local iy = self.height - math.ceil((self.height - target.dimen.h)/2) - corner_mark:getSize().h + local iy = self.height - math.ceil((self.height - target.dimen.h)/2) - corner_mark_size -- math.ceil() makes it looks better than math.floor() if self.status == "abandoned" then corner_mark = abandoned_mark @@ -759,9 +777,8 @@ function MosaicMenuItem:paintTo(bb, x, y) end if self.show_progress_bar then - local cover_item = self[1][1][1] local progress_widget_margin = math.floor((corner_mark_size - progress_widget.height) / 2) - progress_widget.width = cover_item.width - 2*progress_widget_margin + progress_widget.width = target.width - 2*progress_widget_margin local pos_x = x + math.ceil((self.width - progress_widget.width) / 2) if self.do_hint_opened then progress_widget.width = progress_widget.width - corner_mark_size @@ -769,7 +786,7 @@ function MosaicMenuItem:paintTo(bb, x, y) pos_x = pos_x + corner_mark_size end end - local pos_y = y + self.height - math.ceil((self.height - cover_item.height) / 2) - corner_mark_size + progress_widget_margin + local pos_y = y + self.height - math.ceil((self.height - target.height) / 2) - corner_mark_size + progress_widget_margin if self.status == "abandoned" then progress_widget.fillcolor = Blitbuffer.COLOR_GRAY_6 else @@ -782,7 +799,6 @@ function MosaicMenuItem:paintTo(bb, x, y) -- to which we paint a small indicator if this book has a description if self.has_description and not BookInfoManager:getSetting("no_hint_description") then -- On book's right (for similarity to ListMenuItem) - local target = self[1][1][1] local d_w = Screen:scaleBySize(3) local d_h = math.ceil(target.dimen.h / 8) -- Paint it directly relative to target.dimen.x/y which has been computed at this point @@ -907,7 +923,15 @@ function MosaicMenu:_recalculateDimen() width = corner_mark_size, height = corner_mark_size, } - corner_mark = reading_mark + if collection_mark then + collection_mark:free() + end + collection_mark = IconWidget:new{ + icon = "star.white", + width = corner_mark_size, + height = corner_mark_size, + alpha = true, + } end -- Create or replace progress_widget if needed diff --git a/resources/icons/mdlight/star.white.svg b/resources/icons/mdlight/star.white.svg new file mode 100644 index 000000000..f37c82bf1 --- /dev/null +++ b/resources/icons/mdlight/star.white.svg @@ -0,0 +1,9 @@ + + + image/svg+xml + + + Layer 1 + + + \ No newline at end of file