mirror of
https://github.com/koreader/koreader
synced 2024-11-10 01:10:34 +00:00
850be52177
TouchMenu: added options to menu items with the following defaults: keep_menu_open = false hold_keep_menu_open = true So, default for Tap callback is to close menu, and for Hold callback to keep menu open. In both cases, provide the TouchMenu instance as the 1st argument to the callback functions (instead of a refresh_menu_func I added in #3941) so the callback can do more things, like closing, refreshing, changing menu items text and re-ordering... ReaderZooming: show symbol for default (like it was done for ReaderFont, ReaderHyphenation...) TextEditor plugin: update the previously opened files list in real time, so the menu can be kept open and used as the TextEditor main interface. SSH plugin: keep menu open and update the Start/Stop state in real time ReadTimer plugin: tried to do what feels right (but I don't use it) Also remove forgotten cp in the move/paste file code
196 lines
8.4 KiB
Lua
196 lines
8.4 KiB
Lua
local InfoMessage = require("ui/widget/infomessage")
|
|
local TimeWidget = require("ui/widget/timewidget")
|
|
local UIManager = require("ui/uimanager")
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
local T = require("ffi/util").template
|
|
local _ = require("gettext")
|
|
|
|
local ReadTimer = WidgetContainer:new{
|
|
name = "readtimer",
|
|
time = 0, -- The expected time of alarm if enabled, or 0.
|
|
}
|
|
|
|
function ReadTimer:init()
|
|
self.alarm_callback = function()
|
|
if self.time == 0 then return end -- How could this happen?
|
|
self.time = 0
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Read timer alarm\nTime's up. It's %1 now."), os.date("%c")),
|
|
})
|
|
end
|
|
self.ui.menu:registerToMainMenu(self)
|
|
end
|
|
|
|
function ReadTimer:scheduled()
|
|
return self.time ~= 0
|
|
end
|
|
|
|
function ReadTimer:remainingMinutes()
|
|
if self:scheduled() then
|
|
return os.difftime(self.time, os.time()) / 60
|
|
else
|
|
return math.huge
|
|
end
|
|
end
|
|
|
|
function ReadTimer:remainingTime()
|
|
if self:scheduled() then
|
|
local remain_time = os.difftime(self.time, os.time()) / 60
|
|
local remain_hours = math.floor(remain_time / 60)
|
|
local remain_minutes = math.floor(remain_time - 60 * remain_hours)
|
|
return remain_hours, remain_minutes
|
|
end
|
|
end
|
|
|
|
function ReadTimer:unschedule()
|
|
if self:scheduled() then
|
|
UIManager:unschedule(self.alarm_callback)
|
|
self.time = 0
|
|
end
|
|
end
|
|
|
|
function ReadTimer:addToMainMenu(menu_items)
|
|
local hour_string = _("hour")
|
|
local hours_string = _("hours")
|
|
local minute_string = _("minute")
|
|
local minutes_string = _("minutes")
|
|
menu_items.read_timer = {
|
|
text_func = function()
|
|
if self:scheduled() then
|
|
return T(_("Read timer (%1m)"),
|
|
string.format("%.2f", self:remainingMinutes()))
|
|
else
|
|
return _("Read timer")
|
|
end
|
|
end,
|
|
checked_func = function()
|
|
return self:scheduled()
|
|
end,
|
|
sub_item_table = {
|
|
{
|
|
text = _("Time"),
|
|
keep_menu_open = true,
|
|
callback = function(touchmenu_instance)
|
|
local now_t = os.date("*t")
|
|
local curr_hour = now_t.hour
|
|
local curr_min = now_t.min
|
|
local curr_sec_from_midnight = curr_hour*3600 + curr_min*60
|
|
local time_widget = TimeWidget:new{
|
|
hour = curr_hour,
|
|
min = curr_min,
|
|
ok_text = _("Set timer"),
|
|
title_text = _("Set reader timer"),
|
|
callback = function(time)
|
|
touchmenu_instance:closeMenu()
|
|
self:unschedule()
|
|
local timer_sec_from_mignight = time.hour*3600 + time.min*60
|
|
local seconds
|
|
if timer_sec_from_mignight > curr_sec_from_midnight then
|
|
seconds = timer_sec_from_mignight - curr_sec_from_midnight
|
|
else
|
|
seconds = 24*3600 - (curr_sec_from_midnight - timer_sec_from_mignight)
|
|
end
|
|
if seconds > 0 and seconds < 18*3600 then
|
|
self.time = os.time() + seconds
|
|
UIManager:scheduleIn(seconds, self.alarm_callback)
|
|
local hr_str = ""
|
|
local min_str = ""
|
|
local hr = math.floor(seconds/3600)
|
|
if hr == 1 then
|
|
hr_str = string.format("1 %s", hour_string)
|
|
elseif hr > 1 then
|
|
hr_str = string.format("%d %s", hr, hours_string)
|
|
end
|
|
local min = math.floor((seconds%3600)/60)
|
|
if min == 1 then
|
|
min_str = string.format("1 %s", minute_string)
|
|
elseif min > 1 then
|
|
min_str = string.format("%d %s", min, minutes_string)
|
|
end
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Timer set to: %1:%2\nIt's %3 %4 from now"),
|
|
string.format("%02d", time.hour), string.format("%02d", time.min),
|
|
hr_str, min_str),
|
|
timeout = 5,
|
|
})
|
|
--current time or time > 18h
|
|
elseif seconds == 0 or seconds >= 18*3600 then
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Timer could not be set. You have selected current time or time in past"),
|
|
timeout = 5,
|
|
})
|
|
end
|
|
end
|
|
}
|
|
UIManager:show(time_widget)
|
|
end,
|
|
},
|
|
{
|
|
text = _("Minutes from now"),
|
|
keep_menu_open = true,
|
|
callback = function(touchmenu_instance)
|
|
local remain_time = {}
|
|
local remain_hours, remain_minutes = self:remainingTime()
|
|
if not remain_hours and not remain_minutes then
|
|
remain_time = G_reader_settings:readSetting("reader_timer_remain_time")
|
|
if remain_time then
|
|
remain_hours = remain_time[1]
|
|
remain_minutes = remain_time[2]
|
|
end
|
|
end
|
|
local time_widget = TimeWidget:new{
|
|
hour = remain_hours or 0,
|
|
min = remain_minutes or 0,
|
|
hour_max = 17,
|
|
ok_text = _("Set timer"),
|
|
title_text = _("Set reader timer from now (hours:minutes)"),
|
|
callback = function(time)
|
|
touchmenu_instance:closeMenu()
|
|
self:unschedule()
|
|
local seconds = time.hour * 3600 + time.min * 60
|
|
if seconds > 0 then
|
|
self.time = os.time() + seconds
|
|
UIManager:scheduleIn(seconds, self.alarm_callback)
|
|
local hr_str = ""
|
|
local min_str = ""
|
|
local hr = time.hour
|
|
if hr == 1 then
|
|
hr_str = string.format("1 %s", hour_string)
|
|
elseif hr > 1 then
|
|
hr_str = string.format("%d %s", hr, hours_string)
|
|
end
|
|
local min = time.min
|
|
if min == 1 then
|
|
min_str = string.format("1 %s", minute_string)
|
|
elseif min > 1 then
|
|
min_str = string.format("%d %s", min, minutes_string)
|
|
end
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Timer is set to %1 %2"), hr_str, min_str),
|
|
timeout = 5,
|
|
})
|
|
remain_time = {hr, min}
|
|
G_reader_settings:saveSetting("reader_timer_remain_time", remain_time)
|
|
end
|
|
end
|
|
}
|
|
UIManager:show(time_widget)
|
|
end,
|
|
},
|
|
{
|
|
text = _("Stop timer"),
|
|
keep_menu_open = true,
|
|
enabled_func = function()
|
|
return self:scheduled()
|
|
end,
|
|
callback = function(touchmenu_instance)
|
|
self:unschedule()
|
|
touchmenu_instance:updateItems()
|
|
end,
|
|
},
|
|
},
|
|
}
|
|
end
|
|
|
|
return ReadTimer
|