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.
This commit is contained in:
chrox
2013-02-24 19:49:23 +08:00
parent 781821b883
commit 3dfa9aa51d
5 changed files with 86 additions and 42 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

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

BIN
resources/icons/dogear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B