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@gmail.com>2012-08-29 14:12:53 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2012-08-31 12:59:32 (GMT)
commit9993e7b04456b80f4917af4615adb7c1eeccce08 (patch)
tree02ec83026862908a30f626175807942658fb6073 /readactivity.py
parentcd69876be140142a061b99b726690d4d49cfd0ad (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>
Diffstat (limited to 'readactivity.py')
-rw-r--r--readactivity.py125
1 files changed, 77 insertions, 48 deletions
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.