Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2012-08-29 14:12:53 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2012-09-10 14:19:32 (GMT)
commit759188370815f490a6f85343c679e2d3372e9b66 (patch)
tree817365922d64824da808881fc2069ad093f83402
parent9d18b220d83f274328806bcb5a56727c963c5be2 (diff)
Show the table of contents in a panel
The table of contents, actually implemented in epub backend, is displayed in a later panel, instead of in a combo, to do easier the interaction with touch, and provide context. The code is now more general to allow the implementation in the pdf backend too. The button used to display the table of contents, was moved from the main toolbar to the view subtoolbar. Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
-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()