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/apps/reader/modules/readertypeset.lua

256 lines
8.8 KiB
Lua

local ConfirmBox = require("ui/widget/confirmbox")
local Event = require("ui/event")
local InputContainer = require("ui/widget/container/inputcontainer")
local UIManager = require("ui/uimanager")
local lfs = require("libs/libkoreader-lfs")
local _ = require("gettext")
local Screen = require("device").screen
local T = require("ffi/util").template
local ReaderTypeset = InputContainer:new{
css_menu_title = _("Style"),
css = nil,
internal_css = true,
}
function ReaderTypeset:init()
self.ui.menu:registerToMainMenu(self)
end
function ReaderTypeset:onReadSettings(config)
self.css = config:readSetting("css") or G_reader_settings:readSetting("copt_css")
local tweaks_css = self.ui.styletweak:getCssText()
if self.css then
self.ui.document:setStyleSheet(self.css, tweaks_css)
else
self.ui.document:setStyleSheet(self.ui.document.default_css, tweaks_css)
self.css = self.ui.document.default_css
end
self.embedded_fonts = config:readSetting("embedded_fonts")
if self.embedded_fonts == nil then
-- default to enable embedded fonts
-- note that it's a bit confusing here:
-- global settins store 0/1, while document settings store false/true
-- we leave it that way for now to maintain backwards compatibility
local global = G_reader_settings:readSetting("copt_embedded_fonts")
self.embedded_fonts = (global == nil or global == 1) and true or false
end
-- As this is new, call it only when embedded_fonts are explicitely disabled
-- self.ui.document:setEmbeddedFonts(self.embedded_fonts and 1 or 0)
if not self.embedded_fonts then
self.ui.document:setEmbeddedFonts(0)
end
self.embedded_css = config:readSetting("embedded_css")
if self.embedded_css == nil then
-- default to enable embedded CSS
-- note that it's a bit confusing here:
-- global settins store 0/1, while document settings store false/true
-- we leave it that way for now to maintain backwards compatibility
local global = G_reader_settings:readSetting("copt_embedded_css")
self.embedded_css = (global == nil or global == 1) and true or false
end
self.ui.document:setEmbeddedStyleSheet(self.embedded_css and 1 or 0)
-- set page margins
self:onSetPageMargins(
config:readSetting("copt_page_margins") or
G_reader_settings:readSetting("copt_page_margins") or
DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM)
-- default to enable floating punctuation
-- the floating punctuation should not be boolean value for the following
-- expression otherwise a false value will never be returned but numerical
-- values will survive this expression
self.floating_punctuation = config:readSetting("floating_punctuation") or
G_reader_settings:readSetting("floating_punctuation") or 1
self:toggleFloatingPunctuation(self.floating_punctuation)
-- default to disable TXT formatting as it does more harm than good
self.txt_preformatted = config:readSetting("txt_preformatted") or
G_reader_settings:readSetting("txt_preformatted") or 1
self:toggleTxtPreFormatted(self.txt_preformatted)
end
function ReaderTypeset:onSaveSettings()
self.ui.doc_settings:saveSetting("css", self.css)
self.ui.doc_settings:saveSetting("embedded_css", self.embedded_css)
self.ui.doc_settings:saveSetting("floating_punctuation", self.floating_punctuation)
self.ui.doc_settings:saveSetting("embedded_fonts", self.embedded_fonts)
end
function ReaderTypeset:onToggleEmbeddedStyleSheet(toggle)
self:toggleEmbeddedStyleSheet(toggle)
return true
end
function ReaderTypeset:onToggleEmbeddedFonts(toggle)
self:toggleEmbeddedFonts(toggle)
return true
end
function ReaderTypeset:genStyleSheetMenu()
local style_table = {}
local file_list = {
{
text = _("Clear all external styles"),
css = ""
},
{
text = _("Auto"),
css = self.ui.document.default_css
},
}
for f in lfs.dir("./data") do
if lfs.attributes("./data/"..f, "mode") == "file" and string.match(f, "%.css$") then
table.insert(file_list, {
text = f,
css = "./data/"..f
})
end
end
table.sort(file_list, function(v1,v2) return v1.text < v2.text end) -- sort by name
for i,file in ipairs(file_list) do
table.insert(style_table, {
text = file["text"],
callback = function()
self:setStyleSheet(file["css"])
end,
hold_callback = function()
self:makeDefaultStyleSheet(file["css"], file["text"])
end,
checked_func = function()
return file.css == self.css
end
})
end
return style_table
end
function ReaderTypeset:onApplyStyleSheet()
local tweaks_css = self.ui.styletweak:getCssText()
self.ui.document:setStyleSheet(self.css, tweaks_css)
self.ui:handleEvent(Event:new("UpdatePos"))
return true
end
function ReaderTypeset:setStyleSheet(new_css)
if new_css ~= self.css then
self.css = new_css
local tweaks_css = self.ui.styletweak:getCssText()
self.ui.document:setStyleSheet(new_css, tweaks_css)
self.ui:handleEvent(Event:new("UpdatePos"))
end
end
function ReaderTypeset:setEmbededStyleSheetOnly()
if self.css ~= nil then
-- clear applied css
self.ui.document:setStyleSheet("")
self.ui.document:setEmbeddedStyleSheet(1)
self.css = nil
self.ui:handleEvent(Event:new("UpdatePos"))
end
end
function ReaderTypeset:toggleEmbeddedStyleSheet(toggle)
if not toggle then
self.embedded_css = false
self:setStyleSheet(self.ui.document.default_css)
self.ui.document:setEmbeddedStyleSheet(0)
else
self.embedded_css = true
--self:setStyleSheet(self.ui.document.default_css)
self.ui.document:setEmbeddedStyleSheet(1)
end
self.ui:handleEvent(Event:new("UpdatePos"))
end
function ReaderTypeset:toggleEmbeddedFonts(toggle)
if not toggle then
self.embedded_fonts = false
self.ui.document:setEmbeddedFonts(0)
else
self.embedded_fonts = true
self.ui.document:setEmbeddedFonts(1)
end
self.ui:handleEvent(Event:new("UpdatePos"))
end
function ReaderTypeset:toggleFloatingPunctuation(toggle)
-- for some reason the toggle value read from history files may stay boolean
-- and there seems no more elegant way to convert boolean values to numbers
if toggle == true then
toggle = 1
elseif toggle == false then
toggle = 0
end
self.ui.document:setFloatingPunctuation(toggle)
self.ui:handleEvent(Event:new("UpdatePos"))
end
function ReaderTypeset:toggleTxtPreFormatted(toggle)
self.ui.document:setTxtPreFormatted(toggle)
self.ui:handleEvent(Event:new("UpdatePos"))
end
function ReaderTypeset:addToMainMenu(menu_items)
-- insert table to main reader menu
menu_items.set_render_style = {
text = self.css_menu_title,
sub_item_table = self:genStyleSheetMenu(),
}
menu_items.floating_punctuation = {
text = _("Floating punctuation"),
checked_func = function() return self.floating_punctuation == 1 end,
callback = function()
self.floating_punctuation = self.floating_punctuation == 1 and 0 or 1
self:toggleFloatingPunctuation(self.floating_punctuation)
end,
hold_callback = function() self:makeDefaultFloatingPunctuation() end,
}
end
function ReaderTypeset:makeDefaultFloatingPunctuation()
local toggler = self.floating_punctuation == 1 and _("On") or _("Off")
UIManager:show(ConfirmBox:new{
text = T(
_("Set default floating punctuation to %1?"),
toggler
),
ok_callback = function()
G_reader_settings:saveSetting("floating_punctuation", self.floating_punctuation)
end,
})
end
function ReaderTypeset:makeDefaultStyleSheet(css, text)
text = text or css
if css then
UIManager:show(ConfirmBox:new{
text = T( _("Set default style to %1?"), text),
ok_callback = function()
G_reader_settings:saveSetting("copt_css", css)
end,
})
end
end
function ReaderTypeset:onSetPageMargins(margins)
local left = Screen:scaleBySize(margins[1])
local top = Screen:scaleBySize(margins[2])
local right = Screen:scaleBySize(margins[3])
local bottom
if self.view.footer.has_no_mode then
bottom = Screen:scaleBySize(margins[4])
else
bottom = Screen:scaleBySize(margins[4] + DMINIBAR_HEIGHT)
end
self.ui.document:setPageMargins(left, top, right, bottom)
self.ui:handleEvent(Event:new("UpdatePos"))
return true
end
return ReaderTypeset