diff --git a/selectmenu.lua b/selectmenu.lua index e6d0b00bd..32728e9ab 100644 --- a/selectmenu.lua +++ b/selectmenu.lua @@ -37,6 +37,7 @@ SelectMenu = { "A", "S", "D", "F", "G", "H", "J", "K", "L", "Del", "Z", "X", "C", "V", "B", "N", "M", ".", "Sym", "Ent", }, + last_shortcut = 0, -- state buffer page = 1, current = 1, @@ -76,8 +77,9 @@ function SelectMenu:updateFont() end function SelectMenu:getItemIndexByShortCut(c, perpage) + if c == nil then return end -- unused key for _k,_v in ipairs(self.item_shortcuts) do - if _v == c then + if _v == c and _k <= self.last_shortcut then return (perpage * (self.page - 1) + _k) end end @@ -121,6 +123,7 @@ function SelectMenu:choose(ypos, height) end end + self.last_shortcut = 0 while true do if pagedirty then @@ -165,6 +168,8 @@ function SelectMenu:choose(ypos, height) self.item_shortcuts[c], true) end + self.last_shortcut = c + renderUtf8Text(fb.bb, 50, y, self.face, self.fhash, self.item_array[i], true) end @@ -204,6 +209,7 @@ function SelectMenu:choose(ypos, height) local ev = input.waitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then + local selected = nil if ev.code == KEY_FW_UP then prevItem() elseif ev.code == KEY_FW_DOWN then @@ -227,75 +233,33 @@ function SelectMenu:choose(ypos, height) self.current = 1 markerdirty = true end - elseif ev.code == KEY_FW_PRESS then + elseif ev.code == KEY_FW_PRESS or ev.code == KEY_ENTER and self.last_shortcut < 30 then if self.items == 0 then return nil else return (perpage*(self.page-1) + self.current) end - elseif ev.code == KEY_Q then - return self:getItemIndexByShortCut("Q", perpage) - elseif ev.code == KEY_W then - return self:getItemIndexByShortCut("W", perpage) - elseif ev.code == KEY_D then - return self:getItemIndexByShortCut("D", perpage) - elseif ev.code == KEY_E then - return self:getItemIndexByShortCut("E", perpage) - elseif ev.code == KEY_F then - return self:getItemIndexByShortCut("F", perpage) - elseif ev.code == KEY_G then - return self:getItemIndexByShortCut("G", perpage) - elseif ev.code == KEY_H then - return self:getItemIndexByShortCut("H", perpage) - elseif ev.code == KEY_I then - return self:getItemIndexByShortCut("I", perpage) - elseif ev.code == KEY_J then - return self:getItemIndexByShortCut("J", perpage) - elseif ev.code == KEY_K then - return self:getItemIndexByShortCut("K", perpage) - elseif ev.code == KEY_L then - return self:getItemIndexByShortCut("L", perpage) - elseif ev.code == KEY_A then - return self:getItemIndexByShortCut("A", perpage) - elseif ev.code == KEY_S then - return self:getItemIndexByShortCut("S", perpage) - elseif ev.code == KEY_O then - return self:getItemIndexByShortCut("O", perpage) - elseif ev.code == KEY_P then - return self:getItemIndexByShortCut("P", perpage) - elseif ev.code == KEY_R then - return self:getItemIndexByShortCut("R", perpage) - elseif ev.code == KEY_T then - return self:getItemIndexByShortCut("T", perpage) - elseif ev.code == KEY_U then - return self:getItemIndexByShortCut("U", perpage) - elseif ev.code == KEY_Y then - return self:getItemIndexByShortCut("Y", perpage) + elseif ev.code >= KEY_Q and ev.code <= KEY_P then + selected = self:getItemIndexByShortCut(self.item_shortcuts[ ev.code - KEY_Q + 1 ], perpage) + elseif ev.code >= KEY_A and ev.code <= KEY_L then + selected = self:getItemIndexByShortCut(self.item_shortcuts[ ev.code - KEY_A + 11], perpage) + elseif ev.code >= KEY_Z and ev.code <= KEY_M then + selected = self:getItemIndexByShortCut(self.item_shortcuts[ ev.code - KEY_Z + 21], perpage) elseif ev.code == KEY_DEL then - return self:getItemIndexByShortCut("Del", perpage) - elseif ev.code == KEY_Z then - return self:getItemIndexByShortCut("Z", perpage) - elseif ev.code == KEY_X then - return self:getItemIndexByShortCut("X", perpage) - elseif ev.code == KEY_C then - return self:getItemIndexByShortCut("C", perpage) - elseif ev.code == KEY_V then - return self:getItemIndexByShortCut("V", perpage) - elseif ev.code == KEY_B then - return self:getItemIndexByShortCut("B", perpage) - elseif ev.code == KEY_N then - return self:geTitemIndexByShortCut("N", perpage) - elseif ev.code == KEY_M then - return self:getItemIndexByShortCut("M", perpage) + selected = self:getItemIndexByShortCut("Del", perpage) elseif ev.code == KEY_DOT then - return self:getItemIndexByShortCut(".", perpage) + selected = self:getItemIndexByShortCut(".", perpage) elseif ev.code == KEY_SYM or ev.code == KEY_SLASH then -- DXG has slash after dot - return self:getItemIndexByShortCut("Sym", perpage) + selected = self:getItemIndexByShortCut("Sym", perpage) elseif ev.code == KEY_ENTER then - return self:getItemIndexByShortCut("Ent", perpage) + selected = self:getItemIndexByShortCut("Ent", perpage) elseif ev.code == KEY_BACK then return nil end + if selected ~= nil then + print("# selected "..selected) + return selected + end end end end