[Sugar-devel] [PATCH Jukebox] Port to Gtk3 SL #3760

Manuel Kaufmann humitos at gmail.com
Mon Jul 16 07:24:19 EDT 2012


This commit ports completely the Jukebox Activity to Gtk3.

Signed-off-by: Manuel Kaufmann <humitos at gmail.com>
---
 ControlToolbar.py  |   58 +++++++------
 jukeboxactivity.py |  243 ++++++++++++++++++++++++----------------------------
 setup.py           |    2 +-
 widgets.py         |   43 +++++-----
 4 files changed, 169 insertions(+), 177 deletions(-)

diff --git a/ControlToolbar.py b/ControlToolbar.py
index 87a9b50..2205bde 100644
--- a/ControlToolbar.py
+++ b/ControlToolbar.py
@@ -15,29 +15,31 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
+import logging
+
 from gettext import gettext as _
 
-import gobject
-import gtk
+from gi.repository import GObject
+from gi.repository import Gtk
 
-from sugar.graphics.toolbutton import ToolButton
-from sugar.graphics.toggletoolbutton import ToggleToolButton
+from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.toggletoolbutton import ToggleToolButton
 
 
-class ViewToolbar(gtk.Toolbar):
+class ViewToolbar(Gtk.Toolbar):
     __gtype_name__ = 'ViewToolbar'
 
     __gsignals__ = {
-        'go-fullscreen': (gobject.SIGNAL_RUN_FIRST,
-                          gobject.TYPE_NONE,
+        'go-fullscreen': (GObject.SignalFlags.RUN_FIRST,
+                          None,
                          ([])),
-        'toggle-playlist': (gobject.SIGNAL_RUN_FIRST,
-                            gobject.TYPE_NONE,
+        'toggle-playlist': (GObject.SignalFlags.RUN_FIRST,
+                            None,
                             ([]))
     }
 
     def __init__(self):
-        gtk.Toolbar.__init__(self)
+        GObject.GObject.__init__(self)
 
         self._show_playlist = ToggleToolButton('view-list')
         self._show_playlist.set_active(True)
@@ -59,11 +61,11 @@ class ViewToolbar(gtk.Toolbar):
         self.emit('toggle-playlist')
 
 
-class Control(gobject.GObject):
+class Control(GObject.GObject):
     """Class to create the Control (play) toolbar"""
 
     def __init__(self, toolbar, jukebox):
-        gobject.GObject.__init__(self)
+        GObject.GObject.__init__(self)
 
         self.toolbar = toolbar
         self.jukebox = jukebox
@@ -80,7 +82,7 @@ class Control(gobject.GObject):
                  jukebox._erase_playlist_entry_clicked_cb)
         self.toolbar.insert(erase_playlist_entry_btn, -1)
 
-        spacer = gtk.SeparatorToolItem()
+        spacer = Gtk.SeparatorToolItem()
         self.toolbar.insert(spacer, -1)
         spacer.show()
 
@@ -90,14 +92,14 @@ class Control(gobject.GObject):
         self.prev_button.connect('clicked', self.prev_button_clicked_cb)
         self.toolbar.insert(self.prev_button, -1)
 
-        self.pause_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE,
-                                                    gtk.ICON_SIZE_BUTTON)
+        self.pause_image = Gtk.Image.new_from_stock(Gtk.STOCK_MEDIA_PAUSE,
+                                                    Gtk.IconSize.BUTTON)
         self.pause_image.show()
-        self.play_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY,
-                                                   gtk.ICON_SIZE_BUTTON)
+        self.play_image = Gtk.Image.new_from_stock(Gtk.STOCK_MEDIA_PLAY,
+                                                   Gtk.IconSize.BUTTON)
         self.play_image.show()
 
-        self.button = gtk.ToolButton()
+        self.button = Gtk.ToolButton()
         self.button.set_icon_widget(self.play_image)
         self.button.set_property('can-default', True)
         self.button.show()
@@ -111,28 +113,32 @@ class Control(gobject.GObject):
         self.next_button.connect('clicked', self.next_button_clicked_cb)
         self.toolbar.insert(self.next_button, -1)
 
-        current_time = gtk.ToolItem()
-        self.current_time_label = gtk.Label('')
+        current_time = Gtk.ToolItem()
+        self.current_time_label = Gtk.Label(label='')
         current_time.add(self.current_time_label)
         current_time.show()
         toolbar.insert(current_time, -1)
 
