add new sorting methods for file list in filemanager

Now files can be sorted by filename or last accessed time
pull/1073/head
chrox 10 years ago
parent 84029e9694
commit a32991d898

@ -148,6 +148,16 @@ function FileManager:toggleHiddenFiles()
G_reader_settings:saveSetting("show_hidden", self.file_chooser.show_hidden) G_reader_settings:saveSetting("show_hidden", self.file_chooser.show_hidden)
end end
function FileManager:setCollate(collate)
self.file_chooser:setCollate(collate)
G_reader_settings:saveSetting("collate", self.file_chooser.collate)
end
function FileManager:toggleReverseCollate()
self.file_chooser:toggleReverseCollate()
G_reader_settings:saveSetting("reverse_collate", self.file_chooser.reverse_collate)
end
function FileManager:onClose() function FileManager:onClose()
DEBUG("close filemanager") DEBUG("close filemanager")
UIManager:close(self) UIManager:close(self)
@ -222,4 +232,31 @@ function FileManager:deleteFile(file)
util.execute("/bin/rm", "-r", util.realpath(file)) util.execute("/bin/rm", "-r", util.realpath(file))
end end
local collates = {
strcoll = _("Title"),
access = _("Recent"),
}
function FileManager:getSortingMenuTable()
local fm = self
local set_collate_table = function(collate)
return {
text = collates[collate],
checked_func = function()
return fm.file_chooser.collate == collate
end,
callback = function() fm:setCollate(collate) end,
}
end
return {
text_func = function()
return _("Sorting: ") .. collates[fm.file_chooser.collate]
end,
sub_item_table = {
set_collate_table("strcoll"),
set_collate_table("access"),
}
}
end
return FileManager return FileManager

@ -96,11 +96,15 @@ function FileManagerMenu:setUpdateItemTable()
table.insert(self.tab_item_table.setting, { table.insert(self.tab_item_table.setting, {
text = _("Show hidden files"), text = _("Show hidden files"),
checked_func = function() return self.ui.file_chooser.show_hidden end, checked_func = function() return self.ui.file_chooser.show_hidden end,
callback = function() callback = function() self.ui:toggleHiddenFiles() end
self.ui:toggleHiddenFiles() })
end local FileManager = require("apps/filemanager/filemanager")
table.insert(self.tab_item_table.setting, self.ui:getSortingMenuTable())
table.insert(self.tab_item_table.setting, {
text = _("Reverse sorting"),
checked_func = function() return self.ui.file_chooser.reverse_collate end,
callback = function() self.ui:toggleReverseCollate() end
}) })
table.insert(self.tab_item_table.setting, { table.insert(self.tab_item_table.setting, {
text = _("Start with last opened file"), text = _("Start with last opened file"),
checked_func = function() return G_reader_settings:readSetting("open_last") end, checked_func = function() return G_reader_settings:readSetting("open_last") end,

@ -25,7 +25,9 @@ local FileChooser = Menu:extend{
show_hidden = nil, show_hidden = nil,
filter = function(filename) return true end, filter = function(filename) return true end,
exclude_dirs = {"%.sdr$"}, exclude_dirs = {"%.sdr$"},
collate = strcoll, strcoll = strcoll,
collate = "strcoll", -- or collate = "access",
reverse_collate = false,
} }
function FileChooser:init() function FileChooser:init()
@ -37,7 +39,7 @@ function FileChooser:init()
return true return true
end end
-- disable string collating in Kobo devices. See issue koreader/koreader#686 -- disable string collating in Kobo devices. See issue koreader/koreader#686
if Device:isKobo() then self.collate = nil end if Device:isKobo() then self.strcoll = nil end
self.item_table = self:genItemTableFromPath(self.path) self.item_table = self:genItemTableFromPath(self.path)
Menu.init(self) -- call parent's init() Menu.init(self) -- call parent's init()
end end
@ -52,26 +54,45 @@ function FileChooser:genItemTableFromPath(path)
for f in iter, dir_obj do for f in iter, dir_obj do
if self.show_hidden or not string.match(f, "^%.[^.]") then if self.show_hidden or not string.match(f, "^%.[^.]") then
local filename = self.path.."/"..f local filename = self.path.."/"..f
local filemode = lfs.attributes(filename, "mode") local attributes = lfs.attributes(filename)
if filemode == "directory" and f ~= "." and f~=".." then if attributes.mode == "directory" and f ~= "." and f~=".." then
if self.dir_filter(filename) then if self.dir_filter(filename) then
table.insert(dirs, f) table.insert(dirs, {name = f, attr = attributes})
end end
elseif filemode == "file" then elseif attributes.mode == "file" then
if self.file_filter(filename) then if self.file_filter(filename) then
table.insert(files, f) table.insert(files, {name = f, attr = attributes})
end end
end end
end end
end end
end end
table.sort(dirs, self.collate)
if path ~= "/" then table.insert(dirs, 1, "..") end local sorting = nil
table.sort(files, self.collate) local reverse = self.reverse_collate
if self.collate == "strcoll" then
sorting = self.strcoll and function(a, b)
return self.strcoll(a.name, b.name) == not reverse
end or function(a, b)
return (a.name < b.name) == not reverse
end
elseif self.collate == "access" then
sorting = function(a, b)
if reverse then
return a.attr.access < b.attr.access
else
return a.attr.access > b.attr.access
end
end
end
table.sort(dirs, sorting)
if path ~= "/" then table.insert(dirs, 1, {name = ".."}) end
table.sort(files, sorting)
local item_table = {} local item_table = {}
for i, dir in ipairs(dirs) do for i, dir in ipairs(dirs) do
local path = self.path.."/"..dir local path = self.path.."/"..dir.name
local items = 0 local items = 0
local ok, iter, dir_obj = pcall(lfs.dir, path) local ok, iter, dir_obj = pcall(lfs.dir, path)
if ok then if ok then
@ -83,13 +104,13 @@ function FileChooser:genItemTableFromPath(path)
end end
local istr = items .. (items > 1 and _(" items") or _(" item")) local istr = items .. (items > 1 and _(" items") or _(" item"))
table.insert(item_table, { table.insert(item_table, {
text = dir.."/", text = dir.name.."/",
mandatory = istr, mandatory = istr,
path = path path = path
}) })
end end
for _, file in ipairs(files) do for _, file in ipairs(files) do
local full_path = self.path.."/"..file local full_path = self.path.."/"..file.name
local file_size = lfs.attributes(full_path, "size") or 0 local file_size = lfs.attributes(full_path, "size") or 0
local sstr = "" local sstr = ""
if file_size > 1024*1024 then if file_size > 1024*1024 then
@ -100,7 +121,7 @@ function FileChooser:genItemTableFromPath(path)
sstr = string.format("%d B", file_size) sstr = string.format("%d B", file_size)
end end
table.insert(item_table, { table.insert(item_table, {
text = file, text = file.name,
mandatory = sstr, mandatory = sstr,
path = full_path path = full_path
}) })
@ -133,6 +154,16 @@ function FileChooser:toggleHiddenFiles()
self:refreshPath() self:refreshPath()
end end
function FileChooser:setCollate(collate)
self.collate = collate
self:refreshPath()
end
function FileChooser:toggleReverseCollate()
self.reverse_collate = not self.reverse_collate
self:refreshPath()
end
function FileChooser:onMenuSelect(item) function FileChooser:onMenuSelect(item)
-- parent directory of dir without permission get nil mode -- parent directory of dir without permission get nil mode
-- we need to change to parent path in this case -- we need to change to parent path in this case

Loading…
Cancel
Save