diff --git a/commands.lua b/commands.lua index 1d7064b03..abdb19cfe 100644 --- a/commands.lua +++ b/commands.lua @@ -162,5 +162,24 @@ function Commands:new(obj) end setmetatable(obj.map, mt) + obj:add(KEY_INTO_SCREEN_SAVER, nil, "slider", + "toggle screen saver", + function() + Screen:saveCurrentBB() + Screen.kpv_rotation_mode = Screen.cur_rotation_mode + fb:setOrientation(Screen.native_rotation_mode) + --os.execute("killall -cont cvm") + end + ) + obj:add(KEY_OUTOF_SCREEN_SAVER, nil, "slider", + "toggle screen saver", + function() + os.execute("sleep 3") + --os.execute("killall -stop cvm") + fb:setOrientation(Screen.kpv_rotation_mode) + Screen:resotreFromSavedBB() + fb:refresh(0) + end + ) return obj end diff --git a/filechooser.lua b/filechooser.lua index cb5a5aaf5..301cd052b 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -197,7 +197,7 @@ function FileChooser:choose(ypos, height) --]] return nil, function() FileSearcher:init( self.path ) - FileSearcher:choose(ypos, height, keywords) + FileSearcher:choose(keywords) end end pagedirty = true diff --git a/filesearcher.lua b/filesearcher.lua index 31ec6e371..0a86af39a 100644 --- a/filesearcher.lua +++ b/filesearcher.lua @@ -85,42 +85,141 @@ function FileSearcher:init(search_path) else self:setPath("/mnt/us/documents") end + self:addAllCommands() end +function FileSearcher:prevItem() + if self.current == 1 then + if self.page > 1 then + self.current = self.perpage + self.page = self.page - 1 + self.pagedirty = true + end + else + self.current = self.current - 1 + self.markerdirty = true + end +end -function FileSearcher:choose(ypos, height, keywords) - local perpage = math.floor(height / self.spacing) - 2 - local pagedirty = true - local markerdirty = false - - local prevItem = function () - if self.current == 1 then - if self.page > 1 then - self.current = perpage - self.page = self.page - 1 - pagedirty = true - end - else - self.current = self.current - 1 - markerdirty = true +function FileSearcher:nextItem() + if self.current == self.perpage then + if self.page < (self.items / self.perpage) then + self.current = 1 + self.page = self.page + 1 + self.pagedirty = true + end + else + if self.page ~= math.floor(self.items / self.perpage) + 1 + or self.current + (self.page-1)*self.perpage < self.items then + self.current = self.current + 1 + self.markerdirty = true end end +end - local nextItem = function () - if self.current == perpage then - if self.page < (self.items / perpage) then - self.current = 1 +function FileSearcher:addAllCommands() + self.commands = Commands:new{} + + self.commands:add(KEY_FW_UP, nil, "joypad up", + "goto previous item", + function(self) + self:prevItem() + end + ) + self.commands:add(KEY_FW_DOWN, nil, "joypad down", + "goto next item", + function(self) + self:nextItem() + end + ) + self.commands:add(KEY_PGFWD, nil, ">", + "next page", + function(self) + if self.page < (self.items / self.perpage) then + if self.current + self.page*self.perpage > self.items then + self.current = self.items - self.page*self.perpage + end self.page = self.page + 1 - pagedirty = true - end - else - if self.page ~= math.floor(self.items / perpage) + 1 - or self.current + (self.page-1)*perpage < self.items then - self.current = self.current + 1 - markerdirty = true + self.pagedirty = true + else + self.current = self.items - (self.page-1)*self.perpage + self.markerdirty = true end end - end + ) + self.commands:add(KEY_PGBCK, nil, "<", + "previous page", + function(self) + if self.page > 1 then + self.page = self.page - 1 + self.pagedirty = true + else + self.current = 1 + self.markerdirty = true + end + end + ) + self.commands:add(KEY_S, nil, "S", + "invoke search inputbox", + function(self) + old_keywords = keywords + keywords = InputBox:input(height-100, 100, "Search:", old_keywords) + if keywords then + self:setSearchResult(keywords) + else + keywords = old_keywords + end + self.pagedirty = true + end + ) + self.commands:add(KEY_F, nil, "F", + "font menu", + function(self) + fonts_menu = SelectMenu:new{ + menu_title = "Fonts Menu", + item_array = Font.fonts, + } + local re = fonts_menu:choose(0, height) + if re then + Font.cfont = Font.fonts[re] + Font:update() + end + self.pagedirty = true + end + ) + self.commands:add({KEY_ENTER, KEY_FW_PRESS}, nil, "", + "select item", + function(self) + file_entry = self.result[self.perpage*(self.page-1)+self.current] + file_full_path = file_entry.dir .. "/" .. file_entry.name + + -- rotation mode might be changed while reading, so + -- record height_percent here + local height_percent = height/fb.bb:getHeight() + openFile(file_full_path) + + --reset height and item index if screen has been rotated + local item_no = self.perpage * (self.page - 1) + self.current + self.perpage = math.floor(height / self.spacing) - 2 + self.current = item_no % self.perpage + self.page = math.floor(item_no / self.perpage) + 1 + + self.pagedirty = true + end + ) + self.commands:add({KEY_BACK, KEY_HOME}, nil, "", + "back to file browser", + function(self) + return "break" + end + ) +end + +function FileSearcher:choose(keywords) + self.perpage = math.floor(height / self.spacing) - 2 + self.pagedirty = true + self.markerdirty = false + -- if given keywords, set new result according to keywords. -- Otherwise, display the previous search result. @@ -133,28 +232,28 @@ function FileSearcher:choose(ypos, height, keywords) local tface, tfhash = Font:getFaceAndHash(25, Font.tfont) local fface, ffhash = Font:getFaceAndHash(16, Font.ffont) - if pagedirty then - markerdirty = true - fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) + if self.pagedirty then + self.markerdirty = true + fb.bb:paintRect(0, 0, width, height, 0) -- draw menu title - renderUtf8Text(fb.bb, 30, ypos + self.title_H, tface, tfhash, + renderUtf8Text(fb.bb, 30, 0 + self.title_H, tface, tfhash, "Search Result for: "..keywords, true) -- draw results local c if self.items == 0 then -- nothing found - y = ypos + self.title_H + self.spacing * 2 + y = self.title_H + self.spacing * 2 renderUtf8Text(fb.bb, 20, y, cface, cfhash, "Sorry, no match found.", true) renderUtf8Text(fb.bb, 20, y + self.spacing, cface, cfhash, "Please try a different keyword.", true) - markerdirty = false + self.markerdirty = false else -- found something, draw it - for c = 1, perpage do - local i = (self.page - 1) * perpage + c + for c = 1, self.perpage do + local i = (self.page - 1) * self.perpage + c if i <= self.items then - y = ypos + self.title_H + (self.spacing * c) + y = self.title_H + (self.spacing * c) renderUtf8Text(fb.bb, 50, y, cface, cfhash, self.result[i].name, true) end @@ -162,103 +261,59 @@ function FileSearcher:choose(ypos, height, keywords) end -- draw footer - y = ypos + self.title_H + (self.spacing * perpage) + self.foot_H - x = (fb.bb:getWidth() / 2) - 50 - all_page = (math.floor(self.items / perpage)+1) + y = self.title_H + (self.spacing * self.perpage) + self.foot_H + x = (width / 2) - 50 + all_page = (math.floor(self.items / self.perpage)+1) renderUtf8Text(fb.bb, x, y, fface, ffhash, "Page "..self.page.." of "..all_page, true) end - if markerdirty then - if not pagedirty then + if self.markerdirty then + if not self.pagedirty then if self.oldcurrent > 0 then - y = ypos + self.title_H + (self.spacing * self.oldcurrent) + 10 - fb.bb:paintRect(30, y, fb.bb:getWidth() - 60, 3, 0) - fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) + y = self.title_H + (self.spacing * self.oldcurrent) + 10 + fb.bb:paintRect(30, y, width - 60, 3, 0) + fb:refresh(1, 30, y, width - 60, 3) end end -- draw new marker line - y = ypos + self.title_H + (self.spacing * self.current) + 10 - fb.bb:paintRect(30, y, fb.bb:getWidth() - 60, 3, 15) - if not pagedirty then - fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) + y = self.title_H + (self.spacing * self.current) + 10 + fb.bb:paintRect(30, y, width - 60, 3, 15) + if not self.pagedirty then + fb:refresh(1, 30, y, width - 60, 3) end self.oldcurrent = self.current - markerdirty = false + self.markerdirty = false end - if pagedirty then - fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) - pagedirty = false + if self.pagedirty then + fb:refresh(0, 0, 0, width, height) + self.pagedirty = false end local ev = input.waitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then - if ev.code == KEY_FW_UP then - prevItem() - elseif ev.code == KEY_FW_DOWN then - nextItem() - elseif ev.code == KEY_PGFWD then - if self.page < (self.items / perpage) then - if self.current + self.page*perpage > self.items then - self.current = self.items - self.page*perpage - end - self.page = self.page + 1 - pagedirty = true - else - self.current = self.items - (self.page-1)*perpage - markerdirty = true - end - elseif ev.code == KEY_PGBCK then - if self.page > 1 then - self.page = self.page - 1 - pagedirty = true - else - self.current = 1 - markerdirty = true - end - elseif ev.code == KEY_S then - old_keywords = keywords - keywords = InputBox:input(height-100, 100, "Search:", old_keywords) - if keywords then - self:setSearchResult(keywords) - else - keywords = old_keywords - end - pagedirty = true - elseif ev.code == KEY_F then -- invoke fontchooser menu - fonts_menu = SelectMenu:new{ - menu_title = "Fonts Menu", - item_array = Font.fonts, - } - local re = fonts_menu:choose(0, height) - if re then - Font.cfont = Font.fonts[re] - Font:update() - end - pagedirty = true - elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then - file_entry = self.result[perpage*(self.page-1)+self.current] - file_full_path = file_entry.dir .. "/" .. file_entry.name + keydef = Keydef:new(ev.code, getKeyModifier()) + print("key pressed: "..tostring(keydef)) - -- rotation mode might be changed while reading, so - -- record height_percent here - local height_percent = height/fb.bb:getHeight() - openFile(file_full_path) - - --reset height and item index if screen has been rotated - local old_perpage = perpage - height = math.floor(fb.bb:getHeight()*height_percent) - perpage = math.floor(height / self.spacing) - 2 - self.current = (old_perpage * (self.page - 1) + - self.current) % perpage - self.page = math.floor(self.items / perpage) + 1 - - pagedirty = true - elseif ev.code == KEY_BACK or ev.code == KEY_HOME then - return nil + command = self.commands:getByKeydef(keydef) + if command ~= nil then + print("command to execute: "..tostring(command)) + ret_code = command.func(self, keydef) + else + print("command not found: "..tostring(command)) end - end - end + + if ret_code == "break" then + break + end + + if self.selected_item ~= nil then + print("# selected "..self.selected_item) + return self.selected_item + end + end -- EOF if + end -- EOF while + return nil end diff --git a/screen.lua b/screen.lua index 6d6022498..0ac639044 100644 --- a/screen.lua +++ b/screen.lua @@ -44,6 +44,8 @@ Screen = { -- these two variabls are used to help switching from framework to reader native_rotation_mode = nil, kpv_rotation_mode = nil, + + saved_bb = nil, } -- @orien: 1 for clockwise rotate, -1 for anti-clockwise @@ -74,3 +76,27 @@ function Screen:updateRotationMode() end end +function Screen:saveCurrentBB() + if not self.saved_bb then + self.saved_bb = Blitbuffer.new(width, height) + end + if self.saved_bb:getWidth() ~= width then + self.saved_bb:free() + self.saved_bb = Blitbuffer.new(width, height) + end + self.saved_bb:blitFullFrom(fb.bb) +end + +function Screen:resotreFromSavedBB() + self:restoreFromBB(self.saved_bb) +end + +function Screen:getCurrentScreenBB() + local bb = Blitbuffer.new(width, height) + bb:blitFullFrom(fb.bb) + return bb +end + +function Screen:restoreFromBB(bb) + fb.bb:blitFullFrom(bb) +end diff --git a/selectmenu.lua b/selectmenu.lua index c4ce67f45..9a7b6ec1e 100644 --- a/selectmenu.lua +++ b/selectmenu.lua @@ -85,8 +85,8 @@ function SelectMenu:addAllCommands() sm.current = sm.current - 1 sm.markerdirty = true end - end) - + end + ) self.commands:add(KEY_FW_DOWN, nil, "", "next item", function(sm) @@ -103,8 +103,8 @@ function SelectMenu:addAllCommands() sm.markerdirty = true end end - end) - + end + ) self.commands:add({KEY_PGFWD, KEY_LPGFWD}, nil, "", "next page", function(sm) @@ -118,8 +118,8 @@ function SelectMenu:addAllCommands() sm.current = sm.items - (sm.page - 1) * sm.perpage sm.markerdirty = true end - end) - + end + ) self.commands:add({KEY_PGBCK, KEY_LPGBCK}, nil, "", "previous page", function(sm) @@ -130,8 +130,8 @@ function SelectMenu:addAllCommands() sm.current = 1 sm.markerdirty = true end - end) - + end + ) self.commands:add(KEY_FW_PRESS, nil, "", "select menu item", function(sm) @@ -143,8 +143,8 @@ function SelectMenu:addAllCommands() + sm.current) end end - end) - + end + ) local KEY_Q_to_E = {} for i = KEY_Q, KEY_P do table.insert(KEY_Q_to_E, Keydef:new(i, nil, "")) @@ -154,8 +154,8 @@ function SelectMenu:addAllCommands() function(sm, keydef) sm.selected_item = sm:getItemIndexByShortCut( sm.item_shortcuts[ keydef.keycode - KEY_Q + 1 ], sm.perpage) - end) - + end + ) local KEY_A_to_L = {} for i = KEY_A, KEY_L do table.insert(KEY_A_to_L, Keydef:new(i, nil, "")) @@ -165,8 +165,8 @@ function SelectMenu:addAllCommands() function(sm, keydef) sm.selected_item = sm:getItemIndexByShortCut( sm.item_shortcuts[ keydef.keycode - KEY_A + 11 ], sm.perpage) - end) - + end + ) local KEY_Z_to_M = {} for i = KEY_Z, KEY_M do table.insert(KEY_Z_to_M, Keydef:new(i, nil, "")) @@ -176,38 +176,39 @@ function SelectMenu:addAllCommands() function(sm, keydef) sm.selected_item = sm:getItemIndexByShortCut( sm.item_shortcuts[ keydef.keycode - KEY_Z + 21 ], sm.perpage) - end) - + end + ) self.commands:add(KEY_DEL, nil, "", "Select menu item with del key as shortcut", function(sm) sm.selected_item = sm:getItemIndexByShortCut("Del", sm.perpage) - end) - + end + ) self.commands:add(KEY_DOT, nil, "", "Select menu item with dot key as shortcut", function(sm) sm.selected_item = sm:getItemIndexByShortCut(".", sm.perpage) - end) - + end + ) self.commands:add({KEY_SYM, KEY_SLASH}, nil, "", "Select menu item with sym/slash key as shortcut", function(sm) -- DXG has slash after dot sm.selected_item = sm:getItemIndexByShortCut("Sym", sm.perpage) - end) - + end + ) self.commands:add(KEY_ENTER, nil, "", "Select menu item with enter key as shortcut", function(sm) sm.selected_item = sm:getItemIndexByShortCut("Ent", sm.perpage) - end) - + end + ) self.commands:add(KEY_BACK, nil, "", "Exit menu", function(sm) return "break" - end) + end + ) end function SelectMenu:clearCommands() diff --git a/unireader.lua b/unireader.lua index 4c1353a09..bc5294a8e 100644 --- a/unireader.lua +++ b/unireader.lua @@ -1249,20 +1249,5 @@ function UniReader:addAllCommands() end end) -- end panning - self.commands:add(KEY_INTO_SCREEN_SAVER,nil,"slider", - "toggle screen saver", - function(unireader) - Screen.kpv_rotation_mode = Screen.cur_rotation_mode - fb:setOrientation(Screen.native_rotation_mode) - --os.execute("killall -cont cvm") - end) - self.commands:add(KEY_OUTOF_SCREEN_SAVER,nil,"slider", - "toggle screen saver", - function(unireader) - os.execute("sleep 3") - --os.execute("killall -stop cvm") - fb:setOrientation(Screen.kpv_rotation_mode) - unireader:redrawCurrentPage() - end) print("## defined commands "..dump(self.commands.map)) end