From c37d8dcc5ac0dfafa6e5e110e91c820453b84ae8 Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Tue, 08 Sep 2009 17:53:25 +0000 Subject: Migrate to new toolbar system --- diff --git a/readactivity.py b/readactivity.py index c4db369..bdf9454 100644 --- a/readactivity.py +++ b/readactivity.py @@ -1,6 +1,7 @@ # Copyright (C) 2007, Red Hat, Inc. # Copyright (C) 2007 Collabora Ltd. # Copyright 2008 One Laptop Per Child +# Copyright 2009 Simon Schampijer # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,21 +21,32 @@ import logging import os import time from gettext import gettext as _ +import re +import md5 import dbus import evince import gobject import gtk +import pango +from glib import GError import telepathy from sugar.activity import activity +from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.toolbarbox import ToolbarBox +from sugar.graphics.toolbarbox import ToolbarButton +from sugar.graphics.toggletoolbutton import ToggleToolButton +from sugar.graphics.menuitem import MenuItem +from sugar.activity.widgets import ActivityToolbarButton +from sugar.activity.widgets import StopButton from sugar import network from sugar import mime from sugar.datastore import datastore from sugar.graphics.objectchooser import ObjectChooser -from readtoolbar import EditToolbar, ReadToolbar, ViewToolbar +from readtoolbar import EditToolbar, ViewToolbar from readsidebar import Sidebar from readtopbar import TopBar @@ -59,6 +71,17 @@ def _get_screen_dpi(): _logger.debug('Setting dpi to %f', float(xft_dpi / 1024)) return float(xft_dpi / 1024) +def get_md5(filename): #FIXME: Should be moved somewhere else + filename = filename.replace('file://', '') #XXX: hack + fh = open(filename) + digest = md5.new() + while 1: + buf = fh.read(4096) + if buf == "": + break + digest.update(buf) + fh.close() + return digest.hexdigest() class ReadHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler): """HTTP Request Handler for transferring document while collaborating. @@ -127,7 +150,11 @@ class ReadActivity(activity.Activity): self._sidebar = Sidebar() self._sidebar.show() - toolbox = activity.ActivityToolbox(self) + toolbar_box = ToolbarBox() + + activity_button = ActivityToolbarButton(self) + toolbar_box.toolbar.insert(activity_button, 0) + activity_button.show() self._edit_toolbar = EditToolbar() self._edit_toolbar.undo.props.visible = False @@ -136,23 +163,93 @@ class ReadActivity(activity.Activity): self._edit_toolbar.copy.set_sensitive(False) self._edit_toolbar.copy.connect('clicked', self._edit_toolbar_copy_cb) self._edit_toolbar.paste.props.visible = False - toolbox.add_toolbar(_('Edit'), self._edit_toolbar) - self._edit_toolbar.show() - self._read_toolbar = ReadToolbar(self._sidebar) - toolbox.add_toolbar(_('Read'), self._read_toolbar) - self._read_toolbar.show() + edit_toolbar_button = ToolbarButton( + page=self._edit_toolbar, + icon_name='toolbar-edit') + self._edit_toolbar.show() + toolbar_box.toolbar.insert(edit_toolbar_button, -1) + edit_toolbar_button.show() self._view_toolbar = ViewToolbar() self._view_toolbar.connect('needs-update-size', self.__view_toolbar_needs_update_size_cb) self._view_toolbar.connect('go-fullscreen', self.__view_toolbar_go_fullscreen_cb) - toolbox.add_toolbar(_('View'), self._view_toolbar) + view_toolbar_button = ToolbarButton( + page=self._view_toolbar, + icon_name='toolbar-view') self._view_toolbar.show() - - self.set_toolbox(toolbox) - toolbox.show() + toolbar_box.toolbar.insert(view_toolbar_button, -1) + view_toolbar_button.show() + + self._back_button = self._create_back_button() + toolbar_box.toolbar.insert(self._back_button, -1) + self._back_button.show() + + self._forward_button = self._create_forward_button() + toolbar_box.toolbar.insert(self._forward_button, -1) + self._forward_button.show() + + num_page_item = gtk.ToolItem() + self._num_page_entry = self._create_search() + num_page_item.add(self._num_page_entry) + self._num_page_entry.show() + toolbar_box.toolbar.insert(num_page_item, -1) + num_page_item.show() + + total_page_item = gtk.ToolItem() + self._total_page_label = self._create_total_page_label() + total_page_item.add(self._total_page_label) + self._total_page_label.show() + toolbar_box.toolbar.insert(total_page_item, -1) + total_page_item.show() + + spacer = gtk.SeparatorToolItem() + spacer.props.draw = False + toolbar_box.toolbar.insert(spacer, -1) + spacer.show() + + navigator_toolbar = gtk.Toolbar() + navigator_item = gtk.ToolItem() + self._navigator = self._create_navigator() + navigator_item.add(self._navigator) + self._navigator.show() + navigator_toolbar.insert(navigator_item, -1) + navigator_item.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) + #navigator_toolbar_button.show() + + spacer = gtk.SeparatorToolItem() + spacer.props.draw = False + toolbar_box.toolbar.insert(spacer, -1) + spacer.show() + + bookmark_item = gtk.ToolItem() + self._bookmarker = self._create_bookmarker() + self._bookmarker_toggle_handler_id = self._bookmarker.connect( \ + 'toggled', self.__bookmarker_toggled_cb) + bookmark_item.add(self._bookmarker) + self._bookmarker.show() + toolbar_box.toolbar.insert(bookmark_item, -1) + bookmark_item.show() + + separator = gtk.SeparatorToolItem() + separator.props.draw = False + separator.set_expand(True) + toolbar_box.toolbar.insert(separator, -1) + separator.show() + + stop_button = StopButton(self) + stop_button.props.accelerator = 'Q' + toolbar_box.toolbar.insert(stop_button, -1) + stop_button.show() + + self.set_toolbar_box(toolbar_box) + toolbar_box.show() self._vbox = gtk.VBox() self._vbox.show() @@ -213,9 +310,6 @@ class ReadActivity(activity.Activity): if handle.uri: self._load_document(handle.uri) - # start on the read toolbar - self.toolbox.set_current_toolbar(_TOOLBAR_READ) - if self.shared_activity: # We're joining if self.get_shared(): @@ -231,6 +325,208 @@ class ReadActivity(activity.Activity): #else: # self._load_document('file:///home/smcv/tmp/test.pdf') + def _create_back_button(self): + back = ToolButton('go-previous') + back.set_tooltip(_('Back')) + back.props.sensitive = False + palette = back.get_palette() + previous_page = MenuItem(text_label= _("Previous page")) + palette.menu.append(previous_page) + previous_page.show_all() + previous_bookmark = MenuItem(text_label= _("Previous bookmark")) + palette.menu.append(previous_bookmark) + previous_bookmark.show_all() + back.connect('clicked', self.__go_back_cb) + previous_page.connect('activate', self.__go_back_page_cb) + previous_bookmark.connect('activate', self.__prev_bookmark_activate_cb) + return back + + def _create_forward_button(self): + forward = ToolButton('go-next') + forward.set_tooltip(_('Forward')) + forward.props.sensitive = False + palette = forward.get_palette() + next_page = MenuItem(text_label= _("Next page")) + palette.menu.append(next_page) + next_page.show_all() + next_bookmark = MenuItem(text_label= _("Next bookmark")) + palette.menu.append(next_bookmark) + next_bookmark.show_all() + forward.connect('clicked', self.__go_forward_cb) + next_page.connect('activate', self.__go_forward_page_cb) + next_bookmark.connect('activate', self.__next_bookmark_activate_cb) + return forward + + def _create_search(self): + num_page_entry = gtk.Entry() + num_page_entry.set_text('0') + num_page_entry.set_alignment(1) + num_page_entry.connect('insert-text', + self.__num_page_entry_insert_text_cb) + num_page_entry.connect('activate', + self.__num_page_entry_activate_cb) + num_page_entry.set_width_chars(4) + return num_page_entry + + def _create_total_page_label(self): + total_page_label = gtk.Label() + + label_attributes = pango.AttrList() + label_attributes.insert(pango.AttrSize(14000, 0, -1)) + label_attributes.insert(pango.AttrForeground(65535, 65535, + 65535, 0, -1)) + total_page_label.set_attributes(label_attributes) + + total_page_label.set_text(' / 0') + return total_page_label + + def _create_navigator(self): + navigator = gtk.ComboBox() + navigator.set_add_tearoffs(True) + cell = gtk.CellRendererText() + navigator.pack_start(cell, True) + navigator.add_attribute(cell, 'text', 0) + navigator.props.visible = False + return navigator + + def _create_bookmarker(self): + bookmarker = ToggleToolButton('emblem-favorite') + return bookmarker + + def __num_page_entry_insert_text_cb(self, entry, text, length, position): + if not re.match('[0-9]', text): + entry.emit_stop_by_name('insert-text') + return True + return False + + def __num_page_entry_activate_cb(self, entry): + if entry.props.text: + page = int(entry.props.text) - 1 + else: + page = 0 + + if page >= self._document.get_n_pages(): + page = self._document.get_n_pages() - 1 + elif page < 0: + page = 0 + + self._document.get_page_cache().set_current_page(page) + entry.props.text = str(page + 1) + + def __go_back_cb(self, button): + self._view.scroll(gtk.SCROLL_PAGE_BACKWARD, False) + + def __go_forward_cb(self, button): + self._view.scroll(gtk.SCROLL_PAGE_FORWARD, False) + + def __go_back_page_cb(self, button): + self._view.previous_page() + + def __go_forward_page_cb(self, button): + self._view.next_page() + + def __prev_bookmark_activate_cb(self, menuitem): + page = self._document.get_page_cache().get_current_page() + bookmarkmanager = self._sidebar.get_bookmarkmanager() + + prev_bookmark = bookmarkmanager.get_prev_bookmark_for_page(page) + if prev_bookmark is not None: + self._document.get_page_cache().set_current_page(prev_bookmark.page_no) + + def __next_bookmark_activate_cb(self, menuitem): + page = self._document.get_page_cache().get_current_page() + bookmarkmanager = self._sidebar.get_bookmarkmanager() + + next_bookmark = bookmarkmanager.get_next_bookmark_for_page(page) + if next_bookmark is not None: + self._document.get_page_cache().set_current_page(next_bookmark.page_no) + + def __bookmarker_toggled_cb(self, button): + page = self._document.get_page_cache().get_current_page() + if self._bookmarker.props.active: + self._sidebar.add_bookmark(page) + else: + self._sidebar.del_bookmark(page) + + def __page_changed_cb(self, page, proxy = None): + self._update_nav_buttons() + if hasattr(self._document, 'has_document_links'): + if self._document.has_document_links(): + self._toc_select_active_page() + + self._sidebar.update_for_page(self._document.get_page_cache().get_current_page()) + + self._bookmarker.handler_block(self._bookmarker_toggle_handler_id) + self._bookmarker.props.active = self._sidebar.is_showing_local_bookmark() + self._bookmarker.handler_unblock(self._bookmarker_toggle_handler_id) + + def _update_nav_buttons(self): + current_page = self._document.get_page_cache().get_current_page() + self._back_button.props.sensitive = current_page > 0 + self._forward_button.props.sensitive = \ + current_page < self._document.get_n_pages() - 1 + + self._num_page_entry.props.text = str(current_page + 1) + self._total_page_label.props.label = \ + ' / ' + str(self._document.get_n_pages()) + + def _update_toc(self): + if hasattr(self._document, 'has_document_links'): + if self._document.has_document_links(): + self._navigator_toolbar_button.show() + self._navigator.show_all() + + self._toc_model = self._document.get_links_model() + self._navigator.set_model(self._toc_model) + self._navigator.set_active(0) + + self._navigator_changed_handler_id = \ + self._navigator.connect('changed', + self.__navigator_changed_cb) + + self._toc_select_active_page() + + def __navigator_changed_cb(self, combobox): + iter = self._navigator.get_active_iter() + + link = self._toc_model.get(iter, 1)[0] + self._view.handle_link(link) + + def _toc_select_active_page_foreach(self, model, path, iter, current_page): + link = self._toc_model.get(iter, 1)[0] + + 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 + else: + if current_page == link.get_page(): + self._navigator.set_active_iter(iter) + return True + + return False + + def _toc_select_active_page(self): + iter = self._navigator.get_active_iter() + + current_link = self._toc_model.get(iter, 1)[0] + current_page = self._document.get_page_cache().get_current_page() + + + if not hasattr(current_link, 'get_page'): + filepath = self._view.get_current_file() + if filepath is None or filepath.endswith(current_link): + return + 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) + def _show_journal_object_picker(self): """Show the journal object picker to load a document. @@ -500,18 +796,29 @@ class ReadActivity(activity.Activity): self._document = epubadapter.EpubDocument(self._view, filepath.replace('file://', '')) else: self._setup_evince_viewer() - self._document = evince.factory_get_document(filepath) + try: + self._document = evince.factory_get_document(filepath) + except GError, e: + _logger.error('Can not load document: %s', e) + return self._view_toolbar.set_view(self._view) self._edit_toolbar.set_view(self._view) - self._read_toolbar.set_view(self._view) self._want_document = False self._view.set_document(self._document) self._edit_toolbar.set_document(self._document) - self._read_toolbar.set_document(self._document, filepath) self._topbar.set_document(self._document) + filehash = get_md5(filepath) + self._sidebar.set_bookmarkmanager(filehash) + + self._update_nav_buttons() + self._update_toc() + + page_cache = self._document.get_page_cache() + page_cache.connect('page-changed', self.__page_changed_cb) + if not self.metadata['title_set_by_user'] == '1': info = self._document.get_info() if info and info.title: diff --git a/readtoolbar.py b/readtoolbar.py index ba48a24..53a756f 100644 --- a/readtoolbar.py +++ b/readtoolbar.py @@ -14,11 +14,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import logging from gettext import gettext as _ -import re -import pango import gobject import gtk import evince @@ -28,28 +25,10 @@ try: except: pass -import md5 - from sugar.graphics.toolbutton import ToolButton -from sugar.graphics.toggletoolbutton import ToggleToolButton from sugar.graphics.menuitem import MenuItem from sugar.graphics import iconentry from sugar.activity import activity -from sugar.graphics.icon import Icon -from sugar.graphics.xocolor import XoColor - -def get_md5(filename): #FIXME: Should be moved somewhere else - filename = filename.replace('file://', '') #XXX: hack - fh = open(filename) - digest = md5.new() - while 1: - buf = fh.read(4096) - if buf == "": - break - digest.update(buf) - fh.close() - return digest.hexdigest() - class EditToolbar(activity.EditToolbar): __gtype_name__ = 'EditToolbar' @@ -62,12 +41,6 @@ class EditToolbar(activity.EditToolbar): self._document = None self._find_job = None - separator = gtk.SeparatorToolItem() - separator.set_draw(False) - separator.set_expand(True) - self.insert(separator, -1) - separator.show() - search_item = gtk.ToolItem() self._search_entry = iconentry.IconEntry() @@ -191,260 +164,6 @@ class EditToolbar(activity.EditToolbar): self._next.props.sensitive = True self._next.set_tooltip(_('Find next')) -class ReadToolbar(gtk.Toolbar): - __gtype_name__ = 'ReadToolbar' - - def __init__(self, sidebar): - gtk.Toolbar.__init__(self) - - self._evince_view = None - self._sidebar = sidebar - self._document = None - - self._back = ToolButton('go-previous') - self._back.set_tooltip(_('Back')) - self._back.props.sensitive = False - palette = self._back.get_palette() - self._prev_page = MenuItem(text_label= _("Previous page")) - palette.menu.append(self._prev_page) - self._prev_page.show_all() - self._prev_bookmark = MenuItem(text_label= _("Previous bookmark")) - palette.menu.append(self._prev_bookmark) - self._prev_bookmark.show_all() - self._back.connect('clicked', self._go_back_cb) - self._prev_page.connect('activate', self._go_back_page_cb) - self._prev_bookmark.connect('activate', self._prev_bookmark_activate_cb) - self.insert(self._back, -1) - self._back.show() - - self._forward = ToolButton('go-next') - self._forward.set_tooltip(_('Forward')) - self._forward.props.sensitive = False - palette = self._forward.get_palette() - self._next_page = MenuItem(text_label= _("Next page")) - palette.menu.append(self._next_page) - self._next_page.show_all() - self._next_bookmark = MenuItem(text_label= _("Next bookmark")) - palette.menu.append(self._next_bookmark) - self._next_bookmark.show_all() - self._forward.connect('clicked', self._go_forward_cb) - self._next_page.connect('activate', self._go_forward_page_cb) - self._next_bookmark.connect('activate', self._next_bookmark_activate_cb) - self.insert(self._forward, -1) - self._forward.show() - - num_page_item = gtk.ToolItem() - - self._num_page_entry = gtk.Entry() - self._num_page_entry.set_text('0') - self._num_page_entry.set_alignment(1) - self._num_page_entry.connect('insert-text', - self._num_page_entry_insert_text_cb) - self._num_page_entry.connect('activate', - self._num_page_entry_activate_cb) - - self._num_page_entry.set_width_chars(4) - - num_page_item.add(self._num_page_entry) - self._num_page_entry.show() - - self.insert(num_page_item, -1) - num_page_item.show() - - total_page_item = gtk.ToolItem() - - self._total_page_label = gtk.Label() - - label_attributes = pango.AttrList() - label_attributes.insert(pango.AttrSize(14000, 0, -1)) - label_attributes.insert(pango.AttrForeground(65535, 65535, 65535, 0, -1)) - self._total_page_label.set_attributes(label_attributes) - - self._total_page_label.set_text(' / 0') - total_page_item.add(self._total_page_label) - self._total_page_label.show() - - self.insert(total_page_item, -1) - total_page_item.show() - - spacer = gtk.SeparatorToolItem() - spacer.props.draw = False - self.insert(spacer, -1) - spacer.show() - - navitem = gtk.ToolItem() - - self._navigator = gtk.ComboBox() - cell = gtk.CellRendererText() - self._navigator.pack_start(cell, True) - self._navigator.add_attribute(cell, 'text', 0) - self._navigator.props.visible = False - - navitem.add(self._navigator) - - self.insert(navitem, -1) - navitem.show() - - spacer = gtk.SeparatorToolItem() - self.insert(spacer, -1) - spacer.show() - - bookmarkitem = gtk.ToolItem() - self._bookmarker = ToggleToolButton('emblem-favorite') - self._bookmarker_toggle_handler_id = self._bookmarker.connect('toggled', - self._bookmarker_toggled_cb) - - bookmarkitem.add(self._bookmarker) - - self.insert(bookmarkitem, -1) - bookmarkitem.show_all() - - def set_view(self, view): - self._evince_view = view - - def set_document(self, document, filepath): - filehash = get_md5(filepath) - self._document = document - page_cache = self._document.get_page_cache() - page_cache.connect('page-changed', self._page_changed_cb) - self._update_nav_buttons() - self._update_toc() - self._sidebar.set_bookmarkmanager(filehash) - - def _num_page_entry_insert_text_cb(self, entry, text, length, position): - if not re.match('[0-9]', text): - entry.emit_stop_by_name('insert-text') - return True - return False - - def _num_page_entry_activate_cb(self, entry): - if entry.props.text: - page = int(entry.props.text) - 1 - else: - page = 0 - - if page >= self._document.get_n_pages(): - page = self._document.get_n_pages() - 1 - elif page < 0: - page = 0 - - self._document.get_page_cache().set_current_page(page) - entry.props.text = str(page + 1) - - def _go_back_cb(self, button): - self._evince_view.scroll(gtk.SCROLL_PAGE_BACKWARD, False) - - def _go_forward_cb(self, button): - self._evince_view.scroll(gtk.SCROLL_PAGE_FORWARD, False) - - def _go_back_page_cb(self, button): - self._evince_view.previous_page() - - def _go_forward_page_cb(self, button): - self._evince_view.next_page() - - def _prev_bookmark_activate_cb(self, menuitem): - page = self._document.get_page_cache().get_current_page() - bookmarkmanager = self._sidebar.get_bookmarkmanager() - - prev_bookmark = bookmarkmanager.get_prev_bookmark_for_page(page) - if prev_bookmark is not None: - self._document.get_page_cache().set_current_page(prev_bookmark.page_no) - - def _next_bookmark_activate_cb(self, menuitem): - page = self._document.get_page_cache().get_current_page() - bookmarkmanager = self._sidebar.get_bookmarkmanager() - - next_bookmark = bookmarkmanager.get_next_bookmark_for_page(page) - if next_bookmark is not None: - self._document.get_page_cache().set_current_page(next_bookmark.page_no) - - def _bookmarker_toggled_cb(self, button): - page = self._document.get_page_cache().get_current_page() - if self._bookmarker.props.active: - self._sidebar.add_bookmark(page) - else: - self._sidebar.del_bookmark(page) - - def _page_changed_cb(self, page, proxy = None): - self._update_nav_buttons() - if hasattr(self._document, 'has_document_links'): - if self._document.has_document_links(): - self._toc_select_active_page() - - self._sidebar.update_for_page(self._document.get_page_cache().get_current_page()) - - self._bookmarker.handler_block(self._bookmarker_toggle_handler_id) - self._bookmarker.props.active = self._sidebar.is_showing_local_bookmark() - self._bookmarker.handler_unblock(self._bookmarker_toggle_handler_id) - - def _update_nav_buttons(self): - current_page = self._document.get_page_cache().get_current_page() - self._back.props.sensitive = current_page > 0 - self._forward.props.sensitive = \ - current_page < self._document.get_n_pages() - 1 - - self._num_page_entry.props.text = str(current_page + 1) - self._total_page_label.props.label = \ - ' / ' + str(self._document.get_n_pages()) - - def _update_toc(self): - if hasattr(self._document, 'has_document_links'): - if self._document.has_document_links(): - self._navigator.show_all() - - self._toc_model = self._document.get_links_model() - self._navigator.set_model(self._toc_model) - self._navigator.set_active(0) - - self.__navigator_changed_handler_id = \ - self._navigator.connect('changed', - self._navigator_changed_cb) - - self._toc_select_active_page() - - def _navigator_changed_cb(self, combobox): - iter = self._navigator.get_active_iter() - - link = self._toc_model.get(iter, 1)[0] - self._evince_view.handle_link(link) - - def _toc_select_active_page_foreach(self, model, path, iter, current_page): - link = self._toc_model.get(iter, 1)[0] - - if not hasattr(link, 'get_page'): - #FIXME: This needs to be implemented in epubadapter, not here - filepath = self._evince_view.get_current_file() - if filepath.endswith(link): - self._navigator.set_active_iter(iter) - return True - else: - if current_page == link.get_page(): - self._navigator.set_active_iter(iter) - return True - - return False - - - def _toc_select_active_page(self): - iter = self._navigator.get_active_iter() - - current_link = self._toc_model.get(iter, 1)[0] - current_page = self._document.get_page_cache().get_current_page() - - - if not hasattr(current_link, 'get_page'): - filepath = self._evince_view.get_current_file() - if filepath is None or filepath.endswith(current_link): - return - 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) - class ViewToolbar(gtk.Toolbar): __gtype_name__ = 'ViewToolbar' -- cgit v0.9.1