From 300634858529c1cd1bcd25f07feb6634ed7768b8 Mon Sep 17 00:00:00 2001 From: poire-z Date: Tue, 14 Mar 2023 18:29:20 +0100 Subject: [PATCH] PageBrowser: toggle page bookmark with long-press on thumbnail --- .../apps/reader/modules/readerbookmark.lua | 15 ++++++++--- frontend/document/credocument.lua | 4 +++ frontend/ui/widget/pagebrowserwidget.lua | 26 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index 0c602e586..15a95442a 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -844,7 +844,7 @@ function ReaderBookmark:isBookmarkMatch(item, pn_or_xp) if self.ui.paging then return item.page == pn_or_xp else - return self.ui.document:isXPointerInCurrentPage(item.page) + return self.ui.document:getPageFromXPointer(item.page) == self.ui.document:getPageFromXPointer(pn_or_xp) end end @@ -1190,8 +1190,17 @@ function ReaderBookmark:doesBookmarkMatchTable(item, match_table) end end -function ReaderBookmark:toggleBookmark() - local pn_or_xp = self:getCurrentPageNumber() +function ReaderBookmark:toggleBookmark(pageno) + local pn_or_xp + if pageno then + if self.ui.rolling then + pn_or_xp = self.ui.document:getPageXPointer(pageno) + else + pn_or_xp = pageno + end + else + pn_or_xp = self:getCurrentPageNumber() + end local index = self:getDogearBookmarkIndex(pn_or_xp) if index then self.ui:handleEvent(Event:new("BookmarkRemoved", self.bookmarks[index])) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index a60797fce..433bab2dd 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -831,6 +831,10 @@ function CreDocument:getXPointer() return self._document:getXPointer() end +function CreDocument:getPageXPointer(page) + return self._document:getPageXPointer(page) +end + function CreDocument:isXPointerInDocument(xp) return self._document:isXPointerInDocument(xp) end diff --git a/frontend/ui/widget/pagebrowserwidget.lua b/frontend/ui/widget/pagebrowserwidget.lua index 9739fe5f2..b9c5547cf 100644 --- a/frontend/ui/widget/pagebrowserwidget.lua +++ b/frontend/ui/widget/pagebrowserwidget.lua @@ -984,6 +984,32 @@ function PageBrowserWidget:onHold(arg, ges) end return true end + -- Hold on title: do nothing + if ges.pos.y < self.title_bar_h then + return true + end + -- If hold on a thumbnail, toggle bookmark on that page + for idx=1, self.nb_grid_items do + if ges.pos:intersectWith(self.grid[idx].dimen) then + local page = self.grid[idx].page_idx + if page and self.grid[idx][1][1].is_page_thumbnail then + -- Only allow hold on fully displayed thumbnails. + -- Also, a thumbnail might be smaller than the original grid + -- item dimension. Be sure the hold is on it (otherwise, it's + -- a hold in the inter thumbnail margin, that we'd rather not + -- handle) + local thumb_frame = self.grid[idx][1][1] + if ges.pos:intersectWith(thumb_frame.dimen) then + self.ui.bookmark:toggleBookmark(page) + -- Update our cached bookmarks info and ensure the bottom ribbon is redrawn + self.bookmarked_pages = self.ui.bookmark:getBookmarkedPages() + self:updateLayout() + return true + end + end + break + end + end return true end