diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index c17743b21..8200a08b0 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -28,6 +28,7 @@ KoptOptions = { toggle = {"portrait", "landscape"}, args = {"portrait", "landscape"}, default_arg = Screen:getScreenMode(), + current_func = function() return Screen:getScreenMode() end, event = "SetScreenMode", } } @@ -188,14 +189,14 @@ KoptOptions = { KoptInterface = {} -- get reflow context -function KoptInterface:getKOPTContext(doc, pageno, bbox) +function KoptInterface:getKOPTContext(doc, pageno, bbox, screen_size) local kc = KOPTContext.new() kc:setTrim(doc.configurable.trim_page) kc:setWrap(doc.configurable.text_wrap) kc:setIndent(doc.configurable.detect_indent) kc:setRotate(doc.configurable.screen_rotation) kc:setColumns(doc.configurable.max_columns) - kc:setDeviceDim(doc.screen_size.w, doc.screen_size.h) + kc:setDeviceDim(screen_size.w, screen_size.h) kc:setDeviceDPI(doc.screen_dpi) kc:setStraighten(doc.configurable.auto_straighten) kc:setJustification(doc.configurable.justification) @@ -213,12 +214,14 @@ end -- calculates page dimensions function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation) -- check cached page size - self.cur_bbox = doc:getPageBBox(pageno) - local bbox = self.cur_bbox - local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local bbox = doc:getPageBBox(pageno) + local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local screen_size = Screen:getSize() + local screen_size_hash = screen_size.w.."|"..screen_size.h + local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local cached = Cache:check(hash) if not cached then - local kc = self:getKOPTContext(doc, pageno, self.cur_bbox) + local kc = self:getKOPTContext(doc, pageno, bbox, screen_size) local page = doc._document:openPage(pageno) -- reflow page page:reflow(kc, 0) @@ -238,9 +241,11 @@ end function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode) doc.render_mode = render_mode - self.cur_bbox = doc:getPageBBox(pageno) - local bbox = self.cur_bbox - local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local bbox = doc:getPageBBox(pageno) + local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local screen_size = Screen:getSize() + local screen_size_hash = screen_size.w.."|"..screen_size.h + local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local page_size = self:getPageDimensions(doc, pageno, zoom, rotation) -- this will be the size we actually render local size = page_size @@ -271,13 +276,13 @@ function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode } -- draw to blitbuffer - local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local page = doc._document:openPage(pageno) local cached = Cache:check(kc_hash) if cached then page:rfdraw(cached.kctx, tile.bb) page:close() - DEBUG("cached hash", hash) + --DEBUG("cached hash", hash) if not Cache:check(hash) then Cache:insert(hash, tile) end @@ -288,7 +293,7 @@ end function KoptInterface:drawPage(doc, target, x, y, rect, pageno, zoom, rotation, render_mode) local tile = self:renderPage(doc, pageno, rect, zoom, rotation, render_mode) - DEBUG("now painting", tile, rect) + --DEBUG("now painting", tile, rect) target:blitFrom(tile.bb, x, y, rect.x - tile.excerpt.x, diff --git a/frontend/ui/config.lua b/frontend/ui/config.lua index 32d269459..1c2123025 100644 --- a/frontend/ui/config.lua +++ b/frontend/ui/config.lua @@ -380,7 +380,9 @@ function ConfigOption:init() local current_item = nil if self.options[c].name then if self.options[c].values then - local val = self.config.configurable[self.options[c].name] + -- check if current value is stored in configurable or calculated in runtime + local val = self.options[c].current_func and self.options[c].current_func() + or self.config.configurable[self.options[c].name] local min_diff = math.abs(val - self.options[c].values[1]) local diff = nil for index, val_ in pairs(self.options[c].values) do @@ -395,7 +397,9 @@ function ConfigOption:init() end end elseif self.options[c].args then - local arg = self.config.configurable[self.options[c].name] + -- check if current arg is stored in configurable or calculated in runtime + local arg = self.options[c].current_func and self.options[c].current_func() + or self.config.configurable[self.options[c].name] for idx, arg_ in pairs(self.options[c].args) do if arg_ == arg then current_item = idx diff --git a/frontend/ui/reader/readermenu.lua b/frontend/ui/reader/readermenu.lua index 412ff21ba..671e8dce6 100644 --- a/frontend/ui/reader/readermenu.lua +++ b/frontend/ui/reader/readermenu.lua @@ -58,6 +58,8 @@ function ReaderMenu:setUpdateItemTable() table.insert(self.item_table, { text = "Return to file manager", callback = function() + self.ui:handleEvent(Event:new("RestoreScreenMode", + G_reader_settings:readSetting("screen_mode") or "portrait")) UIManager:close(self.menu_container) self.ui:onClose() end diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 4d832ade3..0ae308d13 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -132,12 +132,21 @@ end function ReaderView:onSetScreenMode(new_mode) if new_mode == "landscape" or new_mode == "portrait" then + self.screen_mode = new_mode Screen:setScreenMode(new_mode) self.ui:handleEvent(Event:new("SetDimensions", Screen:getSize())) end return true end +function ReaderView:onRestoreScreenMode(old_mode) + if old_mode == "landscape" or old_mode == "portrait" then + Screen:setScreenMode(old_mode) + self.ui:handleEvent(Event:new("SetDimensions", Screen:getSize())) + end + return true +end + function ReaderView:onSetDimensions(dimensions) self.dimen = dimensions -- recalculate view @@ -146,6 +155,11 @@ end function ReaderView:onReadSettings(config) self.render_mode = config:readSetting("render_mode") or 0 + local screen_mode = config:readSetting("screen_mode") + if screen_mode then + table.insert(self.ui.postInitCallback, function() + self:onSetScreenMode(screen_mode) end) + end end function ReaderView:onPageUpdate(new_page_no) @@ -192,4 +206,5 @@ end function ReaderView:onCloseDocument() self.ui.doc_settings:saveSetting("render_mode", self.render_mode) + self.ui.doc_settings:saveSetting("screen_mode", self.screen_mode) end