Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAgustin Zubiaga <aguz@sugarlabs.org>2012-08-18 01:05:09 (GMT)
committer Agustin Zubiaga <aguz@sugarlabs.org>2012-08-18 01:05:09 (GMT)
commit8e33a6d00c1f2f46ebbf8aab11d18ed0ad2348e5 (patch)
tree2fa1d4da909714885409a974f55c8f472848e54f
parent44fbe6ad1649cf1191b4bf8672301b255cdf4d89 (diff)
Initial commit
-rw-r--r--PortfolioActivity.py219
-rw-r--r--exportpdf.py18
-rw-r--r--grecord.py12
-rwxr-xr-xsetup.py2
-rw-r--r--sprites.py38
-rw-r--r--toolbar_utils.py32
-rw-r--r--utils.py14
7 files changed, 149 insertions, 186 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):
diff --git a/exportpdf.py b/exportpdf.py
index e01a788..eef14bd 100644
--- a/exportpdf.py
+++ b/exportpdf.py
@@ -11,14 +11,14 @@
# Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
-import pygtk
-pygtk.require('2.0')
-import gtk
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
from glib import GError
import os.path
import time
import cairo
-import pango
+from gi.repository import Pango
import pangocairo
from gettext import gettext as _
@@ -42,7 +42,7 @@ def save_pdf(activity, nick, description=None):
tmp_file = os.path.join(activity.datapath, 'output.pdf')
pdf_surface = cairo.PDFSurface(tmp_file, 504, 648)
- fd = pango.FontDescription('Sans')
+ fd = Pango.FontDescription('Sans')
cr = cairo.Context(pdf_surface)
cr.set_source_rgb(0, 0, 0)
@@ -67,7 +67,7 @@ def save_pdf(activity, nick, description=None):
try:
w = int(PAGE_WIDTH - LEFT_MARGIN * 2)
h = int(w * 3 / 4)
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobj.file_path,
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(dsobj.file_path,
w, h)
except(GError, IOError):
try:
@@ -81,7 +81,7 @@ def save_pdf(activity, nick, description=None):
if pixbuf is not None:
cr.save()
- cr = gtk.gdk.CairoContext(cr)
+ cr = Gdk.CairoContext(cr)
cr.set_source_pixbuf(pixbuf, LEFT_MARGIN, TOP_MARGIN + 150)
cr.rectangle(LEFT_MARGIN, TOP_MARGIN + 150, w, h)
cr.fill()
@@ -97,13 +97,13 @@ def save_pdf(activity, nick, description=None):
def show_text(cr, fd, label, size, x, y):
cr = pangocairo.CairoContext(cr)
pl = cr.create_layout()
- fd.set_size(int(size * pango.SCALE))
+ fd.set_size(int(size * Pango.SCALE))
pl.set_font_description(fd)
if type(label) == str or type(label) == unicode:
pl.set_text(label.replace('\0', ' '))
else:
pl.set_text(str(label))
- pl.set_width((PAGE_WIDTH - LEFT_MARGIN * 2) * pango.SCALE)
+ pl.set_width((PAGE_WIDTH - LEFT_MARGIN * 2) * Pango.SCALE)
cr.save()
cr.translate(x, y)
cr.update_layout(pl)
diff --git a/grecord.py b/grecord.py
index ae353be..6f35886 100644
--- a/grecord.py
+++ b/grecord.py
@@ -22,14 +22,14 @@
import os
import time
-import gtk
+from gi.repository import Gtk
import gst
import logging
_logger = logging.getLogger("portfolio-activity")
-import gobject
-gobject.threads_init()
+from gi.repository import GObject
+GObject.threads_init()
class Grecord:
@@ -147,7 +147,7 @@ filesink name=audioFilesink'
audioBus.add_signal_watch()
self._audio_transcode_handler = audioBus.connect(
'message', self._onMuxedAudioMessageCb, self._audioline)
- self._transcode_id = gobject.timeout_add(200, self._transcodeUpdateCb,
+ self._transcode_id = GObject.timeout_add(200, self._transcodeUpdateCb,
self._audioline)
self._audiopos = 0
self._audioline.set_state(gst.STATE_PLAYING)
@@ -213,9 +213,9 @@ filesink name=audioFilesink'
return False
def _clean_up_transcoding_pipeline(self, pipe):
- gobject.source_remove(self._audio_transcode_handler)
+ GObject.source_remove(self._audio_transcode_handler)
self._audio_transcode_handler = None
- gobject.source_remove(self._transcode_id)
+ GObject.source_remove(self._transcode_id)
self._transcode_id = None
pipe.set_state(gst.STATE_NULL)
pipe.get_bus().remove_signal_watch()
diff --git a/setup.py b/setup.py
index e5026ee..79bd6d4 100755
--- a/setup.py
+++ b/setup.py
@@ -26,7 +26,7 @@ if len(sys.argv) > 1 and '--no-sugar' == sys.argv[1]:
data_files = DATA_FILES,
)
else:
- from sugar.activity import bundlebuilder
+ from sugar3.activity import bundlebuilder
if __name__ == "__main__":
bundlebuilder.start()
diff --git a/sprites.py b/sprites.py
index baae94f..aab92cc 100644
--- a/sprites.py
+++ b/sprites.py
@@ -24,7 +24,7 @@
'''
sprites.py is a simple sprites library for managing graphics objects,
-'sprites', on a gtk.DrawingArea. It manages multiple sprites with
+'sprites', on a Gtk.DrawingArea. It manages multiple sprites with
methods such as move, hide, set_layer, etc.
There are two classes:
@@ -68,7 +68,7 @@ Example usage:
# method for converting SVG to a gtk pixbuf
def svg_str_to_pixbuf(svg_string):
- pl = gtk.gdk.PixbufLoader('svg')
+ pl = GdkPixbuf.PixbufLoader('svg')
pl.write(svg_string)
pl.close()
pixbuf = pl.get_pixbuf()
@@ -76,10 +76,10 @@ def svg_str_to_pixbuf(svg_string):
'''
-import pygtk
-pygtk.require('2.0')
-import gtk
-import pango
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
+from gi.repository import Pango
import pangocairo
import cairo
@@ -160,7 +160,7 @@ class Sprite:
''' Initialize an individual sprite '''
self._sprites = sprites
self.save_xy = (x, y) # remember initial (x, y) position
- self.rect = gtk.gdk.Rectangle(int(x), int(y), 0, 0)
+ self.rect = (int(x), int(y), 0, 0)
self._scale = [12]
self._rescale = [True]
self._horiz_align = ["center"]
@@ -187,7 +187,7 @@ class Sprite:
self._dy.append(0)
self._dx[i] = dx
self._dy[i] = dy
- if isinstance(image, gtk.gdk.Pixbuf):
+ if isinstance(image, GdkPixbuf.Pixbuf):
w = image.get_width()
h = image.get_height()
else:
@@ -203,7 +203,7 @@ class Sprite:
surface = cairo.ImageSurface(
cairo.FORMAT_ARGB32, self.rect.width, self.rect.height)
context = cairo.Context(surface)
- context = gtk.gdk.CairoContext(context)
+ context = Gdk.CairoContext(context)
context.set_source_pixbuf(image, 0, 0)
context.rectangle(0, 0, self.rect.width, self.rect.height)
context.fill()
@@ -282,7 +282,7 @@ class Sprite:
def set_font(self, font):
''' Set the font for a label '''
- self._fd = pango.FontDescription(font)
+ self._fd = Pango.FontDescription(font)
def set_label_color(self, rgb):
''' Set the font color for a label '''
@@ -365,23 +365,23 @@ class Sprite:
for i in range(len(self.labels)):
pl = cr.create_layout()
pl.set_text(str(self.labels[i]))
- self._fd.set_size(int(self._scale[i] * pango.SCALE))
+ self._fd.set_size(int(self._scale[i] * Pango.SCALE))
pl.set_font_description(self._fd)
- w = pl.get_size()[0] / pango.SCALE
+ w = pl.get_size()[0] / Pango.SCALE
if w > my_width:
if self._rescale[i]:
self._fd.set_size(
- int(self._scale[i] * pango.SCALE * my_width / w))
+ int(self._scale[i] * Pango.SCALE * my_width / w))
pl.set_font_description(self._fd)
- w = pl.get_size()[0] / pango.SCALE
+ w = pl.get_size()[0] / Pango.SCALE
else:
j = len(self.labels[i]) - 1
while(w > my_width and j > 0):
pl.set_text(
"…" + self.labels[i][len(self.labels[i]) - j:])
- self._fd.set_size(int(self._scale[i] * pango.SCALE))
+ self._fd.set_size(int(self._scale[i] * Pango.SCALE))
pl.set_font_description(self._fd)
- w = pl.get_size()[0] / pango.SCALE
+ w = pl.get_size()[0] / Pango.SCALE
j -= 1
if self._horiz_align[i] == "center":
x = int(self.rect.x + self._margins[0] + (my_width - w) / 2)
@@ -389,7 +389,7 @@ class Sprite:
x = int(self.rect.x + self._margins[0])
else: # right
x = int(self.rect.x + self.rect.width - w - self._margins[2])
- h = pl.get_size()[1] / pango.SCALE
+ h = pl.get_size()[1] / Pango.SCALE
if self._vert_align[i] == "middle":
y = int(self.rect.y + self._margins[1] + (my_height - h) / 2)
elif self._vert_align[i] == "top":
@@ -411,9 +411,9 @@ class Sprite:
for i in range(len(self.labels)):
pl = cr.create_layout()
pl.set_text(self.labels[i])
- self._fd.set_size(int(self._scale[i] * pango.SCALE))
+ self._fd.set_size(int(self._scale[i] * Pango.SCALE))
pl.set_font_description(self._fd)
- w = pl.get_size()[0] / pango.SCALE
+ w = pl.get_size()[0] / Pango.SCALE
if w > max:
max = w
return max
diff --git a/toolbar_utils.py b/toolbar_utils.py
index 563147e..788817d 100644
--- a/toolbar_utils.py
+++ b/toolbar_utils.py
@@ -11,12 +11,12 @@
# Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
-import gtk
+from gi.repository import Gtk
-from sugar.graphics.radiotoolbutton import RadioToolButton
-from sugar.graphics.toolbutton import ToolButton
-from sugar.graphics.combobox import ComboBox
-from sugar.graphics.toolcombobox import ToolComboBox
+from sugar3.graphics.radiotoolbutton import RadioToolButton
+from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.combobox import ComboBox
+from sugar3.graphics.toolcombobox import ToolComboBox
def combo_factory(combo_array, toolbar, callback, cb_arg=None,
@@ -32,7 +32,7 @@ def combo_factory(combo_array, toolbar, callback, cb_arg=None,
for i, selection in enumerate(combo_array):
combo.append_item(i, selection, None)
combo.show()
- toolitem = gtk.ToolItem()
+ toolitem = Gtk.ToolItem()
toolitem.add(combo)
if hasattr(toolbar, 'insert'): # the main toolbar
toolbar.insert(toolitem, -1)
@@ -46,13 +46,13 @@ def combo_factory(combo_array, toolbar, callback, cb_arg=None,
def entry_factory(default_string, toolbar, tooltip=None, max=3):
''' Factory for adding a text box to a toolbar '''
- entry = gtk.Entry()
+ entry = Gtk.Entry()
entry.set_text(default_string)
if tooltip is not None and hasattr(entry, 'set_tooltip_text'):
entry.set_tooltip_text(tooltip)
entry.set_width_chars(max)
entry.show()
- toolitem = gtk.ToolItem()
+ toolitem = Gtk.ToolItem()
toolitem.add(entry)
if hasattr(toolbar, 'insert'): # the main toolbar
toolbar.insert(toolitem, -1)
@@ -105,12 +105,12 @@ def radio_factory(button_name, toolbar, callback, cb_arg=None, tooltip=None,
def label_factory(toolbar, label_text, width=None):
''' Factory for adding a label to a toolbar '''
- label = gtk.Label(label_text)
+ label = Gtk.Label(label=label_text)
label.set_line_wrap(True)
if width is not None:
label.set_size_request(width, -1) # doesn't work on XOs
label.show()
- toolitem = gtk.ToolItem()
+ toolitem = Gtk.ToolItem()
toolitem.add(label)
if hasattr(toolbar, 'insert'): # the main toolbar
toolbar.insert(toolitem, -1)
@@ -122,7 +122,7 @@ def label_factory(toolbar, label_text, width=None):
def separator_factory(toolbar, expand=False, visible=True):
''' add a separator to a toolbar '''
- separator = gtk.SeparatorToolItem()
+ separator = Gtk.SeparatorToolItem()
separator.props.draw = visible
separator.set_expand(expand)
if hasattr(toolbar, 'insert'): # the main toolbar
@@ -134,9 +134,9 @@ def separator_factory(toolbar, expand=False, visible=True):
def image_factory(image, toolbar, tooltip=None):
''' Add an image to the toolbar '''
- img = gtk.Image()
+ img = Gtk.Image()
img.set_from_pixbuf(image)
- img_tool = gtk.ToolItem()
+ img_tool = Gtk.ToolItem()
img_tool.add(img)
if tooltip is not None:
img.set_tooltip_text(tooltip)
@@ -149,12 +149,12 @@ def image_factory(image, toolbar, tooltip=None):
def spin_factory(default, min, max, callback, toolbar):
- spin_adj = gtk.Adjustment(default, min, max, 1, 32, 0)
- spin = gtk.SpinButton(spin_adj, 0, 0)
+ spin_adj = Gtk.Adjustment(default, min, max, 1, 32, 0)
+ spin = Gtk.SpinButton(spin_adj, 0, 0)
spin_id = spin.connect('value-changed', callback)
spin.set_numeric(True)
spin.show()
- toolitem = gtk.ToolItem()
+ toolitem = Gtk.ToolItem()
toolitem.add(spin)
if hasattr(toolbar, 'insert'): # the main toolbar
toolbar.insert(toolitem, -1)
diff --git a/utils.py b/utils.py
index fc45b41..563008e 100644
--- a/utils.py
+++ b/utils.py
@@ -11,7 +11,7 @@
# Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
-import gtk
+from gi.repository import Gtk
import os
import subprocess
@@ -88,7 +88,7 @@ def lighter_color(colors):
def svg_str_to_pixbuf(svg_string):
''' Load pixbuf from SVG string '''
- pl = gtk.gdk.PixbufLoader('svg')
+ pl = GdkPixbuf.PixbufLoader('svg')
pl.write(svg_string)
pl.close()
pixbuf = pl.get_pixbuf()
@@ -124,7 +124,7 @@ def svg_rectangle(width, height, colors):
def load_svg_from_file(file_path, width, height):
'''Create a pixbuf from SVG in a file. '''
- return gtk.gdk.pixbuf_new_from_file_at_size(file_path, width, height)
+ return GdkPixbuf.Pixbuf.new_from_file_at_size(file_path, width, height)
def file_to_base64(activity, path):
@@ -143,7 +143,7 @@ def pixbuf_to_base64(activity, pixbuf, width=100, height=75):
''' Convert pixbuf to base64-encoded data '''
png_file = os.path.join(get_path(activity, 'instance'), 'imagetmp.png')
if pixbuf != None:
- pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_NEAREST)
+ pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.NEAREST)
pixbuf.save(png_file, "png")
data = file_to_base64(activity, png_file)
os.remove(png_file)
@@ -165,7 +165,7 @@ def base64_to_pixbuf(activity, data, width=300, height=225):
''' Convert base64-encoded data to a pixbuf '''
png_file = os.path.join(get_path(activity, 'instance'), 'imagetmp.png')
base64_to_file(activity, data, png_file)
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(png_file, width, height)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(png_file, width, height)
os.remove(png_file)
return pixbuf
@@ -173,7 +173,7 @@ def base64_to_pixbuf(activity, data, width=300, height=225):
def get_pixbuf_from_journal(dsobject, w, h):
""" Load a pixbuf from a Journal object. """
pixbufloader = \
- gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
+ GdkPixbuf.Pixbuf.loader_new_with_mime_type('image/png')
pixbufloader.set_size(min(300, int(w)), min(225, int(h)))
try:
pixbufloader.write(dsobject.metadata['preview'])
@@ -186,7 +186,7 @@ def get_pixbuf_from_journal(dsobject, w, h):
def get_pixbuf_from_file(file_path, w, h):
""" Load a pixbuf from a file. """
- return gtk.gdk.pixbuf_new_from_file_at_size(file_path, w, h)
+ return GdkPixbuf.Pixbuf.new_from_file_at_size(file_path, w, h)
def genblank(w, h, colors, stroke_width=1.0):