-        self.adjustment = gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0)
-        self.hscale = gtk.HScale(self.adjustment)
+        self.adjustment = Gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0)
+        self.hscale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL,
+                                adjustment=self.adjustment)
         self.hscale.set_draw_value(False)
-        self.hscale.set_update_policy(gtk.UPDATE_CONTINUOUS)
+        # FIXME: this seems to be deprecated
+        # self.hscale.set_update_policy(Gtk.UPDATE_CONTINUOUS)
+        logging.debug("FIXME: AttributeError: 'Scale' object has no "
+                      "attribute 'set_update_policy'")
         self.hscale.connect('button-press-event',
                 jukebox.scale_button_press_cb)
         self.hscale.connect('button-release-event',
                 jukebox.scale_button_release_cb)
 
-        self.scale_item = gtk.ToolItem()
+        self.scale_item = Gtk.ToolItem()
         self.scale_item.set_expand(True)
         self.scale_item.add(self.hscale)
         self.toolbar.insert(self.scale_item, -1)
 
-        total_time = gtk.ToolItem()
-        self.total_time_label = gtk.Label('')
+        total_time = Gtk.ToolItem()
+        self.total_time_label = Gtk.Label(label='')
         total_time.add(self.total_time_label)
         total_time.show()
         toolbar.insert(total_time, -1)
diff --git a/jukeboxactivity.py b/jukeboxactivity.py
index 8ad59d6..7062fc3 100644
--- a/jukeboxactivity.py
+++ b/jukeboxactivity.py
@@ -27,31 +27,27 @@ import tempfile
 from gettext import gettext as _
 import os
 
-from sugar.activity import activity
-from sugar.graphics.objectchooser import ObjectChooser
-from sugar import mime
-from sugar.datastore import datastore
+from sugar3.activity import activity
+from sugar3.graphics.objectchooser import ObjectChooser
+from sugar3 import mime
+from sugar3.datastore import datastore
 
-OLD_TOOLBAR = False
-try:
-    from sugar.graphics.toolbarbox import ToolbarBox
-    from sugar.graphics.toolbarbox import ToolbarButton
-    from sugar.activity.widgets import StopButton
-    from sugar.activity.widgets import ActivityToolbarButton
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.graphics.toolbarbox import ToolbarButton
+from sugar3.activity.widgets import StopButton
+from sugar3.activity.widgets import ActivityToolbarButton
 
-except ImportError:
-    OLD_TOOLBAR = True
+import gi
+gi.require_version('Gtk', '3.0')
 
-import pygtk
-pygtk.require('2.0')
-
-import gobject
+from gi.repository import GObject
+from gi.repository import Gdk
 
 import pygst
 pygst.require('0.10')
 import gst
 import gst.interfaces
-import gtk
+from gi.repository import Gtk
 
 import urllib
 from ControlToolbar import Control, ViewToolbar
@@ -74,70 +70,45 @@ class JukeboxActivity(activity.Activity):
         self.max_participants = 1
         self._playlist_jobject = None
 
-        if OLD_TOOLBAR:
-            toolbox = activity.ActivityToolbox(self)
-            self.set_toolbox(toolbox)
-            toolbar = gtk.Toolbar()
-            self.control = Control(toolbar, self)
-            toolbox.add_toolbar(_('Play'), toolbar)
-
-            toolbar.show()
-
-            _view_toolbar = ViewToolbar()
-            _view_toolbar.connect('go-fullscreen',
-                    self.__go_fullscreen_cb)
-            _view_toolbar.connect('toggle-playlist',
-                    self.__toggle_playlist_cb)
-            toolbox.add_toolbar(_('View'), _view_toolbar)
-            _view_toolbar.show()
-
-            toolbox.show()
-
-            toolbar.grab_focus()
-            #self.connect("shared", self._shared_cb)
-            activity_toolbar = toolbox.get_activity_toolbar()
-            activity_toolbar.remove(activity_toolbar.share)
-            activity_toolbar.share = None
-            activity_toolbar.remove(activity_toolbar.keep)
-            activity_toolbar.keep = None
-            self.title_entry = activity_toolbar.title
+        toolbar_box = ToolbarBox()
+        activity_button = ActivityToolbarButton(self)
+        activity_toolbar = activity_button.page
+        toolbar_box.toolbar.insert(activity_button, 0)
+        self.title_entry = activity_toolbar.title
+
+        # FIXME: I don't know what is the mission of this line
+        # activity_toolbar.stop.hide()
+
+        _view_toolbar = ViewToolbar()
+        _view_toolbar.connect('go-fullscreen',
+                              self.__go_fullscreen_cb)
+        _view_toolbar.connect('toggle-playlist',
+                              self.__toggle_playlist_cb)
+        view_toolbar_button = ToolbarButton(
+            page=_view_toolbar,
+            icon_name='toolbar-view')
+        _view_toolbar.show()
+        toolbar_box.toolbar.insert(view_toolbar_button, -1)
+        view_toolbar_button.show()
+
+        self.control = Control(toolbar_box.toolbar, self)
+
+        toolbar_box.toolbar.insert(StopButton(self), -1)
+
+        self.set_toolbar_box(toolbar_box)
+        toolbar_box.show_all()
 
