Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epubadapter.py13
-rw-r--r--epubview/epubview.py2
-rw-r--r--evinceadapter.py12
-rw-r--r--readactivity.py125
-rw-r--r--readtoolbar.py19
5 files changed, 110 insertions, 61 deletions
diff --git a/epubadapter.py b/epubadapter.py
index 13d4185..5ad6e55 100644
--- a/epubadapter.py
+++ b/epubadapter.py
@@ -144,14 +144,15 @@ class EpubViewer(epubview.EpubView):
def get_current_page(self):
return int(self._loaded_page) - 1
+ def get_current_link(self):
+ # the _loaded_filename include all the path,
+ # need only the part included in the link
+ return self._loaded_filename[len(self._epub._tempdir) + 1:]
+
def update_toc(self, activity):
if self._epub.has_document_links():
- activity._navigator_toolbar_button.show()
- activity._navigator.show_all()
-
- activity._toc_model = self._epub.get_links_model()
- activity._navigator.set_model(activity._toc_model)
- activity._navigator.set_active(0)
+ activity.show_navigator_button()
+ activity.set_navigator_model(self._epub.get_links_model())
return True
else:
return False
diff --git a/epubview/epubview.py b/epubview/epubview.py
index ea52b5a..8865aeb 100644
--- a/epubview/epubview.py
+++ b/epubview/epubview.py
@@ -556,7 +556,6 @@ class _View(Gtk.HBox):
if self._loaded_page == pageno:
return
- self._on_page_changed(self._loaded_page, pageno)
filename = self._paginator.get_file_for_pageno(pageno)
filename = filename.replace('file://', '')
@@ -587,6 +586,7 @@ class _View(Gtk.HBox):
else:
self._loaded_page = pageno
self._scroll_page()
+ self._on_page_changed(self._loaded_page, pageno)
def _insert_js_reference(self, file_name, path):
js_reference = '<script type="text/javascript" ' + \
diff --git a/evinceadapter.py b/evinceadapter.py
index 06071cd..59a4e3e 100644
--- a/evinceadapter.py
+++ b/evinceadapter.py
@@ -91,6 +91,10 @@ class EvinceViewer():
def get_current_page(self):
return self._model.props.page
+ def get_current_link(self):
+ # TODO
+ return ""
+
def set_current_page(self, page):
if page >= self._document.get_n_pages():
page = self._document.get_n_pages() - 1
@@ -273,12 +277,8 @@ class EvinceViewer():
break
"""
- activity._navigator_toolbar_button.show()
- activity._navigator.show_all()
-
- activity._toc_model = self._index_model
- activity._navigator.set_model(activity._toc_model)
- activity._navigator.set_active(0)
+ activity.show_navigator_button()
+ activity.set_navigator_model(self._epub.get_links_model())
return True
def find_set_highlight_search(self, set_highlight_search):
diff --git a/readactivity.py b/readactivity.py
index 1a5d047..9e314c6 100644
--- a/readactivity.py
+++ b/readactivity.py
@@ -177,6 +177,8 @@ class ReadActivity(activity.Activity):
self._view_toolbar = ViewToolbar()
self._view_toolbar.connect('go-fullscreen',
self.__view_toolbar_go_fullscreen_cb)
+ self._view_toolbar.connect('toggle-index-show',
+ self.__toogle_navigator_cb)
view_toolbar_button = ToolbarButton(
page=self._view_toolbar,
icon_name='toolbar-view')
@@ -212,17 +214,6 @@ class ReadActivity(activity.Activity):
toolbar_box.toolbar.insert(spacer, -1)
spacer.show()
- navigator_toolbar = Gtk.Toolbar()
- self._navigator = self._create_navigator()
- combotool = ToolComboBox(self._navigator)
- navigator_toolbar.insert(combotool, -1)
- self._navigator.show()
- combotool.show()
- self._navigator_toolbar_button = ToolbarButton(page=navigator_toolbar,
- icon_name='view-list')
- navigator_toolbar.show()
- toolbar_box.toolbar.insert(self._navigator_toolbar_button, -1)
-
self._bookmarker = ToggleToolButton('emblem-favorite')
self._bookmarker_toggle_handler_id = self._bookmarker.connect( \
'toggled', self.__bookmarker_toggled_cb)
@@ -280,6 +271,8 @@ class ReadActivity(activity.Activity):
self._vbox.pack_start(overlay, True, True, 0)
self.set_canvas(self._vbox)
+ self._navigator = self._create_navigator()
+
# Set up for idle suspend
self._idle_timer = 0
self._service = None
@@ -408,13 +401,50 @@ class ReadActivity(activity.Activity):
def _set_total_page_label(self, value):
self._total_page_label.set_text(' / %s' % value)
+ def show_navigator_button(self):
+ self._view_toolbar.show_nav_button()
+
def _create_navigator(self):
- navigator = Gtk.ComboBox()
+ self._toc_visible = False
+ self._update_toc_view = False
+ toc_navigator = Gtk.TreeView()
+ toc_navigator.set_enable_search(False)
+ toc_selection = toc_navigator.get_selection()
+ toc_selection.set_mode(Gtk.SelectionMode.SINGLE)
+
cell = Gtk.CellRendererText()
- navigator.pack_start(cell, True)
- navigator.add_attribute(cell, 'text', 0)
- navigator.props.visible = False
- return navigator
+ self.treecol_toc = Gtk.TreeViewColumn(_('Index'), cell, text=0)
+ toc_navigator.append_column(self.treecol_toc)
+
+ self._toc_scroller = Gtk.ScrolledWindow(hadjustment=None,
+ vadjustment=None)
+ self._toc_scroller.set_policy(Gtk.PolicyType.AUTOMATIC,
+ Gtk.PolicyType.AUTOMATIC)
+ self._toc_scroller.add(toc_navigator)
+ self._hbox.pack_start(self._toc_scroller, expand=False, fill=False,
+ padding=0)
+ self._toc_separator = Gtk.VSeparator()
+ self._hbox.pack_start(self._toc_separator, expand=False,
+ fill=False, padding=1)
+ return toc_navigator
+
+ def set_navigator_model(self, model):
+ self._toc_model = model
+ self._navigator.set_model(model)
+
+ def __toogle_navigator_cb(self, button, visible):
+ if visible:
+ self._toc_visible = True
+ self._update_toc_view = True
+ self._toc_select_active_page()
+ self._toc_scroller.set_size_request(int(Gdk.Screen.width() / 4),
+ -1)
+ self._toc_scroller.show_all()
+ self._toc_separator.show()
+ else:
+ self._toc_visible = False
+ self._toc_scroller.hide()
+ self._toc_separator.hide()
def __num_page_entry_insert_text_cb(self, entry, text, length, position):
if not re.match('[0-9]', text):
@@ -542,48 +572,47 @@ class ReadActivity(activity.Activity):
def _update_toc(self):
if self._view.update_toc(self):
self._navigator_changed_handler_id = \
- self._navigator.connect('changed', self.__navigator_changed_cb)
+ self._navigator.connect('cursor-changed',
+ self.__navigator_cursor_changed_cb)
- def __navigator_changed_cb(self, combobox):
- iter = self._navigator.get_active_iter()
+ def __navigator_cursor_changed_cb(self, toc_treeview):
+ treestore, toc_selected = toc_treeview.get_selection().get_selected()
- link = self._toc_model.get(iter, 1)[0]
- self._view.handle_link(link)
+ if toc_selected is not None:
+ link = self._toc_model.get(toc_selected, 1)[0]
+ logging.debug('View handle link %s', link)
+ self._update_toc_view = False
+ self._view.handle_link(link)
+ self._update_toc_view = True
- def _toc_select_active_page_foreach(self, model, path, iter, current_page):
- link = self._toc_model.get(iter, 1)[0]
+ def _toc_select_active_page(self):
+ if not self._toc_visible or not self._update_toc_view:
+ return
- if not hasattr(link, 'get_page'):
- #FIXME: This needs to be implemented in epubadapter, not here
- filepath = self._view.get_current_file()
- if filepath.endswith(link):
- self._navigator.set_active_iter(iter)
- return True
+ _store, toc_selected = self._navigator.get_selection().get_selected()
+
+ if toc_selected is not None:
+ selected_link = self._toc_model.get(toc_selected, 1)[0]
else:
- if current_page == link.get_page():
- self._navigator.set_active_iter(iter)
- return True
+ selected_link = ""
+ current_link = self._view.get_current_link()
- return False
+ if current_link == selected_link:
+ return
- def _toc_select_active_page(self):
- iter = self._navigator.get_active_iter()
+ link_iter = self._toc_model.get_iter_first()
- current_link = self._toc_model.get(iter, 1)[0]
- current_page = self._view.get_current_page()
+ while link_iter is not None and \
+ self._toc_model.get_value(link_iter, 1) != current_link:
+ link_iter = self._toc_model.iter_next(link_iter)
- if not hasattr(current_link, 'get_page'):
- filepath = self._view.get_current_file()
- if filepath is None or filepath.endswith(current_link):
- return
+ if link_iter is not None:
+ self._navigator.handler_block(self._navigator_changed_handler_id)
+ toc_selection = self._navigator.get_selection()
+ toc_selection.select_iter(link_iter)
+ self._navigator.handler_unblock(self._navigator_changed_handler_id)
else:
- if current_link.get_page() == current_page:
- return
-
- self._navigator.handler_block(self._navigator_changed_handler_id)
- self._toc_model.foreach(self._toc_select_active_page_foreach,
- current_page)
- self._navigator.handler_unblock(self._navigator_changed_handler_id)
+ logging.debug('link "%s" not found in the toc model', current_link)
def _show_journal_object_picker(self):
"""Show the journal object picker to load a document.
diff --git a/readtoolbar.py b/readtoolbar.py
index 58baebc..737c55d 100644
--- a/readtoolbar.py
+++ b/readtoolbar.py
@@ -22,6 +22,7 @@ from gi.repository import Gtk
from gi.repository import Gdk
from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.toggletoolbutton import ToggleToolButton
from sugar3.graphics import iconentry
from sugar3.activity.widgets import EditToolbar as BaseEditToolbar
@@ -164,6 +165,8 @@ class ViewToolbar(Gtk.Toolbar):
__gsignals__ = {
'go-fullscreen': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
([])),
+ 'toggle-index-show': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
+ ([bool])),
}
def __init__(self):
@@ -171,6 +174,15 @@ class ViewToolbar(Gtk.Toolbar):
self._view = None
+ self._navigator_button = ToggleToolButton('view-list')
+ self._navigator_button.set_tooltip(_('Table of contents'))
+ self._navigator_button.connect('toggled', self.__navigator_toggled_cb)
+ self.insert(self._navigator_button, -1)
+
+ self._spacer_navigator = Gtk.SeparatorToolItem()
+ self._spacer_navigator.props.draw = False
+ self.insert(self._spacer_navigator, -1)
+
self._zoom_out = ToolButton('zoom-out')
self._zoom_out.set_tooltip(_('Zoom out'))
self._zoom_out.connect('clicked', self._zoom_out_cb)
@@ -218,6 +230,10 @@ class ViewToolbar(Gtk.Toolbar):
self._view = view
self._update_zoom_buttons()
+ def show_nav_button(self):
+ self._navigator_button.show()
+ self._spacer_navigator.show()
+
def zoom_in(self):
self._view.zoom_in()
self._update_zoom_buttons()
@@ -239,6 +255,9 @@ class ViewToolbar(Gtk.Toolbar):
def _zoom_to_width_cb(self, button):
self.zoom_to_width()
+ def __navigator_toggled_cb(self, button):
+ self.emit('toggle-index-show', button.get_active())
+
def _update_zoom_buttons(self):
self._zoom_in.props.sensitive = self._view.can_zoom_in()
self._zoom_out.props.sensitive = self._view.can_zoom_out()