diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index ff9717d42..a10d85dcf 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -18,9 +18,23 @@ local _ = require("gettext") local util = require("util") +local MODE = { + off = 0, + page_progress = 1, + time = 2, + pages_left = 3, + battery = 4, + percentage = 5, + book_time_to_read = 6, + chapter_time_to_read = 7, +} +local MODE_INDEX = {} +for k,v in pairs(MODE) do + MODE_INDEX[v] = k +end + local ReaderFooter = InputContainer:new{ - mode = 1, - visible = true, + mode = MODE.page_progress, pageno = nil, pages = nil, toc_level = 0, @@ -67,7 +81,6 @@ function ReaderFooter:init() face = Font:getFace(self.text_font_face, self.text_font_size), } self.text_width = self.progress_text:getSize().w + self.text_left_margin - self:applyFooterMode() self.progress_bar = ProgressWidget:new{ width = nil, -- width will be updated in self:resetLayout() height = self.bar_height, @@ -101,7 +114,8 @@ function ReaderFooter:init() } } - self.mode = G_reader_settings:readSetting("reader_footer_mode") or self.mode + self:applyFooterMode( + G_reader_settings:readSetting("reader_footer_mode") or self.mode) self:resetLayout() if self.settings.auto_refresh_time then @@ -328,21 +342,23 @@ function ReaderFooter:updateFooterText() end self.progress_text:setText(table.concat(info, " | ")) else - local info = "" - if self.mode == 1 then + local info + if self.mode == MODE.page_progress then info = self:getProgressInfo() - elseif self.mode == 2 then + elseif self.mode == MODE.time then info = self:getTimeInfo() - elseif self.mode == 3 then + elseif self.mode == MODE.pages_left then info = self:getNextChapterInfo() - elseif self.mode == 4 then + elseif self.mode == MODE.battery then info = self:getBatteryInfo() - elseif self.mode == 5 then + elseif self.mode == MODE.percentage then info = self:getProgressPercentage() - elseif self.mode == 6 then + elseif self.mode == MODE.book_time_to_read then info = self:getBookTimeToRead() - elseif self.mode == 7 then + elseif self.mode == MODE.chapter_time_to_read then info = self:getChapterTimeToRead() + else + info = "" end self.progress_text:setText(info) end @@ -384,16 +400,12 @@ function ReaderFooter:applyFooterMode(mode) -- 6 for from statistics book time to read -- 7 for from statistics chapter time to read if mode ~= nil then self.mode = mode end - if self.mode == 0 then - self.view.footer_visible = false - else - self.view.footer_visible = true - end + self.view.footer_visible = (self.mode ~= MODE.off) end function ReaderFooter:onEnterFlippingMode() self.orig_mode = self.mode - self:applyFooterMode(1) + self:applyFooterMode(MODE.page_progress) end function ReaderFooter:onExitFlippingMode() @@ -410,30 +422,24 @@ function ReaderFooter:onTapFooter(arg, ges) self.ui:handleEvent(Event:new("GotoPercentage", percentage)) end else - self.mode = (self.mode + 1) % 8 - if self.settings.all_at_once and (self.mode > 1) then - self.mode = 0 - end - if (self.mode == 1) and not self.settings.page_progress then - self.mode = 2 - end - if (self.mode == 2) and not self.settings.time then - self.mode = 3 - end - if (self.mode == 3) and not self.settings.pages_left then - self.mode = 4 - end - if (self.mode == 4) and not self.settings.battery then - self.mode = 5 - end - if (self.mode == 5) and not self.settings.percentage then - self.mode = 6 - end - if (self.mode == 6) and not self.settings.book_time_to_read then - self.mode = 7 - end - if (self.mode == 7) and not self.settings.chapter_time_to_read then - self.mode = 0 + if self.settings.all_at_once then + if self.mode >= 1 then + self.mode = MODE.off + else + self.mode = MODE.page_progress + end + else + self.mode = (self.mode + 1) % 8 + for i, m in ipairs(MODE_INDEX) do + if self.mode == MODE.off then break end + if self.mode == i then + if self.settings[m] then + break + else + self.mode = (self.mode + 1) % 8 + end + end + end end self:applyFooterMode() G_reader_settings:saveSetting("reader_footer_mode", self.mode) @@ -443,13 +449,13 @@ function ReaderFooter:onTapFooter(arg, ges) end function ReaderFooter:onHoldFooter(arg, ges) - if self.mode == 0 then return end + if self.mode == MODE.off then return end self.ui:handleEvent(Event:new("ShowGotoDialog")) return true end function ReaderFooter:onSetStatusLine(status_line) - self.view.footer_visible = status_line == 1 and true or false + self.view.footer_visible = (status_line == 1) self.ui.document:setStatusLineProp(status_line) self.ui:handleEvent(Event:new("UpdatePos")) end diff --git a/frontend/apps/reader/modules/readerview.lua b/frontend/apps/reader/modules/readerview.lua index 225ea21d7..16fe52a07 100644 --- a/frontend/apps/reader/modules/readerview.lua +++ b/frontend/apps/reader/modules/readerview.lua @@ -94,7 +94,6 @@ function ReaderView:addWidgets() self.footer = ReaderFooter:new{ view = self, ui = self.ui, - visible = self.footer_visible, } self.flipping = ReaderFlipping:new{ view = self, @@ -644,7 +643,9 @@ function ReaderView:onReadSettings(config) self.state.gamma = config:readSetting("gamma") or DGLOBALGAMMA local full_screen = config:readSetting("kopt_full_screen") or self.document.configurable.full_screen local status_line = config:readSetting("copt_status_line") or self.document.configurable.status_line - self.footer_visible = (full_screen == 0 or status_line == 1) and true or false + if full_screen == 0 or status_line == 0 then + self.footer_visible = false + end self:resetLayout() local page_scroll = config:readSetting("kopt_page_scroll") or self.document.configurable.page_scroll self.page_scroll = page_scroll == 1 and true or false diff --git a/spec/unit/readerfooter_spec.lua b/spec/unit/readerfooter_spec.lua index f95b62bfd..e7f1c9095 100644 --- a/spec/unit/readerfooter_spec.lua +++ b/spec/unit/readerfooter_spec.lua @@ -100,6 +100,41 @@ describe("Readerfooter module", function() assert.are.same('TC: na', footer.progress_text.text) end) + it("should rotate through different modes", function() + local sample_pdf = "spec/front/unit/data/2col.pdf" + local readerui = ReaderUI:new{ + document = DocumentRegistry:openDocument(sample_pdf), + } + local footer = readerui.view.footer + footer.settings.all_at_once = false + footer.mode = 0 + footer:onTapFooter() + assert.is.same(1, footer.mode) + footer:onTapFooter() + assert.is.same(2, footer.mode) + footer:onTapFooter() + assert.is.same(3, footer.mode) + footer:onTapFooter() + assert.is.same(4, footer.mode) + footer:onTapFooter() + assert.is.same(5, footer.mode) + footer:onTapFooter() + assert.is.same(6, footer.mode) + footer:onTapFooter() + assert.is.same(7, footer.mode) + footer:onTapFooter() + assert.is.same(0, footer.mode) + + footer.settings.all_at_once = true + footer.mode = 5 + footer:onTapFooter() + assert.is.same(0, footer.mode) + footer:onTapFooter() + assert.is.same(1, footer.mode) + footer:onTapFooter() + assert.is.same(0, footer.mode) + end) + it("should pick up screen resize in resetLayout", function() local sample_pdf = "spec/front/unit/data/2col.pdf" purgeDir(DocSettings:getSidecarDir(sample_pdf)) diff --git a/spec/unit/widget_progresswidget_spec.lua b/spec/unit/widget_progresswidget_spec.lua index f5085b657..0f3dd0f0e 100644 --- a/spec/unit/widget_progresswidget_spec.lua +++ b/spec/unit/widget_progresswidget_spec.lua @@ -6,7 +6,7 @@ describe("ProgressWidget widget", function() Screen = require("device").screen end) - it("should not crash with nil self.last #ok", function() + it("should not crash with nil self.last", function() local progress = ProgressWidget:new{ width = 100, height = 50,