-        else:
-            toolbar_box = ToolbarBox()
-            activity_button = ActivityToolbarButton(self)
-            activity_toolbar = activity_button.page
-            toolbar_box.toolbar.insert(activity_button, 0)
-            self.title_entry = activity_toolbar.title
-            activity_toolbar.stop.hide()
-
-            _view_toolbar = ViewToolbar()
-            _view_toolbar.connect('go-fullscreen',
-                    self.__go_fullscreen_cb)
-            _view_toolbar.connect('toggle-playlist',
-                    self.__toggle_playlist_cb)
-            view_toolbar_button = ToolbarButton(
-                    page=_view_toolbar,
-                    icon_name='toolbar-view')
-            _view_toolbar.show()
-            toolbar_box.toolbar.insert(view_toolbar_button, -1)
-            view_toolbar_button.show()
-
-            self.control = Control(toolbar_box.toolbar, self)
-
-            toolbar_box.toolbar.insert(StopButton(self), -1)
-
-            self.set_toolbar_box(toolbar_box)
-            toolbar_box.show_all()
         self.connect("key_press_event", self._key_press_event_cb)
 
-        if handle.uri:
-            pass
-        elif self._shared_activity:
-            if self.get_shared():
-                pass
-            else:
-                # Wait for a successful join before trying to get the document
-                self.connect("joined", self._joined_cb)
+        # FIXME: this is related with shared activity and it doesn't work
+        # if handle.uri:
+        #     pass
+        # elif self._shared_activity:
+        #     if self.get_shared():
+        #         pass
+        #     else:
+        #         # Wait for a successful join before trying to get the document
+        #         self.connect("joined", self._joined_cb)
 
         self.update_id = -1
         self.changed_id = -1
@@ -162,29 +133,36 @@ class JukeboxActivity(activity.Activity):
         self.p_position = gst.CLOCK_TIME_NONE
         self.p_duration = gst.CLOCK_TIME_NONE
 
-        self.bin = gtk.HBox()
-        self.bin.show()
+        # README: I changed this because I was getting an error when I
+        # tried to modify self.bin with something different than
+        # Gtk.Bin
+
+        # self.bin = Gtk.HBox()
+        # self.bin.show()
+
+        self.canvas = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
+
         self.playlist_widget = PlayListWidget(self.play)
         self.playlist_widget.update(self.playlist)
         self.playlist_widget.show()
-        self.bin.pack_start(self.playlist_widget, expand=False)
-        self._empty_widget = gtk.Label("")
+        self.canvas.pack_start(self.playlist_widget, False, True, 0)
+        self._empty_widget = Gtk.Label(label="")
         self._empty_widget.show()
         self.videowidget = VideoWidget()
         self._switch_canvas(show_video=False)
-        self.set_canvas(self.bin)
+        self.set_canvas(self.canvas)
         self.show_all()
-        self.bin.connect('size-allocate', self.__size_allocate_cb)
+        self.canvas.connect('size-allocate', self.__size_allocate_cb)
 
         #From ImageViewer Activity
         self._want_document = True
         if 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)
 
         if handle.uri:
             self.uri = handle.uri
-            gobject.idle_add(self._start, self.uri, handle.title)
+            GObject.idle_add(self._start, self.uri, handle.title)
 
     def _switch_canvas(self, show_video):
         """Show or hide the video visualization in the canvas.
@@ -194,19 +172,19 @@ class JukeboxActivity(activity.Activity):
 
         """
         if show_video:
-            self.bin.remove(self._empty_widget)
-            self.bin.pack_end(self.videowidget)
+            self.canvas.remove(self._empty_widget)
+            self.canvas.pack_end(self.videowidget, True, True, 0)
         else:
