diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2006-10-22 15:11:04 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2006-10-22 15:11:04 (GMT) |
commit | f5ed91621f4c5abb37f93c98a401b797e8ce20cf (patch) | |
tree | 87fda00893a7f9d838de48ab5cb538449d265232 | |
parent | 82c2f8e52ca185c0e8f0c5fa39e9eb292e0a39b5 (diff) |
Added toolbar with navigation and search capabilities.
Signed-off-by: Tomeu Vizoso <tomeu@tomeuvizoso.net>
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | XbookActivity.py | 50 | ||||
-rw-r--r-- | toolbar.py | 163 |
3 files changed, 195 insertions, 21 deletions
diff --git a/Makefile.am b/Makefile.am index aaadd7b..ee3369f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,8 @@ activitydir = $(datadir)/sugar/activities/xbook activity_PYTHON = \ __init__.py \ - XbookActivity.py + XbookActivity.py \ + toolbar.py EXTRA_DIST = xbook.activity diff --git a/XbookActivity.py b/XbookActivity.py index d994080..e5a6ae6 100644 --- a/XbookActivity.py +++ b/XbookActivity.py @@ -1,26 +1,36 @@ import os - +from gettext import gettext as _ import gtk import evince - from sugar.activity.Activity import Activity -class XbookActivity(Activity): - def __init__(self): - Activity.__init__(self) - - evince.job_queue_init() +from toolbar import Toolbar - scrolled = gtk.ScrolledWindow() - self.add(scrolled) - scrolled.show() - - test_file = 'file://' + os.path.expanduser('~/test.pdf') - - view = evince.View() - document = evince.factory_get_document(test_file) - document.load(test_file) - view.set_document(document) - - scrolled.add(view) - view.show() +class XbookActivity(Activity): + def __init__(self): + Activity.__init__(self) + + self.set_title(_('Read Activity')) + + evince.job_queue_init() + evince_view = evince.View() + + vbox = gtk.VBox(False, 0) + self.add(vbox) + vbox.show() + + toolbar = Toolbar(evince_view) + vbox.pack_start(toolbar, False) + toolbar.show() + + scrolled = gtk.ScrolledWindow() + vbox.pack_start(scrolled, True, True) + scrolled.show() + + scrolled.add(evince_view) + evince_view.show() + + test_file = 'file://' + os.path.expanduser('~/test.pdf') + document = evince.factory_get_document(test_file) + evince_view.set_document(document) + toolbar.set_document(document) diff --git a/toolbar.py b/toolbar.py new file mode 100644 index 0000000..740d60a --- /dev/null +++ b/toolbar.py @@ -0,0 +1,163 @@ +# Copyright (C) 2006, Red Hat, Inc. +# +# 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 +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# 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 +import gtk +import pango + +class Toolbar(gtk.Toolbar): + def __init__(self, evince_view): + gtk.Toolbar.__init__(self) + + self.set_style(gtk.TOOLBAR_BOTH_HORIZ) + + 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): + self._back = gtk.ToolButton() + self._back.props.sensitive = False + self._back.set_icon_name('stock-back') + self._back.connect("clicked", self._go_back_cb) + self.insert(self._back, -1) + self._back.show() + + self._forward = gtk.ToolButton() + self._back.props.sensitive = False + self._forward.set_icon_name('stock-forward') + self._forward.connect("clicked", self._go_forward_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("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() + + 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 = gtk.ToolButton() + self._prev.props.sensitive = False + self._prev.set_icon_name('stock-back') + self._prev.connect("clicked", self._find_prev_cb) + self.insert(self._prev, -1) + self._prev.show() + + self._next = gtk.ToolButton() + self._next.props.sensitive = False + self._next.set_icon_name('stock-forward') + self._next.connect("clicked", self._find_next_cb) + self.insert(self._next, -1) + self._next.show() + + def _num_page_entry_activate_cb(self, entry): + page = int(entry.get_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.get_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() + + def _go_forward_cb(self, button): + self._evince_view.next_page() + + 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() + self._back.props.sensitive = current_page > 0 + self._forward.props.sensitive = current_page < self._document.get_n_pages() - 1 + + self._num_page_entry.set_text(str(current_page + 1)) + self._total_page_label.set_text(' / ' + 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() + |