diff --git a/cre.cpp b/cre.cpp index 47998a13b..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; @@ -408,9 +403,23 @@ 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); + } 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)); - doc->text_view->setStyleSheet(lString8(style_sheet_data)); return 0; } @@ -673,6 +682,7 @@ static const struct luaL_Reg credocument_meth[] = { {"setFontSize", setFontSize}, {"setDefaultInterlineSpace", setDefaultInterlineSpace}, {"setStyleSheet", setStyleSheet}, + {"setEmbeddedStyleSheet", setEmbeddedStyleSheet}, /* --- control methods ---*/ {"gotoPage", gotoPage}, {"gotoPercent", gotoPercent}, @@ -701,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()); diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 2b5c05e53..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", + }, + }, }, } @@ -81,6 +89,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,12 +158,13 @@ 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, - 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 @@ -163,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() @@ -281,6 +288,14 @@ function CreDocument:setGammaIndex(index) cre.setGammaIndex(index) end +function CreDocument:setStyleSheet(new_css) + self._document:setStyleSheet(new_css) +end + +function CreDocument:setEmbeddedStyleSheet(toggle) + self._document:setEmbeddedStyleSheet(toggle) +end + DocumentRegistry:addProvider("txt", "application/txt", CreDocument) DocumentRegistry:addProvider("epub", "application/epub", CreDocument) DocumentRegistry:addProvider("html", "application/html", CreDocument) 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 new file mode 100644 index 000000000..7720ede53 --- /dev/null +++ b/frontend/ui/reader/readertypeset.lua @@ -0,0 +1,109 @@ +ReaderTypeset = InputContainer:new{ + css_menu_title = "Set render style", + css = nil, + internal_css = true, +} + +function ReaderTypeset:init() + self.ui.menu:registerToMainMenu(self) +end + +function ReaderTypeset:onReadSettings(config) + self.css = config:readSetting("css") + if self.css and self.css ~= "" then + self.ui.document:setStyleSheet(self.css) + else + self.ui.document:setStyleSheet("") + self.css = nil + 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 +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 = { + { + text = "clear all external styles", + callback = function() + self:setStyleSheet(nil) + 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, { + 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 + --DEBUG("setting css to ", 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 + +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, { + text = self.css_menu_title, + sub_item_table = self:genStyleSheetMenu(), + }) +end + + 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