Codebase list sugar-read-activity / 7591883
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> Gonzalo Odiard 11 years ago
5 changed file(s) with 118 addition(s) and 69 deletion(s). Raw diff Collapse all Expand all
143143 def get_current_page(self):
144144 return int(self._loaded_page) - 1
145145
146 def get_current_link(self):
147 # the _loaded_filename include all the path,
148 # need only the part included in the link
149 return self._loaded_filename[len(self._epub._tempdir) + 1:]
150
146151 def update_toc(self, activity):
147152 if self._epub.has_document_links():
148 activity._navigator_toolbar_button.show()
149 activity._navigator.show_all()
150
151 activity._toc_model = self._epub.get_links_model()
152 activity._navigator.set_model(activity._toc_model)
153 activity._navigator.set_active(0)
153 activity.show_navigator_button()
154 activity.set_navigator_model(self._epub.get_links_model())
154155 return True
155156 else:
156157 return False
555555 if self._loaded_page == pageno:
556556 return
557557
558 self._on_page_changed(self._loaded_page, pageno)
559558 filename = self._paginator.get_file_for_pageno(pageno)
560559 filename = filename.replace('file://', '')
561560
586585 else:
587586 self._loaded_page = pageno
588587 self._scroll_page()
588 self._on_page_changed(self._loaded_page, pageno)
589589
590590 def _insert_js_reference(self, file_name, path):
591591 js_reference = '<script type="text/javascript" ' + \
9090 def get_current_page(self):
9191 return self._model.props.page
9292
93 def get_current_link(self):
94 # TODO
95 return ""
96
9397 def set_current_page(self, page):
9498 if page >= self._document.get_n_pages():
9599 page = self._document.get_n_pages() - 1
272276 break
273277 """
274278
275 activity._navigator_toolbar_button.show()
276 activity._navigator.show_all()
277
278 activity._toc_model = self._index_model
279 activity._navigator.set_model(activity._toc_model)
280 activity._navigator.set_active(0)
279 activity.show_navigator_button()
280 activity.set_navigator_model(self._epub.get_links_model())
281281 return True
282282
283283 def find_set_highlight_search(self, set_highlight_search):
176176 self._view_toolbar = ViewToolbar()
177177 self._view_toolbar.connect('go-fullscreen',
178178 self.__view_toolbar_go_fullscreen_cb)
179 self._view_toolbar.connect('toggle-index-show',
180 self.__toogle_navigator_cb)
179181 view_toolbar_button = ToolbarButton(
180182 page=self._view_toolbar,
181183 icon_name='toolbar-view')
211213 toolbar_box.toolbar.insert(spacer, -1)
212214 spacer.show()
213215
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
225216 self._bookmarker = ToggleToolButton('emblem-favorite')
226217 self._bookmarker_toggle_handler_id = self._bookmarker.connect( \
227218 'toggled', self.__bookmarker_toggled_cb)
278269 overlay.show()
279270 self._vbox.pack_start(overlay, True, True, 0)
280271 self.set_canvas(self._vbox)
272
273 self._navigator = self._create_navigator()
281274
282275 # Set up for idle suspend
283276 self._idle_timer = 0
407400 def _set_total_page_label(self, value):
408401 self._total_page_label.set_text(' / %s' % value)
409402
403 def show_navigator_button(self):
404 self._view_toolbar.show_nav_button()
405
410406 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
412414 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()
417447
418448 def __num_page_entry_insert_text_cb(self, entry, text, length, position):
419449 if not re.match('[0-9]', text):
541571 def _update_toc(self):
542572 if self._view.update_toc(self):
543573 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
567586
568587 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)
586615
587616 def _show_journal_object_picker(self):
588617 """Show the journal object picker to load a document.
2121 from gi.repository import Gdk
2222
2323 from sugar3.graphics.toolbutton import ToolButton
24 from sugar3.graphics.toggletoolbutton import ToggleToolButton
2425 from sugar3.graphics import iconentry
2526 from sugar3.activity.widgets import EditToolbar as BaseEditToolbar
2627
163164 __gsignals__ = {
164165 'go-fullscreen': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
165166 ([])),
167 'toggle-index-show': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
168 ([bool])),
166169 }
167170
168171 def __init__(self):
169172 Gtk.Toolbar.__init__(self)
170173
171174 self._view = None
175
176 self._navigator_button = ToggleToolButton('view-list')
177 self._navigator_button.set_tooltip(_('Table of contents'))
178 self._navigator_button.connect('toggled', self.__navigator_toggled_cb)
179 self.insert(self._navigator_button, -1)
180
181 self._spacer_navigator = Gtk.SeparatorToolItem()
182 self._spacer_navigator.props.draw = False
183 self.insert(self._spacer_navigator, -1)
172184
173185 self._zoom_out = ToolButton('zoom-out')
174186 self._zoom_out.set_tooltip(_('Zoom out'))
217229 self._view = view
218230 self._update_zoom_buttons()
219231
232 def show_nav_button(self):
233 self._navigator_button.show()
234 self._spacer_navigator.show()
235
220236 def zoom_in(self):
221237 self._view.zoom_in()
222238 self._update_zoom_buttons()
237253
238254 def _zoom_to_width_cb(self, button):
239255 self.zoom_to_width()
256
257 def __navigator_toggled_cb(self, button):
258 self.emit('toggle-index-show', button.get_active())
240259
241260 def _update_zoom_buttons(self):
242261 self._zoom_in.props.sensitive = self._view.can_zoom_in()