Merge pull request #768 from chrox/dogear_bookmark

show a dog-ear-like icon on bookmarked page
This commit is contained in:
{Qingping,Dave} Hou
2013-02-24 11:23:48 -08:00
7 changed files with 106 additions and 50 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,
}
}

View File

@@ -1,6 +1,7 @@
require "ui/reader/readerfooter"
require "ui/reader/readerdogear"
ReaderView = WidgetContainer:new{
ReaderView = OverlapGroup:new{
_name = "ReaderView",
document = nil,
@@ -13,7 +14,7 @@ ReaderView = WidgetContainer: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
@@ -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)

View File

@@ -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()

BIN
resources/icons/dogear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B