Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Dogra <lionaneesh@gmail.com>2012-12-12 11:40:19 (GMT)
committer Aneesh Dogra <lionaneesh@gmail.com>2012-12-12 11:40:19 (GMT)
commite5e07d388ff28f95a377e3ae3c7a404c7a0c5b50 (patch)
tree5736c16f2c6d9f389035b4863aa261e1723b036d
parent5fec02465ae49f0ce8a50a1df4b9334a0f52bbfa (diff)
Add gtk3 version of ReadEText 2.
-rw-r--r--Add_Refinements_gtk3/MANIFEST6
-rw-r--r--Add_Refinements_gtk3/ReadEtextsActivity2.py367
-rw-r--r--Add_Refinements_gtk3/activity/activity.info9
-rw-r--r--Add_Refinements_gtk3/activity/read-etexts.svg71
-rw-r--r--Add_Refinements_gtk3/po/ReadEtextsII.pot54
-rwxr-xr-xAdd_Refinements_gtk3/setup.py23
-rw-r--r--Add_Refinements_gtk3/toolbar.py134
7 files changed, 664 insertions, 0 deletions
diff --git a/Add_Refinements_gtk3/MANIFEST b/Add_Refinements_gtk3/MANIFEST
new file mode 100644
index 0000000..e724c0c
--- /dev/null
+++ b/Add_Refinements_gtk3/MANIFEST
@@ -0,0 +1,6 @@
+toolbar.py
+setup.py
+ReadEtextsActivity2.py
+activity/read-etexts.svg
+activity/activity.info
+po/ReadEtextsII.pot
diff --git a/Add_Refinements_gtk3/ReadEtextsActivity2.py b/Add_Refinements_gtk3/ReadEtextsActivity2.py
new file mode 100644
index 0000000..0b78614
--- /dev/null
+++ b/Add_Refinements_gtk3/ReadEtextsActivity2.py
@@ -0,0 +1,367 @@
+#
+# ReadEtextsActivity2.py A version of ReadEtextsActivity with better
+# toolbars and other refinements.
+# Copyright (C) 2010 James D. Simmons
+# Copyright (C) 2012 Aneesh Dogra <lionaneesh@gmail.com>
+#
+# 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 os
+import zipfile
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import Pango
+from sugar3.activity import activity
+from sugar3.graphics import style
+from sugar3.graphics.toolbarbox import ToolbarButton
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.activity.widgets import StopButton
+from sugar3.activity.widgets import EditToolbar
+from sugar3.activity.widgets import ActivityToolbar
+from sugar3.activity.widgets import _create_activity_icon
+from toolbar import ReadToolbar, ViewToolbar
+from gettext import gettext as _
+
+page=0
+PAGE_SIZE = 45
+TOOLBAR_READ = 2
+
+class CustomActivityToolbarButton(ToolbarButton):
+ """
+ Custom Activity Toolbar button, adds the functionality to disable or
+ enable the share button.
+ """
+ def __init__(self, activity, shared=False, **kwargs):
+ toolbar = ActivityToolbar(activity, orientation_left=True)
+
+ if not shared:
+ toolbar.share.props.visible = False
+
+ ToolbarButton.__init__(self, page=toolbar, **kwargs)
+
+ icon = _create_activity_icon(activity.metadata)
+ self.set_icon_widget(icon)
+ icon.show()
+
+class ReadEtextsActivity(activity.Activity):
+ def __init__(self, handle):
+ "The entry point to the Activity"
+ global page
+ activity.Activity.__init__(self, handle)
+
+ toolbar_box = ToolbarBox()
+
+ activity_button = CustomActivityToolbarButton(self)
+ toolbar_box.toolbar.insert(activity_button, 0)
+ activity_button.show()
+
+ edit_toolbar = EditToolbar()
+ edit_toolbar.undo.props.visible = False
+ edit_toolbar.redo.props.visible = False
+ edit_toolbar.separator.props.visible = False
+ edit_toolbar.copy.set_sensitive(False)
+ edit_toolbar.copy.connect('clicked', self.edit_toolbar_copy_cb)
+ edit_toolbar.paste.props.visible = False
+ edit_toolbar_button = ToolbarButton(page=edit_toolbar,
+ label=_("Edit"))
+ edit_toolbar.show()
+ toolbar_box.toolbar.insert(edit_toolbar_button, -1)
+ edit_toolbar_button.show()
+
+ read_toolbar = ReadToolbar()
+ read_toolbar.back.connect('clicked', self.go_back_cb)
+ read_toolbar.forward.connect('clicked', self.go_forward_cb)
+ read_toolbar.num_page_entry.connect('activate',
+ self.num_page_entry_activate_cb)
+ read_toolbar.show()
+ read_toolbar_button = ToolbarButton(page=read_toolbar,
+ label=_("Read"))
+ toolbar_box.toolbar.insert(read_toolbar_button, -1)
+ read_toolbar_button.show()
+
+ view_toolbar = ViewToolbar()
+ view_toolbar.connect('go-fullscreen',
+ self.view_toolbar_go_fullscreen_cb)
+ view_toolbar.zoom_in.connect('clicked', self.zoom_in_cb)
+ view_toolbar.zoom_out.connect('clicked', self.zoom_out_cb)
+ view_toolbar.show()
+ view_toolbar_button = ToolbarButton(page=view_toolbar,
+ label=_("View"))
+ toolbar_box.toolbar.insert(view_toolbar_button, -1)
+ view_toolbar_button.show()
+
+ stop_button = StopButton(self)
+ stop_button.props.accelerator = '<Ctrl><Shift>Q'
+ toolbar_box.toolbar.insert(stop_button, -1)
+ stop_button.show()
+
+ self.set_toolbar_box(toolbar_box)
+ toolbar_box.show()
+
+ self.scrolled_window = Gtk.ScrolledWindow()
+ self.scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
+
+ self.textview = Gtk.TextView()
+ self.textview.set_editable(False)
+ self.textview.set_cursor_visible(False)
+ self.textview.set_left_margin(50)
+ self.textview.connect("key_press_event", self.keypress_cb)
+
+ self.scrolled_window.add(self.textview)
+ self.set_canvas(self.scrolled_window)
+ self.textview.show()
+ self.scrolled_window.show()
+ page = 0
+ self.clipboard = Gtk.Clipboard()
+ self.textview.grab_focus()
+ self.font_desc = Pango.FontDescription("sans %d" % style.zoom(10))
+ self.textview.modify_font(self.font_desc)
+
+ buffer = self.textview.get_buffer()
+ self.markset_id = buffer.connect("mark-set", self.mark_set_cb)
+
+ def keypress_cb(self, widget, event):
+ "Respond when the user presses one of the arrow keys"
+ keyname = Gdk.keyval_name(event.keyval)
+ print keyname
+ if keyname == 'plus':
+ self.font_increase()
+ return True
+ if keyname == 'minus':
+ self.font_decrease()
+ return True
+ if keyname == 'Page_Up' :
+ self.page_previous()
+ return True
+ if keyname == 'Page_Down':
+ self.page_next()
+ return True
+ if keyname == 'Up' or keyname == 'KP_Up' \
+ or keyname == 'KP_Left':
+ self.scroll_up()
+ return True
+ if keyname == 'Down' or keyname == 'KP_Down' \
+ or keyname == 'KP_Right':
+ self.scroll_down()
+ return True
+ return False
+
+ def num_page_entry_activate_cb(self, entry):
+ global page
+ if entry.props.text:
+ new_page = int(entry.props.text) - 1
+ else:
+ new_page = 0
+
+ if new_page >= self.read_toolbar.total_pages:
+ new_page = self.read_toolbar.total_pages - 1
+ elif new_page < 0:
+ new_page = 0
+
+ self.read_toolbar.current_page = new_page
+ self.read_toolbar.set_current_page(new_page)
+ self.show_page(new_page)
+ entry.props.text = str(new_page + 1)
+ self.read_toolbar.update_nav_buttons()
+ page = new_page
+
+ def go_back_cb(self, button):
+ self.page_previous()
+
+ def go_forward_cb(self, button):
+ self.page_next()
+
+ def page_previous(self):
+ global page
+ page=page-1
+ if page < 0: page=0
+ self.read_toolbar.set_current_page(page)
+ self.show_page(page)
+ v_adjustment = self.scrolled_window.get_vadjustment()
+ v_adjustment.set_value(v_adjustment.get_upper() - \
+ v_adjustment.get_page_size())
+
+ def page_next(self):
+ global page
+ page=page+1
+ if page >= len(self.page_index): page=0
+ self.read_toolbar.set_current_page(page)
+ self.show_page(page)
+ v_adjustment = self.scrolled_window.get_vadjustment()
+ v_adjustment.set_value(v_adjustment.get_lower())
+
+ def zoom_in_cb(self, button):
+ self.font_increase()
+
+ def zoom_out_cb(self, button):
+ self.font_decrease()
+
+ def font_decrease(self):
+ font_size = self.font_desc.get_size() / 1024
+ font_size = font_size - 1
+ if font_size < 1:
+ font_size = 1
+ self.font_desc.set_size(font_size * 1024)
+ self.textview.modify_font(self.font_desc)
+
+ def font_increase(self):
+ font_size = self.font_desc.get_size() / 1024
+ font_size = font_size + 1
+ self.font_desc.set_size(font_size * 1024)
+ self.textview.modify_font(self.font_desc)
+
+ def mark_set_cb(self, textbuffer, iter, textmark):
+
+ if textbuffer.get_has_selection():
+ begin, end = textbuffer.get_selection_bounds()
+ self.edit_toolbar.copy.set_sensitive(True)
+ else:
+ self.edit_toolbar.copy.set_sensitive(False)
+
+ def edit_toolbar_copy_cb(self, button):
+ textbuffer = self.textview.get_buffer()
+ begin, end = textbuffer.get_selection_bounds()
+ copy_text = textbuffer.get_text(begin, end)
+ self.clipboard.set_text(copy_text)
+
+ def view_toolbar_go_fullscreen_cb(self, view_toolbar):
+ self.fullscreen()
+
+ def scroll_down(self):
+ v_adjustment = self.scrolled_window.get_vadjustment()
+ if v_adjustment.get_value() == v_adjustment.get_upper() - \
+ v_adjustment.get_page_size():
+ self.page_next()
+ return
+ if v_adjustment.get_value() < v_adjustment.get_upper() - \
+ v_adjustment.get_page_size():
+ new_value = v_adjustment.get_value() + v_adjustment.step_increment
+ if new_value > v_adjustment.get_upper() - v_adjustment.get_page_size():
+ new_value = v_adjustment.get_upper() - v_adjustment.get_page_size()
+ v_adjustment.set_value(new_value)
+
+ def scroll_up(self):
+ v_adjustment = self.scrolled_window.get_vadjustment()
+ if v_adjustment.get_value() == v_adjustment.get_lower():
+ self.page_previous()
+ return
+ if v_adjustment.get_value() > v_adjustment.get_lower():
+ new_value = v_adjustment.get_value() - \
+ v_adjustment.step_increment
+ if new_value < v_adjustment.get_lower():
+ new_value = v_adjustment.get_lower()
+ v_adjustment.set_value(new_value)
+
+ def show_page(self, page_number):
+ global PAGE_SIZE, current_word
+ position = self.page_index[page_number]
+ self.etext_file.seek(position)
+ linecount = 0
+ label_text = '\n\n\n'
+ textbuffer = self.textview.get_buffer()
+ while linecount < PAGE_SIZE:
+ line = self.etext_file.readline()
+ label_text = label_text + unicode(line, 'iso-8859-1')
+ linecount = linecount + 1
+ label_text = label_text + '\n\n\n'
+ textbuffer.set_text(label_text)
+ self.textview.set_buffer(textbuffer)
+
+ def save_extracted_file(self, zipfile, filename):
+ "Extract the file to a temp directory for viewing"
+ filebytes = zipfile.read(filename)
+ outfn = self.make_new_filename(filename)
+ if (outfn == ''):
+ return False
+ f = open(os.path.join(self.get_activity_root(), 'tmp', outfn), 'w')
+ try:
+ f.write(filebytes)
+ finally:
+ f.close()
+
+ def get_saved_page_number(self):
+ global page
+ title = self.metadata.get('title', '')
+ if title == '' or not title[len(title)- 1].isdigit():
+ page = 0
+ else:
+ i = len(title) - 1
+ newPage = ''
+ while (title[i].isdigit() and i > 0):
+ newPage = title[i] + newPage
+ i = i - 1
+ if title[i] == 'P':
+ page = int(newPage) - 1
+ else:
+ # not a page number; maybe a volume number.
+ page = 0
+
+ def save_page_number(self):
+ global page
+ title = self.metadata.get('title', '')
+ if title == '' or not title[len(title)- 1].isdigit():
+ title = title + ' P' + str(page + 1)
+ else:
+ i = len(title) - 1
+ while (title[i].isdigit() and i > 0):
+ i = i - 1
+ if title[i] == 'P':
+ title = title[0:i] + 'P' + str(page + 1)
+ else:
+ title = title + ' P' + str(page + 1)
+ self.metadata['title'] = title
+
+ def read_file(self, filename):
+ "Read the Etext file"
+ global PAGE_SIZE, page
+
+ if zipfile.is_zipfile(filename):
+ self.zf = zipfile.ZipFile(filename, 'r')
+ self.book_files = self.zf.namelist()
+ self.save_extracted_file(self.zf, self.book_files[0])
+ currentFileName = os.path.join(self.get_activity_root(), \
+ 'tmp', self.book_files[0])
+ else:
+ currentFileName = filename
+
+ self.etext_file = open(currentFileName,"r")
+ self.page_index = [ 0 ]
+ pagecount = 0
+ linecount = 0
+ while self.etext_file:
+ line = self.etext_file.readline()
+ if not line:
+ break
+ linecount = linecount + 1
+ if linecount >= PAGE_SIZE:
+ position = self.etext_file.tell()
+ self.page_index.append(position)
+ linecount = 0
+ pagecount = pagecount + 1
+ if filename.endswith(".zip"):
+ os.remove(currentFileName)
+ self.get_saved_page_number()
+ self.show_page(page)
+ self.read_toolbar.set_total_pages(pagecount + 1)
+ self.read_toolbar.set_current_page(page)
+
+ def make_new_filename(self, filename):
+ partition_tuple = filename.rpartition('/')
+ return partition_tuple[2]
+
+ def write_file(self, filename):
+ "Save meta data for the file."
+ self.metadata['activity'] = self.get_bundle_id()
+ self.save_page_number()
diff --git a/Add_Refinements_gtk3/activity/activity.info b/Add_Refinements_gtk3/activity/activity.info
new file mode 100644
index 0000000..d8850ca
--- /dev/null
+++ b/Add_Refinements_gtk3/activity/activity.info
@@ -0,0 +1,9 @@
+[Activity]
+name = ReadEtexts II
+bundle_id = net.flossmanuals.ReadETextsActivity2
+icon = read-etexts
+exec = sugar-activity ReadEtextsActivity2.ReadEtextsActivity
+show_launcher = no
+mime_types = text/plain;application/zip
+activity_version = 1
+license = GPLv2+
diff --git a/Add_Refinements_gtk3/activity/read-etexts.svg b/Add_Refinements_gtk3/activity/read-etexts.svg
new file mode 100644
index 0000000..5682ec8
--- /dev/null
+++ b/Add_Refinements_gtk3/activity/read-etexts.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000000">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg116"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ sodipodi:docname="New document 4"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs118">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective124" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1024"
+ inkscape:window-height="698"
+ inkscape:window-x="0"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata121">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-opacity:1"
+ id="rect904"
+ width="36.142857"
+ height="32.142857"
+ x="4.1428571"
+ y="7.1428571" />
+ </g>
+</svg>
diff --git a/Add_Refinements_gtk3/po/ReadEtextsII.pot b/Add_Refinements_gtk3/po/ReadEtextsII.pot
new file mode 100644
index 0000000..8efe9aa
--- /dev/null
+++ b/Add_Refinements_gtk3/po/ReadEtextsII.pot
@@ -0,0 +1,54 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-12 17:10+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: activity/activity.info:2
+msgid "ReadEtexts II"
+msgstr ""
+
+#: ReadEtextsActivity2.py:78
+msgid "Edit"
+msgstr ""
+
+#: ReadEtextsActivity2.py:90
+msgid "Read"
+msgstr ""
+
+#: ReadEtextsActivity2.py:101
+msgid "View"
+msgstr ""
+
+#: toolbar.py:36
+msgid "Back"
+msgstr ""
+
+#: toolbar.py:42
+msgid "Forward"
+msgstr ""
+
+#: toolbar.py:113
+msgid "Zoom out"
+msgstr ""
+
+#: toolbar.py:118
+msgid "Zoom in"
+msgstr ""
+
+#: toolbar.py:128
+msgid "Fullscreen"
+msgstr ""
diff --git a/Add_Refinements_gtk3/setup.py b/Add_Refinements_gtk3/setup.py
new file mode 100755
index 0000000..601d35c
--- /dev/null
+++ b/Add_Refinements_gtk3/setup.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+# setup.py
+
+# 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
+
+from sugar3.activity import bundlebuilder
+
+bundlebuilder.start()
diff --git a/Add_Refinements_gtk3/toolbar.py b/Add_Refinements_gtk3/toolbar.py
new file mode 100644
index 0000000..70dd1b8
--- /dev/null
+++ b/Add_Refinements_gtk3/toolbar.py
@@ -0,0 +1,134 @@
+# toolbar.,py The toolbars used by ReadEtextsActivity.
+#
+# Copyright (C) 2010, James Simmons.
+# Adapted from code Copyright (C) Red Hat Inc.
+# Copyright (C) 2012, Aneesh Dogra <lionaneesh@gmail.com>
+#
+# 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
+
+from gettext import gettext as _
+import re
+
+from gi.repository import Gtk
+from gi.repository import GObject
+
+from sugar3.graphics.toolbutton import ToolButton
+
+class ReadToolbar(Gtk.Toolbar):
+ __gtype_name__ = 'ReadToolbar'
+
+ def __init__(self):
+ Gtk.Toolbar.__init__(self)
+
+ self.back = ToolButton('go-previous')
+ self.back.set_tooltip(_('Back'))
+ self.back.props.sensitive = False
+ self.insert(self.back, -1)
+ self.back.show()
+
+ self.forward = ToolButton('go-next')
+ self.forward.set_tooltip(_('Forward'))
+ self.forward.props.sensitive = False
+ 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.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()
+ self.total_page_label.set_markup("<span foreground='#FFF' size='14000'></span>")
+
+ 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 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 update_nav_buttons(self):
+ current_page = self.current_page
+ self.back.props.sensitive = current_page > 0
+ self.forward.props.sensitive = \
+ current_page < self.total_pages - 1
+
+ self.num_page_entry.props.text = str(current_page + 1)
+ self.total_page_label.props.label = \
+ ' / ' + str(self.total_pages)
+
+ def set_total_pages(self, pages):
+ self.total_pages = pages
+
+ def set_current_page(self, page):
+ self.current_page = page
+ self.update_nav_buttons()
+
+class ViewToolbar(Gtk.Toolbar):
+ __gtype_name__ = 'ViewToolbar'
+
+ __gsignals__ = {
+ 'needs-update-size': (GObject.SIGNAL_RUN_FIRST,
+ GObject.TYPE_NONE,
+ ([])),
+ 'go-fullscreen': (GObject.SIGNAL_RUN_FIRST,
+ GObject.TYPE_NONE,
+ ([]))
+ }
+
+ def __init__(self):
+ Gtk.Toolbar.__init__(self)
+ self.zoom_out = ToolButton('zoom-out')
+ self.zoom_out.set_tooltip(_('Zoom out'))
+ self.insert(self.zoom_out, -1)
+ self.zoom_out.show()
+
+ self.zoom_in = ToolButton('zoom-in')
+ self.zoom_in.set_tooltip(_('Zoom in'))
+ self.insert(self.zoom_in, -1)
+ self.zoom_in.show()
+
+ spacer = Gtk.SeparatorToolItem()
+ spacer.props.draw = False
+ self.insert(spacer, -1)
+ spacer.show()
+
+ self.fullscreen = ToolButton('view-fullscreen')
+ self.fullscreen.set_tooltip(_('Fullscreen'))
+ self.fullscreen.connect('clicked', self.fullscreen_cb)
+ self.insert(self.fullscreen, -1)
+ self.fullscreen.show()
+
+ def fullscreen_cb(self, button):
+ self.emit('go-fullscreen')