You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koreader/frontend/ui/elements/font_settings.lua

109 lines
3.1 KiB
Lua

local Device = require("device")
local logger = require("logger")
local util = require("util")
local _ = require("gettext")
--[[ Font settings for desktop linux, mac and android ]]--
local ANDROID_SYSTEM_FONT_DIR = "/system/fonts"
local LINUX_SYSTEM_FONT_DIR = "/usr/share/fonts"
local DESKTOP_USER_FONT_DIR = "/.local/share/fonts"
-- get primary storage on Android
local function getAndroidPrimaryStorage()
local A, android = pcall(require, "android")
if not A then return end
local path = android.getExternalStoragePath()
if path ~= "Unknown" then
-- use the external storage identified by the app
return path
else
-- unable to identify external storage. Use defaults
return "/sdcard"
end
end
-- user font path, should be rw. On linux/mac it goes under $HOME.
-- on Android it goes in the primary storage (internal/sd)
local function getUserDir()
if Device:isDesktop() then
local home = os.getenv("HOME")
if home then return home..DESKTOP_USER_FONT_DIR end
elseif Device:isAndroid() then
local p = getAndroidPrimaryStorage()
return p.."/koreader/fonts;"..p.."/fonts"
end
end
-- system (ttf) fonts are available on linux and android but not on mac
local function getSystemDir()
if Device:isDesktop() then
if util.pathExists(LINUX_SYSTEM_FONT_DIR) then
return LINUX_SYSTEM_FONT_DIR
else return nil end
elseif Device:isAndroid() then
return ANDROID_SYSTEM_FONT_DIR
end
end
local function usesSystemFonts()
return G_reader_settings:isTrue("system_fonts")
end
local function openFontDir()
if not Device:canOpenLink() then return end
local user_dir = getUserDir()
local openable = util.pathExists(user_dir)
if not openable and user_dir then
logger.info("Font path not found, making one in ", user_dir)
openable = util.makePath(user_dir)
end
if not openable then
logger.warn("Unable to create the folder ", user_dir)
return
end
Device:openLink(user_dir)
end
local FontSettings = {}
function FontSettings:getPath()
if usesSystemFonts() then
local system_path = getSystemDir()
if system_path ~= nil then
return getUserDir()..";"..system_path
end
end
return getUserDir()
end
function FontSettings:getMenuTable()
local t = {{
text = _("Enable system fonts"),
checked_func = usesSystemFonts,
callback = function()
G_reader_settings:saveSetting("system_fonts", not usesSystemFonts())
local UIManager = require("ui/uimanager")
local InfoMessage = require("ui/widget/infomessage")
UIManager:show(InfoMessage:new{
text = _("This will take effect on next restart.")
})
end,
}}
if Device:isDesktop() then table.insert(t, 2, {
text = _("Open fonts folder"),
keep_menu_open = true,
callback = openFontDir,
})
end
return {
text = _("Font settings"),
separator = true,
sub_item_table = t
}
end
return FontSettings