-            self.bin.pack_end(self._empty_widget)
-            self.bin.remove(self.videowidget)
-        self.bin.queue_draw()
+            self.canvas.pack_end(self._empty_widget, True, True, 0)
+            self.canvas.remove(self.videowidget)
+        self.canvas.queue_draw()
 
     def __get_tags_cb(self, tags_reader, order, tags):
         self.playlist[order]['title'] = tags['title']
         self.playlist_widget.update(self.playlist)
 
     def __size_allocate_cb(self, widget, allocation):
-        canvas_size = self.bin.get_allocation()
+        canvas_size = self.canvas.get_allocation()
         playlist_width = int(canvas_size.width * PLAYLIST_WIDTH_PROP)
         self.playlist_widget.set_size_request(playlist_width, 0)
 
@@ -219,10 +197,10 @@ class JukeboxActivity(activity.Activity):
         #self.currentplaying = None
         #self.playflag = False
         self._want_document = True
-        self._show_object_picker = gobject.timeout_add(1, self._show_picker_cb)
+        self._show_object_picker = GObject.timeout_add(1, self._show_picker_cb)
 
     def _key_press_event_cb(self, widget, event):
-        keyname = gtk.gdk.keyval_name(event.keyval)
+        keyname = Gdk.keyval_name(event.keyval)
         logging.info("Keyname Press: %s, time: %s", keyname, event.time)
         if self.title_entry.has_focus():
             return False
@@ -289,10 +267,10 @@ class JukeboxActivity(activity.Activity):
         self.player.stop()
         self.player.set_uri(None)
         self.control.set_disabled()
-        self.bin.remove(self.videowidget)
-        text = gtk.Label("Error: %s - %s" % (message, detail))
+        self.canvas.remove(self.videowidget)
+        text = Gtk.Label("Error: %s - %s" % (message, detail))
         text.show_all()
-        self.bin.add(text)
+        self.canvas.add(text)
 
     def _player_new_tag_cb(self, widget, tag, value):
         if not tag in [gst.TAG_TITLE, gst.TAG_ARTIST, gst.TAG_ALBUM]:
@@ -342,14 +320,18 @@ class JukeboxActivity(activity.Activity):
         if not self._want_document:
             return
 
-        chooser = ObjectChooser(_('Choose document'), self,
-            gtk.DIALOG_MODAL |
-            gtk.DIALOG_DESTROY_WITH_PARENT,
-            what_filter=mime.GENERIC_TYPE_AUDIO)
+        # README: some arguments are deprecated so I avoid them
+
+        # chooser = ObjectChooser(_('Choose document'), self,
+        #     Gtk.DialogFlags.MODAL |
+        #     Gtk.DialogFlags.DESTROY_WITH_PARENT,
+        #     what_filter=mime.GENERIC_TYPE_AUDIO)
+
+        chooser = ObjectChooser(self, what_filter=mime.GENERIC_TYPE_AUDIO)
 
         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:
                     logging.error('Adding %s', jobject.file_path)
@@ -376,11 +358,11 @@ class JukeboxActivity(activity.Activity):
         if mimetype == 'audio/x-mpegurl':
             # is a M3U playlist:
             for uri in self._read_m3u_playlist(file_path):
