Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/readactivity.py
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@sugarlabs.org>2011-02-12 21:32:21 (GMT)
committer Gonzalo Odiard <godiard@sugarlabs.org>2011-02-12 21:32:21 (GMT)
commit5aa984020832ee87513570c5f5593b6f721c9eea (patch)
treeac4a41c10a47fba42fa20703a641cd5eb142ff8b /readactivity.py
parent5832d4df2cfd4478463ec581e21ac4f2bc92ad21 (diff)
Get back functionalities in EPUB framework
- TOC, zoom and find are working in epub - All the code specific to a backend is moved outsude of readactivity.py, readtoolbar.py and readtopbar.py - Rename adapter classes to avoid confusion
Diffstat (limited to 'readactivity.py')
-rw-r--r--readactivity.py172
1 files changed, 43 insertions, 129 deletions
diff --git a/readactivity.py b/readactivity.py
index ba8bbfa..48baaa2 100644
--- a/readactivity.py
+++ b/readactivity.py
@@ -25,7 +25,6 @@ import re
import md5
import dbus
-import evince
import gobject
import gtk
import pango
@@ -50,14 +49,8 @@ from readtoolbar import EditToolbar, ViewToolbar
from readsidebar import Sidebar
from readtopbar import TopBar
-
-_EPUB_SUPPORT = True
-try:
- import epubadapter
-except ImportError, e:
- _EPUB_SUPPORT = False
- logging.warning('Epub support disabled because: %s' % e)
-
+import epubadapter
+import evinceadapter
_HARDWARE_MANAGER_INTERFACE = 'org.laptop.HardwareManager'
_HARDWARE_MANAGER_SERVICE = 'org.laptop.HardwareManager'
@@ -76,7 +69,7 @@ def _get_screen_dpi():
def get_md5(filename):
#FIXME: Should be moved somewhere else
- filename = filename.replace('file://', '') #XXX: hack
+ filename = filename.replace('file://', '') # XXX: hack
fh = open(filename)
digest = md5.new()
while 1:
@@ -139,10 +132,10 @@ class ReadActivity(activity.Activity):
def __init__(self, handle):
activity.Activity.__init__(self, handle)
- self._epub = False
self._document = None
self._fileserver = None
self._object_id = handle.object_id
+ self._toc_model = None
self.connect('key-press-event', self._key_press_event_cb)
self.connect('key-release-event', self._key_release_event_cb)
@@ -151,7 +144,7 @@ class ReadActivity(activity.Activity):
_logger.debug('Starting Read...')
self._view = None
-
+ self.dpi = _get_screen_dpi()
self._sidebar = Sidebar()
self._sidebar.show()
@@ -408,12 +401,7 @@ class ReadActivity(activity.Activity):
else:
page = 0
- if page >= self._document.get_n_pages():
- page = self._document.get_n_pages() - 1
- elif page < 0:
- page = 0
-
- self._model.props.page = page
+ self._view.set_current_page(page)
entry.props.text = str(page + 1)
def __go_back_cb(self, button):
@@ -429,23 +417,23 @@ class ReadActivity(activity.Activity):
self._view.next_page()
def __prev_bookmark_activate_cb(self, menuitem):
- page = self._model.props.page
+ page = self._view.get_current_page()
bookmarkmanager = self._sidebar.get_bookmarkmanager()
prev_bookmark = bookmarkmanager.get_prev_bookmark_for_page(page)
if prev_bookmark is not None:
- self._model.props.page = prev_bookmark.page_no
+ self._view.set_current_page(prev_bookmark.page_no)
def __next_bookmark_activate_cb(self, menuitem):
- page = self._model.props.page
+ page = self._view.get_current_page()
bookmarkmanager = self._sidebar.get_bookmarkmanager()
next_bookmark = bookmarkmanager.get_next_bookmark_for_page(page)
if next_bookmark is not None:
- self._model.props.page = next_bookmark.page_no
+ self._view.set_current_page(next_bookmark.page_no)
def __bookmarker_toggled_cb(self, button):
- page = self._model.props.page
+ page = self._view.get_current_page()
if self._bookmarker.props.active:
self._sidebar.add_bookmark(page)
else:
@@ -453,27 +441,31 @@ class ReadActivity(activity.Activity):
def __page_changed_cb(self, model, page_from, page_to):
self._update_nav_buttons()
- if hasattr(self._document, 'has_document_links'):
- if self._document.has_document_links():
- self._toc_select_active_page()
+ if self._toc_model != None:
+ self._toc_select_active_page()
- self._sidebar.update_for_page(self._model.props.page)
+ self._sidebar.update_for_page(self._view.get_current_page())
self._bookmarker.handler_block(self._bookmarker_toggle_handler_id)
- self._bookmarker.props.active = self._sidebar.is_showing_local_bookmark()
+ self._bookmarker.props.active = \
+ self._sidebar.is_showing_local_bookmark()
self._bookmarker.handler_unblock(self._bookmarker_toggle_handler_id)
def _update_nav_buttons(self):
- current_page = self._model.props.page
+ current_page = self._view.get_current_page()
self._back_button.props.sensitive = current_page > 0
self._forward_button.props.sensitive = \
- current_page < self._document.get_n_pages() - 1
+ current_page < self._view.get_pagecount() - 1
self._num_page_entry.props.text = str(current_page + 1)
self._total_page_label.props.label = \
- ' / ' + str(self._document.get_n_pages())
+ ' / ' + str(self._view.get_pagecount())
def _update_toc(self):
+ if self._view.update_toc(self):
+ self._navigator_changed_handler_id = \
+ self._navigator.connect('changed', self.__navigator_changed_cb)
+
if hasattr(self._document, 'has_document_links'):
if self._document.has_document_links():
self._navigator_toolbar_button.show()
@@ -515,7 +507,7 @@ class ReadActivity(activity.Activity):
iter = self._navigator.get_active_iter()
current_link = self._toc_model.get(iter, 1)[0]
- current_page = self._model.props.page
+ current_page = self._view.get_current_page()
if not hasattr(current_link, 'get_page'):
filepath = self._view.get_current_file()
@@ -526,7 +518,8 @@ class ReadActivity(activity.Activity):
return
self._navigator.handler_block(self._navigator_changed_handler_id)
- self._toc_model.foreach(self._toc_select_active_page_foreach, current_page)
+ self._toc_model.foreach(self._toc_select_active_page_foreach,
+ current_page)
self._navigator.handler_unblock(self._navigator_changed_handler_id)
def _show_journal_object_picker(self):
@@ -557,7 +550,8 @@ class ReadActivity(activity.Activity):
# Now active, start initial suspend timeout
if self._idle_timer > 0:
gobject.source_remove(self._idle_timer)
- self._idle_timer = gobject.timeout_add_seconds(15, self._suspend_cb)
+ self._idle_timer = gobject.timeout_add_seconds(15,
+ self._suspend_cb)
self._sleep_inhibit = False
else:
# Now inactive
@@ -597,8 +591,8 @@ class ReadActivity(activity.Activity):
self._load_document('file://' + self._tempfile)
# FIXME: This should obviously be fixed properly
- gobject.timeout_add_seconds(1, self.__view_toolbar_needs_update_size_cb,
- None)
+ gobject.timeout_add_seconds(1,
+ self.__view_toolbar_needs_update_size_cb, None)
def write_file(self, file_path):
"""Write into datastore for Keep.
@@ -616,21 +610,9 @@ class ReadActivity(activity.Activity):
try:
self.metadata['Read_current_page'] = \
- str(self._model.props.page)
-
- self.metadata['Read_zoom'] = str(self._model.props.scale)
-
- if not self._epub:
- if self._model.props.sizing_mode == evince.SIZING_BEST_FIT:
- self.metadata['Read_sizing_mode'] = "best-fit"
- elif self._model.props.sizing_mode == evince.SIZING_FREE:
- self.metadata['Read_sizing_mode'] = "free"
- elif self._model.props.sizing_mode == evince.SIZING_FIT_WIDTH:
- self.metadata['Read_sizing_mode'] = "fit-width"
- else:
- _logger.error("Don't know how to save sizing_mode state '%s'" %
- self._model.props.sizing_mode)
- self.metadata['Read_sizing_mode'] = "fit-width"
+ str(self._view.get_current_page())
+
+ self._view.update_metadata(self)
self.metadata['Read_search'] = \
self._edit_toolbar._search_entry.props.text
@@ -758,30 +740,6 @@ class ReadActivity(activity.Activity):
self.watch_for_tubes()
gobject.idle_add(self._get_document)
- def _setup_epub_viewer(self):
- self._view = epubadapter.View()
- self._view.set_screen_dpi(_get_screen_dpi())
- self._view.connect('selection-changed',
- self._view_selection_changed_cb)
-
- self._hbox.pack_start(self._view, expand=True, fill=True)
- self._view.show_all()
-
- def _setup_evince_viewer(self):
- self._view = evince.View()
- self._view.connect('selection-changed',
- self._view_selection_changed_cb)
-
- self._scrolled = gtk.ScrolledWindow()
- self._scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- self._scrolled.props.shadow_type = gtk.SHADOW_NONE
-
- self._scrolled.add(self._view)
- self._view.show()
-
- self._hbox.pack_start(self._scrolled, expand=True, fill=True)
- self._scrolled.show()
-
def _load_document(self, filepath):
"""Load the specified document and set up the UI.
@@ -790,43 +748,19 @@ class ReadActivity(activity.Activity):
"""
mimetype = mime.get_for_file(filepath)
if mimetype == 'application/epub+zip':
- if not _EPUB_SUPPORT:
- self.close()
- return
- self._epub = True
- self._setup_epub_viewer()
- self._document = epubadapter.EpubDocument(self._view, filepath.replace('file://', ''))
- self._model = None
-
- self._view.set_document(self._document)
+ self._view = epubadapter.EpubViewer()
else:
- self._setup_evince_viewer()
- try:
- self._document = evince.document_factory_get_document(filepath)
- except GError, e:
- _logger.error('Can not load document: %s', e)
- return
- else:
- self._model = evince.DocumentModel()
- self._model.set_document(self._document)
- self._view.set_model(self._model)
+ self._view = evinceadapter.EvinceViewer()
- # set dpi
- dpi = _get_screen_dpi()
- min_scale = self._model.get_min_scale()
- max_scale = self._model.get_max_scale()
- self._model.set_min_scale(min_scale * dpi / 72.0)
- self._model.set_max_scale(max_scale * dpi / 72.0)
+ self._view.setup(self)
+ self._view.load_document(filepath)
self._want_document = False
- # set dpi
-
- self._view_toolbar.set_view(self._view, self._model)
+ self._view_toolbar.set_view(self._view)
self._edit_toolbar.set_view(self._view)
- self._edit_toolbar.set_document(self._document)
- self._topbar.set_document(self._document)
+ self._topbar.set_view(self._view)
filehash = get_md5(filepath)
self._sidebar.set_bookmarkmanager(filehash)
@@ -834,34 +768,14 @@ class ReadActivity(activity.Activity):
self._update_nav_buttons()
self._update_toc()
- self._model.connect('page-changed', self.__page_changed_cb)
+ self._view.connect_page_changed_handler(self.__page_changed_cb)
if not self.metadata['title_set_by_user'] == '1':
title = self._document.get_title()
if title:
self.metadata['title'] = title
- if not self._epub:
- sizing_mode = self.metadata.get('Read_sizing_mode', 'fit-width')
- _logger.debug('Found sizing mode: %s', sizing_mode)
- if sizing_mode == "best-fit":
- self._model.props.sizing_mode = evince.SIZING_BEST_FIT
- if hasattr(self._view, 'update_view_size'):
- self._view.update_view_size(self._scrolled)
- elif sizing_mode == "free":
- self._model.props.sizing_mode = evince.SIZING_FREE
- self._model.props.scale = float(self.metadata.get('Read_zoom', '1.0'))
- _logger.debug('Set zoom to %f', self._model.props.scale)
- elif sizing_mode == "fit-width":
- self._model.props.sizing_mode = evince.SIZING_FIT_WIDTH
- if hasattr(self._view, 'update_view_size'):
- self._view.update_view_size(self._scrolled)
- else:
- # this may happen when we get a document from a buddy with a later
- # version of Read, for example.
- _logger.warning("Unknown sizing_mode state '%s'", sizing_mode)
- if self.metadata.get('Read_zoom', None) is not None:
- self._model.props.scale = float(self.metadata['Read_zoom'])
+ self._view.load_metadata(self)
self._view_toolbar._update_zoom_buttons()
@@ -870,7 +784,7 @@ class ReadActivity(activity.Activity):
current_page = int(self.metadata.get('Read_current_page', '0'))
_logger.debug('Setting page to: %d', current_page)
- self._model.props.page = current_page
+ self._view.set_current_page(current_page)
# We've got the document, so if we're a shared activity, offer it
try:
@@ -993,7 +907,7 @@ class ReadActivity(activity.Activity):
if hasattr(self._view, 'update_view_size'):
self._view.update_view_size(self._scrolled)
else:
- return False # No need to run this again and again
+ return False # No need again to run this again and
def __view_toolbar_go_fullscreen_cb(self, view_toolbar):
self.fullscreen()