diff options
-rw-r--r-- | epubadapter.py | 13 | ||||
-rw-r--r-- | epubview/epubview.py | 2 | ||||
-rw-r--r-- | evinceadapter.py | 12 | ||||
-rw-r--r-- | readactivity.py | 125 | ||||
-rw-r--r-- | readtoolbar.py | 19 |
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() |