-                gobject.idle_add(self._start, uri['url'], uri['title'],
+                GObject.idle_add(self._start, uri['url'], uri['title'],
                         uri['object_id'])
         else:
             # is another media file:
-            gobject.idle_add(self._start, self.uri, title, object_id)
+            GObject.idle_add(self._start, self.uri, title, object_id)
 
     def _create_playlist_jobject(self):
         """Create an object in the Journal to store the playlist.
@@ -536,7 +518,7 @@ class JukeboxActivity(activity.Activity):
             else:
                 self.player.play()
                 if self.update_id == -1:
-                    self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL,
+                    self.update_id = GObject.timeout_add(self.UPDATE_INTERVAL,
                                                          self.update_scale_cb)
                 self.control.set_button_pause()
 
@@ -552,7 +534,7 @@ class JukeboxActivity(activity.Activity):
 
         # don't timeout-update position during seek
         if self.update_id != -1:
-            gobject.source_remove(self.update_id)
+            GObject.source_remove(self.update_id)
             self.update_id = -1
 
         # make sure we get changed notifies
@@ -574,7 +556,7 @@ class JukeboxActivity(activity.Activity):
 
         self.control.button.set_sensitive(True)
         if self.seek_timeout_id != -1:
-            gobject.source_remove(self.seek_timeout_id)
+            GObject.source_remove(self.seek_timeout_id)
             self.seek_timeout_id = -1
         else:
             if self.was_playing:
@@ -583,7 +565,7 @@ class JukeboxActivity(activity.Activity):
         if self.update_id != -1:
             self.error('Had a previous update timeout id')
         else:
-            self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL,
+            self.update_id = GObject.timeout_add(self.UPDATE_INTERVAL,
                 self.update_scale_cb)
 
     def update_scale_cb(self):
@@ -617,17 +599,17 @@ class JukeboxActivity(activity.Activity):
             self.playlist_widget.hide()
         else:
             self.playlist_widget.show_all()
-        self.bin.queue_draw()
+        self.canvas.queue_draw()
 
 
-class TagReader(gobject.GObject):
+class TagReader(GObject.GObject):
 
     __gsignals__ = {
-        'get-tags': (gobject.SIGNAL_RUN_FIRST, None, [int, object]),
+        'get-tags': (GObject.SignalFlags.RUN_FIRST, None, [int, object]),
     }
 
     def __init__(self):
-        gobject.GObject.__init__(self)
+        GObject.GObject.__init__(self)
         #make a playbin to parse the audio file
         self.pbin = gst.element_factory_make('playbin', 'player')
         fakesink = gst.element_factory_make('fakesink', 'fakesink')
@@ -661,17 +643,17 @@ class TagReader(gobject.GObject):
         self.pbin.set_state(gst.STATE_PAUSED)
 
 
-class GstPlayer(gobject.GObject):
+class GstPlayer(GObject.GObject):
 
     __gsignals__ = {
-        'error': (gobject.SIGNAL_RUN_FIRST, None, [str, str]),
-        'eos': (gobject.SIGNAL_RUN_FIRST, None, []),
-        'tag': (gobject.SIGNAL_RUN_FIRST, None, [str, str]),
-        'stream-info': (gobject.SIGNAL_RUN_FIRST, None, [object])
+        'error': (GObject.SignalFlags.RUN_FIRST, None, [str, str]),
+        'eos': (GObject.SignalFlags.RUN_FIRST, None, []),
+        'tag': (GObject.SignalFlags.RUN_FIRST, None, [str, str]),
+        'stream-info': (GObject.SignalFlags.RUN_FIRST, None, [object])
     }
 
     def __init__(self, videowidget):
-        gobject.GObject.__init__(self)
+        GObject.GObject.__init__(self)
 
         self.playing = False
         self.error = False
@@ -689,7 +671,7 @@ class GstPlayer(gobject.GObject):
         self.overlay = None
         videowidget.realize()
         self.videowidget = videowidget
-        self.videowidget_xid = videowidget.window.xid
+        self.videowidget_xid = videowidget.get_window().get_xid()
         self._init_video_sink()
 
         bus = self.player.get_bus()
@@ -831,17 +813,18 @@ class GstPlayer(gobject.GObject):
         return self.playing
 
 
-class VideoWidget(gtk.DrawingArea):
+class VideoWidget(Gtk.DrawingArea):
     def __init__(self):
-        gtk.DrawingArea.__init__(self)
-        self.set_events(gtk.gdk.POINTER_MOTION_MASK |
-        gtk.gdk.POINTER_MOTION_HINT_MASK |
-        gtk.gdk.EXPOSURE_MASK |
-        gtk.gdk.KEY_PRESS_MASK |
-        gtk.gdk.KEY_RELEASE_MASK)
+        GObject.GObject.__init__(self)
+        self.set_events(Gdk.EventMask.POINTER_MOTION_MASK |
+        Gdk.EventMask.POINTER_MOTION_HINT_MASK |
+        Gdk.EventMask.EXPOSURE_MASK |
+        Gdk.EventMask.KEY_PRESS_MASK |
+        Gdk.EventMask.KEY_RELEASE_MASK)
         self.imagesink = None
-        self.unset_flags(gtk.DOUBLE_BUFFERED)
-        self.set_flags(gtk.APP_PAINTABLE)
+
+        self.set_app_paintable(True)
+        self.set_double_buffered(False)
 
     def do_expose_event(self, event):
         if self.imagesink:
@@ -856,7 +839,7 @@ class VideoWidget(gtk.DrawingArea):
 
 
 if __name__ == '__main__':
-    window = gtk.Window()
+    window = Gtk.Window()
 
     view = VideoWidget()
 
@@ -873,4 +856,4 @@ if __name__ == '__main__':
     player.set_uri('http://78.46.73.237:8000/prog')
     player.play()
     window.show_all()
-    gtk.main()
+    Gtk.main()
diff --git a/setup.py b/setup.py
index d3ab3a3..2f2c143 100755
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-from sugar.activity import bundlebuilder
+from sugar3.activity import bundlebuilder
 
 bundlebuilder.start()
diff --git a/widgets.py b/widgets.py
index bd09a73..2dd5742 100644
--- a/widgets.py
+++ b/widgets.py
@@ -16,41 +16,41 @@
 import logging
 from gettext import gettext as _
 
-import pygtk
-pygtk.require('2.0')
+import gi
+gi.require_version('Gtk', '3.0')
 
-import gobject
-import gtk
-import pango
+from gi.repository import GObject
+from gi.repository import Gtk
+from gi.repository import Pango
 
 
 COLUMNS_NAME = ('index', 'media')
 COLUMNS = dict((name, i) for i, name in enumerate(COLUMNS_NAME))
 
 
-class PlayListWidget(gtk.ScrolledWindow):
+class PlayListWidget(Gtk.ScrolledWindow):
     def __init__(self, play_callback):
         self._playlist = None
         self._play_callback = play_callback
 
-        gtk.ScrolledWindow.__init__(self, hadjustment=None,
+        GObject.GObject.__init__(self, hadjustment=None,
                                     vadjustment=None)
-        self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
-        self.listview = gtk.TreeView()
-        self.treemodel = gtk.ListStore(int, object)
+        self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
+        self.listview = Gtk.TreeView()
+        self.treemodel = Gtk.ListStore(int, object)
         self.listview.set_model(self.treemodel)
         selection = self.listview.get_selection()
-        selection.set_mode(gtk.SELECTION_SINGLE)
+        selection.set_mode(Gtk.SelectionMode.SINGLE)
 
-        renderer_idx = gtk.CellRendererText()
-        treecol_idx = gtk.TreeViewColumn(_('No.'))
+        renderer_idx = Gtk.CellRendererText()
+        treecol_idx = Gtk.TreeViewColumn(_('No.'))
         treecol_idx.pack_start(renderer_idx, True)
         treecol_idx.set_cell_data_func(renderer_idx, self._set_number)
         self.listview.append_column(treecol_idx)
 
-        renderer_title = gtk.CellRendererText()
-        renderer_title.set_property('ellipsize', pango.ELLIPSIZE_END)
-        treecol_title = gtk.TreeViewColumn(_('Play List'))
+        renderer_title = Gtk.CellRendererText()
+        renderer_title.set_property('ellipsize', Pango.EllipsizeMode.END)
+        treecol_title = Gtk.TreeViewColumn(_('Play List'))
         treecol_title.pack_start(renderer_title, True)
         treecol_title.set_cell_data_func(renderer_title, self._set_title)
         self.listview.append_column(treecol_title)
@@ -64,14 +64,16 @@ class PlayListWidget(gtk.ScrolledWindow):
 
     def __on_row_activated(self, treeview, path, col):
         model = treeview.get_model()
-        media_idx = path[COLUMNS['index']]
+
+        treeiter = model.get_iter(path)
+        media_idx = model.get_value(treeiter, COLUMNS['index'])
         self._play_callback(media_idx)
 
-    def _set_number(self, column, cell, model, it):
+    def _set_number(self, column, cell, model, it, data):
         idx = model.get_value(it, COLUMNS['index'])
         cell.set_property('text', idx + 1)
 
-    def _set_title(self, column, cell, model, it):
+    def _set_title(self, column, cell, model, it, data):
         playlist_item = model.get_value(it, COLUMNS['media'])
         cell.set_property('text', playlist_item['title'])
 
@@ -90,6 +92,7 @@ class PlayListWidget(gtk.ScrolledWindow):
         selection = self.listview.get_selection()
         sel_model, sel_rows = self.listview.get_selection().get_selected_rows()
         for row in sel_rows:
-            self._playlist.pop(row[0])
+            index = sel_model.get_value(sel_model.get_iter(row), 0)
+            self._playlist.pop(index)
             self.treemodel.remove(self.treemodel.get_iter(row))
         self.update(self._playlist)
-- 
1.7.10.4



More information about the Sugar-devel mailing list