From 781821b8834e158a9d237a8a75c8eea0a890bb07 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 24 Feb 2013 19:37:55 +0800 Subject: [PATCH 1/4] bugfix: use pageno from listened events other than the page in view state As the view state may not be updated yet when PageUpdate event is triggered. --- frontend/ui/reader/readerfooter.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/ui/reader/readerfooter.lua b/frontend/ui/reader/readerfooter.lua index 09bde9821..ddb72eeaf 100644 --- a/frontend/ui/reader/readerfooter.lua +++ b/frontend/ui/reader/readerfooter.lua @@ -43,21 +43,22 @@ function ReaderFooter:init() } } self.dimen = self[1]:getSize() - self:update() + self.pageno = self.view.state.page + self.pages = self.view.document.info.number_of_pages + self:updateFooter() end function ReaderFooter:paintTo(bb, x, y) self[1]:paintTo(bb, x, y) end -function ReaderFooter:update() - self.pageno = self.view.state.page - self.pages = self.view.document.info.number_of_pages +function ReaderFooter:updateFooter() self.progress_bar.percentage = self.pageno / self.pages self.progress_text.text = string.format("%d / %d", self.pageno, self.pages) end function ReaderFooter:onPageUpdate(pageno) self.pageno = pageno - self:update() + self.pages = self.view.document.info.number_of_pages + self:updateFooter() end From 3dfa9aa51d47f9594884e20de67abdf0c63d0c86 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 24 Feb 2013 19:49:23 +0800 Subject: [PATCH 2/4] 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 | 66 ++++++++++++++++---------- 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, 86 insertions(+), 42 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 - - local noti_text = "Bookmark added." - if not self:addBookmark(pn_or_xp) then - noti_text = "Page already marked!" - end - UIManager:show(Notification:new{ - text = noti_text, - timeout = 3 - }) - return true + self:toggleBookmark(pn_or_xp) + self.view.dogear_visible = not self.view.dogear_visible + UIManager:setDirty(self.view.dialog, "partial") end +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 +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 Date: Sun, 24 Feb 2013 20:44:55 +0800 Subject: [PATCH 3/4] set page background color to white in pdf/djvu reader --- frontend/ui/reader/readerview.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index ec0ce2b7a..1a3e54ac2 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -14,7 +14,7 @@ ReaderView = OverlapGroup:new{ offset = nil, bbox = nil, }, - outer_page_color = 7, + outer_page_color = 0, -- DjVu page rendering mode (used in djvu.c:drawPage()) render_mode = 0, -- default to COLOR -- Crengine view mode From 1ecbb69ab2d517f7fbb75bd7d8ca5784d2a47b6c Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 24 Feb 2013 20:48:42 +0800 Subject: [PATCH 4/4] do full refresh every six page turning/rolling --- frontend/ui/ui.lua | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/ui/ui.lua b/frontend/ui/ui.lua index aac25681e..bc63d977f 100644 --- a/frontend/ui/ui.lua +++ b/frontend/ui/ui.lua @@ -19,7 +19,10 @@ UIManager = { -- force to repaint all the widget is stack, will be reset to false -- after each ui loop repaint_all = false, - + -- trigger a full refresh when counter reaches FULL_REFRESH_COUNT + FULL_REFRESH_COUNT = 6, + refresh_count = 0, + _running = true, _window_stack = {}, _execution_stack = {}, @@ -162,11 +165,12 @@ function UIManager:run() -- repaint dirty widgets local dirty = false + local full_refresh = false for _, widget in ipairs(self._window_stack) do if self.repaint_all or self._dirty[widget.widget] then widget.widget:paintTo(Screen.bb, widget.x, widget.y) if self._dirty[widget.widget] == "full" then - self.refresh_type = 0 + full_refresh = true end -- and remove from list after painting self._dirty[widget.widget] = nil @@ -177,10 +181,17 @@ function UIManager:run() self.repaint_all = false if dirty then + if self.refresh_count == self.FULL_REFRESH_COUNT - 1 then + self.refresh_type = 0 + else + self.refresh_type = 1 + end -- refresh FB Screen:refresh(self.refresh_type) -- TODO: refresh explicitly only repainted area -- reset refresh_type self.refresh_type = 1 + -- increase refresh_count only when full refresh is requested + self.refresh_count = (self.refresh_count + (full_refresh and 1 or 0))%self.FULL_REFRESH_COUNT end self:checkTasks()