Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSayamindu Dasgupta <sayamindu@gmail.com>2009-07-29 21:46:38 (GMT)
committer Sayamindu Dasgupta <sayamindu@gmail.com>2009-07-29 21:46:38 (GMT)
commitab7c9f6521554f886ec12247d7cdcc7bfb71e03e (patch)
tree0a37d4ae2bdfedf338add0c92765bcff47153e65
parentee0f4afd8f626098ff26e0686bba001cea68c426 (diff)
Add a information bar on top during full screen view.
-rw-r--r--readactivity.py23
-rw-r--r--readtopbar.py204
2 files changed, 225 insertions, 2 deletions
diff --git a/readactivity.py b/readactivity.py
index a4c083c..4e8bd31 100644
--- a/readactivity.py
+++ b/readactivity.py
@@ -36,6 +36,7 @@ from sugar.graphics.objectchooser import ObjectChooser
from readtoolbar import EditToolbar, ReadToolbar, ViewToolbar
from readsidebar import Sidebar
+from readtopbar import TopBar
import epubadapter
@@ -111,6 +112,7 @@ class ReadActivity(activity.Activity):
self.connect('key-press-event', self._key_press_event_cb)
self.connect('key-release-event', self._key_release_event_cb)
+ self.connect('window-state-event', self._window_state_event_cb)
_logger.debug('Starting Read...')
@@ -146,11 +148,18 @@ class ReadActivity(activity.Activity):
self.set_toolbox(toolbox)
toolbox.show()
+ self._vbox = gtk.VBox()
+ self._vbox.show()
+
+ self._topbar = TopBar()
+ self._vbox.pack_start(self._topbar, expand = False, fill = False)
+
self._hbox = gtk.HBox()
+ self._hbox.show()
self._hbox.pack_start(self._sidebar, expand=False, fill=False)
- self.set_canvas(self._hbox)
- self._hbox.show()
+ self._vbox.pack_start(self._hbox, expand = True, fill = True)
+ self.set_canvas(self._vbox)
# Set up for idle suspend
self._idle_timer = 0
@@ -493,6 +502,7 @@ class ReadActivity(activity.Activity):
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)
if not self.metadata['title_set_by_user'] == '1':
info = self._document.get_info()
@@ -623,6 +633,15 @@ class ReadActivity(activity.Activity):
keyname = gtk.gdk.keyval_name(event.keyval)
_logger.debug("Keyname Release: %s, time: %s", keyname, event.time)
+ def _window_state_event_cb(self, window, event):
+ if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN):
+ return False
+
+ if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
+ self._topbar.show_all()
+ else:
+ self._topbar.hide()
+
def __view_toolbar_needs_update_size_cb(self, view_toolbar):
if not self._epub:
self._view.update_view_size(self._scrolled)
diff --git a/readtopbar.py b/readtopbar.py
new file mode 100644
index 0000000..3f338f5
--- /dev/null
+++ b/readtopbar.py
@@ -0,0 +1,204 @@
+# Copyright (C) 2006-2007, Red Hat, Inc.
+# Copyright (C) 2009 One Laptop Per Child
+# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
+#
+# 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 gtk, gobject
+import dbus
+
+from sugar.graphics import style
+from sugar.graphics.icon import Icon, get_icon_state
+
+from gettext import gettext as _
+
+_LEVEL_PROP = 'battery.charge_level.percentage'
+_CHARGING_PROP = 'battery.rechargeable.is_charging'
+_DISCHARGING_PROP = 'battery.rechargeable.is_discharging'
+_PRESENT_PROP = 'battery.present'
+
+_ICON_NAME = 'battery'
+
+# Taken from sugar/extensions/deviceicon/battery.py
+class BattMan(gobject.GObject):
+ __gproperties__ = {
+ 'level' : (int, None, None, 0, 100, 0,
+ gobject.PARAM_READABLE),
+ 'charging' : (bool, None, None, False,
+ gobject.PARAM_READABLE),
+ 'discharging' : (bool, None, None, False,
+ gobject.PARAM_READABLE),
+ 'present' : (bool, None, None, False,
+ gobject.PARAM_READABLE)
+ }
+
+ def __init__(self, udi):
+ gobject.GObject.__init__(self)
+
+ bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
+ proxy = bus.get_object('org.freedesktop.Hal', udi,
+ follow_name_owner_changes=True)
+ self._battery = dbus.Interface(proxy, 'org.freedesktop.Hal.Device')
+ bus.add_signal_receiver(self._battery_changed,
+ 'PropertyModified',
+ 'org.freedesktop.Hal.Device',
+ 'org.freedesktop.Hal',
+ udi)
+
+ self._level = self._get_level()
+ self._charging = self._get_charging()
+ self._discharging = self._get_discharging()
+ self._present = self._get_present()
+
+ def _get_level(self):
+ try:
+ return self._battery.GetProperty(_LEVEL_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _LEVEL_PROP)
+ return 0
+
+ def _get_charging(self):
+ try:
+ return self._battery.GetProperty(_CHARGING_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _CHARGING_PROP)
+ return False
+
+ def _get_discharging(self):
+ try:
+ return self._battery.GetProperty(_DISCHARGING_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _DISCHARGING_PROP)
+ return False
+
+ def _get_present(self):
+ try:
+ return self._battery.GetProperty(_PRESENT_PROP)
+ except dbus.DBusException:
+ logging.error('Cannot access %s' % _PRESENT_PROP)
+ return False
+
+ def do_get_property(self, pspec):
+ if pspec.name == 'level':
+ return self._level
+ if pspec.name == 'charging':
+ return self._charging
+ if pspec.name == 'discharging':
+ return self._discharging
+ if pspec.name == 'present':
+ return self._present
+
+ def get_type(self):
+ return 'battery'
+
+ def _battery_changed(self, num_changes, changes_list):
+ for change in changes_list:
+ if change[0] == _LEVEL_PROP:
+ self._level = self._get_level()
+ self.notify('level')
+ elif change[0] == _CHARGING_PROP:
+ self._charging = self._get_charging()
+ self.notify('charging')
+ elif change[0] == _DISCHARGING_PROP:
+ self._discharging = self._get_discharging()
+ self.notify('discharging')
+ elif change[0] == _PRESENT_PROP:
+ self._present = self._get_present()
+ self.notify('present')
+
+
+class _TopBar(gtk.HBox):
+ __gproperties__ = {
+ 'completion-level' : (float, None, None, 0.0, 100.0, 0.0,
+ gobject.PARAM_READWRITE),
+ }
+
+ def __init__(self):
+ gtk.HBox.__init__(self)
+
+ self.set_border_width(int(style.DEFAULT_SPACING/2.0))
+ self.set_spacing(style.DEFAULT_SPACING * 4)
+
+ self._completion_level = 0
+ self._progressbar = None
+
+ bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
+ proxy = bus.get_object('org.freedesktop.Hal',
+ '/org/freedesktop/Hal/Manager')
+ hal_manager = dbus.Interface(proxy, 'org.freedesktop.Hal.Manager')
+ udis = hal_manager.FindDeviceByCapability('battery')
+ if len(udis) > 0:
+ self._battery = BattMan(udis[0]) # TODO: Support more than one battery
+ self._battery.connect('notify::level', \
+ self._battery_level_changed_cb)
+ else:
+ self._battery = None
+
+ self._icon = None
+
+ self._setup()
+
+ def do_get_property(self, property):
+ if property.name == 'completion-level':
+ return self._completion_level
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def do_set_property(self, property, value):
+ if property.name == 'completion-level':
+ self.set_completion_level(value)
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
+ def set_completion_level(self, value):
+ self._completion_level = value
+ self._progressbar.set_fraction(self._completion_level/100.0)
+
+ def _setup(self):
+ self._progressbar = gtk.ProgressBar()
+ self._progressbar.props.discrete_blocks = 10
+ self._progressbar.set_fraction(self._completion_level/100.0)
+ self.pack_start(self._progressbar, expand = True, fill = True)
+ if self._battery is not None:
+ icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5)
+ self._icon = Icon(icon_name=icon_name)
+ self.pack_start(self._icon, expand = False, fill = False)
+
+ def _battery_level_changed_cb(self, pspec, param):
+ icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5)
+ self._icon.props.icon_name = icon_name
+
+class TopBar(_TopBar):
+ def __init__(self):
+ _TopBar.__init__(self)
+ self._document = None
+
+ def set_document(self, document):
+ self._document = document
+
+ page_cache = self._document.get_page_cache()
+ page_cache.connect('page-changed', self._page_changed_cb)
+
+ def _page_changed_cb(self, page, proxy = None):
+ current_page = self._document.get_page_cache().get_current_page()
+ n_pages = self._document.get_n_pages()
+
+ self.set_completion_level(current_page * 100/n_pages)
+
+ #TRANS: Translate this as Page i of m (eg: Page 4 of 334)
+ self._progressbar.set_text(_("Page %i of %i") % (current_page, n_pages))
+
+
+