diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index 841b7f45e..da9a8f20d 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -297,6 +297,23 @@ function ReaderBookmark:addBookmark(item) table.insert(self.bookmarks, _middle + direction, item) end +-- binary search of sorted bookmarks +function ReaderBookmark:isBookmarkAdded(item) + local _start, _middle, _end, direction = 1, 1, #self.bookmarks, 0 + while _start <= _end do + local v = self.bookmarks[_middle] + _middle = math.floor((_start + _end)/2) + if self:isBookmarkSame(item, self.bookmarks[_middle]) then + return true + end + if self:isBookmarkInPageOrder(item, self.bookmarks[_middle]) then + _end, direction = _middle - 1, 0 + else + _start, direction = _middle + 1, 1 + end + end +end + -- binary search to remove bookmark function ReaderBookmark:removeBookmark(item) local _start, _middle, _end = 1, 1, #self.bookmarks diff --git a/frontend/apps/reader/modules/readerhighlight.lua b/frontend/apps/reader/modules/readerhighlight.lua index 9e79d9011..91e9e1950 100644 --- a/frontend/apps/reader/modules/readerhighlight.lua +++ b/frontend/apps/reader/modules/readerhighlight.lua @@ -385,10 +385,28 @@ function ReaderHighlight:highlightFromHoldPos() end function ReaderHighlight:onHighlight() - self:highlightFromHoldPos() self:saveHighlight() end +function ReaderHighlight:getHighlightBookmarkItem() + if self.hold_pos and not self.selected_text then + self:highlightFromHoldPos() + end + if self.selected_text and self.selected_text.pos0 and self.selected_text.pos1 then + local datetime = os.date("%Y-%m-%d %H:%M:%S") + local page = self.ui.document.info.has_pages and + self.hold_pos.page or self.selected_text.pos0 + return { + page = page, + pos0 = self.selected_text.pos0, + pos1 = self.selected_text.pos1, + datetime = datetime, + notes = self.selected_text.text, + highlighted = true, + } + end +end + function ReaderHighlight:saveHighlight() DEBUG("save highlight") local page = self.hold_pos.page @@ -407,14 +425,10 @@ function ReaderHighlight:saveHighlight() drawer = self.view.highlight.saved_drawer, } table.insert(self.view.highlight.saved[page], hl_item) - self.ui.bookmark:addBookmark({ - page = self.ui.document.info.has_pages and page or self.selected_text.pos0, - pos0 = self.selected_text.pos0, - pos1 = self.selected_text.pos1, - datetime = datetime, - notes = self.selected_text.text, - highlighted = true, - }) + local bookmark_item = self:getHighlightBookmarkItem() + if bookmark_item then + self.ui.bookmark:addBookmark(bookmark_item) + end --[[ -- disable exporting hightlights to My Clippings -- since it's not portable and there is a better Evernote plugin diff --git a/frontend/ui/widget/dictquicklookup.lua b/frontend/ui/widget/dictquicklookup.lua index 2ff62936a..2ec2883ac 100644 --- a/frontend/ui/widget/dictquicklookup.lua +++ b/frontend/ui/widget/dictquicklookup.lua @@ -158,9 +158,11 @@ function DictQuickLookup:update() end, }, { - text = _("Highlight"), + text = self:getHighlightText(), + enabled = select(2, self:getHighlightText()), callback = function() self.ui:handleEvent(Event:new("Highlight")) + self:update() end, }, { @@ -279,6 +281,21 @@ function DictQuickLookup:onShow() return true end +function DictQuickLookup:getHighlightedItem() + return self.ui.highlight:getHighlightBookmarkItem() +end + +function DictQuickLookup:getHighlightText() + local item = self:getHighlightedItem() + if not item then + return _("Highlight"), false + elseif self.ui.bookmark:isBookmarkAdded(item) then + return _("Unhighlight"), false + else + return _("Highlight"), true + end +end + function DictQuickLookup:isPrevDictAvaiable() return self.dict_index > 1 end