2
0
mirror of https://github.com/koreader/koreader synced 2024-11-16 06:12:56 +00:00
koreader/plugins/perceptionexpander.koplugin/main.lua

246 lines
8.1 KiB
Lua

local Widget = require("ui/widget/widget")
local LineWidget = require("ui/widget/linewidget")
local MultiInputDialog = require("ui/widget/multiinputdialog")
local WidgetContainer = require("ui/widget/container/widgetcontainer")
local HorizontalGroup = require("ui/widget/horizontalgroup")
local UIManager = require("ui/uimanager")
local InfoMessage = require("ui/widget/infomessage")
local Geom = require("ui/geometry")
local Screen = require("device").screen
local T = require("ffi/util").template
local _ = require("gettext")
local LuaSettings = require("luasettings")
local DataStorage = require("datastorage")
local Blitbuffer = require("ffi/blitbuffer")
local PerceptionExpander = Widget:extend{
is_enabled = nil,
name = "perceptionexpander",
page_counter = 0,
shift_each_pages = 100,
margin = 0.1,
line_thickness = 2,
line_color_intensity = 0.3,
margin_shift = 0.03,
settings = nil,
ALMOST_CENTER_OF_THE_SCREEN = 0.37,
last_screen_mode = nil
}
function PerceptionExpander:init()
if not self.settings then self:readSettingsFile() end
self.is_enabled = self.settings:readSetting("is_enabled") or false
if not self.is_enabled then
return
end
self:createUI(true)
end
function PerceptionExpander:readSettingsFile()
self.settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/perception_expander.lua")
end
function PerceptionExpander:createUI(readSettings)
if readSettings then
self.line_thickness = tonumber(self.settings:readSetting("line_thick"))
self.margin = tonumber(self.settings:readSetting("margin"))
self.line_color_intensity = tonumber(self.settings:readSetting("line_color_intensity"))
self.shift_each_pages = tonumber(self.settings:readSetting("shift_each_pages"))
self.page_counter = tonumber(self.settings:readSetting("page_counter"))
end
self.screen_width = Screen:getWidth()
local screen_height = Screen:getHeight()
local line_height = math.floor(screen_height * 0.9)
local line_top_position = math.floor(screen_height * 0.05)
self.last_screen_mode = Screen:getScreenMode()
if self.last_screen_mode == "landscape" then
self.margin = (self.margin - self.margin_shift)
end
local line_widget = LineWidget:new{
background = Blitbuffer.gray(self.line_color_intensity),
dimen = Geom:new{
w = self.line_thickness,
h = line_height,
},
}
self.left_line = WidgetContainer:new{
dimen = Geom:new{
x = self.screen_width * self.margin,
y = line_top_position,
w = self.line_thickness,
h = line_height,
},
line_widget
}
self.right_line = WidgetContainer:new{
dimen = Geom:new{
x = self.screen_width - (self.screen_width * self.margin),
y = line_top_position,
w = self.line_thickness,
h = line_height,
},
line_widget
}
self[1] = HorizontalGroup:new{
self.left_line,
self.right_line,
}
end
function PerceptionExpander:onReaderReady()
self.ui.menu:registerToMainMenu(self)
self.view:registerViewModule("perception_expander", self)
end
function PerceptionExpander:resetLayout()
self:createUI()
end
function PerceptionExpander:showSettingsDialog()
self.settings_dialog = MultiInputDialog:new{
title = _("Perception expander settings"),
fields ={
{
text = "",
input_type = "number",
hint = T(_("Line thickness. Current value: %1"),
self.line_thickness),
},
{
text = "",
input_type = "number",
hint = T(_("Margin from edges. Current value: %1"),
self.margin),
},
{
text = "",
input_type = "number",
hint = T(_("Line color intensity (1-10). Current value: %1"),
self.line_color_intensity * 10),
},
{
text = "",
input_type = "number",
hint = T(_("Increase margin after pages. Current value: %1\nSet to 0 to disable."),
self.shift_each_pages),
},
},
buttons ={
{
{
text = _("Cancel"),
callback = function()
self.settings_dialog:onClose()
UIManager:close(self.settings_dialog)
end
},
{
text = _("Apply"),
callback = function()
self:saveSettings(MultiInputDialog:getFields())
self.settings_dialog:onClose()
UIManager:close(self.settings_dialog)
self:createUI()
end
},
},
},
width = math.floor(Screen:getWidth() * 0.8),
height = math.floor(Screen:getHeight() * 0.3),
}
UIManager:show(self.settings_dialog)
self.settings_dialog:onShowKeyboard()
end
function PerceptionExpander:addToMainMenu(menu_items)
menu_items.speed_reading_module_perception_expander = {
text = _("Speed reading module - perception expander"),
sub_item_table ={
{
text = _("Enable"),
checked_func = function() return self.is_enabled end,
callback = function()
self.is_enabled = not self.is_enabled
self:saveSettings()
if self.is_enabled then self:createUI() end
return true
end,
},
{
text = _("Settings"),
keep_menu_open = true,
callback = function()
self:showSettingsDialog()
end,
},
{
text = _("About"),
keep_menu_open = true,
callback = function()
UIManager:show(InfoMessage:new{
text = _("For more information see wiki page Perception Expander Plugin"),
})
end,
},
},
}
end
function PerceptionExpander:onPageUpdate(pageno)
if not self.is_enabled then
return
end
-- If this plugin did not apply screen orientation change, redraw plugin UI
if Screen:getScreenMode() ~= self.last_screen_mode then
self:createUI()
end
if self.shift_each_pages ~= 0 and self.page_counter >= self.shift_each_pages and self.margin < self.ALMOST_CENTER_OF_THE_SCREEN then
self.page_counter = 0
self.margin = self.margin + self.margin_shift
self.left_line.dimen.x = self.screen_width * self.margin
self.right_line.dimen.x = self.screen_width - (self.screen_width * self.margin)
else
self.page_counter = self.page_counter + 1;
end
end
function PerceptionExpander:saveSettings(fields)
if fields then
self.line_thickness = fields[1] ~= "" and tonumber(fields[1]) or self.line_thickness
self.margin = fields[2] ~= "" and tonumber(fields[2]) or self.margin
local line_intensity = fields[3] ~= "" and tonumber(fields[3]) or self.line_color_intensity * 10
if line_intensity then
self.line_color_intensity = line_intensity / 10
end
self.shift_each_pages = fields[4] ~= "" and tonumber(fields[4]) or self.shift_each_pages
end
self.settings:saveSetting("line_thick", self.line_thickness)
self.settings:saveSetting("margin", self.margin)
self.settings:saveSetting("line_color_intensity", self.line_color_intensity)
self.settings:saveSetting("shift_each_pages", self.shift_each_pages)
self.settings:saveSetting("is_enabled", self.is_enabled)
self.settings:flush()
self:createUI()
end
function PerceptionExpander:paintTo(bb, x, y)
if self.is_enabled and self[1] then
self[1]:paintTo(bb, x, y)
end
end
return PerceptionExpander