diff --git a/frontend/apps/filemanager/filemanagerfilesearcher.lua b/frontend/apps/filemanager/filemanagerfilesearcher.lua new file mode 100644 index 000000000..9b584b787 --- /dev/null +++ b/frontend/apps/filemanager/filemanagerfilesearcher.lua @@ -0,0 +1,157 @@ +local CenterContainer = require("ui/widget/container/centercontainer") +local InputContainer = require("ui/widget/container/inputcontainer") +local DocumentRegistry = require("document/documentregistry") +local InputDialog = require("ui/widget/inputdialog") +local InfoMessage = require("ui/widget/infomessage") +local lfs = require("libs/libkoreader-lfs") +local UIManager = require("ui/uimanager") +local Menu = require("ui/widget/menu") +local Screen = require("device").screen +local util = require("ffi/util") +local Font = require("ui/font") +local DEBUG = require("dbg") +local _ = require("gettext") + +local FileSearcher = InputContainer:new{ + search_dialog = nil, + + --filesearcher + -- state buffer + dirs = {}, + files = {}, + results = {}, + items = 0, + commands = nil, + + --filemanagersearch + use_previous_search_results = false, + lastsearch = nil, +} + +function FileSearcher:readDir() + self.dirs = {self.path} + DEBUG("self.path", self.path) + self.files = {} + while #self.dirs ~= 0 do + new_dirs = {} + -- handle each dir + for __, d in pairs(self.dirs) do + -- handle files in d + for f in lfs.dir(d) do + local fullpath = d.."/"..f + local attributes = lfs.attributes(fullpath) + if attributes.mode == "directory" and f ~= "." and f~=".." then + table.insert(new_dirs, d.."/"..f) + elseif attributes.mode == "file" and DocumentRegistry:getProvider(fullpath) then + table.insert(self.files, {name = f, path = fullpath, attr = attributes}) + end + end + end + self.dirs = new_dirs + end +end + +function FileSearcher:setSearchResults() + local ReaderUI = require("apps/reader/readerui") + local keywords = self.search_value + DEBUG("keywords", keywords) + DEBUG("self.files", self.files) + self.results = {} + if keywords == " " then -- one space to show all files + self.results = self.files + else + for __,f in pairs(self.files) do + DEBUG("f", f) + if string.find(string.lower(f.name), string.lower(keywords)) then + f.text = f.name + f.name = nil + f.callback = function() + ReaderUI:showReader(f.path) + end + table.insert(self.results, f) + end + end + end + DEBUG("self.results", self.results) + self.keywords = keywords + self.items = #self.results +end + +function FileSearcher:init(search_path) + self.path = search_path or lfs.currentdir() + --self.path = ('/home/frans/Dropbox') + self:showSearch() +end + +function FileSearcher:close() + if self.search_value then + self.search_dialog:onClose() + UIManager:close(self.search_dialog) + if string.len(self.search_value) > 0 then + self:readDir() -- TODO this probably doesn't need to be repeated once it's been done + self:setSearchResults() -- TODO doesn't have to be repeated if the search term is the same + self:showSearchResults() -- TODO something about no results + end + end +end + +function FileSearcher:showSearch() + local dummy = self.search_value + self.search_dialog = InputDialog:new{ + title = _("Search for books by filename"), + input = self.search_value, + buttons = { + { + { + text = _("Cancel"), + enabled = true, + callback = function() + self.search_dialog:onClose() + UIManager:close(self.search_dialog) + end, + }, + { + text = _("Find books"), + enabled = true, + callback = function() + self.search_value = self.search_dialog:getInputText() + if self.search_value == dummy then -- probably DELETE this if/else block + self.use_previous_search_results = true + else + self.use_previous_search_results = false + end + self:close() + end, + }, + }, + }, + width = Screen:getWidth() * 0.8, + height = Screen:getHeight() * 0.2, + } + self.search_dialog:onShowKeyboard() + UIManager:show(self.search_dialog) +end + +function FileSearcher:showSearchResults() + local ReaderUI = require("apps/reader/readerui") + local menu_container = CenterContainer:new{ + dimen = Screen:getSize(), + } + self.search_menu = Menu:new{ + width = Screen:getWidth()-15, + height = Screen:getHeight()-15, + show_parent = menu_container, + onMenuHold = self.onMenuHold, + cface = Font:getFace("cfont", 22), + _manager = self, + } + table.insert(menu_container, self.search_menu) + self.search_menu.close_callback = function() + UIManager:close(menu_container) + end + table.sort(self.results, function(v1,v2) return v1.text < v2.text end) + self.search_menu:swithItemTable(_("Search Results"), self.results) + UIManager:show(menu_container) +end + +return FileSearcher diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 7db2eaf72..7721c30e5 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -13,6 +13,7 @@ local Language = require("ui/language") local DEBUG = require("dbg") local _ = require("gettext") local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") +local FileSearcher = require("apps/filemanager/filemanagerfilesearcher") local Search = require("apps/filemanager/filemanagersearch") local SetDefaults = require("apps/filemanager/filemanagersetdefaults") @@ -176,7 +177,11 @@ function FileManagerMenu:setUpdateItemTable() text = _("Search books"), callback = function() Search:getCalibre() - Search:ShowSearch() + if Search.metafile_1 ~= nil then + Search:ShowSearch() + else -- fallback to filename search if no calibre metadata file + FileSearcher:init() + end end }) -- home tab