From 07e17125b5fa7b18625bdc7fad98c64b89933b8b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 27 May 2012 14:03:13 +0800 Subject: [PATCH 1/3] add select callback to menu and bug fix in shortcut --- frontend/ui/dialog.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/frontend/ui/dialog.lua b/frontend/ui/dialog.lua index 3e679b426..75d85e4ea 100644 --- a/frontend/ui/dialog.lua +++ b/frontend/ui/dialog.lua @@ -416,9 +416,8 @@ Menu = FocusManager:new{ item_height = 36, page = 1, - current = 1, - oldcurrent = 0, - selected_item = nil, + + on_select_callback = function() end, } function Menu:init() @@ -440,6 +439,7 @@ function Menu:init() if self.is_enable_shortcut then self.key_events.SelectByShortCut = { {self.item_shortcuts} } end + self.key_events.Select = { {"Press"}, doc = "select current menu item"} self[1] = CenterContainer:new{ dimen = {w = G_width, h = G_height}, @@ -506,15 +506,17 @@ end function Menu:onSelectByShortCut(_, keyevent) for k,v in ipairs(self.item_shortcuts) do - if v == keyevent.key then + if k > self.perpage then + break + elseif v == keyevent.key then local item = self.item_table[k] self.item_table = nil UIManager:close(self) - debug(item) - -- send events + self.on_select_callback(item) break end end + return true end function Menu:onNextPage() @@ -553,6 +555,12 @@ function Menu:onShowItemDetail() ) end +function Menu:onSelect() + UIManager:close(self) + self.on_select_callback(self.item_table[self.selected.y]) + return true +end + function Menu:onClose() UIManager:close(self) return true From 284d5ce9d90b726ba188c0b3d0c31d3287ddd88d Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 27 May 2012 19:44:37 +0800 Subject: [PATCH 2/3] two bug fixes in menu widget * update page info * item shortcut support in all pages --- frontend/ui/dialog.lua | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/frontend/ui/dialog.lua b/frontend/ui/dialog.lua index 75d85e4ea..19e9a4450 100644 --- a/frontend/ui/dialog.lua +++ b/frontend/ui/dialog.lua @@ -442,7 +442,6 @@ function Menu:init() self.key_events.Select = { {"Press"}, doc = "select current menu item"} self[1] = CenterContainer:new{ - dimen = {w = G_width, h = G_height}, FrameContainer:new{ background = 0, radius = math.floor(self.width/20), @@ -460,6 +459,7 @@ function Menu:init() }, }, -- VerticalGroup }, -- FrameContainer + dimen = {w = G_width, h = G_height}, } -- CenterContainer self:_updateItems() @@ -467,7 +467,10 @@ end function Menu:_updateItems() self.layout = {} - self[1][1][1][2] = VerticalGroup:new{} + self[1] + [1] -- FrameContainer + [1] -- VerticalGroup + [2] = VerticalGroup:new{} local item_group = self[1][1][1][2] for c = 1, self.perpage do @@ -509,7 +512,7 @@ function Menu:onSelectByShortCut(_, keyevent) if k > self.perpage then break elseif v == keyevent.key then - local item = self.item_table[k] + local item = self.item_table[(self.page-1)*self.perpage+k] self.item_table = nil UIManager:close(self) self.on_select_callback(item) @@ -525,10 +528,7 @@ function Menu:onNextPage() self.page = self.page + 1 self:_updateItems() self.selected = { x = 1, y = 1 } - self[1][1][1][3] = TextWidget:new{ - text = "page "..self.page.."/"..self.page_num, - face = self.fface, - }, + self[1][1][1][3].text = "page "..self.page.."/"..self.page_num UIManager:setDirty(self) end return true @@ -540,10 +540,7 @@ function Menu:onPrevPage() self.page = self.page - 1 self:_updateItems() self.selected = { x = 1, y = 1 } - self[1][1][1][3] = TextWidget:new{ - text = "page "..self.page.."/"..self.page_num, - face = self.fface, - }, + self[1][1][1][3].text = "page "..self.page.."/"..self.page_num UIManager:setDirty(self) end return true From cf048e286d5f29fb835d64291004067d89c48603 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 27 May 2012 19:47:22 +0800 Subject: [PATCH 3/3] add toc menu support for readerui --- frontend/document/document.lua | 4 ++++ frontend/ui/reader/readertoc.lua | 36 ++++++++++++++++++++++++++++++++ frontend/ui/readerui.lua | 7 +++++++ 3 files changed, 47 insertions(+) create mode 100644 frontend/ui/reader/readertoc.lua diff --git a/frontend/document/document.lua b/frontend/document/document.lua index e4527c15d..3d96d7592 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -92,6 +92,10 @@ function Document:getPageDimensions(pageno, zoom, rotation) return native_dimen end +function Document:getToc() + return self._document:getToc() +end + -- load implementations: require "document/pdfdocument" diff --git a/frontend/ui/reader/readertoc.lua b/frontend/ui/reader/readertoc.lua new file mode 100644 index 000000000..815b6003b --- /dev/null +++ b/frontend/ui/reader/readertoc.lua @@ -0,0 +1,36 @@ +ReaderToc = InputContainer:new{ + key_events = { + ShowToc = { {"T"}, doc = "show Table of Content menu"}, + }, + dimen = Geom:new{ w = G_width-20, h = G_height-20}, +} + +function ReaderToc:cleanUpTocTitle(title) + return title:gsub("\13", "") +end + +function ReaderToc:onSetDimensions(dimen) + self.dimen = dimen +end + +function ReaderToc:onShowToc() + function callback(item) + self.ui:handleEvent(Event:new("PageUpdate", item.page)) + end + + local items = self.ui.document:getToc() + -- build menu items + for _,v in ipairs(items) do + v.text = (" "):rep(v.depth-1)..self:cleanUpTocTitle(v.title) + end + toc_menu = Menu:new{ + title = "Table of Contents", + item_table = items, + width = self.dimen.w, + height = self.dimen.h, + on_select_callback = callback, + } + + UIManager:show(toc_menu) +end + diff --git a/frontend/ui/readerui.lua b/frontend/ui/readerui.lua index 30b18d75d..593f24293 100644 --- a/frontend/ui/readerui.lua +++ b/frontend/ui/readerui.lua @@ -4,6 +4,7 @@ require "ui/reader/readerzooming" require "ui/reader/readerpanning" require "ui/reader/readerrotation" require "ui/reader/readerpaging" +require "ui/reader/readertoc" --[[ This is an abstraction for a reader interface @@ -54,6 +55,12 @@ function ReaderUI:init() view = self[1], ui = self } + -- Toc menu controller + self[5] = ReaderToc:new{ + dialog = self.dialog, + view = self[1], + ui = self + } -- if needed, insert a paging container if self.document.info.has_pages then local pager = ReaderPaging:new{