From 272c7a2e25c3ec39f43f60eaef28b6f7e0309921 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 16:58:45 -0500 Subject: [PATCH 01/13] bug fix: read css file name instread of content in cre:setStyleSheet --- cre.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cre.cpp b/cre.cpp index 47998a13b..6b9e02ef7 100644 --- a/cre.cpp +++ b/cre.cpp @@ -408,9 +408,13 @@ static int setDefaultInterlineSpace(lua_State *L) { static int setStyleSheet(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); - const char* style_sheet_data = luaL_checkstring(L, 2); + const char* style_sheet = luaL_checkstring(L, 2); + lString8 css; + + if (LVLoadStylesheetFile(lString16(style_sheet), css)){ + doc->text_view->setStyleSheet(css); + } - doc->text_view->setStyleSheet(lString8(style_sheet_data)); return 0; } From 6c4da43dbf85b3c3b429c032f902fe0ae3ffffb0 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 16:59:40 -0500 Subject: [PATCH 02/13] add setStyleSheet method to credocument --- frontend/document/credocument.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 2b5c05e53..afdfb17c2 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -281,6 +281,10 @@ function CreDocument:setGammaIndex(index) cre.setGammaIndex(index) end +function CreDocument:setStyleSheet(new_css) + self._document:setStyleSheet(new_css); +end + DocumentRegistry:addProvider("txt", "application/txt", CreDocument) DocumentRegistry:addProvider("epub", "application/epub", CreDocument) DocumentRegistry:addProvider("html", "application/html", CreDocument) From 65910b20175a79fc1b1e5b993c49069bf513402d Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 17:12:20 -0500 Subject: [PATCH 03/13] add default_css to credocument --- frontend/document/credocument.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index afdfb17c2..6d5732e70 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -81,6 +81,7 @@ CreDocument = Document:new{ line_space_percent = 100, default_font = "Droid Sans Fallback", header_font = "Droid Sans Fallback", + default_css = "./data/cr3.css", options = CreOptions, configurable = Configurable, } @@ -149,11 +150,11 @@ function CreDocument:init() if not io.open("./data/"..file_type..".css") then file_type = "cr3" end - local style_sheet = "./data/"..file_type..".css" + self.default_css = "./data/"..file_type..".css" -- @TODO check the default view_mode to a global user configurable -- variable 22.12 2012 (houqp) - ok, self._document = pcall(cre.newDocView, style_sheet, + ok, self._document = pcall(cre.newDocView, self.default_css, Screen:getWidth(), Screen:getHeight(), self.PAGE_VIEW_MODE) if not ok then self.error_message = self.doc -- will contain error message From 268926edf376e1c8fe52d4471c94ba1bc71c172b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 17:12:50 -0500 Subject: [PATCH 04/13] add readertypeset to readerui --- frontend/ui/readerui.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/ui/readerui.lua b/frontend/ui/readerui.lua index 876a1564a..a4331e97b 100644 --- a/frontend/ui/readerui.lua +++ b/frontend/ui/readerui.lua @@ -8,6 +8,7 @@ require "ui/reader/readerrolling" require "ui/reader/readertoc" require "ui/reader/readerbookmark" require "ui/reader/readerfont" +require "ui/reader/readertypeset" require "ui/reader/readermenu" require "ui/reader/readerconfig" @@ -123,10 +124,6 @@ function ReaderUI:init() ui = self } table.insert(self, roller) - --if not self.start_pos then - --self.start_pos = 0 - --end - --roller:gotoPercent(self.start_pos) -- font menu local font_menu = ReaderFont:new{ dialog = self.dialog, @@ -134,6 +131,13 @@ function ReaderUI:init() ui = self } table.insert(self, font_menu) + -- typeset controller + local typeset = ReaderTypeset:new{ + dialog = self.dialog, + view = self[1], + ui = self + } + table.insert(self, typeset) end if self.document.info.configurable then -- configurable controller From fe6d161382ef85bfe7200e15401d3765699df270 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 17:13:57 -0500 Subject: [PATCH 05/13] add readertypeset.lua --- frontend/ui/reader/readertypeset.lua | 53 ++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 frontend/ui/reader/readertypeset.lua diff --git a/frontend/ui/reader/readertypeset.lua b/frontend/ui/reader/readertypeset.lua new file mode 100644 index 000000000..529db9883 --- /dev/null +++ b/frontend/ui/reader/readertypeset.lua @@ -0,0 +1,53 @@ +ReaderTypeset = InputContainer:new{ + css_menu_title = "CSS Menu", + css = nil, +} + +function ReaderTypeset:init() + self.ui.menu:registerToMainMenu(self) +end + +function ReaderTypeset:onReadSettings(config) + self.css = config:readSetting("css") + if not self.css then + self.css = self.ui.document.default_css + end + self.ui.document:setStyleSheet(self.css) +end + +function ReaderTypeset:onCloseDocument() + self.ui.doc_settings:saveSetting("css", self.css) +end + +function ReaderTypeset:genStyleSheetMenu() + local file_list = {} + for f in lfs.dir("./data") do + if lfs.attributes("./data/"..f, "mode") == "file" and string.match(f, "%.css$") then + table.insert(file_list, { + text = f, + callback = function() + self:setStyleSheet("./data/"..f) + end + }) + end + end + return file_list +end + +function ReaderTypeset:setStyleSheet(new_css) + if new_css ~= self.css then + self.ui.document:setStyleSheet(new_css) + self.css = new_css + self.ui:handleEvent(Event:new("UpdatePos")) + end +end + +function ReaderTypeset:addToMainMenu(item_table) + -- insert table to main reader menu + table.insert(item_table, { + text = self.css_menu_title, + sub_item_table = self:genStyleSheetMenu(), + }) +end + + From 50e8750db46087de805ef419decbbf1a6259e0cb Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 17 Jan 2013 20:19:58 -0500 Subject: [PATCH 06/13] fix: check number of pages before calling hintPage otherwise, we will reach out page limit when reached last page --- frontend/ui/reader/readerview.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 94d0beb64..82d0e6d30 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -164,7 +164,13 @@ function ReaderView:onRotationUpdate(rotation) end function ReaderView:onHintPage() - self.ui.document:hintPage(self.state.page+1, self.state.zoom, self.state.rotation, self.render_mode) + if self.state.page < self.ui.document.info.number_of_pages then + self.ui.document:hintPage( + self.state.page+1, + self.state.zoom, + self.state.rotation, + self.render_mode) + end return true end From 8771bb8e656de3f0e7707e4a22e138c1d9977b3f Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 22 Jan 2013 06:26:28 +0800 Subject: [PATCH 07/13] API changes in cre.cpp * now css argument is removed from newDocView call. * when setStyleSheet method cannot read given css file, it clears all the applied style. * add setEmbeddedStyleSheet method. --- cre.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/cre.cpp b/cre.cpp index 6b9e02ef7..960b67844 100644 --- a/cre.cpp +++ b/cre.cpp @@ -45,11 +45,9 @@ static int initCache(lua_State *L) { } static int newDocView(lua_State *L) { - const char *style_sheet = luaL_checkstring(L, 1); - int width = luaL_checkint(L, 2); - int height = luaL_checkint(L, 3); - LVDocViewMode view_mode = (LVDocViewMode)luaL_checkint(L, 4); - lString8 css; + int width = luaL_checkint(L, 1); + int height = luaL_checkint(L, 2); + LVDocViewMode view_mode = (LVDocViewMode)luaL_checkint(L, 3); CreDocument *doc = (CreDocument*) lua_newuserdata(L, sizeof(CreDocument)); luaL_getmetatable(L, "credocument"); @@ -58,11 +56,8 @@ static int newDocView(lua_State *L) { doc->text_view = new LVDocView(); //doc->text_view->setBackgroundColor(0xFFFFFF); //doc->text_view->setTextColor(0x000000); - if (LVLoadStylesheetFile(lString16(style_sheet), css)){ - if (!css.empty()){ - doc->text_view->setStyleSheet(css); - } - } + //doc->text_view->doCommand(DCMD_SET_DOC_FONTS, 1); + //doc->text_view->doCommand(DCMD_SET_INTERNAL_STYLES, 1); doc->text_view->setViewMode(view_mode, -1); doc->text_view->Resize(width, height); doc->text_view->setPageHeaderInfo(PGHDR_AUTHOR|PGHDR_TITLE|PGHDR_PAGE_NUMBER|PGHDR_PAGE_COUNT|PGHDR_CHAPTER_MARKS|PGHDR_CLOCK); @@ -98,7 +93,7 @@ static int loadDocument(lua_State *L) { static int closeDocument(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); - // should be save if called twice + /* should be save if called twice */ if(doc->text_view != NULL) { delete doc->text_view; doc->text_view = NULL; @@ -413,11 +408,21 @@ static int setStyleSheet(lua_State *L) { if (LVLoadStylesheetFile(lString16(style_sheet), css)){ doc->text_view->setStyleSheet(css); + } else { + doc->text_view->setStyleSheet(lString8()); } return 0; } +static int setEmbeddedStyleSheet(lua_State *L) { + CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); + + doc->text_view->doCommand(DCMD_SET_INTERNAL_STYLES, luaL_checkint(L, 2)); + + return 0; +} + static int toggleFontBolder(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); @@ -677,6 +682,7 @@ static const struct luaL_Reg credocument_meth[] = { {"setFontSize", setFontSize}, {"setDefaultInterlineSpace", setDefaultInterlineSpace}, {"setStyleSheet", setStyleSheet}, + {"setEmbeddedStyleSheet", setEmbeddedStyleSheet}, /* --- control methods ---*/ {"gotoPage", gotoPage}, {"gotoPercent", gotoPercent}, @@ -705,7 +711,6 @@ int luaopen_cre(lua_State *L) { lua_pop(L, 1); luaL_register(L, "cre", cre_func); - /* initialize font manager for CREngine */ InitFontManager(lString8()); From 6d8ebb412626bbf78d51850df7f6288dcb2a10a5 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 22 Jan 2013 06:27:22 +0800 Subject: [PATCH 08/13] adapt credocument to new changes in cre.cpp --- frontend/document/credocument.lua | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 6d5732e70..f1d2f469c 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -66,7 +66,15 @@ CreOptions = { default_arg = "page", event = "SetViewMode", }, - } + { + name = "embedded_css", + name_text = "Embedded style", + item_text = {"toggle"}, + args = {1}, + default_arg = nil, + event = "ToggleEmbeddedStyleSheet", + }, + }, }, } @@ -154,8 +162,9 @@ function CreDocument:init() -- @TODO check the default view_mode to a global user configurable -- variable 22.12 2012 (houqp) - ok, self._document = pcall(cre.newDocView, self.default_css, - Screen:getWidth(), Screen:getHeight(), self.PAGE_VIEW_MODE) + ok, self._document = pcall(cre.newDocView, + Screen:getWidth(), Screen:getHeight(), self.PAGE_VIEW_MODE + ) if not ok then self.error_message = self.doc -- will contain error message return @@ -164,9 +173,6 @@ function CreDocument:init() self.info.has_pages = false self:_readMetadata() self.info.configurable = true - - -- @TODO read line_space_percent from setting file 12.06 2012 (houqp) - --self._document:setDefaultInterlineSpace(self.line_space_percent) end function CreDocument:loadDocument() @@ -283,7 +289,11 @@ function CreDocument:setGammaIndex(index) end function CreDocument:setStyleSheet(new_css) - self._document:setStyleSheet(new_css); + self._document:setStyleSheet(new_css) +end + +function CreDocument:setEmbeddedStyleSheet(toggle) + self._document:setEmbeddedStyleSheet(toggle) end DocumentRegistry:addProvider("txt", "application/txt", CreDocument) From f216be49a76e724d625906164d8cfbbd9f8a3006 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 22 Jan 2013 06:28:34 +0800 Subject: [PATCH 09/13] two changes to ReaderTypeset * now we only use Embedded CSS by default * add toggleEmbeddedStyleSheet methods --- frontend/ui/reader/readertypeset.lua | 60 ++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/frontend/ui/reader/readertypeset.lua b/frontend/ui/reader/readertypeset.lua index 529db9883..fba31cb23 100644 --- a/frontend/ui/reader/readertypeset.lua +++ b/frontend/ui/reader/readertypeset.lua @@ -1,6 +1,7 @@ ReaderTypeset = InputContainer:new{ css_menu_title = "CSS Menu", css = nil, + internal_css = true, } function ReaderTypeset:init() @@ -9,18 +10,47 @@ end function ReaderTypeset:onReadSettings(config) self.css = config:readSetting("css") - if not self.css then - self.css = self.ui.document.default_css + if self.css and self.css ~= "" then + self.ui.document:setStyleSheet(self.css) + else + self.ui.document:setStyleSheet("") + end + + self.embedded_css = config:readSetting("embedded_css") + -- default to enable embedded css + if self.embedded_css == nil then + self.embedded_css = true + end + if not self.embedded_css then + self.ui.document:setEmbeddedStyleSheet(0) end - self.ui.document:setStyleSheet(self.css) end function ReaderTypeset:onCloseDocument() self.ui.doc_settings:saveSetting("css", self.css) + self.ui.doc_settings:saveSetting("embedded_css", self.embedded_css) +end + +function ReaderTypeset:onToggleEmbeddedStyleSheet() + self:toggleEmbeddedStyleSheet() + return true end function ReaderTypeset:genStyleSheetMenu() - local file_list = {} + local file_list = { + { + text = "clear all styles", + callback = function() + self:setStyleSheet("") + end + }, + { + text = "Auto", + callback = function() + self:setStyleSheet(self.ui.document.default_css) + end + }, + } for f in lfs.dir("./data") do if lfs.attributes("./data/"..f, "mode") == "file" and string.match(f, "%.css$") then table.insert(file_list, { @@ -36,12 +66,34 @@ end function ReaderTypeset:setStyleSheet(new_css) if new_css ~= self.css then + --DEBUG("setting css to ", new_css) self.ui.document:setStyleSheet(new_css) self.css = new_css self.ui:handleEvent(Event:new("UpdatePos")) end end +function ReaderTypeset:setEmbededStyleSheetOnly() + if self.css ~= nil then + -- clear applied css + self.ui.document:setStyleSheet("") + self.ui.document:setEmbeddedStyleSheet(1) + self.css = nil + self.ui:handleEvent(Event:new("UpdatePos")) + end +end + +function ReaderTypeset:toggleEmbeddedStyleSheet() + if self.embedded_css then + self.ui.document:setEmbeddedStyleSheet(0) + self.embedded_css = false + else + self.ui.document:setEmbeddedStyleSheet(1) + self.embedded_css = true + end + self.ui:handleEvent(Event:new("UpdatePos")) +end + function ReaderTypeset:addToMainMenu(item_table) -- insert table to main reader menu table.insert(item_table, { From 69260aaac807de0dfc54a7e615b550471b9ed84e Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 22 Jan 2013 06:37:08 +0800 Subject: [PATCH 10/13] cosmetic changes to menu wording --- frontend/ui/reader/readerfont.lua | 2 +- frontend/ui/reader/readertypeset.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/ui/reader/readerfont.lua b/frontend/ui/reader/readerfont.lua index 5b221fb2d..33c6f5a3d 100644 --- a/frontend/ui/reader/readerfont.lua +++ b/frontend/ui/reader/readerfont.lua @@ -2,7 +2,7 @@ ReaderFont = InputContainer:new{ font_face = nil, font_size = nil, line_space_percent = nil, - font_menu_title = "Font Menu", + font_menu_title = "Change font", face_table = nil, -- default gamma from crengine's lvfntman.cpp gamma_index = nil, diff --git a/frontend/ui/reader/readertypeset.lua b/frontend/ui/reader/readertypeset.lua index fba31cb23..1813b8e1e 100644 --- a/frontend/ui/reader/readertypeset.lua +++ b/frontend/ui/reader/readertypeset.lua @@ -1,5 +1,5 @@ ReaderTypeset = InputContainer:new{ - css_menu_title = "CSS Menu", + css_menu_title = "Set render style", css = nil, internal_css = true, } @@ -39,7 +39,7 @@ end function ReaderTypeset:genStyleSheetMenu() local file_list = { { - text = "clear all styles", + text = "clear all external styles", callback = function() self:setStyleSheet("") end From c75530968268919e35d10fc3a62daca4df5094f7 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 22 Jan 2013 10:28:35 +0800 Subject: [PATCH 11/13] set self.css to nil when there is no external css --- frontend/ui/reader/readertypeset.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/ui/reader/readertypeset.lua b/frontend/ui/reader/readertypeset.lua index 1813b8e1e..7720ede53 100644 --- a/frontend/ui/reader/readertypeset.lua +++ b/frontend/ui/reader/readertypeset.lua @@ -14,6 +14,7 @@ function ReaderTypeset:onReadSettings(config) self.ui.document:setStyleSheet(self.css) else self.ui.document:setStyleSheet("") + self.css = nil end self.embedded_css = config:readSetting("embedded_css") @@ -41,7 +42,7 @@ function ReaderTypeset:genStyleSheetMenu() { text = "clear all external styles", callback = function() - self:setStyleSheet("") + self:setStyleSheet(nil) end }, { @@ -67,8 +68,11 @@ end function ReaderTypeset:setStyleSheet(new_css) if new_css ~= self.css then --DEBUG("setting css to ", new_css) - self.ui.document:setStyleSheet(new_css) self.css = new_css + if new_css == nil then + new_css = "" + end + self.ui.document:setStyleSheet(new_css) self.ui:handleEvent(Event:new("UpdatePos")) end end From b7e5921d4030cae9e76d5397dcf022657a91d6bd Mon Sep 17 00:00:00 2001 From: chrox Date: Wed, 23 Jan 2013 20:36:05 +0800 Subject: [PATCH 12/13] update k2pdfopt to version 1.64a --- libk2pdfopt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libk2pdfopt b/libk2pdfopt index f31e2a859..90ce6b4e0 160000 --- a/libk2pdfopt +++ b/libk2pdfopt @@ -1 +1 @@ -Subproject commit f31e2a859321603e4b9248a7314b5a2ab4ab301d +Subproject commit 90ce6b4e0bae768157ebbcbf0aeaf54930a0353c From 563fd50dc3af1a2553f67ffb2ff50ea736d4f279 Mon Sep 17 00:00:00 2001 From: chrox Date: Fri, 25 Jan 2013 23:53:00 +0800 Subject: [PATCH 13/13] add toggle switch widget in config option --- frontend/document/koptinterface.lua | 64 ++++---- frontend/ui/config.lua | 244 ++++++++++++++++++++++++---- 2 files changed, 243 insertions(+), 65 deletions(-) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index 3d625debf..a98fb354d 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -25,7 +25,9 @@ KoptOptions = { { name="screen_mode", name_text = "Screen Mode", - item_text = {"portrait", "landscape"}, + toggle = {"portrait", "landscape"}, + values = {1, 0}, + default_value = 1, -- TODO: add screen mode changing command } } @@ -36,7 +38,7 @@ KoptOptions = { { name="trim_page", name_text = "Page Crop", - item_text = {"auto", "manual"}, + toggle = {"auto", "manual"}, values = {1, 0}, default_value = 1, } @@ -48,17 +50,24 @@ KoptOptions = { { name = "page_margin", name_text = "Page Margin", - item_text = {"small", "medium", "large"}, + toggle = {"small", "medium", "large"}, values = {0.02, 0.06, 0.10}, default_value = 0.06, }, { name = "line_spacing", name_text = "Line Spacing", - item_text = {"small", "medium", "large"}, + toggle = {"small", "medium", "large"}, values = {1.0, 1.2, 1.4}, default_value = 1.2, }, + { + name = "max_columns", + name_text = "Columns", + item_text = {"1","2","3","4"}, + values = {1,2,3,4}, + default_value = 2, + }, { name = "justification", name_text = "Justification", @@ -103,57 +112,50 @@ KoptOptions = { { name = "text_wrap", name_text = "Reflow", - item_text = {"on","off"}, + toggle = {"On", "Off"}, values = {1, 0}, default_value = 0, event = "RedrawCurrentPage", }, - { - name = "max_columns", - name_text = "Columns", - item_text = {"1","2","3","4"}, - values = {1,2,3,4}, - default_value = 2, - }, { name="screen_rotation", name_text = "Vertical Text", - item_text = {"true", "false"}, - values = {90, 0}, - default_value = 0, - }, - { - name = "quality", - name_text = "Render Quality", - item_text = {"low", "default", "high"}, - values={0.5, 0.8, 1.0}, - default_value = 0.8, - }, - { - name = "auto_straighten", - name_text = "Auto Straighten", - item_text = {"0 deg", "5 deg", "10 deg"}, - values = {0, 5, 10}, + toggle = {"Off", "On"}, + values = {0, 90}, default_value = 0, }, { name = "word_spacing", name_text = "Word Gap", - item_text = {"small", "medium", "large"}, + toggle = {"small", "medium", "large"}, values = {0.05, 0.15, 0.375}, default_value = 0.15, }, { name = "defect_size", name_text = "Defect Size", - item_text = {"small","medium","large"}, + toggle = {"small", "medium", "large"}, values = {0.5, 1.0, 2.0}, default_value = 1.0, }, + { + name = "quality", + name_text = "Render Quality", + toggle = {"low", "default", "high"}, + values={0.5, 0.8, 1.0}, + default_value = 0.8, + }, + { + name = "auto_straighten", + name_text = "Auto Straighten", + toggle = {"0 deg", "5 deg", "10 deg"}, + values = {0, 5, 10}, + default_value = 0, + }, { name = "detect_indent", name_text = "Indentation", - item_text = {"enable","disable"}, + toggle = {"On", "Off"}, values = {1, 0}, default_value = 1, show = false, diff --git a/frontend/ui/config.lua b/frontend/ui/config.lua index 485abcc12..c8f797dcb 100644 --- a/frontend/ui/config.lua +++ b/frontend/ui/config.lua @@ -99,13 +99,172 @@ function OptionTextItem:onTapSelect() return true end +--[[ +Dummy Widget that reserves vertical and horizontal space +]] +RectSpan = Widget:new{ + width = 0, + hright = 0, +} + +function RectSpan:getSize() + return {w = self.width, h = self.height} +end + +ToggleLabel = TextWidget:new{} +function ToggleLabel:paintTo(bb, x, y) + if self.color == 0 then + return + end + renderUtf8Text(bb, x, y+self._height*0.75, self.face, self.text, true) +end + +ToggleSwitch = InputContainer:new{} +function ToggleSwitch:init() + self.n_pos = #self.toggle + if self.n_pos ~= 2 and self.n_pos ~= 3 then + -- currently only support options with two or three items. + error("items number not supported") + end + self.position = nil + + local label_font_face = "cfont" + local label_font_size = math.floor(20*Screen:getWidth()/600) + + self.toggle_frame = FrameContainer:new{background = 0, color = 7, radius = 7, bordersize = 1, padding = 2,} + self.toggle_content = HorizontalGroup:new{} + + self.left_label = ToggleLabel:new{ + align = "center", + color = 0, + text = self.toggle[self.n_pos], + face = Font:getFace(label_font_face, label_font_size), + } + self.left_button = FrameContainer:new{ + background = 0, + color = 7, + margin = 0, + radius = 5, + bordersize = 1, + padding = 2, + self.left_label, + } + self.middle_label = ToggleLabel:new{ + align = "center", + color = 0, + text = self.n_pos > 2 and self.toggle[2] or "", + face = Font:getFace(label_font_face, label_font_size), + } + self.middle_button = FrameContainer:new{ + background = 0, + color = 7, + margin = 0, + radius = 5, + bordersize = 1, + padding = 2, + self.middle_label, + } + self.right_label = ToggleLabel:new{ + align = "center", + color = 0, + text = self.toggle[1], + face = Font:getFace(label_font_face, label_font_size), + } + self.right_button = FrameContainer:new{ + background = 0, + color = 7, + margin = 0, + radius = 5, + bordersize = 1, + padding = 2, + self.right_label, + } + + table.insert(self.toggle_content, self.left_button) + table.insert(self.toggle_content, self.middle_button) + table.insert(self.toggle_content, self.right_button) + + self.toggle_frame[1] = self.toggle_content + self[1] = self.toggle_frame + self.dimen = Geom:new(self.toggle_frame:getSize()) + if Device:isTouchDevice() then + self.ges_events = { + TapSelect = { + GestureRange:new{ + ges = "tap", + range = self.dimen, + }, + doc = "Toggle switch", + }, + } + end +end + +function ToggleSwitch:onGesture(ev) + for name, gsseq in pairs(self.ges_events) do + for _, gs_range in ipairs(gsseq) do + --DEBUG("gs_range", gs_range) + if gs_range:match(ev) then + local eventname = gsseq.event or name + local position = math.ceil((ev.pos.x-gs_range.range.x)/gs_range.range.w*self.n_pos) + return self:handleEvent(Event:new(eventname, position)) + end + end + end +end + +function ToggleSwitch:update() + local left_pos = self.position == 1 + local right_pos = self.position == self.n_pos + local middle_pos = not left_pos and not right_pos + self.left_label.color = right_pos and 15 or 0 + self.left_button.color = left_pos and 7 or 0 + self.left_button.background = left_pos and 7 or 0 + self.middle_label.color = middle_pos and 15 or 0 + self.middle_button.color = middle_pos and 0 or 0 + self.middle_button.background = middle_pos and 0 or 0 + self.right_label.color = left_pos and 15 or 0 + self.right_button.color = right_pos and 7 or 0 + self.right_button.background = right_pos and 7 or 0 +end + +function ToggleSwitch:setPosition(position) + self.position = position + self:update() +end + +function ToggleSwitch:togglePosition(position) + if self.n_pos == 2 then + self.position = (self.position+1)%self.n_pos + self.position = self.position == 0 and self.n_pos or self.position + else + self.position = position + end + self:update() +end + +function ToggleSwitch:onTapSelect(position) + DEBUG("toggle position:", position) + self:togglePosition(position) + local option_value = nil + local option_arg = nil + if type(self.values) == "table" then + option_value = self.values[self.position] + self.config:onConfigChoice(self.name, option_value, self.event) + elseif type(self.args) == "table" then + option_arg = self.args[self.position] + self.config:onConfigChoice(self.name, option_arg, self.event) + end + UIManager.repaint_all = true +end + ConfigOption = CenterContainer:new{} function ConfigOption:init() local default_name_font_size = math.floor(20*Screen:getWidth()/600) local default_item_font_size = math.floor(20*Screen:getWidth()/600) local default_items_spacing = math.floor(30*Screen:getWidth()/600) - local default_option_height = math.floor(40*Screen:getWidth()/600) - local default_option_padding = math.floor(40*Screen:getWidth()/600) + local default_option_height = math.floor(50*Screen:getWidth()/600) + local default_option_padding = math.floor(30*Screen:getWidth()/600) local vertical_group = VerticalGroup:new{} table.insert(vertical_group, VerticalSpan:new{ width = default_option_padding }) for c = 1, #self.options do @@ -184,40 +343,57 @@ function ConfigOption:init() end end - for d = 1, #self.options[c].item_text do - local option_item = nil - if option_items_fixed then - option_item = OptionTextItem:new{ - FixedTextWidget:new{ - text = self.options[c].item_text[d], - face = Font:getFace(item_font_face, item_font_size[d]), - }, - padding = 3, - color = d == current_item and 15 or 0, - } - else - option_item = OptionTextItem:new{ - TextWidget:new{ - text = self.options[c].item_text[d], - face = Font:getFace(item_font_face, item_font_size), - }, - padding = -3, - color = d == current_item and 15 or 0, - } - end - option_items[d] = option_item - option_item.items = option_items - option_item.name = self.options[c].name - option_item.values = self.options[c].values - option_item.args = self.options[c].args - option_item.event = self.options[c].event - option_item.current_item = d - option_item.config = self.config - table.insert(option_items_group, option_item) - if d ~= #self.options[c].item_text then - table.insert(option_items_group, items_spacing) + if self.options[c].item_text then + for d = 1, #self.options[c].item_text do + local option_item = nil + if option_items_fixed then + option_item = OptionTextItem:new{ + FixedTextWidget:new{ + text = self.options[c].item_text[d], + face = Font:getFace(item_font_face, item_font_size[d]), + }, + padding = 3, + color = d == current_item and 15 or 0, + } + else + option_item = OptionTextItem:new{ + TextWidget:new{ + text = self.options[c].item_text[d], + face = Font:getFace(item_font_face, item_font_size), + }, + padding = -3, + color = d == current_item and 15 or 0, + } + end + option_items[d] = option_item + option_item.items = option_items + option_item.name = self.options[c].name + option_item.values = self.options[c].values + option_item.args = self.options[c].args + option_item.event = self.options[c].event + option_item.current_item = d + option_item.config = self.config + table.insert(option_items_group, option_item) + if d ~= #self.options[c].item_text then + table.insert(option_items_group, items_spacing) + end end end + + if self.options[c].toggle then + local switch = ToggleSwitch:new{ + name = self.options[c].name, + toggle = self.options[c].toggle, + values = self.options[c].values, + args = self.options[c].args, + event = self.options[c].event, + config = self.config, + } + local position = current_item + switch:setPosition(position) + table.insert(option_items_group, switch) + end + table.insert(option_items_container, option_items_group) table.insert(horizontal_group, option_items_container) table.insert(vertical_group, horizontal_group)