From 3dfa9aa51d47f9594884e20de67abdf0c63d0c86 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 24 Feb 2013 19:49:23 +0800 Subject: [PATCH] add a dog-ear-like icon at the above right corner of bookmarked page And tap the above right corner will toggle the bookmark on this page on/off. --- frontend/ui/reader/readerbookmark.lua | 62 +++++++++++++++++--------- frontend/ui/reader/readerdogear.lua | 16 +++++++ frontend/ui/reader/readermenu.lua | 2 +- frontend/ui/reader/readerview.lua | 44 +++++++++++------- resources/icons/dogear.png | Bin 0 -> 193 bytes 5 files changed, 84 insertions(+), 40 deletions(-) create mode 100644 frontend/ui/reader/readerdogear.lua create mode 100644 resources/icons/dogear.png diff --git a/frontend/ui/reader/readerbookmark.lua b/frontend/ui/reader/readerbookmark.lua index 5c17e4e7e..503f83468 100644 --- a/frontend/ui/reader/readerbookmark.lua +++ b/frontend/ui/reader/readerbookmark.lua @@ -18,13 +18,13 @@ end function ReaderBookmark:initGesListener() self.ges_events = { - AddBookmark = { + ToggleBookmark = { GestureRange:new{ - ges = "double_tap", + ges = "tap", range = Geom:new{ - x = Screen:getWidth()/2, y = 0, - w = Screen:getWidth()/2, - h = Screen:getHeight()/2 + x = Screen:getWidth()*7/8, y = 0, + w = Screen:getWidth()/8, + h = Screen:getHeight()/8 } } }, @@ -46,25 +46,35 @@ function ReaderBookmark:onSetDimensions(dimen) end end -function ReaderBookmark:onAddBookmark() +function ReaderBookmark:onToggleBookmark() local pn_or_xp = nil if self.ui.document.getXPointer then pn_or_xp = self.ui.document:getXPointer() else pn_or_xp = self.view.state.page end + self:toggleBookmark(pn_or_xp) + self.view.dogear_visible = not self.view.dogear_visible + UIManager:setDirty(self.view.dialog, "partial") +end - local noti_text = "Bookmark added." - if not self:addBookmark(pn_or_xp) then - noti_text = "Page already marked!" +function ReaderBookmark:setDogearVisibility(pn_or_xp) + if self:isBookmarked(pn_or_xp) then + self.ui:handleEvent(Event:new("SetDogearVisibility", true)) + else + self.ui:handleEvent(Event:new("SetDogearVisibility", false)) end - UIManager:show(Notification:new{ - text = noti_text, - timeout = 3 - }) - return true end +function ReaderBookmark:onPageUpdate(pageno) + self:setDogearVisibility(pageno) +end + +function ReaderBookmark:onPosUpdate(pos) + -- TODO: cannot check if this pos is bookmarked or not. +end + + function ReaderBookmark:onShowBookmark() -- build up item_table for k, v in ipairs(self.bookmarks) do @@ -119,16 +129,16 @@ function ReaderBookmark:addToMainMenu(item_table) }) end ---[[ -return nil if page already marked, otherwise, return true -for CREngine, bookmark page is xpointer instead of page number ---]] -function ReaderBookmark:addBookmark(pn_or_xp) +function ReaderBookmark:isBookmarked(pn_or_xp) for k,v in ipairs(self.bookmarks) do if v.page == pn_or_xp then - return nil + return true end end + return false +end + +function ReaderBookmark:addBookmark(pn_or_xp) -- build notes from TOC local notes = self.ui.toc:getTocTitleByPage(pn_or_xp) if notes ~= "" then @@ -144,10 +154,18 @@ function ReaderBookmark:addBookmark(pn_or_xp) return self:isBookmarkInSequence(a, b) end) return true -end +end function ReaderBookmark:isBookmarkInSequence(a, b) return a.page < b.page end - +function ReaderBookmark:toggleBookmark(pn_or_xp) + for k,v in ipairs(self.bookmarks) do + if v.page == pn_or_xp then + table.remove(self.bookmarks, k) + return + end + end + self:addBookmark(pn_or_xp) +end diff --git a/frontend/ui/reader/readerdogear.lua b/frontend/ui/reader/readerdogear.lua new file mode 100644 index 000000000..f8622f927 --- /dev/null +++ b/frontend/ui/reader/readerdogear.lua @@ -0,0 +1,16 @@ + +ReaderDogear = RightContainer:new{} + +function ReaderDogear:init() + local widget = ImageWidget:new{ + file = "resources/icons/dogear.png", + } + local icon_size = widget:getSize() + self.dimen = Geom:new{w = Screen:getWidth(), h = icon_size.h} + self[1] = widget +end + +function ReaderDogear:onSetDogearVisibility(visible) + self.view.dogear_visible = visible + return true +end \ No newline at end of file diff --git a/frontend/ui/reader/readermenu.lua b/frontend/ui/reader/readermenu.lua index 671e8dce6..05b613857 100644 --- a/frontend/ui/reader/readermenu.lua +++ b/frontend/ui/reader/readermenu.lua @@ -22,7 +22,7 @@ function ReaderMenu:initGesListener() ges = "tap", range = Geom:new{ x = 0, y = 0, - w = Screen:getWidth(), + w = Screen:getWidth()*7/8, h = Screen:getHeight()/4, } } diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index ef3cd2be8..ec0ce2b7a 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -1,6 +1,7 @@ require "ui/reader/readerfooter" +require "ui/reader/readerdogear" -ReaderView = WidgetContainer:new{ +ReaderView = OverlapGroup:new{ _name = "ReaderView", document = nil, @@ -26,19 +27,24 @@ ReaderView = WidgetContainer:new{ -- dimen for area to dim dim_area = Geom:new{w = 0, h = 0}, -- has footer - footer_visible = nil, + footer_visible = false, + -- has dogear + dogear_visible = false, } -function ReaderView:resetFooter() - if self.footer_visible then - self.footer = ReaderFooter:new{ - view = self, - } - self[1] = self.footer - else - self.footer = nil - self[1] = nil - end +function ReaderView:init() + self:resetLayout() +end + +function ReaderView:resetLayout() + self.dogear = ReaderDogear:new{ + view = self, + } + self.footer = ReaderFooter:new{ + view = self, + } + self[1] = self.dogear + self[2] = self.footer end function ReaderView:paintTo(bb, x, y) @@ -95,8 +101,12 @@ function ReaderView:paintTo(bb, x, y) self.dim_area.w, self.dim_area.h ) end + -- paint dogear + if self.dogear_visible then + self.dogear:paintTo(bb, x, y) + end -- paint footer - if self.footer then + if self.footer_visible then self.footer:paintTo(bb, x, y) end end @@ -176,9 +186,9 @@ end function ReaderView:onSetDimensions(dimensions) --DEBUG("set dimen", dimensions) - self:resetFooter() + self:resetLayout() self.dimen = dimensions - if self.footer then + if self.footer_visible then self.dimen.h = dimensions.h - self.footer.height end -- recalculate view @@ -187,7 +197,7 @@ end function ReaderView:onRestoreDimensions(dimensions) --DEBUG("restore dimen", dimensions) - self:resetFooter() + self:resetLayout() self.dimen = dimensions -- recalculate view self:recalculate() @@ -213,7 +223,7 @@ function ReaderView:onReadSettings(config) else self.footer_visible = full_screen == 0 and true or false end - self:resetFooter() + self:resetLayout() end function ReaderView:onPageUpdate(new_page_no) diff --git a/resources/icons/dogear.png b/resources/icons/dogear.png new file mode 100644 index 0000000000000000000000000000000000000000..293c9c6d8e75e6185c324f94bc25641263398162 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAj3?#R^_xk}Uwg8_HS5|iB-+zAzTyb^;iZCX5 zySp%Su*!M>Ih+L^k;Opm*Fl)kNn>^eP>{XE)7O>#E|UbC8E0k49VMWUqo<2w2*>s0 z3IG2$Hp+M0Y@8w4A=wzg(4qRu-r&TI`h*FS{~u5|&wu2tLybg-Jkv*Zg@1tu6#gG? gaQru)fmw)w!QDwF{CwkLTcBYKp00i_>zopr050k|eE