[Sugar-devel] [PATCH ImageViewer] GTK3 Port

Agustin Zubiaga Sanchez aguz at sugarlabs.org
Sun Jul 8 06:02:27 EDT 2012


Feedbacks?

2012/7/1 Agustin Zubiaga <aguz at sugarlabs.org>

> Signed-off-by: Agustin Zubiaga <aguz at sugarlabs.org>
> Signed-off-by: Flavio Danesse <fdanesse at 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
>
>


--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120708/4d0b784e/attachment-0001.html>


More information about the Sugar-devel mailing list