mirror of
https://github.com/koreader/koreader
synced 2024-11-10 01:10:34 +00:00
62059f8d68
* This removes support for the following deprecated constants: `DTAP_ZONE_FLIPPING`, `DTAP_ZONE_BOOKMARK`, `DCREREADER_CONFIG_DEFAULT_FONT_GAMMA` * The "Advanced settings" panel now highlights modified values in bold (think about:config in Firefox ;)). * LuaData: Isolate global table lookup shenanigans, and fix a few issues in unused-in-prod codepaths. * CodeStyle: Require module locals for Lua/C modules, too. * ScreenSaver: Actually garbage collect our widget on close (ScreenSaver itself is not an instantiated object). * DateTimeWidget: Code cleanups to ensure child widgets can be GC'ed.
76 lines
2.7 KiB
Lua
76 lines
2.7 KiB
Lua
--[[
|
|
Subclass of ImageWidget to show icons
|
|
]]
|
|
|
|
local DataStorage = require("datastorage")
|
|
local ImageWidget = require("ui/widget/imagewidget")
|
|
local Screen = require("device").screen
|
|
local lfs = require("libs/libkoreader-lfs")
|
|
|
|
local DGENERIC_ICON_SIZE = G_defaults:readSetting("DGENERIC_ICON_SIZE")
|
|
|
|
-- Directories to look for icons by name, with any of the accepted suffixes
|
|
local ICONS_DIRS = {}
|
|
local user_icons_dir = DataStorage:getDataDir() .. "/icons"
|
|
if lfs.attributes(user_icons_dir, "mode") == "directory" then
|
|
table.insert(ICONS_DIRS, user_icons_dir)
|
|
end
|
|
-- Default icons (material design light)
|
|
table.insert(ICONS_DIRS, "resources/icons/mdlight")
|
|
-- Fallback directories
|
|
table.insert(ICONS_DIRS, "resources/icons")
|
|
table.insert(ICONS_DIRS, "resources")
|
|
|
|
-- Supported icon suffixes
|
|
local ICONS_EXTS = { ".svg", ".png" }
|
|
|
|
-- Show this icon instead of crashing if we can't find any icon
|
|
local ICON_NOT_FOUND = "resources/icons/icon-not-found.svg"
|
|
|
|
-- Icon filepath location cache
|
|
local ICONS_PATH = {}
|
|
|
|
local IconWidget = ImageWidget:extend{
|
|
-- The icon filename should be provided without any path
|
|
icon = ICON_NOT_FOUND, -- show this if not provided
|
|
-- See ImageWidget for other available options,
|
|
-- we only start with a few different defaults, that can
|
|
-- be overriden by callers.
|
|
width = Screen:scaleBySize(DGENERIC_ICON_SIZE), -- our icons are square
|
|
height = Screen:scaleBySize(DGENERIC_ICON_SIZE),
|
|
alpha = false, --- @note: Our icons have a transparent background, but, by default, we flatten them at caching time.
|
|
--- Our caller may choose to override that by setting this to true, in which case,
|
|
--- the alpha layer will be kept intact, and we'll do alpha-blending at blitting time.
|
|
is_icon = true, -- avoid dithering in ImageWidget:paintTo()
|
|
}
|
|
|
|
function IconWidget:init()
|
|
if self.image or self.file then
|
|
-- In case we're created with one of these: just be an ImageWidget.
|
|
return
|
|
end
|
|
-- See if already seen and full path cached
|
|
self.file = ICONS_PATH[self.icon]
|
|
if not self.file then
|
|
-- Not yet seen, look for it
|
|
for _, dir in ipairs(ICONS_DIRS) do
|
|
for __, ext in ipairs(ICONS_EXTS) do
|
|
local path = dir .. "/" .. self.icon .. ext
|
|
if lfs.attributes(path, "mode") == "file" then
|
|
self.file = path
|
|
break
|
|
end
|
|
end
|
|
if self.file then
|
|
break
|
|
end
|
|
end
|
|
if not self.file then
|
|
self.file = ICON_NOT_FOUND
|
|
end
|
|
ICONS_PATH[self.icon] = self.file
|
|
end
|
|
end
|
|
|
|
return IconWidget
|