Merge pull request #124 from houqp/master

rewrite jump stack and add bookmark feature
pull/2/merge
Dobrica Pavlinušić 12 years ago
commit 632820c051

@ -168,14 +168,15 @@ function Commands:new(obj)
Screen:saveCurrentBB()
Screen.kpv_rotation_mode = Screen.cur_rotation_mode
fb:setOrientation(Screen.native_rotation_mode)
--os.execute("killall -cont cvm")
util.sleep(1)
os.execute("killall -cont cvm")
end
)
obj:add(KEY_OUTOF_SCREEN_SAVER, nil, "Slider",
"toggle screen saver",
function()
util.sleep(3)
--os.execute("killall -stop cvm")
util.usleep(1500000)
os.execute("killall -stop cvm")
fb:setOrientation(Screen.kpv_rotation_mode)
Screen:restoreFromSavedBB()
fb:refresh(0)

@ -138,8 +138,9 @@ function FileChooser:choose(ypos, height)
renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, self.files[i-#self.dirs], true)
end
end
all_page = math.ceil(self.items/perpage)
renderUtf8Text(fb.bb, 5, ypos + self.spacing * perpage + 42, fface,
"Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true)
"Page "..self.page.." of "..all_page, true)
local msg = self.exception_message and self.exception_message:match("[^%:]+:%d+: (.*)") or "Path: "..self.path
self.exception_message = nil
renderUtf8Text(fb.bb, 5, ypos + self.spacing * (perpage+1) + 27, fface, msg, true)

@ -262,7 +262,7 @@ function FileSearcher:choose(keywords)
-- draw footer
y = self.title_H + (self.spacing * self.perpage) + self.foot_H
x = (G_width / 2) - 50
all_page = (math.floor(self.items / self.perpage)+1)
all_page = math.ceil(self.items/self.perpage)
renderUtf8Text(fb.bb, x, y, fface,
"Page "..self.page.." of "..all_page, true)
end

@ -18,6 +18,9 @@ if test "$1" == "--framework_stop"; then
/etc/init.d/framework stop
fi
# stop cvm
killall -stop cvm
# finally call reader
./reader.lua "$1" 2> /mnt/us/kindlepdfviewer/crash.log || cat /mnt/us/kindlepdfviewer/crash.log

@ -53,8 +53,8 @@ function openFile(filename)
if ok then
reader:loadSettings(filename)
page_num = reader:getLastPageOrPos()
reader:goto(tonumber(page_num))
reader_settings:savesetting("lastfile", filename)
reader:goto(tonumber(page_num), true)
reader_settings:saveSetting("lastfile", filename)
return reader:inputLoop()
else
InfoMessage:show("Error opening document.", 0)
@ -160,7 +160,7 @@ end
-- save reader settings
reader_settings:savesetting("fontmap", Font.fontmap)
reader_settings:saveSetting("fontmap", Font.fontmap)
reader_settings:close()
-- @TODO dirty workaround, find a way to force native system poll
@ -169,6 +169,6 @@ fb:setOrientation(Screen.native_rotation_mode)
input.closeAll()
if util.isEmulated()==0 then
--os.execute("killall -cont cvm")
os.execute("killall -cont cvm")
os.execute('echo "send '..KEY_MENU..'" > /proc/keypad;echo "send '..KEY_MENU..'" > /proc/keypad')
end

@ -100,5 +100,9 @@ function Screen:getCurrentScreenBB()
end
function Screen:restoreFromBB(bb)
fb.bb:blitFullFrom(bb)
if bb then
fb.bb:blitFullFrom(bb)
else
debug("Got nil bb in restoreFromSavedBB!")
end
end

@ -13,10 +13,14 @@ function DocSettings:readSetting(key)
return self.data[key]
end
function DocSettings:savesetting(key, value)
function DocSettings:saveSetting(key, value)
self.data[key] = value
end
function DocSettings:delSetting(key)
self.data[key] = nil
end
function dump(data)
local out = {}
DocSettings:_serialize(data, out, 0)

@ -79,7 +79,10 @@ UniReader = {
pagehash = nil,
jump_stack = {},
-- we use array to simluate two stacks,
-- one for backwards, one for forwards
jump_history = {cur = 1},
bookmarks = {},
highlight = {},
toc = nil,
@ -914,8 +917,26 @@ function UniReader:loadSettings(filename)
self.globalgamma = gamma
end
local jumpstack = self.settings:readSetting("jumpstack")
self.jump_stack = jumpstack or {}
local jump_history = self.settings:readSetting("jump_history")
if jump_history then
self.jump_history = jump_history
else
self.jump_history = {cur = 1}
end
local bookmarks = self.settings:readSetting("bookmarks")
self.bookmarks = bookmarks or {}
-- clear obselate jumpstack settings
-- move jump_stack to bookmarks incase users used
-- it as bookmark feature before.
local jump_stack = self.settings:readSetting("jumpstack")
if jump_stack then
if #self.bookmarks == 0 then
self.bookmarks = jump_stack
end
self.settings:delSetting("jumpstack")
end
local highlight = self.settings:readSetting("highlight")
self.highlight = highlight or {}
@ -938,7 +959,7 @@ function UniReader:getLastPageOrPos()
end
function UniReader:saveLastPageOrPos()
self.settings:savesetting("last_page", self.pageno)
self.settings:saveSetting("last_page", self.pageno)
end
-- guarantee that we have enough memory in cache
@ -1312,69 +1333,85 @@ function UniReader:isSamePage(p1, p2)
end
--[[
@ pageno is the page you want to add to jump_stack
@ pageno is the page you want to add to jump_history, this will
clear the forward stack since pageno is the new head.
NOTE: for CREReader, pageno refers to xpointer
--]]
function UniReader:addJump(pageno, notes)
local jump_item = nil
local notes_to_add = notes
if not notes_to_add then
-- no notes given, auto generate from Toc entry
notes_to_add = self:getTocTitleOfCurrentPage()
if notes_to_add ~= "" then
notes_to_add = "in "..notes_to_add
end
end
-- move pageno page to jump_stack top if already in
for _t,_v in ipairs(self.jump_stack) do
if self:isSamePage(_v.page, pageno) then
jump_item = _v
table.remove(self.jump_stack, _t)
-- if original notes is not empty, probably defined by users,
-- we use the original notes to overwrite auto generated notes
-- from Toc entry
if jump_item.notes ~= "" then
notes_to_add = jump_item.notes
end
jump_item.notes = notes or notes_to_add
break
function UniReader:addJump(pageno)
-- build notes from TOC
local notes = self:getTocTitleOfCurrentPage()
if notes ~= "" then
notes = "in "..notes
end
-- create a head
jump_item = {
page = pageno,
datetime = os.date("%Y-%m-%d %H:%M:%S"),
notes = notes,
}
-- clear forward stack if it is not empty
if self.jump_history.cur < #self.jump_history then
for i=self.jump_history.cur+1, #self.jump_history do
self.jump_history[i] = nil
end
end
-- create a new one if page not found in stack
if not jump_item then
jump_item = {
page = pageno,
datetime = os.date("%Y-%m-%d %H:%M:%S"),
notes = notes_to_add,
}
-- keep the size less than 10
if #self.jump_history > 10 then
table.remove(self.jump_history)
end
-- insert item at the start
table.insert(self.jump_stack, 1, jump_item)
if #self.jump_stack > 10 then
-- remove the last element to keep the size less than 10
table.remove(self.jump_stack)
-- set up new head
-- if backward stack top is the same as page to record, remove it
if #self.jump_history ~= 0 and
self.jump_history[#self.jump_history].page == pageno then
self.jump_history[#self.jump_history] = nil
end
table.insert(self.jump_history, jump_item)
self.jump_history.cur = #self.jump_history + 1
return true
end
function UniReader:delJump(pageno)
for _t,_v in ipairs(self.jump_stack) do
for _t,_v in ipairs(self.jump_history) do
if _v.page == pageno then
table.remove(self.jump_stack, _t)
table.remove(self.jump_history, _t)
end
end
end
-- return nil if page already marked
-- otherwise, return true
function UniReader:addBookmark(pageno)
for k,v in ipairs(self.bookmarks) do
if v.page == pageno then
return nil
end
end
-- build notes from TOC
local notes = self:getTocTitleOfCurrentPage()
if notes ~= "" then
notes = "in "..notes
end
mark_item = {
page = pageno,
datetime = os.date("%Y-%m-%d %H:%M:%S"),
notes = notes,
}
table.insert(self.bookmarks, mark_item)
return true
end
-- change current page and cache next page after rendering
function UniReader:goto(no)
function UniReader:goto(no, is_ignore_jump)
if no < 1 or no > self.doc:getPages() then
return
end
-- for jump_stack, distinguish jump from normal page turn
if self.pageno and math.abs(self.pageno - no) > 1 then
self:addJump(self.pageno)
-- for jump_history
if not is_ignore_jump then
-- distinguish jump from normal page turn
if self.pageno and math.abs(self.pageno - no) > 1 then
self:addJump(self.pageno)
end
end
self.pageno = no
@ -1554,25 +1591,60 @@ function UniReader:showToc()
end
end
function UniReader:showJumpStack()
function UniReader:showJumpHist()
local menu_items = {}
for k,v in ipairs(self.jump_stack) do
for k,v in ipairs(self.jump_history) do
if k == self.jump_history.cur then
cur_sign = "*(Cur) "
else
cur_sign = ""
end
table.insert(menu_items,
v.datetime.." -> Page "..v.page.." "..v.notes)
cur_sign..v.datetime.." -> Page "..v.page.." "..v.notes)
end
if #menu_items == 0 then
showInfoMsgWithDelay(
"No jump history found.", 2000, 1)
showInfoMsgWithDelay("No jump history found.", 2000, 1)
else
-- if cur points to head, draw entry for current page
if self.jump_history.cur > #self.jump_history then
table.insert(menu_items,
"Current Page "..self.pageno)
end
jump_menu = SelectMenu:new{
menu_title = "Jump Keeper (current page: "..self.pageno..")",
menu_title = "Jump History",
item_array = menu_items,
}
item_no = jump_menu:choose(0, fb.bb:getHeight())
if item_no and item_no <= #self.jump_history then
local jump_item = self.jump_history[item_no]
self.jump_history.cur = item_no
self:goto(jump_item.page, true)
else
self:redrawCurrentPage()
end
end
end
function UniReader:showBookMarks()
local menu_items = {}
-- build menu items
for k,v in ipairs(self.bookmarks) do
table.insert(menu_items,
"Page "..v.page.." "..v.notes.." @ "..v.datetime)
end
if #menu_items == 0 then
showInfoMsgWithDelay(
"No bookmark found.", 2000, 1)
else
toc_menu = SelectMenu:new{
menu_title = "Bookmarks",
item_array = menu_items,
}
item_no = toc_menu:choose(0, fb.bb:getHeight())
if item_no then
local jump_item = self.jump_stack[item_no]
self:goto(jump_item.page)
self:goto(self.bookmarks[item_no].page)
else
self:redrawCurrentPage()
end
@ -1700,12 +1772,13 @@ function UniReader:inputLoop()
end
if self.settings ~= nil then
self:saveLastPageOrPos()
self.settings:savesetting("gamma", self.globalgamma)
self.settings:savesetting("jumpstack", self.jump_stack)
self.settings:savesetting("bbox", self.bbox)
self.settings:savesetting("globalzoom", self.globalzoom)
self.settings:savesetting("globalzoommode", self.globalzoommode)
self.settings:savesetting("highlight", self.highlight)
self.settings:saveSetting("gamma", self.globalgamma)
self.settings:saveSetting("jump_history", self.jump_history)
self.settings:saveSetting("bookmarks", self.bookmarks)
self.settings:saveSetting("bbox", self.bbox)
self.settings:saveSetting("globalzoom", self.globalzoom)
self.settings:saveSetting("globalzoommode", self.globalzoommode)
self.settings:saveSetting("highlight", self.highlight)
self:saveSpecialSettings()
self.settings:close()
end
@ -1734,10 +1807,25 @@ function UniReader:addAllCommands()
unireader:setGlobalZoom(unireader.globalzoom + (keydef.keycode==KEY_PGBCK and -1 or 1)*unireader.globalzoom_orig*0.2)
end)
self.commands:add(KEY_BACK,nil,"Back",
"back to last jump",
"go backward in jump history",
function(unireader)
if #unireader.jump_stack ~= 0 then
unireader:goto(unireader.jump_stack[1].page)
local prev_jump_no = unireader.jump_history.cur - 1
if prev_jump_no >= 1 then
unireader.jump_history.cur = prev_jump_no
unireader:goto(unireader.jump_history[prev_jump_no].page, true)
else
showInfoMsgWithDelay("Already first jump!", 2000, 1)
end
end)
self.commands:add(KEY_BACK,MOD_SHIFT,"Back",
"go forward in jump history",
function(unireader)
local next_jump_no = unireader.jump_history.cur + 1
if next_jump_no <= #self.jump_history then
unireader.jump_history.cur = next_jump_no
unireader:goto(unireader.jump_history[next_jump_no].page, true)
else
showInfoMsgWithDelay("Already last jump!", 2000, 1)
end
end)
self.commands:add(KEY_BACK,MOD_ALT,"Back",
@ -1832,14 +1920,24 @@ function UniReader:addAllCommands()
unireader:showToc()
end)
self.commands:add(KEY_B,nil,"B",
"show jump stack",
"show book marks",
function(unireader)
unireader:showBookMarks()
end)
self.commands:add(KEY_B,MOD_ALT,"B",
"add book mark to current page",
function(unireader)
unireader:showJumpStack()
ok = unireader:addBookmark(self.pageno)
if not ok then
showInfoMsgWithDelay("Page already marked!", 2000, 1)
else
showInfoMsgWithDelay("Page marked.", 2000, 1)
end
end)
self.commands:add(KEY_B,MOD_SHIFT,"B",
"add jump",
"show jump history",
function(unireader)
unireader:addJump(unireader.pageno)
unireader:showJumpHist()
end)
self.commands:add(KEY_J,MOD_SHIFT,"J",
"rotate 10° clockwise",
@ -1897,15 +1995,13 @@ function UniReader:addAllCommands()
unireader.bbox.enabled = true
debug("bbox", unireader.pageno, unireader.bbox)
unireader.globalzoommode = unireader.ZOOM_FIT_TO_CONTENT -- use bbox
showInfoMsgWithDelay(
"Manual crop setting saved.", 2000, 1)
showInfoMsgWithDelay("Manual crop setting saved.", 2000, 1)
end)
self.commands:add(KEY_Z,MOD_SHIFT,"Z",
"reset crop",
function(unireader)
unireader.bbox[unireader.pageno] = nil;
showInfoMsgWithDelay(
"Manual crop setting removed.", 2000, 1)
showInfoMsgWithDelay("Manual crop setting removed.", 2000, 1)
debug("bbox remove", unireader.pageno, unireader.bbox);
end)
self.commands:add(KEY_Z,MOD_ALT,"Z",
@ -1913,11 +2009,9 @@ function UniReader:addAllCommands()
function(unireader)
unireader.bbox.enabled = not unireader.bbox.enabled;
if unireader.bbox.enabled then
showInfoMsgWithDelay(
"Manual crop enabled.", 2000, 1)
showInfoMsgWithDelay("Manual crop enabled.", 2000, 1)
else
showInfoMsgWithDelay(
"Manual crop disabled.", 2000, 1)
showInfoMsgWithDelay("Manual crop disabled.", 2000, 1)
end
debug("bbox override", unireader.bbox.enabled);
end)

Loading…
Cancel
Save