mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Merge pull request #674 from houqp/new_ui_houqp
bug fix in readerfont & minor code adjustment & page status in readerrolling
This commit is contained in:
30
cre.cpp
30
cre.cpp
@@ -294,6 +294,33 @@ static int getFontFaces(lua_State *L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int setViewMode(lua_State *L) {
|
||||
CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument");
|
||||
LVDocViewMode view_mode = (LVDocViewMode)luaL_checkint(L, 2);
|
||||
|
||||
doc->text_view->setViewMode(view_mode, -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setHeaderInfo(lua_State *L) {
|
||||
CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument");
|
||||
int info = luaL_checkint(L, 2);
|
||||
|
||||
doc->text_view->setPageHeaderInfo(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setHeaderFont(lua_State *L) {
|
||||
CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument");
|
||||
const char *face = luaL_checkstring(L, 2);
|
||||
|
||||
doc->text_view->setStatusFontFace(lString8(face));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setFontFace(lua_State *L) {
|
||||
CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument");
|
||||
const char *face = luaL_checkstring(L, 2);
|
||||
@@ -632,6 +659,9 @@ static const struct luaL_Reg credocument_meth[] = {
|
||||
{"getFontFace", getFontFace},
|
||||
{"getToc", getTableOfContent},
|
||||
/*--- set methods ---*/
|
||||
{"setViewMode", setViewMode},
|
||||
{"setHeaderInfo", setHeaderInfo},
|
||||
{"setHeaderFont", setHeaderFont},
|
||||
{"setFontFace", setFontFace},
|
||||
{"setFontSize", setFontSize},
|
||||
{"setDefaultInterlineSpace", setDefaultInterlineSpace},
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
require "ui/geometry"
|
||||
|
||||
CreDocument = Document:new{
|
||||
-- this is defined in kpvcrlib/crengine/crengine/include/lvdocview.h
|
||||
SCROLL_VIEW_MODE = 0,
|
||||
PAGE_VIEW_MODE = 1,
|
||||
|
||||
_document = false,
|
||||
engine_initilized = false,
|
||||
|
||||
line_space_percent = 100,
|
||||
default_font = "Droid Sans Fallback",
|
||||
view_mode = "page",
|
||||
}
|
||||
|
||||
-- NuPogodi, 20.05.12: inspect the zipfile content
|
||||
@@ -69,13 +72,10 @@ function CreDocument:init()
|
||||
end
|
||||
local style_sheet = "./data/"..file_type..".css"
|
||||
|
||||
-- view_mode default to page mode
|
||||
local view_mode = 1
|
||||
if self.view_mode == "scroll" then
|
||||
view_mode = 0
|
||||
end
|
||||
-- @TODO check the default view_mode to a global user configurable
|
||||
-- variable 22.12 2012 (houqp)
|
||||
ok, self._document = pcall(cre.openDocument, self.file, style_sheet,
|
||||
Screen:getWidth(), Screen:getHeight(), view_mode)
|
||||
Screen:getWidth(), Screen:getHeight(), self.PAGE_VIEW_MODE)
|
||||
if not ok then
|
||||
self.error_message = self.doc -- will contain error message
|
||||
return
|
||||
@@ -88,6 +88,22 @@ function CreDocument:init()
|
||||
--self._document:setDefaultInterlineSpace(self.line_space_percent)
|
||||
end
|
||||
|
||||
function CreDocument:drawCurrentView(target, x, y, rect, pos)
|
||||
tile_bb = Blitbuffer.new(rect.w, rect.h)
|
||||
self._document:drawCurrentPage(tile_bb)
|
||||
target:blitFrom(tile_bb, x, y, 0, 0, rect.w, rect.h)
|
||||
end
|
||||
|
||||
function CreDocument:drawCurrentViewByPos(target, x, y, rect, pos)
|
||||
self._document:gotoPos(pos)
|
||||
self:drawCurrentView(target, x, y, rect)
|
||||
end
|
||||
|
||||
function CreDocument:drawCurrentViewByPage(target, x, y, rect, page)
|
||||
self._document:gotoPage(page)
|
||||
self:drawCurrentView(target, x, y, rect)
|
||||
end
|
||||
|
||||
function CreDocument:hintPage(pageno, zoom, rotation)
|
||||
end
|
||||
|
||||
@@ -97,12 +113,44 @@ end
|
||||
function CreDocument:renderPage(pageno, rect, zoom, rotation)
|
||||
end
|
||||
|
||||
function CreDocument:gotoXPointer(xpointer)
|
||||
self._document:gotoXPointer(xpointer)
|
||||
end
|
||||
|
||||
function CreDocument:getXPointer()
|
||||
return self._document:getXPointer()
|
||||
end
|
||||
|
||||
function CreDocument:getPosFromXPointer(xp)
|
||||
return self._document:getPosFromXPointer(xp)
|
||||
end
|
||||
|
||||
function CreDocument:getPageFromXPointer(xp)
|
||||
return self._document:getPageFromXPointer(xp)
|
||||
end
|
||||
|
||||
function CreDocument:getFontFace()
|
||||
return self._document:getFontFace()
|
||||
end
|
||||
|
||||
function CreDocument:getCurrentPos()
|
||||
return self._document:getCurrentPos()
|
||||
end
|
||||
|
||||
function Document:gotoPos(pos)
|
||||
self._document:gotoPos(pos)
|
||||
end
|
||||
|
||||
function CreDocument:gotoPage(page)
|
||||
self._document:gotoPage(page)
|
||||
end
|
||||
|
||||
function CreDocument:getCurrentPage()
|
||||
return self._document:getCurrentPage()
|
||||
end
|
||||
|
||||
function CreDocument:setFontFace(new_font_face)
|
||||
if new_font_face then
|
||||
if new_font_face then
|
||||
self._document:setFontFace(new_font_face)
|
||||
end
|
||||
end
|
||||
@@ -112,7 +160,7 @@ function CreDocument:getFontSize()
|
||||
end
|
||||
|
||||
function CreDocument:setFontSize(new_font_size)
|
||||
if new_font_size then
|
||||
if new_font_size then
|
||||
self._document:setFontSize(new_font_size)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -234,13 +234,6 @@ function Document:drawPage(target, x, y, rect, pageno, zoom, rotation, render_mo
|
||||
rect.w, rect.h)
|
||||
end
|
||||
|
||||
function Document:drawCurrentView(target, x, y, rect, pos)
|
||||
self._document:gotoPos(pos)
|
||||
tile_bb = Blitbuffer.new(rect.w, rect.h)
|
||||
self._document:drawCurrentPage(tile_bb)
|
||||
target:blitFrom(tile_bb, x, y, 0, 0, rect.w, rect.h)
|
||||
end
|
||||
|
||||
function Document:getPageText(pageno)
|
||||
-- is this worth caching? not done yet.
|
||||
local page = self._document:openPage(pageno)
|
||||
|
||||
@@ -60,6 +60,11 @@ function ReaderFont:onReadSettings(config)
|
||||
self.font_size = self.ui.document:getFontSize()
|
||||
end
|
||||
self.ui.document:setFontSize(self.font_size)
|
||||
-- Dirty hack: we have to add folloing call in order to set
|
||||
-- m_is_rendered(member of LVDocView) to true. Otherwise position inside
|
||||
-- document will be reset to 0 on first view render.
|
||||
-- So far, I don't know why this call will alter the value of m_is_rendered.
|
||||
self.ui:handleEvent(Event:new("UpdatePos"))
|
||||
end
|
||||
|
||||
function ReaderFont:onShowFontMenu()
|
||||
@@ -87,6 +92,9 @@ function ReaderFont:onShowFontMenu()
|
||||
return true
|
||||
end
|
||||
|
||||
--[[
|
||||
UpdatePos event is used to tell ReaderRolling to update pos.
|
||||
--]]
|
||||
function ReaderFont:onChangeSize(direction)
|
||||
local delta = 1
|
||||
if direction == "decrease" then
|
||||
|
||||
@@ -2,7 +2,10 @@ require "ui/reader/readerpanning"
|
||||
|
||||
ReaderRolling = InputContainer:new{
|
||||
old_doc_height = nil,
|
||||
view_mode = "page",
|
||||
current_pos = 0,
|
||||
-- only used for page view mode
|
||||
current_page= nil,
|
||||
doc_height = nil,
|
||||
panning_steps = ReaderPanning.panning_steps,
|
||||
show_overlap_enable = true,
|
||||
@@ -90,11 +93,18 @@ function ReaderRolling:onReadSettings(config)
|
||||
self.show_overlap_enable = soe
|
||||
end
|
||||
self:gotoPercent(config:readSetting("last_percent") or 0)
|
||||
-- we have to do a real pos change in self.ui.document._document to
|
||||
-- update status information in CREngine.
|
||||
self.ui.document:gotoPos(self.current_pos)
|
||||
if self.view_mode == "page" then
|
||||
self.ui:handleEvent(Event:new("PageUpdate", self.ui.document:getCurrentPage()))
|
||||
end
|
||||
end
|
||||
|
||||
function ReaderRolling:onCloseDocument()
|
||||
local cur_xp = self.ui.document:getXPointer()
|
||||
self.ui.doc_settings:saveSetting("last_percent",
|
||||
10000 * self.current_pos / self.doc_height)
|
||||
10000 * self.ui.document:getPosFromXPointer(cur_xp) / self.doc_height)
|
||||
end
|
||||
|
||||
function ReaderRolling:onTapForward()
|
||||
@@ -111,6 +121,10 @@ function ReaderRolling:onPosUpdate(new_pos)
|
||||
self.current_pos = new_pos
|
||||
end
|
||||
|
||||
function ReaderRolling:onPageUpdate(new_page)
|
||||
self.current_page = new_page
|
||||
end
|
||||
|
||||
function ReaderRolling:onGotoPercent(percent)
|
||||
DEBUG("goto document offset in percent:", percent)
|
||||
self:gotoPercent(percent)
|
||||
@@ -119,19 +133,24 @@ end
|
||||
|
||||
function ReaderRolling:onGotoViewRel(diff)
|
||||
DEBUG("goto relative screen:", diff)
|
||||
local pan_diff = diff * self.ui.dimen.h
|
||||
if self.ui.document.view_mode ~= "page" and self.show_overlap_enable then
|
||||
if pan_diff > self.overlap then
|
||||
pan_diff = pan_diff - self.overlap
|
||||
elseif pan_diff < -self.overlap then
|
||||
pan_diff = pan_diff + self.overlap
|
||||
if self.ui.document.view_mode ~= "page" then
|
||||
local pan_diff = diff * self.ui.dimen.h
|
||||
if self.show_overlap_enable then
|
||||
if pan_diff > self.overlap then
|
||||
pan_diff = pan_diff - self.overlap
|
||||
elseif pan_diff < -self.overlap then
|
||||
pan_diff = pan_diff + self.overlap
|
||||
end
|
||||
end
|
||||
self:gotoPos(self.current_pos + pan_diff)
|
||||
else
|
||||
self:gotoPage(self.current_page + diff)
|
||||
end
|
||||
self:gotoPos(self.current_pos + pan_diff)
|
||||
return true
|
||||
end
|
||||
|
||||
function ReaderRolling:onPanning(args, key)
|
||||
--@TODO disable panning in page view_mode? 22.12 2012 (houqp)
|
||||
local _, dy = unpack(args)
|
||||
DEBUG("key =", key)
|
||||
self:gotoPos(self.current_pos + dy * self.panning_steps.normal)
|
||||
@@ -143,21 +162,25 @@ function ReaderRolling:onZoom()
|
||||
self:onUpdatePos()
|
||||
end
|
||||
|
||||
-- remember to signal this event the document has been zoomed,
|
||||
-- font has been changed, or line height has been changed.
|
||||
--[[
|
||||
remember to signal this event the document has been zoomed,
|
||||
font has been changed, or line height has been changed.
|
||||
--]]
|
||||
function ReaderRolling:onUpdatePos()
|
||||
-- reread document height
|
||||
self.ui.document:_readMetadata()
|
||||
-- update self.current_pos if the height of document has been changed.
|
||||
if self.old_doc_height ~= self.ui.document.info.doc_height then
|
||||
self:gotoPos(self.current_pos *
|
||||
(self.ui.document.info.doc_height - self.dialog.dimen.h) /
|
||||
(self.old_doc_height - self.dialog.dimen.h))
|
||||
self.old_doc_height = self.ui.document.info.doc_height
|
||||
local new_height = self.ui.document.info.doc_height
|
||||
if self.old_doc_height ~= new_height then
|
||||
self:gotoXPointer(self.ui.document:getXPointer())
|
||||
self.old_doc_height = new_height
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
--[[
|
||||
PosUpdate event is used to signal other widgets that pos has been changed.
|
||||
--]]
|
||||
function ReaderRolling:gotoPos(new_pos)
|
||||
if new_pos == self.current_pos then return end
|
||||
if new_pos < 0 then new_pos = 0 end
|
||||
@@ -177,6 +200,19 @@ function ReaderRolling:gotoPos(new_pos)
|
||||
self.ui:handleEvent(Event:new("PosUpdate", new_pos))
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoPage(new_page)
|
||||
self.ui.document:gotoPage(new_page)
|
||||
self.ui:handleEvent(Event:new("PageUpdate", new_page))
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoXPointer(xpointer)
|
||||
if self.view_mode == "page" then
|
||||
self:gotoPage(self.ui.document:getPageFromXPointer(xpointer))
|
||||
else
|
||||
self:gotoPos(self.ui.document:getPosFromXPointer(xpointer))
|
||||
end
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoPercent(new_percent)
|
||||
self:gotoPos(new_percent * self.doc_height / 10000)
|
||||
end
|
||||
|
||||
@@ -12,6 +12,8 @@ ReaderView = WidgetContainer:new{
|
||||
outer_page_color = 7,
|
||||
-- DjVu page rendering mode (used in djvu.c:drawPage())
|
||||
render_mode = 0, -- default to COLOR
|
||||
-- Crengine view mode
|
||||
view_mode = "page", -- default to page mode
|
||||
|
||||
-- visible area within current viewing page
|
||||
visible_area = Geom:new{x = 0, y = 0},
|
||||
@@ -49,12 +51,21 @@ function ReaderView:paintTo(bb, x, y)
|
||||
self.state.rotation,
|
||||
self.render_mode)
|
||||
else
|
||||
self.ui.document:drawCurrentView(
|
||||
bb,
|
||||
x + inner_offset.x,
|
||||
y + inner_offset.y,
|
||||
self.visible_area,
|
||||
self.state.pos)
|
||||
if self.view_mode == "page" then
|
||||
self.ui.document:drawCurrentViewByPage(
|
||||
bb,
|
||||
x + inner_offset.x,
|
||||
y + inner_offset.y,
|
||||
self.visible_area,
|
||||
self.state.page)
|
||||
else
|
||||
self.ui.document:drawCurrentViewByPos(
|
||||
bb,
|
||||
x + inner_offset.x,
|
||||
y + inner_offset.y,
|
||||
self.visible_area,
|
||||
self.state.pos)
|
||||
end
|
||||
end
|
||||
-- dim last read area
|
||||
if self.document.view_mode ~= "page"
|
||||
|
||||
Reference in New Issue
Block a user