From 1196eae1b98101c4df0682639bff65514aceda16 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Fri, 07 Sep 2007 15:59:40 +0000 Subject: #3237: Reorganize toolbars according to spec, add zooming capabilities and add copy to clipboard. --- diff --git a/NEWS b/NEWS index e18cd2c..98def62 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +* #3237: Reorganize toolbars according to spec, add zooming capabilities and + add copy to clipboard. (tomeu) + 27 * #2729 Updated activity icon. (eben) diff --git a/readactivity.py b/readactivity.py index 3eeb858..0d1f84a 100644 --- a/readactivity.py +++ b/readactivity.py @@ -28,7 +28,7 @@ import dbus from sugar.activity import activity from sugar import network -from readtoolbar import ReadToolbar +from readtoolbar import EditToolbar, ReadToolbar, ViewToolbar _HARDWARE_MANAGER_INTERFACE = 'org.laptop.HardwareManager' _HARDWARE_MANAGER_SERVICE = 'org.laptop.HardwareManager' @@ -50,17 +50,33 @@ class ReadActivity(activity.Activity): self._filepath = None self._fileserver = None + self.connect('key-press-event', self._key_press_event_cb) + logging.debug('Starting read...') self.set_title(_('Read Activity')) evince.job_queue_init() self._view = evince.View() + self._view.connect('notify::has-selection', self._view_notify_has_selection_cb) toolbox = activity.ActivityToolbox(self) - self._toolbar = ReadToolbar(self._view) - toolbox.add_toolbar(_('View'), self._toolbar) - self._toolbar.show() + self._edit_toolbar = EditToolbar(self._view) + self._edit_toolbar.undo.set_sensitive(False) + self._edit_toolbar.redo.set_sensitive(False) + self._edit_toolbar.copy.set_sensitive(False) + self._edit_toolbar.copy.connect('clicked', self._edit_toolbar_copy_cb) + self._edit_toolbar.paste.set_sensitive(False) + toolbox.add_toolbar(_('Edit'), self._edit_toolbar) + self._edit_toolbar.show() + + self._read_toolbar = ReadToolbar(self._view) + toolbox.add_toolbar(_('Read'), self._read_toolbar) + self._read_toolbar.show() + + self._view_toolbar = ViewToolbar(self._view) + toolbox.add_toolbar(_('View'), self._view_toolbar) + self._view_toolbar.show() self.set_toolbox(toolbox) toolbox.show() @@ -204,7 +220,8 @@ class ReadActivity(activity.Activity): del self._document self._document = evince.factory_get_document(filepath) self._view.set_document(self._document) - self._toolbar.set_document(self._document) + self._edit_toolbar.set_document(self._document) + self._read_toolbar.set_document(self._document) title = _("Read Activity") info = self._document.get_info() if info and info.title: @@ -227,3 +244,15 @@ class ReadActivity(activity.Activity): def _shared_cb(self, activity): self._start_shared_services() + + def _view_notify_has_selection_cb(self, view, pspec): + self._edit_toolbar.copy.set_sensitive(self._view.props.has_selection) + + def _edit_toolbar_copy_cb(self, button): + self._view.copy() + + def _key_press_event_cb(self, widget, event): + keyname = gtk.gdk.keyval_name(event.keyval) + if keyname == 'c' and event.state & gtk.gdk.CONTROL_MASK: + self._view.copy() + diff --git a/readtoolbar.py b/readtoolbar.py index a5201ac..dd9b90a 100644 --- a/readtoolbar.py +++ b/readtoolbar.py @@ -20,38 +20,86 @@ from gettext import gettext as _ import pango import gobject import gtk +import evince from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.menuitem import MenuItem +from sugar.activity import activity -class ReadToolbar(gtk.Toolbar): - __gtype_name__ = 'ReadToolbar' +class EditToolbar(activity.EditToolbar): + __gtype_name__ = 'EditToolbar' def __init__(self, evince_view): - gtk.Toolbar.__init__(self) + activity.EditToolbar.__init__(self) self._evince_view = evince_view self._document = None - - self._insert_nav_items() - self._insert_spring() - self._insert_search_items() - - def set_document(self, document): - self._document = document - self._document.connect('find_changed', self._find_changed_cb) - - page_cache = self._document.get_page_cache() - page_cache.connect('page-changed', self._page_changed_cb) - self._update_nav_buttons() - def _insert_spring(self): separator = gtk.SeparatorToolItem() separator.set_draw(False) separator.set_expand(True) self.insert(separator, -1) separator.show() - def _insert_nav_items(self): + search_item = gtk.ToolItem() + + self._search_entry = gtk.Entry() + self._search_entry.connect('activate', self._search_entry_activate_cb) + + width = int(gtk.gdk.screen_width() / 3) + self._search_entry.set_size_request(width, -1) + + search_item.add(self._search_entry) + self._search_entry.show() + + self.insert(search_item, -1) + search_item.show() + + self._prev = ToolButton('go-previous') + self._prev.set_tooltip(_('Previous')) + self._prev.props.sensitive = False + self._prev.connect('clicked', self._find_prev_cb) + self.insert(self._prev, -1) + self._prev.show() + + self._next = ToolButton('go-next') + self._next.set_tooltip(_('Next')) + self._next.props.sensitive = False + self._next.connect('clicked', self._find_next_cb) + self.insert(self._next, -1) + self._next.show() + + def set_document(self, document): + self._document = document + self._document.connect('find_changed', self._find_changed_cb) + + def _search_entry_activate_cb(self, entry): + current_page = self._document.get_page_cache().get_current_page() + self._document.find_begin(0, entry.props.text, False) + self._update_find_buttons() + + def _find_changed_cb(self, page, spec): + self._update_find_buttons() + + def _find_prev_cb(self, button): + self._evince_view.find_previous() + + def _find_next_cb(self, button): + self._evince_view.find_next() + + def _update_find_buttons(self): + self._prev.props.sensitive = self._evince_view.can_find_previous() + self._next.props.sensitive = self._evince_view.can_find_next() + +class ReadToolbar(gtk.Toolbar): + __gtype_name__ = 'ReadToolbar' + + def __init__(self, evince_view): + gtk.Toolbar.__init__(self) + + self._evince_view = evince_view + self._document = None + self._back = ToolButton('go-previous') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False @@ -98,50 +146,16 @@ class ReadToolbar(gtk.Toolbar): self.insert(total_page_item, -1) total_page_item.show() - def _insert_search_items(self): - search_item = gtk.ToolItem() - - self._search_entry = gtk.Entry() - self._search_entry.connect('activate', self._search_entry_activate_cb) - - width = int(gtk.gdk.screen_width() / 3) - self._search_entry.set_size_request(width, -1) - - search_item.add(self._search_entry) - self._search_entry.show() - - self.insert(search_item, -1) - search_item.show() - - self._prev = ToolButton('go-previous') - self._prev.set_tooltip(_('Previous')) - self._prev.props.sensitive = False - self._prev.connect('clicked', self._find_prev_cb) - self.insert(self._prev, -1) - self._prev.show() - - self._next = ToolButton('go-next') - self._next.set_tooltip(_('Next')) - self._next.props.sensitive = False - self._next.connect('clicked', self._find_next_cb) - self.insert(self._next, -1) - self._next.show() + def set_document(self, document): + self._document = document + page_cache = self._document.get_page_cache() + page_cache.connect('page-changed', self._page_changed_cb) + self._update_nav_buttons() def _num_page_entry_activate_cb(self, entry): page = int(entry.props.text) - 1 self._document.get_page_cache().set_current_page(page) - def _search_entry_activate_cb(self, entry): - current_page = self._document.get_page_cache().get_current_page() - self._document.find_begin(0, entry.props.text, False) - self._update_find_buttons() - - def _find_prev_cb(self, button): - self._evince_view.find_previous() - - def _find_next_cb(self, button): - self._evince_view.find_next() - def _go_back_cb(self, button): self._evince_view.previous_page() @@ -150,9 +164,6 @@ class ReadToolbar(gtk.Toolbar): def _page_changed_cb(self, page, proxy): self._update_nav_buttons() - - def _find_changed_cb(self, page, spec): - self._update_find_buttons() def _update_nav_buttons(self): current_page = self._document.get_page_cache().get_current_page() @@ -164,6 +175,106 @@ class ReadToolbar(gtk.Toolbar): self._total_page_label.props.label = \ ' / ' + str(self._document.get_n_pages()) - def _update_find_buttons(self): - self._prev.props.sensitive = self._evince_view.can_find_previous() - self._next.props.sensitive = self._evince_view.can_find_next() +class ViewToolbar(gtk.Toolbar): + __gtype_name__ = 'ViewToolbar' + + def __init__(self, evince_view): + gtk.Toolbar.__init__(self) + + self._evince_view = evince_view + self._document = None + + self._zoom_in = ToolButton('zoom-in') + self._zoom_in.set_tooltip(_('Zoom in')) + self._zoom_in.connect('clicked', self._zoom_in_cb) + self.insert(self._zoom_in, -1) + self._zoom_in.show() + + palette = self._zoom_in.get_palette() + menu_item = MenuItem(_('Zoom to fit')) + menu_item.connect('activate', self._zoom_to_fit_menu_item_activate_cb) + palette.menu.append(menu_item) + menu_item.show() + + menu_item = MenuItem(_('Zoom to width')) + menu_item.connect('activate', self._zoom_to_width_menu_item_activate_cb) + palette.menu.append(menu_item) + menu_item.show() + + menu_item = MenuItem(_('Actual size')) + menu_item.connect('activate', self._actual_size_menu_item_activate_cb) + palette.menu.append(menu_item) + menu_item.show() + + self._zoom_out = ToolButton('zoom-out') + self._zoom_out.set_tooltip(_('Zoom out')) + self._zoom_out.connect('clicked', self._zoom_out_cb) + self.insert(self._zoom_out, -1) + self._zoom_out.show() + + tool_item = gtk.ToolItem() + self.insert(tool_item, -1) + tool_item.show() + + self._zoom_spin = gtk.SpinButton() + self._zoom_spin.set_range(5.409, 400) + self._zoom_spin.set_increments(1, 10) + self._zoom_spin.props.value = self._evince_view.props.zoom * 100 + self._zoom_spin_notify_value_handler = self._zoom_spin.connect( + 'notify::value', self._zoom_spin_notify_value_cb) + tool_item.add(self._zoom_spin) + self._zoom_spin.show() + + zoom_perc_label = gtk.Label(_("%")) + zoom_perc_label.show() + tool_item_zoom_perc_label = gtk.ToolItem() + tool_item_zoom_perc_label.add(zoom_perc_label) + self.insert(tool_item_zoom_perc_label, -1) + tool_item_zoom_perc_label.show() + + self._view_notify_zoom_handler = self._evince_view.connect( + 'notify::zoom', self._view_notify_zoom_cb) + + self._update_zoom_buttons() + + def _zoom_spin_notify_value_cb(self, zoom_spin, pspec): + self._evince_view.disconnect(self._view_notify_zoom_handler) + try: + self._evince_view.props.sizing_mode = evince.SIZING_FREE + self._evince_view.props.zoom = zoom_spin.props.value / 100.0 + finally: + self._view_notify_zoom_handler = self._evince_view.connect( + 'notify::zoom', self._view_notify_zoom_cb) + + def _view_notify_zoom_cb(self, evince_view, pspec): + self._zoom_spin.disconnect(self._zoom_spin_notify_value_handler) + try: + self._zoom_spin.props.value = round(evince_view.props.zoom * 100.0) + finally: + self._zoom_spin_notify_value_handler = self._zoom_spin.connect( + 'notify::value', self._zoom_spin_notify_value_cb) + + def _zoom_in_cb(self, button): + self._evince_view.props.sizing_mode = evince.SIZING_FREE + self._evince_view.zoom_in() + self._update_zoom_buttons() + + def _zoom_out_cb(self, button): + self._evince_view.props.sizing_mode = evince.SIZING_FREE + self._evince_view.zoom_out() + self._update_zoom_buttons() + + def _update_zoom_buttons(self): + self._zoom_in.props.sensitive = self._evince_view.can_zoom_in() + self._zoom_out.props.sensitive = self._evince_view.can_zoom_out() + + def _zoom_to_fit_menu_item_activate_cb(self, menu_item): + self._evince_view.props.sizing_mode = evince.SIZING_BEST_FIT + + def _zoom_to_width_menu_item_activate_cb(self, menu_item): + self._evince_view.props.sizing_mode = evince.SIZING_FIT_WIDTH + + def _actual_size_menu_item_activate_cb(self, menu_item): + self._evince_view.props.sizing_mode = evince.SIZING_FREE + self._evince_view.props.zoom = 1.0 + -- cgit v0.9.1