mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Allow sorting of dictionaries
This commit is contained in:
@@ -12,6 +12,7 @@ local KeyValuePage = require("ui/widget/keyvaluepage")
|
||||
local LuaData = require("luadata")
|
||||
local MultiConfirmBox = require("ui/widget/multiconfirmbox")
|
||||
local NetworkMgr = require("ui/network/manager")
|
||||
local SortWidget = require("ui/widget/sortwidget")
|
||||
local Trapper = require("ui/trapper")
|
||||
local UIManager = require("ui/uimanager")
|
||||
local ffiUtil = require("ffi/util")
|
||||
@@ -28,11 +29,6 @@ local lookup_history = nil
|
||||
|
||||
local function getIfosInDir(path)
|
||||
-- Get all the .ifo under directory path.
|
||||
-- We use the same logic as sdcv to walk directories and ifos files
|
||||
-- (so we get them in the order sdcv queries them) :
|
||||
-- - No sorting, entries are processed in the order the dir_read_name() call
|
||||
-- returns them (inodes linked list)
|
||||
-- - If entry is a directory, Walk in it first and recurse
|
||||
-- Don't walk into "res/" subdirectories, as per Stardict specs, they
|
||||
-- may contain possibly many resource files (image, audio files...)
|
||||
-- that could slow down our walk here.
|
||||
@@ -138,6 +134,12 @@ function ReaderDictionary:init()
|
||||
end
|
||||
logger.dbg("found", #available_ifos, "dictionaries")
|
||||
|
||||
if not G_reader_settings:readSetting("dicts_order") then
|
||||
G_reader_settings:saveSetting("dicts_order", {})
|
||||
end
|
||||
|
||||
self:sortAvailableIfos()
|
||||
|
||||
if not G_reader_settings:readSetting("dicts_disabled") then
|
||||
-- Create an empty dict for this setting, so that we can
|
||||
-- access and update it directly through G_reader_settings
|
||||
@@ -145,30 +147,42 @@ function ReaderDictionary:init()
|
||||
G_reader_settings:saveSetting("dicts_disabled", {})
|
||||
end
|
||||
end
|
||||
-- Prepare the -u options to give to sdcv if some dictionaries are disabled
|
||||
-- Prepare the -u options to give to sdcv the dictionary order and if some are disabled
|
||||
self:updateSdcvDictNamesOptions()
|
||||
if not lookup_history then
|
||||
lookup_history = LuaData:open(DataStorage:getSettingsDir() .. "/lookup_history.lua", { name = "LookupHistory" })
|
||||
end
|
||||
end
|
||||
|
||||
function ReaderDictionary:sortAvailableIfos()
|
||||
local dicts_order = G_reader_settings:readSetting("dicts_order")
|
||||
|
||||
table.sort(available_ifos, function(lifo, rifo)
|
||||
local lord = dicts_order[lifo.file]
|
||||
local rord = dicts_order[rifo.file]
|
||||
|
||||
-- Both ifos without an explicit position -> lexical comparison
|
||||
if lord == rord then
|
||||
return ffiUtil.strcoll(lifo.name, rifo.name)
|
||||
end
|
||||
|
||||
-- Ifos without an explicit position come last.
|
||||
return lord ~= nil and (rord == nil or lord < rord)
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
function ReaderDictionary:updateSdcvDictNamesOptions()
|
||||
self.enabled_dict_names = nil
|
||||
self.enabled_dict_names = {}
|
||||
|
||||
-- We cannot tell sdcv which dictionaries to ignore, but we
|
||||
-- can tell it which dictionaries to use, by using multiple
|
||||
-- -u <dictname> options.
|
||||
-- (The order of the -u does not matter, and we can not use
|
||||
-- them for ordering queries and results)
|
||||
-- The order of the -u options controls the dictionary order
|
||||
-- that sdcv uses to order its results.
|
||||
local dicts_disabled = G_reader_settings:readSetting("dicts_disabled")
|
||||
if not next(dicts_disabled) then
|
||||
return
|
||||
end
|
||||
for _, ifo in pairs(available_ifos) do
|
||||
if not dicts_disabled[ifo.file] then
|
||||
if not self.enabled_dict_names then
|
||||
self.enabled_dict_names = {}
|
||||
end
|
||||
table.insert(self.enabled_dict_names, ifo.name)
|
||||
end
|
||||
end
|
||||
@@ -214,29 +228,22 @@ function ReaderDictionary:addToMainMenu(menu_items)
|
||||
text = _("Dictionary settings"),
|
||||
sub_item_table = {
|
||||
{
|
||||
keep_menu_open = true,
|
||||
text_func = function()
|
||||
local nb_available, nb_enabled, nb_disabled = self:getNumberOfDictionaries()
|
||||
local nb_str = nb_available
|
||||
if nb_disabled > 0 then
|
||||
nb_str = nb_enabled .. "/" .. nb_available
|
||||
end
|
||||
return T(_("Installed dictionaries (%1)"), nb_str)
|
||||
return T(_("Manage dictionaries (%1)"), nb_str)
|
||||
end,
|
||||
enabled_func = function()
|
||||
return self:getNumberOfDictionaries() > 0
|
||||
end,
|
||||
sub_item_table = self:genDictionariesMenu(),
|
||||
},
|
||||
{
|
||||
text = _("Info on dictionary order"),
|
||||
keep_menu_open = true,
|
||||
callback = function()
|
||||
UIManager:show(InfoMessage:new{
|
||||
text = T(_([[
|
||||
If you'd like to change the order in which dictionaries are queried (and their results displayed), you can:
|
||||
- move all dictionary directories out of %1.
|
||||
- move them back there, one by one, in the order you want them to be used.]]), BD.dirpath(self.data_dir))
|
||||
})
|
||||
callback = function(touchmenu_instance)
|
||||
self:showDictionariesMenu(function()
|
||||
if touchmenu_instance then touchmenu_instance:updateItems() end
|
||||
end)
|
||||
end,
|
||||
},
|
||||
{
|
||||
@@ -495,28 +502,51 @@ function ReaderDictionary:_genDownloadDictionariesMenu()
|
||||
return menu_items
|
||||
end
|
||||
|
||||
function ReaderDictionary:genDictionariesMenu()
|
||||
local items = {}
|
||||
function ReaderDictionary:showDictionariesMenu(changed_callback)
|
||||
-- Work on local copy, save to settings only when SortWidget is closed with the accept button
|
||||
local dicts_disabled = util.tableDeepCopy(G_reader_settings:readSetting("dicts_disabled"))
|
||||
|
||||
local sort_items = {}
|
||||
for _, ifo in pairs(available_ifos) do
|
||||
table.insert(items, {
|
||||
table.insert(sort_items, {
|
||||
text = ifo.name,
|
||||
callback = function()
|
||||
local dicts_disabled = G_reader_settings:readSetting("dicts_disabled")
|
||||
if dicts_disabled[ifo.file] then
|
||||
dicts_disabled[ifo.file] = nil
|
||||
else
|
||||
dicts_disabled[ifo.file] = true
|
||||
end
|
||||
-- Update the -u options to give to sdcv
|
||||
self:updateSdcvDictNamesOptions()
|
||||
end,
|
||||
checked_func = function()
|
||||
local dicts_disabled = G_reader_settings:readSetting("dicts_disabled")
|
||||
return not dicts_disabled[ifo.file]
|
||||
end
|
||||
end,
|
||||
ifo = ifo,
|
||||
})
|
||||
end
|
||||
return items
|
||||
|
||||
local sort_widget = SortWidget:new{
|
||||
title = _("Manage installed dictionaries"),
|
||||
item_table = sort_items,
|
||||
callback = function()
|
||||
-- Save local copy of dicts_disabled
|
||||
G_reader_settings:saveSetting("dicts_disabled", dicts_disabled)
|
||||
|
||||
-- Write back the sorted items to dicts_order
|
||||
local dicts_order = {}
|
||||
for i, sort_item in pairs(sort_items) do
|
||||
dicts_order[sort_item.ifo.file] = i
|
||||
end
|
||||
G_reader_settings:saveSetting("dicts_order", dicts_order)
|
||||
|
||||
self:sortAvailableIfos()
|
||||
|
||||
self:updateSdcvDictNamesOptions()
|
||||
|
||||
UIManager:setDirty(nil, "ui")
|
||||
changed_callback()
|
||||
end
|
||||
}
|
||||
UIManager:show(sort_widget)
|
||||
end
|
||||
|
||||
local function dictDirsEmpty(dict_dirs)
|
||||
|
||||
Reference in New Issue
Block a user