From 3205f228d3fc6e85186a277ef2ab371df946b343 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 17 Dec 2013 19:51:07 +0800 Subject: [PATCH 1/4] partial refresh when switching time display in progress bar --- frontend/ui/reader/readerfooter.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/reader/readerfooter.lua b/frontend/ui/reader/readerfooter.lua index a3b4abe23..6d97a6802 100644 --- a/frontend/ui/reader/readerfooter.lua +++ b/frontend/ui/reader/readerfooter.lua @@ -93,7 +93,7 @@ end function ReaderFooter:onTapFooter(arg, gev) self.show_time = not self.show_time self:updateFooter() - UIManager:setDirty(self.view.dialog) + UIManager:setDirty(self.view.dialog, "partial") -- consume this tap when footer is visible if self.visible then return true From f0039cbb025d205b8db63760b3a36c92af9f6317 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 17 Dec 2013 19:53:43 +0800 Subject: [PATCH 2/4] customizable tap zones for page flipping and bookmarking --- defaults.lua | 4 +++- frontend/ui/reader/readerbookmark.lua | 23 +------------------ frontend/ui/reader/readerdogear.lua | 33 +++++++++++++++++++++++---- frontend/ui/reader/readerflipping.lua | 33 +++++++++++++++++++++++---- frontend/ui/reader/readerpaging.lua | 10 -------- frontend/ui/reader/readerview.lua | 2 ++ 6 files changed, 64 insertions(+), 41 deletions(-) diff --git a/defaults.lua b/defaults.lua index 0b75ca58a..991713d67 100644 --- a/defaults.lua +++ b/defaults.lua @@ -43,9 +43,11 @@ DSHOWHIDDENFILES = false -- y: y coordinate of top left corner in proportion of screen height -- w: width of tap zone in proportion of screen width -- h: height of tap zone in proportion of screen height +DTAP_ZONE_CONFIG = {x = 0, y = 11/12, w = 1, h = 1/12} DTAP_ZONE_FORWARD = {x = 1/4, y = 0, w = 3/4, h = 1} DTAP_ZONE_BACKWARD = {x = 0, y = 0, w = 1/4, h = 1} -DTAP_ZONE_CONFIG = {x = 0, y = 11/12, w = 1, h = 1/12} +DTAP_ZONE_BOOKMARK = {x = 7/8, y = 0, w = 1/8, h = 1/8} +DTAP_ZONE_FLIPPING = {x = 0, y = 0, w = 1/8, h = 1/8} -- koptreader config defaults DKOPTREADER_CONFIG_FONT_SIZE = 1.0 -- range from 0.1 to 3.0 diff --git a/frontend/ui/reader/readerbookmark.lua b/frontend/ui/reader/readerbookmark.lua index caffc97f5..aa5332ae2 100644 --- a/frontend/ui/reader/readerbookmark.lua +++ b/frontend/ui/reader/readerbookmark.lua @@ -25,21 +25,6 @@ function ReaderBookmark:init() self.ui.menu:registerToMainMenu(self) end -function ReaderBookmark:initGesListener() - self.ges_events = { - ToggleBookmark = { - GestureRange:new{ - ges = "tap", - range = Geom:new{ - x = Screen:getWidth()*7/8, y = 0, - w = Screen:getWidth()/8, - h = Screen:getHeight()/8 - } - } - }, - } -end - function ReaderBookmark:onReadSettings(config) self.bookmarks = config:readSetting("bookmarks") or {} end @@ -48,13 +33,6 @@ function ReaderBookmark:onCloseDocument() self.ui.doc_settings:saveSetting("bookmarks", self.bookmarks) end -function ReaderBookmark:onSetDimensions(dimen) - -- update listening according to new screen dimen - if Device:isTouchDevice() then - self:initGesListener() - end -end - function ReaderBookmark:onToggleBookmark() local pn_or_xp = nil if self.ui.document.getXPointer then @@ -65,6 +43,7 @@ function ReaderBookmark:onToggleBookmark() self:toggleBookmark(pn_or_xp) self.view.dogear_visible = not self.view.dogear_visible UIManager:setDirty(self.view.dialog, "partial") + return true end function ReaderBookmark:setDogearVisibility(pn_or_xp) diff --git a/frontend/ui/reader/readerdogear.lua b/frontend/ui/reader/readerdogear.lua index d9b2695e2..fa8e0197b 100644 --- a/frontend/ui/reader/readerdogear.lua +++ b/frontend/ui/reader/readerdogear.lua @@ -1,17 +1,42 @@ +local InputContainer = require("ui/widget/container/inputcontainer") local RightContainer = require("ui/widget/container/rightcontainer") local ImageWidget = require("ui/widget/imagewidget") +local GestureRange = require("ui/gesturerange") +local Device = require("ui/device") local Geom = require("ui/geometry") local Screen = require("ui/screen") +local Event = require("ui/event") -local ReaderDogear = RightContainer:new{} +local ReaderDogear = InputContainer: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 + self[1] = RightContainer:new{ + dimen = Geom:new{w = Screen:getWidth(), h = widget:getSize().h}, + widget, + } + if Device:isTouchDevice() then + self.ges_events = { + Tap = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_BOOKMARK.x, + y = Screen:getHeight()*DTAP_ZONE_BOOKMARK.y, + w = Screen:getWidth()*DTAP_ZONE_BOOKMARK.w, + h = Screen:getHeight()*DTAP_ZONE_BOOKMARK.h + } + } + } + } + end +end + +function ReaderDogear:onTap() + self.ui:handleEvent(Event:new("ToggleBookmark")) + return true end function ReaderDogear:onSetDogearVisibility(visible) diff --git a/frontend/ui/reader/readerflipping.lua b/frontend/ui/reader/readerflipping.lua index a60742caf..14aad03c3 100644 --- a/frontend/ui/reader/readerflipping.lua +++ b/frontend/ui/reader/readerflipping.lua @@ -1,9 +1,13 @@ +local InputContainer = require("ui/widget/container/inputcontainer") local LeftContainer = require("ui/widget/container/leftcontainer") local ImageWidget = require("ui/widget/imagewidget") +local GestureRange = require("ui/gesturerange") +local Device = require("ui/device") local Geom = require("ui/geometry") local Screen = require("ui/screen") +local Event = require("ui/event") -local ReaderFlipping = LeftContainer:new{ +local ReaderFlipping = InputContainer:new{ orig_reflow_mode = 0, } @@ -11,9 +15,30 @@ function ReaderFlipping:init() local widget = ImageWidget:new{ file = "resources/icons/appbar.book.open.png", } - local icon_size = widget:getSize() - self.dimen = Geom:new{w = Screen:getWidth(), h = icon_size.h} - self[1] = widget + self[1] = LeftContainer:new{ + dimen = Geom:new{w = Screen:getWidth(), h = widget:getSize().h}, + widget, + } + if Device:isTouchDevice() then + self.ges_events = { + Tap = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_FLIPPING.x, + y = Screen:getHeight()*DTAP_ZONE_FLIPPING.y, + w = Screen:getWidth()*DTAP_ZONE_FLIPPING.w, + h = Screen:getHeight()*DTAP_ZONE_FLIPPING.h + } + } + } + } + end +end + +function ReaderFlipping:onTap() + self.ui:handleEvent(Event:new("ToggleFlipping")) + return true end function ReaderFlipping:onSetFlippingMode(flipping_mode) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 28f632ef0..5c6647bbd 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -80,16 +80,6 @@ function ReaderPaging:initGesListener() } } }, - ToggleFlipping = { - GestureRange:new{ - ges = "tap", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth()/8, - h = Screen:getHeight()/8 - } - } - }, Swipe = { GestureRange:new{ ges = "swipe", diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index e56ac0b65..973994504 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -68,6 +68,7 @@ end function ReaderView:resetLayout() self.dogear = ReaderDogear:new{ view = self, + ui = self.ui, } self.footer = ReaderFooter:new{ view = self, @@ -75,6 +76,7 @@ function ReaderView:resetLayout() } self.flipping = ReaderFlipping:new{ view = self, + ui = self.ui, } self[1] = self.dogear self[2] = self.footer From da317ed14a404d5adca46bdd44c1023cc73248eb Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 17 Dec 2013 20:11:34 +0800 Subject: [PATCH 3/4] customizable tap zones for top menu --- defaults.lua | 1 + frontend/ui/reader/readermenu.lua | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/defaults.lua b/defaults.lua index 991713d67..ad8112228 100644 --- a/defaults.lua +++ b/defaults.lua @@ -43,6 +43,7 @@ DSHOWHIDDENFILES = false -- y: y coordinate of top left corner in proportion of screen height -- w: width of tap zone in proportion of screen width -- h: height of tap zone in proportion of screen height +DTAP_ZONE_MENU = {x = 1/8, y = 0, w = 3/4, h = 1/4} DTAP_ZONE_CONFIG = {x = 0, y = 11/12, w = 1, h = 1/12} DTAP_ZONE_FORWARD = {x = 1/4, y = 0, w = 3/4, h = 1} DTAP_ZONE_BACKWARD = {x = 0, y = 0, w = 1/4, h = 1} diff --git a/frontend/ui/reader/readermenu.lua b/frontend/ui/reader/readermenu.lua index 70f0391d1..ee789b226 100644 --- a/frontend/ui/reader/readermenu.lua +++ b/frontend/ui/reader/readermenu.lua @@ -52,10 +52,10 @@ function ReaderMenu:initGesListener() GestureRange:new{ ges = "tap", range = Geom:new{ - x = Screen:getWidth()/8, - y = 0, - w = Screen:getWidth()*3/4, - h = Screen:getHeight()/4, + x = Screen:getWidth()*DTAP_ZONE_MENU.x, + y = Screen:getHeight()*DTAP_ZONE_MENU.y, + w = Screen:getWidth()*DTAP_ZONE_MENU.w, + h = Screen:getHeight()*DTAP_ZONE_MENU.h } } }, From 93866822d0bc2d9f98d2cc91ef23d399eb34145c Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 17 Dec 2013 22:42:25 +0800 Subject: [PATCH 4/4] always show progress bar in flipping mode tap on progress bar in flipping mode will goto corresponding page --- frontend/ui/reader/readerflipping.lua | 13 ------------- frontend/ui/reader/readerfooter.lua | 16 ++++++++++++---- frontend/ui/reader/readerpaging.lua | 27 +++++++++++++++++++++++++++ frontend/ui/reader/readerview.lua | 1 + frontend/ui/widget/progresswidget.lua | 6 ++++++ 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/frontend/ui/reader/readerflipping.lua b/frontend/ui/reader/readerflipping.lua index 14aad03c3..a6a3b9e70 100644 --- a/frontend/ui/reader/readerflipping.lua +++ b/frontend/ui/reader/readerflipping.lua @@ -41,17 +41,4 @@ function ReaderFlipping:onTap() return true end -function ReaderFlipping:onSetFlippingMode(flipping_mode) - if flipping_mode then - self.orig_reflow_mode = self.view.document.configurable.text_wrap - self.orig_scroll_mode = self.view.page_scroll - self.view.document.configurable.text_wrap = 0 - self.view.page_scroll = false - else - self.view.document.configurable.text_wrap = self.orig_reflow_mode - self.view.page_scroll = self.orig_scroll_mode - end - return true -end - return ReaderFlipping diff --git a/frontend/ui/reader/readerfooter.lua b/frontend/ui/reader/readerfooter.lua index 6d97a6802..9ff00ddb8 100644 --- a/frontend/ui/reader/readerfooter.lua +++ b/frontend/ui/reader/readerfooter.lua @@ -11,6 +11,7 @@ local UIManager = require("ui/uimanager") local Device = require("ui/device") local Screen = require("ui/screen") local Geom = require("ui/geometry") +local Event = require("ui/event") local Font = require("ui/font") local DEBUG = require("dbg") @@ -21,8 +22,8 @@ local ReaderFooter = InputContainer:new{ progress_percentage = 0.0, progress_text = "0 / 0", show_time = false, - bar_width = 0.88, - text_width = 0.12, + bar_width = 0.85, + text_width = 0.15, text_font_face = "ffont", text_font_size = 14, height = 19, @@ -90,8 +91,15 @@ function ReaderFooter:onPageUpdate(pageno) self:updateFooter() end -function ReaderFooter:onTapFooter(arg, gev) - self.show_time = not self.show_time +function ReaderFooter:onTapFooter(arg, ges) + if self.view.flipping_visible then + local pos = ges.pos + local dimen = self.progress_bar.dimen + local percentage = (pos.x - dimen.x)/dimen.w + self.ui:handleEvent(Event:new("GotoPercentage", percentage)) + else + self.show_time = not self.show_time + end self:updateFooter() UIManager:setDirty(self.view.dialog, "partial") -- consume this tap when footer is visible diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 5c6647bbd..023d807bb 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -176,17 +176,37 @@ function ReaderPaging:onToggleFlipping() self.view.flipping_visible = not self.view.flipping_visible self.flipping_mode = self.view.flipping_visible self.flipping_page = self.current_page + if self.flipping_mode then self:updateOriginalPage(self.current_page) + self:enterFlippingMode() else self:updateOriginalPage(nil) + self:exitFlippingMode() end + self.view:resetLayout() self.ui:handleEvent(Event:new("SetFlippingMode", self.flipping_mode)) self.ui:handleEvent(Event:new("SetHinting", not self.flipping_mode)) self.ui:handleEvent(Event:new("ReZoom")) UIManager:setDirty(self.view.dialog, "partial") end +function ReaderPaging:enterFlippingMode() + self.orig_reflow_mode = self.view.document.configurable.text_wrap + self.orig_footer_mode = self.view.footer_visible + self.orig_scroll_mode = self.view.page_scroll + + self.view.document.configurable.text_wrap = 0 + self.view.page_scroll = false + self.view.footer_visible = true +end + +function ReaderPaging:exitFlippingMode() + self.view.document.configurable.text_wrap = self.orig_reflow_mode + self.view.page_scroll = self.orig_scroll_mode + self.view.footer_visible = self.orig_footer_mode +end + function ReaderPaging:updateOriginalPage(page) self.original_page = page end @@ -675,4 +695,11 @@ function ReaderPaging:onGotoPage(number) return true end +function ReaderPaging:onGotoPercentage(percentage) + if percentage < 0 then percentage = 0 end + if percentage > 1 then percentage = 1 end + self:gotoPage(math.floor(percentage*self.number_of_pages)) + return true +end + return ReaderPaging diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 973994504..12573bf18 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -72,6 +72,7 @@ function ReaderView:resetLayout() } self.footer = ReaderFooter:new{ view = self, + ui = self.ui, visible = self.footer_visible, } self.flipping = ReaderFlipping:new{ diff --git a/frontend/ui/widget/progresswidget.lua b/frontend/ui/widget/progresswidget.lua index e93efb98c..9042d6a6d 100644 --- a/frontend/ui/widget/progresswidget.lua +++ b/frontend/ui/widget/progresswidget.lua @@ -1,4 +1,5 @@ local Widget = require("ui/widget/widget") +local Geom = require("ui/geometry") --[[ ProgressWidget shows a progress bar @@ -22,6 +23,11 @@ end function ProgressWidget:paintTo(bb, x, y) local my_size = self:getSize() + self.dimen = Geom:new{ + x = x, y = y, + w = my_size.w, + h = my_size.h + } bb:paintRoundedRect(x, y, my_size.w, my_size.h, self.bgcolor, self.radius) bb:paintBorder(x, y, my_size.w, my_size.h, self.bordersize, self.bordercolor, self.radius)