176 | 176 |
self._view_toolbar = ViewToolbar()
|
177 | 177 |
self._view_toolbar.connect('go-fullscreen',
|
178 | 178 |
self.__view_toolbar_go_fullscreen_cb)
|
|
179 |
self._view_toolbar.connect('toggle-index-show',
|
|
180 |
self.__toogle_navigator_cb)
|
179 | 181 |
view_toolbar_button = ToolbarButton(
|
180 | 182 |
page=self._view_toolbar,
|
181 | 183 |
icon_name='toolbar-view')
|
|
211 | 213 |
toolbar_box.toolbar.insert(spacer, -1)
|
212 | 214 |
spacer.show()
|
213 | 215 |
|
214 | |
navigator_toolbar = Gtk.Toolbar()
|
215 | |
self._navigator = self._create_navigator()
|
216 | |
combotool = ToolComboBox(self._navigator)
|
217 | |
navigator_toolbar.insert(combotool, -1)
|
218 | |
self._navigator.show()
|
219 | |
combotool.show()
|
220 | |
self._navigator_toolbar_button = ToolbarButton(page=navigator_toolbar,
|
221 | |
icon_name='view-list')
|
222 | |
navigator_toolbar.show()
|
223 | |
toolbar_box.toolbar.insert(self._navigator_toolbar_button, -1)
|
224 | |
|
225 | 216 |
self._bookmarker = ToggleToolButton('emblem-favorite')
|
226 | 217 |
self._bookmarker_toggle_handler_id = self._bookmarker.connect( \
|
227 | 218 |
'toggled', self.__bookmarker_toggled_cb)
|
|
278 | 269 |
overlay.show()
|
279 | 270 |
self._vbox.pack_start(overlay, True, True, 0)
|
280 | 271 |
self.set_canvas(self._vbox)
|
|
272 |
|
|
273 |
self._navigator = self._create_navigator()
|
281 | 274 |
|
282 | 275 |
# Set up for idle suspend
|
283 | 276 |
self._idle_timer = 0
|
|
407 | 400 |
def _set_total_page_label(self, value):
|
408 | 401 |
self._total_page_label.set_text(' / %s' % value)
|
409 | 402 |
|
|
403 |
def show_navigator_button(self):
|
|
404 |
self._view_toolbar.show_nav_button()
|
|
405 |
|
410 | 406 |
def _create_navigator(self):
|
411 | |
navigator = Gtk.ComboBox()
|
|
407 |
self._toc_visible = False
|
|
408 |
self._update_toc_view = False
|
|
409 |
toc_navigator = Gtk.TreeView()
|
|
410 |
toc_navigator.set_enable_search(False)
|
|
411 |
toc_selection = toc_navigator.get_selection()
|
|
412 |
toc_selection.set_mode(Gtk.SelectionMode.SINGLE)
|
|
413 |
|
412 | 414 |
cell = Gtk.CellRendererText()
|
413 | |
navigator.pack_start(cell, True)
|
414 | |
navigator.add_attribute(cell, 'text', 0)
|
415 | |
navigator.props.visible = False
|
416 | |
return navigator
|
|
415 |
self.treecol_toc = Gtk.TreeViewColumn(_('Index'), cell, text=0)
|
|
416 |
toc_navigator.append_column(self.treecol_toc)
|
|
417 |
|
|
418 |
self._toc_scroller = Gtk.ScrolledWindow(hadjustment=None,
|
|
419 |
vadjustment=None)
|
|
420 |
self._toc_scroller.set_policy(Gtk.PolicyType.AUTOMATIC,
|
|
421 |
Gtk.PolicyType.AUTOMATIC)
|
|
422 |
self._toc_scroller.add(toc_navigator)
|
|
423 |
self._hbox.pack_start(self._toc_scroller, expand=False, fill=False,
|
|
424 |
padding=0)
|
|
425 |
self._toc_separator = Gtk.VSeparator()
|
|
426 |
self._hbox.pack_start(self._toc_separator, expand=False,
|
|
427 |
fill=False, padding=1)
|
|
428 |
return toc_navigator
|
|
429 |
|
|
430 |
def set_navigator_model(self, model):
|
|
431 |
self._toc_model = model
|
|
432 |
self._navigator.set_model(model)
|
|
433 |
|
|
434 |
def __toogle_navigator_cb(self, button, visible):
|
|
435 |
if visible:
|
|
436 |
self._toc_visible = True
|
|
437 |
self._update_toc_view = True
|
|
438 |
self._toc_select_active_page()
|
|
439 |
self._toc_scroller.set_size_request(int(Gdk.Screen.width() / 4),
|
|
440 |
-1)
|
|
441 |
self._toc_scroller.show_all()
|
|
442 |
self._toc_separator.show()
|
|
443 |
else:
|
|
444 |
self._toc_visible = False
|
|
445 |
self._toc_scroller.hide()
|
|
446 |
self._toc_separator.hide()
|
417 | 447 |
|
418 | 448 |
def __num_page_entry_insert_text_cb(self, entry, text, length, position):
|
419 | 449 |
if not re.match('[0-9]', text):
|
|
541 | 571 |
def _update_toc(self):
|
542 | 572 |
if self._view.update_toc(self):
|
543 | 573 |
self._navigator_changed_handler_id = \
|
544 | |
self._navigator.connect('changed', self.__navigator_changed_cb)
|
545 | |
|
546 | |
def __navigator_changed_cb(self, combobox):
|
547 | |
iter = self._navigator.get_active_iter()
|
548 | |
|
549 | |
link = self._toc_model.get(iter, 1)[0]
|
550 | |
self._view.handle_link(link)
|
551 | |
|
552 | |
def _toc_select_active_page_foreach(self, model, path, iter, current_page):
|
553 | |
link = self._toc_model.get(iter, 1)[0]
|
554 | |
|
555 | |
if not hasattr(link, 'get_page'):
|
556 | |
#FIXME: This needs to be implemented in epubadapter, not here
|
557 | |
filepath = self._view.get_current_file()
|
558 | |
if filepath.endswith(link):
|
559 | |
self._navigator.set_active_iter(iter)
|
560 | |
return True
|
561 | |
else:
|
562 | |
if current_page == link.get_page():
|
563 | |
self._navigator.set_active_iter(iter)
|
564 | |
return True
|
565 | |
|
566 | |
return False
|
|
574 |
self._navigator.connect('cursor-changed',
|
|
575 |
self.__navigator_cursor_changed_cb)
|
|
576 |
|
|
577 |
def __navigator_cursor_changed_cb(self, toc_treeview):
|
|
578 |
treestore, toc_selected = toc_treeview.get_selection().get_selected()
|
|
579 |
|
|
580 |
if toc_selected is not None:
|
|
581 |
link = self._toc_model.get(toc_selected, 1)[0]
|
|
582 |
logging.debug('View handle link %s', link)
|
|
583 |
self._update_toc_view = False
|
|
584 |
self._view.handle_link(link)
|
|
585 |
self._update_toc_view = True
|
567 | 586 |
|
568 | 587 |
def _toc_select_active_page(self):
|
569 | |
iter = self._navigator.get_active_iter()
|
570 | |
|
571 | |
current_link = self._toc_model.get(iter, 1)[0]
|
572 | |
current_page = self._view.get_current_page()
|
573 | |
|
574 | |
if not hasattr(current_link, 'get_page'):
|
575 | |
filepath = self._view.get_current_file()
|
576 | |
if filepath is None or filepath.endswith(current_link):
|
577 | |
return
|
578 | |
else:
|
579 | |
if current_link.get_page() == current_page:
|
580 | |
return
|
581 | |
|
582 | |
self._navigator.handler_block(self._navigator_changed_handler_id)
|
583 | |
self._toc_model.foreach(self._toc_select_active_page_foreach,
|
584 | |
current_page)
|
585 | |
self._navigator.handler_unblock(self._navigator_changed_handler_id)
|
|
588 |
if not self._toc_visible or not self._update_toc_view:
|
|
589 |
return
|
|
590 |
|
|
591 |
_store, toc_selected = self._navigator.get_selection().get_selected()
|
|
592 |
|
|
593 |
if toc_selected is not None:
|
|
594 |
selected_link = self._toc_model.get(toc_selected, 1)[0]
|
|
595 |
else:
|
|
596 |
selected_link = ""
|
|
597 |
current_link = self._view.get_current_link()
|
|
598 |
|
|
599 |
if current_link == selected_link:
|
|
600 |
return
|
|
601 |
|
|
602 |
link_iter = self._toc_model.get_iter_first()
|
|
603 |
|
|
604 |
while link_iter is not None and \
|
|
605 |
self._toc_model.get_value(link_iter, 1) != current_link:
|
|
606 |
link_iter = self._toc_model.iter_next(link_iter)
|
|
607 |
|
|
608 |
if link_iter is not None:
|
|
609 |
self._navigator.handler_block(self._navigator_changed_handler_id)
|
|
610 |
toc_selection = self._navigator.get_selection()
|
|
611 |
toc_selection.select_iter(link_iter)
|
|
612 |
self._navigator.handler_unblock(self._navigator_changed_handler_id)
|
|
613 |
else:
|
|
614 |
logging.debug('link "%s" not found in the toc model', current_link)
|
586 | 615 |
|
587 | 616 |
def _show_journal_object_picker(self):
|
588 | 617 |
"""Show the journal object picker to load a document.
|