diff --git a/filechooser.lua b/filechooser.lua index 6137863b4..ecec641a3 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -188,10 +188,15 @@ function FileChooser:choose(ypos, height) end pagedirty = true elseif ev.code == KEY_S then - input = InputBox:input(height-100, 100) - print(input) - --FileSeacher:init() - --FileSeacher:choose(0, height) + keywords = InputBox:input(height-100, 100, "Search:") + if keywords then + -- display search result according to keywords + FileSearcher:init() + file = FileSearcher:choose(ypos, height, keywords) + if file then + return file + end + end pagedirty = true elseif ev.code == KEY_PGFWD then if self.page < (self.items / perpage) then diff --git a/fileseacher.lua b/fileseacher.lua deleted file mode 100644 index 137ce4621..000000000 --- a/fileseacher.lua +++ /dev/null @@ -1,161 +0,0 @@ -require "rendertext" -require "keys" -require "graphics" - -FileSeacher = { - -- font for displaying file/dir names - face = freetype.newBuiltinFace("sans", 25), - fhash = "s25", - -- font for page title - tface = freetype.newBuiltinFace("Helvetica-BoldOblique", 32), - tfhash = "hbo32", - -- font for paging display - sface = freetype.newBuiltinFace("sans", 16), - sfhash = "s16", - -- title height - title_H = 45, - -- spacing between lines - spacing = 40, - -- foot height - foot_H = 27, - - x_input = 50, - -- state buffer - fonts = {"sans", "cjk", "mono", - "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", - "Helvetica", "Helvetica-Oblique", "Helvetica-BoldOblique", - "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",}, - items = 14, - page = 1, - current = 2, - oldcurrent = 1, -} - -function FileSeacher:init() - self.items = #self.fonts - --@TODO check this 17.02 2012 - self.face = freetype.newBuiltinFace("sans", 25), - table.sort(self.fonts) -end - - -function FileSeacher:choose(ypos, height) - 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 - end - end - - local nextItem = function () - if self.current == perpage then - if self.page < (self.items / perpage) then - self.current = 1 - 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 - end - end - end - - - while true do - if pagedirty then - fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) - - -- draw menu title - renderUtf8Text(fb.bb, 30, ypos + self.title_H, self.tface, self.tfhash, - "[ Fonts Menu ]", true) - - local c - for c = 1, perpage do - local i = (self.page - 1) * perpage + c - if i <= self.items then - y = ypos + self.title_H + (self.spacing * c) - renderUtf8Text(fb.bb, 50, y, self.face, self.fhash, self.fonts[i], true) - end - end - y = ypos + self.title_H + (self.spacing * perpage) + self.foot_H - x = (fb.bb:getWidth() / 2) - 50 - renderUtf8Text(fb.bb, x, y, self.sface, self.sfhash, - "Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true) - markerdirty = true - end - - if markerdirty then - if not 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) - 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) - end - self.oldcurrent = self.current - markerdirty = false - end - - if pagedirty then - fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) - pagedirty = false - end - - local ev = input.waitForEvent() - 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_F then - self.x_input = self.x_input + 10 - y = ypos + self.title_H + (self.spacing) - renderUtf8Text(fb.bb, self.x_input, y, self.face, self.fhash, "f", true) - fb:refresh(1, x_input, ypos, fb.bb:getWidth(), height) - elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then - local newface = self.fonts[perpage*(self.page-1)+self.current] - return newface - elseif ev.code == KEY_BACK then - return nil - end - end - end -end diff --git a/filesearcher.lua b/filesearcher.lua index 3f819e941..ac37e5dfe 100644 --- a/filesearcher.lua +++ b/filesearcher.lua @@ -1,60 +1,43 @@ require "rendertext" require "keys" require "graphics" -require "fontchooser" -require "inputbox" FileSearcher = { - -- Class vars: - -- font for displaying file/dir names face = freetype.newBuiltinFace("sans", 25), fhash = "s25", + -- font for page title + tface = freetype.newBuiltinFace("Helvetica-BoldOblique", 32), + tfhash = "hbo32", -- font for paging display sface = freetype.newBuiltinFace("sans", 16), sfhash = "s16", + -- title height + title_H = 45, -- spacing between lines spacing = 40, + -- foot height + foot_H = 27, -- state buffer - dirs = nil, - files = nil, - items = 0, - path = "", + fonts = {"sans", "cjk", "mono", + "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", + "Helvetica", "Helvetica-Oblique", "Helvetica-BoldOblique", + "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",}, + items = 14, page = 1, - current = 1, - oldcurrent = 0, + current = 2, + oldcurrent = 1, } -function FileSearcher:readdir() - self.dirs = {} - self.files = {} - for f in lfs.dir(self.path) do - if lfs.attributes(self.path.."/"..f, "mode") == "directory" and f ~= "." and not string.match(f, "^%.[^.]") then - table.insert(self.dirs, f) - elseif string.match(f, ".+%.[pP][dD][fF]$") then - table.insert(self.files, f) - end - end - table.sort(self.dirs) - table.sort(self.files) -end - -function FileSearcher:setPath(newPath) - self.path = newPath - self:readdir() - self.items = #self.dirs + #self.files - if self.items == 0 then - return nil - end - self.page = 1 - self.current = 1 - return true +function FileSearcher:init() + self.items = #self.fonts + table.sort(self.fonts) end -function FileSearcher:choose(ypos, height) - local perpage = math.floor(height / self.spacing) - 1 +function FileSearcher:choose(ypos, height, keywords) + local perpage = math.floor(height / self.spacing) - 2 local pagedirty = true local markerdirty = false @@ -87,59 +70,59 @@ function FileSearcher:choose(ypos, height) end end + while true do if pagedirty then fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) + + -- draw menu title + renderUtf8Text(fb.bb, 30, ypos + self.title_H, self.tface, self.tfhash, + "Search Result for "..keywords, true) + local c for c = 1, perpage do - local i = (self.page - 1) * perpage + c - if i <= #self.dirs then - -- resembles display in midnight commander: adds "/" prefix for directories - renderUtf8Text(fb.bb, 39, ypos + self.spacing*c, self.face, self.fhash, "/", true) - renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, self.face, self.fhash, self.dirs[i], true) - elseif i <= self.items then - renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, self.face, self.fhash, self.files[i-#self.dirs], true) + local i = (self.page - 1) * perpage + c + if i <= self.items then + y = ypos + self.title_H + (self.spacing * c) + renderUtf8Text(fb.bb, 50, y, self.face, self.fhash, self.fonts[i], true) end end - renderUtf8Text(fb.bb, 39, ypos + self.spacing * perpage + 32, self.sface, self.sfhash, + y = ypos + self.title_H + (self.spacing * perpage) + self.foot_H + x = (fb.bb:getWidth() / 2) - 50 + renderUtf8Text(fb.bb, x, y, self.sface, self.sfhash, "Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true) markerdirty = true end + if markerdirty then if not pagedirty then if self.oldcurrent > 0 then - fb.bb:paintRect(30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3, 0) - fb:refresh(1, 30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3) + 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) end end - fb.bb:paintRect(30, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3, 15) + -- 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, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3) + fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) end self.oldcurrent = self.current markerdirty = false end + if pagedirty then fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) pagedirty = false end + local ev = input.waitForEvent() if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then - ev.code = adjustFWKey(ev.code) if ev.code == KEY_FW_UP then prevItem() elseif ev.code == KEY_FW_DOWN then nextItem() - elseif ev.code == KEY_F then - FontChooser:init() - newfont = FontChooser:choose(0, height) - if newfont ~= nil then - self.face = freetype.newBuiltinFace(newfont, 25) - clearglyphcache() - end - pagedirty = true - elseif ev.code == KEY_S then - InputBox:input() elseif ev.code == KEY_PGFWD then if self.page < (self.items / perpage) then if self.current + self.page*perpage > self.items then @@ -160,17 +143,8 @@ function FileSearcher:choose(ypos, height) markerdirty = true end elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then - local newdir = self.dirs[perpage*(self.page-1)+self.current] - if newdir == ".." then - local path = string.gsub(self.path, "(.*)/[^/]+/?$", "%1") - self:setPath(path) - elseif newdir then - local path = self.path.."/"..newdir - self:setPath(path) - else - return self.path.."/"..self.files[perpage*(self.page-1)+self.current - #self.dirs] - end - pagedirty = true + local newface = self.fonts[perpage*(self.page-1)+self.current] + return newface elseif ev.code == KEY_BACK then return nil end diff --git a/inputbox.lua b/inputbox.lua index a8647adc9..aaf2a5f9c 100644 --- a/inputbox.lua +++ b/inputbox.lua @@ -63,7 +63,7 @@ function InputBox:delChar() self.input_string = self.input_string:sub(0,-2) end -function InputBox:input(ypos, height) +function InputBox:input(ypos, height, title) local pagedirty = true self.input_start_y = ypos + 35 self.input_cur_x = self.input_start_x @@ -77,7 +77,7 @@ function InputBox:input(ypos, height) -- draw input slot fb.bb:paintRect(140, ypos + 10, w - 130, h - 20, self.input_bg) renderUtf8Text(fb.bb, 35, self.input_start_y, self.face, self.fhash, - "Search:", true) + title, true) markerdirty = true end @@ -149,11 +149,15 @@ function InputBox:input(ypos, height) elseif ev.code == KEY_PGFWD then elseif ev.code == KEY_PGBCK then elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then - return self.input_string + if self.input_string == "" then + return nil + else + return self.input_string + end elseif ev.code == KEY_DEL then self:delChar() elseif ev.code == KEY_BACK then - return "" + return nil end end end