diff --git a/frontend/apps/reader/modules/readerfrontlight.lua b/frontend/apps/reader/modules/readerfrontlight.lua index 7e82cbf65..16750865f 100644 --- a/frontend/apps/reader/modules/readerfrontlight.lua +++ b/frontend/apps/reader/modules/readerfrontlight.lua @@ -1,5 +1,4 @@ local InputContainer = require("ui/widget/container/inputcontainer") -local InputDialog = require("ui/widget/inputdialog") local Notification = require("ui/widget/notification") local GestureRange = require("ui/gesturerange") local UIManager = require("ui/uimanager") @@ -83,42 +82,10 @@ function ReaderFrontLight:onPanRelease(arg, ges) end function ReaderFrontLight:onShowFlDialog() - local powerd = Device:getPowerDevice() - self.fl_dialog = InputDialog:new{ - title = _("Frontlight level"), - input_hint = ("(%d - %d)"):format(powerd.fl_min, powerd.fl_max), - buttons = { - { - { - text = _("Toggle"), - enabled = true, - callback = function() - self.fl_dialog:setInputText("") - powerd:toggleFrontlight() - end, - }, - { - text = _("Apply"), - enabled = true, - callback = function() - self:fldialIntensity() - end, - }, - { - text = _("OK"), - enabled = true, - callback = function() - self:fldialIntensity() - self:close() - end, - }, - - }, - }, - input_type = "number", + local FrontLightWidget = require("ui/widget/frontlightwidget") + local fl = FrontLightWidget:new{ } - self.fl_dialog:onShowKeyboard() - UIManager:show(self.fl_dialog) + UIManager:show(fl) end function ReaderFrontLight:close() @@ -126,11 +93,4 @@ function ReaderFrontLight:close() UIManager:close(self.fl_dialog) end -function ReaderFrontLight:fldialIntensity() - local number = tonumber(self.fl_dialog:getInputText()) - if number ~= nil then - Device:getPowerDevice():setIntensity(number) - end -end - return ReaderFrontLight diff --git a/frontend/ui/widget/frontlightwidget.lua b/frontend/ui/widget/frontlightwidget.lua new file mode 100644 index 000000000..19f7e21e0 --- /dev/null +++ b/frontend/ui/widget/frontlightwidget.lua @@ -0,0 +1,318 @@ +local InputContainer = require("ui/widget/container/inputcontainer") +local WidgetContainer = require("ui/widget/container/widgetcontainer") +local FrameContainer = require("ui/widget/container/framecontainer") +local CenterContainer = require("ui/widget/container/centercontainer") +local VerticalGroup = require("ui/widget/verticalgroup") +local OverlapGroup = require("ui/widget/overlapgroup") +local CloseButton = require("ui/widget/closebutton") +local TextWidget = require("ui/widget/textwidget") +local LineWidget = require("ui/widget/linewidget") +local GestureRange = require("ui/gesturerange") +local Button = require("ui/widget/button") +local UIManager = require("ui/uimanager") +local Screen = require("device").screen +local Device = require("device") +local Geom = require("ui/geometry") +local Font = require("ui/font") +local _ = require("gettext") +local Blitbuffer = require("ffi/blitbuffer") +local HorizontalGroup = require("ui/widget/horizontalgroup") +local TextBoxWidget = require("ui/widget/textboxwidget") +local VerticalSpan = require("ui/widget/verticalspan") +local HorizontalSpan = require("ui/widget/horizontalspan") + +local FrontLightWidget = InputContainer:new{ + title_face = Font:getFace("tfont", 22), + width = nil, + height = nil, + fl_cur = 0, + fl_min = 0, + fl_max = 10, +} + +function FrontLightWidget:init() + self.medium_font_face = Font:getFace("ffont", 20) + self.light_bar = {} + self.screen_width = Screen:getSize().w + self.screen_height = Screen:getSize().h + self.span = math.ceil(self.screen_height * 0.01) + self.width = self.screen_width * 0.95 + local powerd = Device:getPowerDevice() + self.fl_cur = powerd.fl_intensity + self.fl_min = powerd.fl_min + self.fl_max = powerd.fl_max + local steps_fl = self.fl_max - self.fl_min + 1 + self.one_step = math.ceil(steps_fl / 25 ) + self.steps = math.ceil(steps_fl / self.one_step) + if (self.steps - 1) * self.one_step < self.fl_max - self.fl_min then + self.steps = self.steps + 1 + end + self.steps = math.min(self.steps , steps_fl) + -- button width to fit screen size + self.button_width = math.floor(self.screen_width * 0.9 / self.steps) - 12 + + self.fl_prog_button = Button:new{ + text = "", + bordersize = 3, + radius = 0, + margin = 1, + enabled = true, + width = self.button_width, + show_parent = self, + } + if Device:hasKeys() then + self.key_events = { + Close = { {"Back"}, doc = "close frontlight" } + } + end + if Device:isTouchDevice() then + self.ges_events = { + TapCloseFL = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = 0, y = 0, + w = self.screen_width, + h = self.screen_height, + } + }, + }, + } + end + self:update() +end + +function FrontLightWidget:generateProgressGroup(width, height, fl_level, step) + self.fl_container = CenterContainer:new{ + dimen = Geom:new{ w = width, h = height }, + } + self:setProgress(fl_level, step) + return self.fl_container +end + +function FrontLightWidget:setProgress(num, step) + --clear previous data + self.fl_container:clear() + local padding_span = VerticalSpan:new{ width = self.span } + local button_group_down = HorizontalGroup:new{ align = "center" } + local button_group_up = HorizontalGroup:new{ align = "center" } + local fl_group = HorizontalGroup:new{ align = "center" } + local vertical_group = VerticalGroup:new{ align = "center" } + local set_fl + local enable_button_plus = true + local enable_button_minus = true + local step_num = math.floor(num / step) + if num then + self.fl_cur = num + set_fl = math.min(self.fl_cur, self.fl_max) + Device:getPowerDevice():setIntensity(set_fl) + if set_fl == self.fl_max then enable_button_plus = false end + if set_fl == self.fl_min then enable_button_minus = false end + + for i = 0, step_num do + table.insert(fl_group, self.fl_prog_button:new{ + text= "", + margin = 1, + preselect = true, + width = self.button_width, + callback = function() self:setProgress(i * step, step) end + }) + end + else + num = 0 + end + + for i = step_num + 1, self.steps -1 do + table.insert(fl_group, self.fl_prog_button:new{ + callback = function() self:setProgress(i * step, step) end + }) + end + local button_minus = Button:new{ + text = "-1", + bordersize = 2, + margin = 2, + radius = 0, + enabled = enable_button_minus, + width = self.screen_width * 0.20, + show_parent = self, + callback = function() self:setProgress(num - 1, step) end, + } + local button_plus = Button:new{ + text = "+1", + bordersize = 2, + margin = 2, + radius = 0, + enabled = enable_button_plus, + width = self.screen_width * 0.20, + show_parent = self, + callback = function() self:setProgress(num + 1, step) end, + } + local item_level = TextBoxWidget:new{ + text = set_fl, + face = self.medium_font_face, + alignment = "center", + width = self.screen_width * 0.95 - 1.275 * button_minus.width - 1.275 * button_plus.width, + } + local button_min = Button:new{ + text = _("Min"), + bordersize = 2, + margin = 2, + radius = 0, + enabled = true, + width = self.screen_width * 0.20, + show_parent = self, + callback = function() self:setProgress(self.fl_min, step) end, + } + local button_max = Button:new{ + text = _("Max"), + bordersize = 2, + margin = 2, + radius = 0, + enabled = true, + width = self.screen_width * 0.20, + show_parent = self, + callback = function() self:setProgress(self.fl_max, step) end, + } + local button_toggle = Button:new{ + text = _("Toggle"), + bordersize = 2, + margin = 2, + radius = 0, + enabled = true, + width = self.screen_width * 0.20, + show_parent = self, + callback = function() + local powerd = Device:getPowerDevice() + powerd:toggleFrontlight() + end, + } + local empty_space = HorizontalSpan:new{ + width = (self.screen_width * 0.95 - 1.2 * button_minus.width - 1.2 * button_plus.width - 1.2 * button_toggle.width) / 2, + } + local button_table_up = HorizontalGroup:new{ + align = "center", + button_minus, + item_level, + button_plus, + } + local button_table_down = HorizontalGroup:new{ + align = "center", + button_min, + empty_space, + button_toggle, + empty_space, + button_max, + } + table.insert(button_group_up, button_table_up) + table.insert(button_group_down, button_table_down) + table.insert(vertical_group,button_group_up) + table.insert(vertical_group,padding_span) + table.insert(vertical_group,fl_group) + table.insert(vertical_group,padding_span) + table.insert(vertical_group,button_group_down) + table.insert(self.fl_container, vertical_group) + + UIManager:setDirty("all", "ui") + return true +end + +function FrontLightWidget:update() + -- header + self.light_title = FrameContainer:new{ + padding = Screen:scaleBySize(5), + margin = Screen:scaleBySize(2), + bordersize = 0, + TextWidget:new{ + text = _("Frontlight"), + face = self.title_face, + bold = true, + width = self.screen_width * 0.95, + }, + } + local light_level = FrameContainer:new{ + padding = Screen:scaleBySize(2), + margin = Screen:scaleBySize(2), + bordersize = 0, + self:generateProgressGroup(self.screen_width * 0.95, self.screen_height * 0.20, + self.fl_cur, self.one_step) + } + local light_line = LineWidget:new{ + dimen = Geom:new{ + w = self.width, + h = Screen:scaleBySize(2), + } + } + self.light_bar = OverlapGroup:new{ + dimen = { + w = self.width, + h = self.light_title:getSize().h + }, + self.light_title, + CloseButton:new{ window = self, }, + } + self.light_frame = FrameContainer:new{ + radius = 5, + bordersize = 3, + padding = 0, + margin = 0, + background = Blitbuffer.COLOR_WHITE, + VerticalGroup:new{ + align = "left", + self.light_bar, + light_line, + CenterContainer:new{ + dimen = Geom:new{ + w = light_line:getSize().w, + h = light_level:getSize().h, + }, + light_level, + }, + } + } + self[1] = WidgetContainer:new{ + align = "center", + dimen =Geom:new{ + x = 0, y = 0, + w = self.screen_width, + h = self.screen_height, + }, + FrameContainer:new{ + bordersize = 0, + padding = Screen:scaleBySize(5), + self.light_frame, + } + } +end + +function FrontLightWidget:onCloseWidget() + UIManager:setDirty(nil, function() + return "partial", self.light_frame.dimen + end) + return true +end + +function FrontLightWidget:onShow() + UIManager:setDirty(self, function() + return "ui", self.light_frame.dimen + end) + return true +end + +function FrontLightWidget:onAnyKeyPressed() + UIManager:close(self) + return true +end + +function FrontLightWidget:onTapCloseFL(arg, ges_ev) + if ges_ev.pos:notIntersectWith(self.light_frame.dimen) then + self:onClose() + end + return true +end + +function FrontLightWidget:onClose() + UIManager:close(self) + return true +end + +return FrontLightWidget