Signed-off-by: Agustin Zubiaga <a...@sugarlabs.org> Signed-off-by: Flavio Danesse <fdane...@gmail.com> --- ImageView.py | 123 +++++++++++++++++++++++++----------------------- ImageViewerActivity.py | 75 ++++++++++++++--------------- ProgressDialog.py | 14 +++--- 3 files changed, 108 insertions(+), 104 deletions(-)
diff --git a/ImageView.py b/ImageView.py index 538c5b5..39556d7 100644 --- a/ImageView.py +++ b/ImageView.py @@ -17,9 +17,11 @@ from __future__ import division -import gtk -from gtk import gdk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import cairo +from gi.repository import GObject import sys import logging @@ -27,39 +29,42 @@ import logging import random -class ImageViewer(gtk.DrawingArea): +class ImageViewer(Gtk.DrawingArea): __gsignals__ = { - 'expose-event': ( - 'override'), + #'expose-event': ( + # 'override'), 'zoom-changed': ( - gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + GObject.SignalFlags.RUN_FIRST, None, []), 'angle-changed': ( - gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + GObject.SignalFlags.RUN_FIRST, None, []), } __gproperties__ = { 'zoom': ( - gobject.TYPE_FLOAT, 'Zoom Factor', 'Factor of zoom', - 0, 4, 1, gobject.PARAM_READWRITE), + GObject.TYPE_FLOAT, 'Zoom Factor', 'Factor of zoom', + 0, 4, 1, GObject.PARAM_READWRITE), 'angle': ( - gobject.TYPE_INT, 'Angle', 'Angle of rotation', - 0, 360, 0, gobject.PARAM_READWRITE), + GObject.TYPE_INT, 'Angle', 'Angle of rotation', + 0, 360, 0, GObject.PARAM_READWRITE), 'file_location': ( - gobject.TYPE_STRING, 'File Location', 'Location of the image file', - '', gobject.PARAM_READWRITE), + GObject.TYPE_STRING, 'File Location', 'Location of the image file', + '', GObject.PARAM_READWRITE), } def __init__(self): - gtk.DrawingArea.__init__(self) + GObject.GObject.__init__(self) self.set_app_paintable(True) self.pixbuf = None self.zoom = None + self.parent = None self.file_location = None self._temp_pixbuf = None self._image_changed_flag = True self._optimal_zoom_flag = True + self.connect('draw', self.draw) + self.angle = 0 def do_get_property(self, pspec): @@ -90,19 +95,7 @@ class ImageViewer(gtk.DrawingArea): if self._optimal_zoom_flag: self._set_zoom(self._calc_optimal_zoom()) - #def do_size_request(self, requisition): - # requisition.width = self.pixbuf.get_width() - # requisition.height = self.pixbuf.get_height() - - def do_expose_event(self, event): - ctx = self.window.cairo_create() - - ctx.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) - ctx.clip() - self.draw(ctx) - - def draw(self, ctx): + def draw(self, widget, ctx): if not self.pixbuf: return if self.zoom is None: @@ -130,7 +123,7 @@ class ImageViewer(gtk.DrawingArea): self.set_size_request(self._temp_pixbuf.get_width(), self._temp_pixbuf.get_height()) - ctx.set_source_pixbuf(self._temp_pixbuf, x, y) + Gdk.cairo_set_source_pixbuf(ctx, self._temp_pixbuf, x, y) ctx.paint() @@ -144,12 +137,15 @@ class ImageViewer(gtk.DrawingArea): self.angle = angle - if self.window: + if self.props.window: alloc = self.get_allocation() - rect = gdk.Rectangle(alloc.x, alloc.y, - alloc.width, alloc.height) - self.window.invalidate_rect(rect, True) - self.window.process_updates(True) + rect = cairo.RectangleInt() + rect.x = alloc.x + rect.y = alloc.y + rect.width = alloc.width + rect.height = alloc.height + self.props.window.invalidate_rect(rect, True) + self.props.window.process_updates(True) self.emit('angle-changed') @@ -168,24 +164,27 @@ class ImageViewer(gtk.DrawingArea): return True def set_file_location(self, file_location): - self.pixbuf = gtk.gdk.pixbuf_new_from_file(file_location) + self.pixbuf = GdkPixbuf.Pixbuf.new_from_file(file_location) self.file_location = file_location self.zoom = None self._image_changed_flag = True - if self.window: + if self.props.window: alloc = self.get_allocation() - rect = gdk.Rectangle(alloc.x, alloc.y, - alloc.width, alloc.height) - self.window.invalidate_rect(rect, True) - self.window.process_updates(True) + rect = cairo.RectangleInt() + rect.x = alloc.x + rect.y = alloc.y + rect.width = alloc.width + rect.height = alloc.height + self.props.window.invalidate_rect(rect, True) + self.props.window.process_updates(True) def _calc_optimal_zoom(self): # This tries to figure out a best fit model # If the image can fit in, we show it in 1:1, # in any other case we show it in a fit to screen way - if isinstance(self.parent, gtk.Viewport): + if isinstance(self.parent, Gtk.Viewport): rect = self.parent.parent.get_allocation() else: rect = self.parent.get_allocation() @@ -206,37 +205,41 @@ class ImageViewer(gtk.DrawingArea): self._image_changed_flag = True self.zoom = zoom - if self.window: + if self.props.window: alloc = self.get_allocation() - rect = gdk.Rectangle(alloc.x, alloc.y, - alloc.width, alloc.height) - self.window.invalidate_rect(rect, True) - self.window.process_updates(True) + rect = cairo.RectangleInt() + rect.x = alloc.x + rect.y = alloc.y + rect.width = alloc.width + rect.height = alloc.height + self.props.window.invalidate_rect(rect, True) + self.props.window.process_updates(True) self.emit('zoom-changed') def _convert_pixbuf(self, pixbuf): if self.angle == 0: - rotate = gtk.gdk.PIXBUF_ROTATE_NONE + rotate = GdkPixbuf.PixbufRotation.NONE elif self.angle == 90: - rotate = gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE + rotate = GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE elif self.angle == 180: - rotate = gtk.gdk.PIXBUF_ROTATE_UPSIDEDOWN + rotate = GdkPixbuf.PixbufRotation.UPSIDEDOWN elif self.angle == 270: - rotate = gtk.gdk.PIXBUF_ROTATE_CLOCKWISE + rotate = GdkPixbuf.PixbufRotation.CLOCKWISE elif self.angle == 360: self.angle = 0 - rotate = gtk.gdk.PIXBUF_ROTATE_NONE + rotate = GdkPixbuf.PixbufRotation.NONE else: logging.warning('Got unsupported rotate angle') - if rotate != gtk.gdk.PIXBUF_ROTATE_NONE: + if rotate != GdkPixbuf.PixbufRotation.NONE: pixbuf = pixbuf.rotate_simple(rotate) if self.zoom != 1: width = int(pixbuf.get_width() * self.zoom) height = int(pixbuf.get_height() * self.zoom) - pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_TILES) + pixbuf = pixbuf.scale_simple(width, height, + GdkPixbuf.InterpType.TILES) return pixbuf @@ -250,18 +253,18 @@ def update(view_object): if __name__ == '__main__': - window = gtk.Window() + window = Gtk.Window() - vadj = gtk.Adjustment() - hadj = gtk.Adjustment() - sw = gtk.ScrolledWindow(hadj, vadj) + vadj = Gtk.Adjustment() + hadj = Gtk.Adjustment() + sw = Gtk.ScrolledWindow(hadj, vadj) view = ImageViewer() view.set_file_location(sys.argv[1]) - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add_with_viewport(view) @@ -271,6 +274,6 @@ if __name__ == '__main__': window.show_all() - gobject.timeout_add(1000, update, view) + GObject.timeout_add(1000, update, view) - gtk.main() + Gtk.main() diff --git a/ImageViewerActivity.py b/ImageViewerActivity.py index 2391dfd..c35829b 100644 --- a/ImageViewerActivity.py +++ b/ImageViewerActivity.py @@ -19,26 +19,26 @@ from __future__ import division -from sugar.activity import activity +from sugar3.activity import activity import logging from gettext import gettext as _ import time import os -import gtk -import gobject - -from sugar.graphics.alert import NotifyAlert -from sugar.graphics.objectchooser import ObjectChooser -from sugar import mime -from sugar.graphics.toolbutton import ToolButton -from sugar.graphics.toolbarbox import ToolbarBox -from sugar.activity.widgets import ActivityToolbarButton -from sugar.activity.widgets import StopButton - -from sugar import network -from sugar.datastore import datastore +from gi.repository import Gtk +from gi.repository import GObject + +from sugar3.graphics.alert import NotifyAlert +from sugar3.graphics.objectchooser import ObjectChooser +from sugar3 import mime +from sugar3.graphics.toolbutton import ToolButton +from sugar3.graphics.toolbarbox import ToolbarBox +from sugar3.activity.widgets import ActivityToolbarButton +from sugar3.activity.widgets import StopButton + +from sugar3 import network +from sugar3.datastore import datastore import telepathy import dbus @@ -113,14 +113,15 @@ class ImageViewerActivity(activity.Activity): self.set_toolbar_box(toolbar_box) toolbar_box.show() - vadj = gtk.Adjustment() - hadj = gtk.Adjustment() - self.sw = gtk.ScrolledWindow(hadj, vadj) + vadj = Gtk.Adjustment() + hadj = Gtk.Adjustment() + self.sw = Gtk.ScrolledWindow(hadj, vadj) + self.view.parent = self.sw - self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.sw.add_with_viewport(self.view) # Avoid needless spacing - self.view.parent.props.shadow_type = gtk.SHADOW_NONE + self.view.parent.props.shadow_type = Gtk.ShadowType.NONE self.set_canvas(self.sw) self.sw.show_all() @@ -138,7 +139,7 @@ class ImageViewerActivity(activity.Activity): self.is_received_document = False - if self._shared_activity and handle.object_id == None: + if self.shared_activity and handle.object_id == None: # We're joining, and we don't already have the document. if self.get_shared(): # Already joined for some reason, just get the document @@ -147,7 +148,7 @@ class ImageViewerActivity(activity.Activity): # Wait for a successful join before trying to get the document self.connect("joined", self._joined_cb) elif self._object_id is None: - self._show_object_picker = gobject.timeout_add(1000, \ + self._show_object_picker = GObject.timeout_add(1000, \ self._show_picker_cb) def handle_view_source(self): @@ -190,7 +191,7 @@ class ImageViewerActivity(activity.Activity): toolbar_box.toolbar.insert(zoom_original_button, -1) zoom_original_button.show() - spacer = gtk.SeparatorToolItem() + spacer = Gtk.SeparatorToolItem() spacer.props.draw = False toolbar_box.toolbar.insert(spacer, -1) spacer.show() @@ -208,7 +209,7 @@ class ImageViewerActivity(activity.Activity): toolbar_box.toolbar.insert(rotate_clockwise_button, -1) rotate_clockwise_button.show() - spacer = gtk.SeparatorToolItem() + spacer = Gtk.SeparatorToolItem() spacer.props.draw = False toolbar_box.toolbar.insert(spacer, -1) spacer.show() @@ -219,7 +220,7 @@ class ImageViewerActivity(activity.Activity): toolbar_box.toolbar.insert(fullscreen_button, -1) fullscreen_button.show() - separator = gtk.SeparatorToolItem() + separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) toolbar_box.toolbar.insert(separator, -1) @@ -262,13 +263,13 @@ class ImageViewerActivity(activity.Activity): return chooser = ObjectChooser(_('Choose document'), self, - gtk.DIALOG_MODAL | - gtk.DIALOG_DESTROY_WITH_PARENT, \ + Gtk.DialogFlags.MODAL | + Gtk.DialogFlags.DESTROY_WITH_PARENT, \ what_filter=mime.GENERIC_TYPE_IMAGE) try: result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: + if result == Gtk.ResponseType.ACCEPT: jobject = chooser.get_selected_object() if jobject and jobject.file_path: self.read_file(jobject.file_path) @@ -284,7 +285,7 @@ class ImageViewerActivity(activity.Activity): os.link(file_path, tempfile) self._tempfile = tempfile - gobject.idle_add(self.__set_file_idle_cb, tempfile) + GObject.idle_add(self.__set_file_idle_cb, tempfile) def __set_file_idle_cb(self, file_path): self.view.set_file_location(file_path) @@ -335,7 +336,7 @@ class ImageViewerActivity(activity.Activity): self.progressdialog.destroy() - gobject.idle_add(self.__set_file_idle_cb, tempfile) + GObject.idle_add(self.__set_file_idle_cb, tempfile) self.save() def _download_progress_cb(self, getter, bytes_downloaded, tube_id): @@ -351,7 +352,7 @@ class ImageViewerActivity(activity.Activity): fraction = bytes_downloaded / total self.progressdialog.set_fraction(fraction) - #gtk.main_iteration() + #Gtk.main_iteration() def _download_error_cb(self, getter, err, tube_id): _logger.debug("Error getting document from tube %u: %s", @@ -360,12 +361,12 @@ class ImageViewerActivity(activity.Activity): self._want_document = True self._download_content_length = 0 self._download_content_type = None - gobject.idle_add(self._get_document) + GObject.idle_add(self._get_document) def _download_document(self, tube_id, path): # FIXME: should ideally have the CM listen on a Unix socket # instead of IPv4 (might be more compatible with Rainbow) - chan = self._shared_activity.telepathy_tubes_chan + chan = self.shared_activity.telepathy_tubes_chan iface = chan[telepathy.CHANNEL_TYPE_TUBES] addr = iface.AcceptStreamTube(tube_id, telepathy.SOCKET_ADDRESS_TYPE_IPV4, @@ -413,7 +414,7 @@ class ImageViewerActivity(activity.Activity): # Avoid trying to download the document multiple times at once self._want_document = False - gobject.idle_add(self._download_document, tube_id, path) + GObject.idle_add(self._download_document, tube_id, path) return False def _joined_cb(self, also_self): @@ -426,7 +427,7 @@ class ImageViewerActivity(activity.Activity): self.progressdialog = ProgressDialog.ProgressDialog(self) self.progressdialog.show_all() - gobject.idle_add(self._get_document) + GObject.idle_add(self._get_document) def _share_document(self): """Share the document.""" @@ -438,7 +439,7 @@ class ImageViewerActivity(activity.Activity): self._tempfile) # Make a tube for it - chan = self._shared_activity.telepathy_tubes_chan + chan = self.shared_activity.telepathy_tubes_chan iface = chan[telepathy.CHANNEL_TYPE_TUBES] self._fileserver_tube_id = \ iface.OfferStreamTube(IMAGEVIEWER_STREAM_SERVICE, @@ -449,7 +450,7 @@ class ImageViewerActivity(activity.Activity): def watch_for_tubes(self): """Watch for new tubes.""" - tubes_chan = self._shared_activity.telepathy_tubes_chan + tubes_chan = self.shared_activity.telepathy_tubes_chan tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal('NewTube', self._new_tube_cb) @@ -468,7 +469,7 @@ class ImageViewerActivity(activity.Activity): self.unused_download_tubes.add(tube_id) # if no download is in progress, let's fetch the document if self._want_document: - gobject.idle_add(self._get_document) + GObject.idle_add(self._get_document) def _list_tubes_reply_cb(self, tubes): """Callback when new tubes are available.""" diff --git a/ProgressDialog.py b/ProgressDialog.py index a46bae3..aa9cea8 100644 --- a/ProgressDialog.py +++ b/ProgressDialog.py @@ -1,24 +1,24 @@ -import gtk +from gi.repository import Gtk from gettext import gettext as _ -class ProgressDialog(gtk.Dialog): +class ProgressDialog(Gtk.Dialog): def __init__(self, parent): - gtk.Dialog.__init__(self, _('Downloading...'), parent, \ - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, \ - (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) + GObject.GObject.__init__(self, _('Downloading...'), parent, \ + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, \ + (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT)) self._activity = parent self.connect('response', self._response_cb) - self._pb = gtk.ProgressBar() + self._pb = Gtk.ProgressBar() self._pb.set_text(_('Retrieving shared image, please wait...')) self.vbox.add(self._pb) def _response_cb(self, dialog, response_id): - if response_id == gtk.RESPONSE_REJECT: + if response_id == Gtk.ResponseType.REJECT: self._activity.close() else: pass -- 1.7.10.2 _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel