diff options
Diffstat (limited to 'PortfolioActivity.py')
-rw-r--r-- | PortfolioActivity.py | 219 |
1 files changed, 91 insertions, 128 deletions
diff --git a/PortfolioActivity.py b/PortfolioActivity.py index 193c4f0..0291992 100644 --- a/PortfolioActivity.py +++ b/PortfolioActivity.py @@ -11,8 +11,9 @@ # Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject import subprocess import os import time @@ -21,28 +22,23 @@ from shutil import copyfile from math import sqrt, ceil -from sugar.activity import activity -from sugar import profile -try: - from sugar.graphics.toolbarbox import ToolbarBox - HAVE_TOOLBOX = True -except ImportError: - HAVE_TOOLBOX = False +from sugar3.activity import activity +from sugar3 import profile -if HAVE_TOOLBOX: - from sugar.activity.widgets import ActivityToolbarButton - from sugar.activity.widgets import StopButton - from sugar.graphics.toolbarbox import ToolbarButton +from sugar3.graphics.toolbarbox import ToolbarBox +from sugar3.activity.widgets import ActivityToolbarButton +from sugar3.activity.widgets import StopButton +from sugar3.graphics.toolbarbox import ToolbarButton -from sugar.datastore import datastore -from sugar.graphics.alert import Alert +from sugar3.datastore import datastore +from sugar3.graphics.alert import Alert from sprites import Sprites, Sprite from exportpdf import save_pdf from utils import get_path, lighter_color, svg_str_to_pixbuf, svg_rectangle, \ play_audio_from_file, get_pixbuf_from_journal, genblank, get_hardware, \ pixbuf_to_base64, base64_to_pixbuf, get_pixbuf_from_file - + from toolbar_utils import radio_factory, button_factory, separator_factory, \ combo_factory, label_factory from grecord import Grecord @@ -53,35 +49,26 @@ import logging _logger = logging.getLogger("portfolio-activity") try: - from sugar.graphics import style + from sugar3.graphics import style GRID_CELL_SIZE = style.GRID_CELL_SIZE except ImportError: GRID_CELL_SIZE = 0 -try: - _OLD_SUGAR_SYSTEM = False - import json - from json import load as jload - from json import dump as jdump -except(ImportError, AttributeError): - try: - import simplejson as json - from simplejson import load as jload - from simplejson import dump as jdump - except ImportError: - _OLD_SUGAR_SYSTEM = True +import json +from json import load as jload +from json import dump as jdump from StringIO import StringIO import telepathy from dbus.service import signal from dbus.gobject_service import ExportedGObject -from sugar.presence import presenceservice -from sugar.presence.tubeconn import TubeConnection +from sugar3.presence import presenceservice +from sugar3.presence.tubeconn import TubeConnection -SERVICE = 'org.sugarlabs.PortfolioActivity' +SERVICE = 'org.sugar3labs.PortfolioActivity' IFACE = SERVICE -PATH = '/org/sugarlabs/PortfolioActivity' +PATH = '/org/sugar3labs/PortfolioActivity' # Size and position of title, preview image, and description PREVIEWW = 600 @@ -177,9 +164,9 @@ class PortfolioActivity(activity.Activity): self._playing = False self._first_time = True - self._width = gtk.gdk.screen_width() - self._height = gtk.gdk.screen_height() - self._scale = gtk.gdk.screen_height() / 900. + self._width = Gdk.Screen.width() + self._height = Gdk.Screen.height() + self._scale = Gdk.Screen.height() / 900. self._titlewh = [self._width, TITLEH * self._scale] self._titlexy = [0, 0] @@ -223,19 +210,19 @@ class PortfolioActivity(activity.Activity): def _setup_canvas(self): ''' Create a canvas ''' - self._canvas = gtk.DrawingArea() - self._canvas.set_size_request(int(gtk.gdk.screen_width()), - int(gtk.gdk.screen_height())) + self._canvas = Gtk.DrawingArea() + self._canvas.set_size_request(int(Gdk.Screen.width()), + int(Gdk.Screen.height())) self._canvas.show() self.set_canvas(self._canvas) self.show_all() - self._canvas.set_flags(gtk.CAN_FOCUS) - self._canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self._canvas.add_events(gtk.gdk.POINTER_MOTION_MASK) - self._canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK) - self._canvas.add_events(gtk.gdk.KEY_PRESS_MASK) - self._canvas.add_events(gtk.gdk.CONFIGURE) + self._canvas.set_flags(Gtk.CAN_FOCUS) + self._canvas.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self._canvas.add_events(Gdk.EventMask.POINTER_MOTION_MASK) + self._canvas.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) + self._canvas.add_events(Gdk.EventMask.KEY_PRESS_MASK) + self._canvas.add_events(Gdk.CONFIGURE) self._canvas.connect('expose-event', self._expose_cb) self._canvas.connect('button-press-event', self._button_press_cb) self._canvas.connect('button-release-event', self._button_release_cb) @@ -247,12 +234,12 @@ class PortfolioActivity(activity.Activity): def _configure_cb(self, win, event): # landscape or portrait? - self._width = gtk.gdk.screen_width() - self._height = gtk.gdk.screen_height() + self._width = Gdk.Screen.width() + self._height = Gdk.Screen.height() if self._width > self._height: - self._scale = gtk.gdk.screen_height() / 900. + self._scale = Gdk.Screen.height() / 900. else: - self._scale = gtk.gdk.screen_width() / 1200. + self._scale = Gdk.Screen.width() / 1200. self._my_canvas.hide() self._title.hide() @@ -282,7 +269,7 @@ class PortfolioActivity(activity.Activity): self._colors[0] = self._colors[1] self._colors[1] = tmp - if not HAVE_TOOLBOX and self._hw[0:2] == 'xo': + if self._hw[0:2] == 'xo': self._titlef = 18 self._descriptionf = 12 else: @@ -296,23 +283,23 @@ class PortfolioActivity(activity.Activity): star_size = 55 else: star_size = int(150. / int(ceil(sqrt(self._nobjects)))) - self._fav_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self._fav_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'favorite-on.svg'), star_size, star_size) - self._unfav_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self._unfav_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'favorite-off.svg'), star_size, star_size) - self.record_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.record_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'media-audio.svg'), 55, 55) - self.recording_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.recording_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'media-audio-recording.svg'), 55, 55) - self.playback_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.playback_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'speaker-100.svg'), 55, 55) - self.playing_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.playing_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'speaker-0.svg'), 55, 55) @@ -325,16 +312,16 @@ class PortfolioActivity(activity.Activity): self._playback_button.type = 'noplay' self._playback_button.hide() - self.prev_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.prev_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'go-previous.svg'), 55, 55) - self.next_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.next_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'go-next.svg'), 55, 55) - self.prev_off_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.prev_off_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'go-previous-inactive.svg'), 55, 55) - self.next_off_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + self.next_off_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'icons', 'go-next-inactive.svg'), 55, 55) @@ -348,7 +335,7 @@ class PortfolioActivity(activity.Activity): self._help = Sprite(self._sprites, 0, 0, - gtk.gdk.pixbuf_new_from_file_at_size( + GdkPixbuf.Pixbuf.new_from_file_at_size( os.path.join(activity.get_bundle_path(), 'help.png'), int(self._previewwh[0]), int(self._previewwh[1]))) @@ -415,41 +402,27 @@ class PortfolioActivity(activity.Activity): self.max_participants = 5 # sharing - if HAVE_TOOLBOX: - toolbox = ToolbarBox() + toolbox = ToolbarBox() - # Activity toolbar - activity_button_toolbar = ActivityToolbarButton(self) + # Activity toolbar + activity_button_toolbar = ActivityToolbarButton(self) - toolbox.toolbar.insert(activity_button_toolbar, 0) - activity_button_toolbar.show() + toolbox.toolbar.insert(activity_button_toolbar, 0) + activity_button_toolbar.show() - self.set_toolbar_box(toolbox) - toolbox.show() - self.toolbar = toolbox.toolbar + self.set_toolbar_box(toolbox) + toolbox.show() + self.toolbar = toolbox.toolbar - adjust_toolbar = gtk.Toolbar() - adjust_toolbar_button = ToolbarButton( - label=_('Adjust'), - page=adjust_toolbar, - icon_name='preferences-system') - adjust_toolbar.show_all() - adjust_toolbar_button.show() - else: - # Use pre-0.86 toolbar design - primary_toolbar = gtk.Toolbar() - toolbox = activity.ActivityToolbox(self) - self.set_toolbox(toolbox) - toolbox.add_toolbar(_('Page'), primary_toolbar) - adjust_toolbar = gtk.Toolbar() - toolbox.add_toolbar(_('Adjust'), adjust_toolbar) - toolbox.show() - toolbox.set_current_toolbar(1) - self.toolbar = primary_toolbar - - if HAVE_TOOLBOX: - # toolbox.toolbar.insert(record_toolbar_button, -1) - toolbox.toolbar.insert(adjust_toolbar_button, -1) + adjust_toolbar = Gtk.Toolbar() + adjust_toolbar_button = ToolbarButton( + label=_('Adjust'), + page=adjust_toolbar, + icon_name='preferences-system') + adjust_toolbar.show_all() + adjust_toolbar_button.show() + + toolbox.toolbar.insert(adjust_toolbar_button, -1) button_factory('view-fullscreen', self.toolbar, self.do_fullscreen_cb, tooltip=_('Fullscreen'), @@ -498,17 +471,16 @@ class PortfolioActivity(activity.Activity): self._save_as_pdf_cb, tooltip=_('Save as PDF')) - if HAVE_TOOLBOX: - separator_factory(toolbox.toolbar, True, False) + separator_factory(toolbox.toolbar, True, False) - stop_button = StopButton(self) - stop_button.props.accelerator = '<Ctrl>q' - toolbox.toolbar.insert(stop_button, -1) - stop_button.show() + stop_button = StopButton(self) + stop_button.props.accelerator = '<Ctrl>q' + toolbox.toolbar.insert(stop_button, -1) + stop_button.show() def _destroy_cb(self, win, event): ''' Clean up on the way out. ''' - gtk.main_quit() + Gtk.main_quit() def _thumb_to_slide(self, spr): if spr is None: @@ -639,7 +611,7 @@ class PortfolioActivity(activity.Activity): self._playing = False self._auto_button.set_icon('media-playback-start') if hasattr(self, '_timeout_id') and self._timeout_id is not None: - gobject.source_remove(self._timeout_id) + GObject.source_remove(self._timeout_id) def _loop(self): ''' Show a slide and then call oneself with a timeout. ''' @@ -647,7 +619,7 @@ class PortfolioActivity(activity.Activity): if self.i == self._nobjects: self.i = 0 self._show_slide() - self._timeout_id = gobject.timeout_add(int(self._rate * 1000), + self._timeout_id = GObject.timeout_add(int(self._rate * 1000), self._loop) def _save_as_pdf_cb(self, button=None): @@ -668,7 +640,7 @@ class PortfolioActivity(activity.Activity): dsobject.metadata['icon-color'] = profile.get_color().to_string() dsobject.metadata['mime_type'] = 'application/pdf' dsobject.set_file_path(tmp_file) - dsobject.metadata['activity'] = 'org.laptop.sugar.ReadActivity' + dsobject.metadata['activity'] = 'org.laptop.sugar3.ReadActivity' datastore.write(dsobject) dsobject.destroy() return @@ -720,7 +692,7 @@ class PortfolioActivity(activity.Activity): return slide = self._slides[self.i] - if self.i == 0: + if self.i == 0: self._prev.set_image(self.prev_off_pixbuf) else: self._prev.set_image(self.prev_pixbuf) @@ -735,7 +707,7 @@ class PortfolioActivity(activity.Activity): self._preview.set_shape(pixbuf.scale_simple( int(PREVIEWW * self._scale), int(PREVIEWH * self._scale), - gtk.gdk.INTERP_NEAREST)) + GdkPixbuf.InterpType.NEAREST)) self._preview.set_layer(MIDDLE) else: if self._preview is not None: @@ -753,7 +725,7 @@ class PortfolioActivity(activity.Activity): if slide.sound is not None: if self._playing: _logger.debug('Playing audio note') - gobject.idle_add(play_audio_from_file, + GObject.idle_add(play_audio_from_file, slide.sound.file_path) self._playback_button.set_image(self.playback_pixbuf) self._playback_button.type = 'play' @@ -834,7 +806,7 @@ class PortfolioActivity(activity.Activity): if slide.thumb is None: if slide.preview is not None: pixbuf_thumb = slide.preview.scale_simple(int(w), int(h), - gtk.gdk.INTERP_TILES) + GdkPixbuf.InterpType.TILES) else: pixbuf_thumb = svg_str_to_pixbuf(genblank(int(w), int(h), self._colors)) @@ -878,13 +850,13 @@ class PortfolioActivity(activity.Activity): os.remove(os.path.join(self.datapath, 'output.ogg')) def do_fullscreen_cb(self, button): - ''' Hide the Sugar toolbars. ''' + ''' Hide the sugar3 toolbars. ''' self.fullscreen() def invalt(self, x, y, w, h): ''' Mark a region for refresh ''' self._canvas.window.invalidate_rect( - gtk.gdk.Rectangle(int(x), int(y), int(w), int(h)), False) + (int(x), int(y), int(w), int(h)), False) def _button_press_cb(self, win, event): ''' The mouse button was pressed. Is it on a thumbnail sprite? ''' @@ -1084,7 +1056,7 @@ class PortfolioActivity(activity.Activity): slide = self._slides[self.i] _logger.debug('Autosaving recording') self._notify_successful_save(title=_('Save recording')) - gobject.timeout_add(100, self._wait_for_transcoding_to_finish) + GObject.timeout_add(100, self._wait_for_transcoding_to_finish) else: # Wasn't recording, so start _logger.debug('recording...False. Start recording.') self._record_button.set_image(self.recording_pixbuf) @@ -1107,8 +1079,8 @@ class PortfolioActivity(activity.Activity): self._playback_button.set_image(self.playing_pixbuf) self._playback_button.set_layer(DRAG) self._playback_button.type = 'playing' - gobject.timeout_add(1000, self._playback_button_reset) - gobject.idle_add(play_audio_from_file, + GObject.timeout_add(1000, self._playback_button_reset) + GObject.idle_add(play_audio_from_file, self._slides[self.i].sound.file_path) def _playback_button_reset(self): @@ -1191,9 +1163,9 @@ class PortfolioActivity(activity.Activity): def _keypress_cb(self, area, event): ''' Keyboard ''' - keyname = gtk.gdk.keyval_name(event.keyval) - keyunicode = gtk.gdk.keyval_to_unicode(event.keyval) - if event.get_state() & gtk.gdk.MOD1_MASK: + keyname = Gdk.keyval_name(event.keyval) + keyunicode = Gdk.keyval_to_unicode(event.keyval) + if event.get_state() & Gdk.ModifierType.MOD1_MASK: alt_mask = True alt_flag = 'T' else: @@ -1338,7 +1310,7 @@ class PortfolioActivity(activity.Activity): if hasattr(self.get_window(), 'get_cursor'): self.get_window().set_cursor(self.old_cursor) else: - self.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + self.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) def _waiting_cursor(self): ''' Waiting, so set watch cursor. ''' @@ -1346,7 +1318,7 @@ class PortfolioActivity(activity.Activity): return if hasattr(self.get_window(), 'get_cursor'): self.old_cursor = self.get_window().get_cursor() - self.get_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) + self.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) # Serialize @@ -1363,12 +1335,7 @@ class PortfolioActivity(activity.Activity): return self._data_dumper(data) def _data_dumper(self, data): - if _OLD_SUGAR_SYSTEM: - return json.write(data) - else: - io = StringIO() - jdump(data, io) - return io.getvalue() + return json.write(data) def _load(self, data): ''' Load slide data from a sharer. ''' @@ -1407,11 +1374,7 @@ class PortfolioActivity(activity.Activity): self._show_thumbs() def _data_loader(self, data): - if _OLD_SUGAR_SYSTEM: - return json.read(data) - else: - io = StringIO(data) - return jload(io) + return json.read(data) # When portfolio is shared, only sharer sends out slides, joiners # send back comments. @@ -1607,7 +1570,7 @@ class PortfolioActivity(activity.Activity): for slide in self._slides: if slide.active and slide.fav: _logger.debug('sharing %s' % (slide.uid)) - gobject.idle_add(self._send_event, 's:%s' % ( + GObject.idle_add(self._send_event, 's:%s' % ( str(self._dump(slide)))) def _send_star(self, uid, status): |