Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-09-07 15:59:40 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-09-07 15:59:40 (GMT)
commit1196eae1b98101c4df0682639bff65514aceda16 (patch)
treed4c3ef33526f00ca40b542e103bc249a129cd9e4
parent28743850c874cb5705876beb99ca334e667572c1 (diff)
#3237: Reorganize toolbars according to spec, add zooming capabilities and add copy to clipboard.
-rw-r--r--NEWS3
-rw-r--r--readactivity.py39
-rw-r--r--readtoolbar.py235
3 files changed, 210 insertions, 67 deletions
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
+