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:
{Qingping,Dave} Hou
2012-12-29 22:12:51 -08:00
6 changed files with 163 additions and 37 deletions

30
cre.cpp
View File

@@ -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},

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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"