Ticket #3760: 0001-Port-to-Gtk3-SL-3760.patch
File 0001-Port-to-Gtk3-SL-3760.patch, 25.3 KB (added by humitos, 12 years ago) |
---|
-
ControlToolbar.py
From 7a4eb9bc2b1a1d47ef30386a983ce13ca552de73 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann <humitos@gmail.com> Date: Mon, 16 Jul 2012 08:21:42 -0300 Subject: [PATCH Jukebox] Port to Gtk3 SL #3760 This commit ports completely the Jukebox Activity to Gtk3. Signed-off-by: Manuel Kaufmann <humitos@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 b 15 15 # along with this program; if not, write to the Free Software 16 16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 17 18 import logging 19 18 20 from gettext import gettext as _ 19 21 20 import gobject21 import gtk22 from gi.repository import GObject 23 from gi.repository import Gtk 22 24 23 from sugar .graphics.toolbutton import ToolButton24 from sugar .graphics.toggletoolbutton import ToggleToolButton25 from sugar3.graphics.toolbutton import ToolButton 26 from sugar3.graphics.toggletoolbutton import ToggleToolButton 25 27 26 28 27 class ViewToolbar( gtk.Toolbar):29 class ViewToolbar(Gtk.Toolbar): 28 30 __gtype_name__ = 'ViewToolbar' 29 31 30 32 __gsignals__ = { 31 'go-fullscreen': ( gobject.SIGNAL_RUN_FIRST,32 gobject.TYPE_NONE,33 'go-fullscreen': (GObject.SignalFlags.RUN_FIRST, 34 None, 33 35 ([])), 34 'toggle-playlist': ( gobject.SIGNAL_RUN_FIRST,35 gobject.TYPE_NONE,36 'toggle-playlist': (GObject.SignalFlags.RUN_FIRST, 37 None, 36 38 ([])) 37 39 } 38 40 39 41 def __init__(self): 40 gtk.Toolbar.__init__(self)42 GObject.GObject.__init__(self) 41 43 42 44 self._show_playlist = ToggleToolButton('view-list') 43 45 self._show_playlist.set_active(True) … … class ViewToolbar(gtk.Toolbar): 59 61 self.emit('toggle-playlist') 60 62 61 63 62 class Control( gobject.GObject):64 class Control(GObject.GObject): 63 65 """Class to create the Control (play) toolbar""" 64 66 65 67 def __init__(self, toolbar, jukebox): 66 gobject.GObject.__init__(self)68 GObject.GObject.__init__(self) 67 69 68 70 self.toolbar = toolbar 69 71 self.jukebox = jukebox … … class Control(gobject.GObject): 80 82 jukebox._erase_playlist_entry_clicked_cb) 81 83 self.toolbar.insert(erase_playlist_entry_btn, -1) 82 84 83 spacer = gtk.SeparatorToolItem()85 spacer = Gtk.SeparatorToolItem() 84 86 self.toolbar.insert(spacer, -1) 85 87 spacer.show() 86 88 … … class Control(gobject.GObject): 90 92 self.prev_button.connect('clicked', self.prev_button_clicked_cb) 91 93 self.toolbar.insert(self.prev_button, -1) 92 94 93 self.pause_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE,94 gtk.ICON_SIZE_BUTTON)95 self.pause_image = Gtk.Image.new_from_stock(Gtk.STOCK_MEDIA_PAUSE, 96 Gtk.IconSize.BUTTON) 95 97 self.pause_image.show() 96 self.play_image = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY,97 gtk.ICON_SIZE_BUTTON)98 self.play_image = Gtk.Image.new_from_stock(Gtk.STOCK_MEDIA_PLAY, 99 Gtk.IconSize.BUTTON) 98 100 self.play_image.show() 99 101 100 self.button = gtk.ToolButton()102 self.button = Gtk.ToolButton() 101 103 self.button.set_icon_widget(self.play_image) 102 104 self.button.set_property('can-default', True) 103 105 self.button.show() … … class Control(gobject.GObject): 111 113 self.next_button.connect('clicked', self.next_button_clicked_cb) 112 114 self.toolbar.insert(self.next_button, -1) 113 115 114 current_time = gtk.ToolItem()115 self.current_time_label = gtk.Label('')116 current_time = Gtk.ToolItem() 117 self.current_time_label = Gtk.Label(label='') 116 118 current_time.add(self.current_time_label) 117 119 current_time.show() 118 120 toolbar.insert(current_time, -1) 119 121 120 self.adjustment = gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0) 121 self.hscale = gtk.HScale(self.adjustment) 122 self.adjustment = Gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0) 123 self.hscale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, 124 adjustment=self.adjustment) 122 125 self.hscale.set_draw_value(False) 123 self.hscale.set_update_policy(gtk.UPDATE_CONTINUOUS) 126 # FIXME: this seems to be deprecated 127 # self.hscale.set_update_policy(Gtk.UPDATE_CONTINUOUS) 128 logging.debug("FIXME: AttributeError: 'Scale' object has no " 129 "attribute 'set_update_policy'") 124 130 self.hscale.connect('button-press-event', 125 131 jukebox.scale_button_press_cb) 126 132 self.hscale.connect('button-release-event', 127 133 jukebox.scale_button_release_cb) 128 134 129 self.scale_item = gtk.ToolItem()135 self.scale_item = Gtk.ToolItem() 130 136 self.scale_item.set_expand(True) 131 137 self.scale_item.add(self.hscale) 132 138 self.toolbar.insert(self.scale_item, -1) 133 139 134 total_time = gtk.ToolItem()135 self.total_time_label = gtk.Label('')140 total_time = Gtk.ToolItem() 141 self.total_time_label = Gtk.Label(label='') 136 142 total_time.add(self.total_time_label) 137 143 total_time.show() 138 144 toolbar.insert(total_time, -1) -
jukeboxactivity.py
diff --git a/jukeboxactivity.py b/jukeboxactivity.py index 8ad59d6..7062fc3 100644
a b import tempfile 27 27 from gettext import gettext as _ 28 28 import os 29 29 30 from sugar .activity import activity31 from sugar .graphics.objectchooser import ObjectChooser32 from sugar import mime33 from sugar .datastore import datastore30 from sugar3.activity import activity 31 from sugar3.graphics.objectchooser import ObjectChooser 32 from sugar3 import mime 33 from sugar3.datastore import datastore 34 34 35 OLD_TOOLBAR = False 36 try: 37 from sugar.graphics.toolbarbox import ToolbarBox 38 from sugar.graphics.toolbarbox import ToolbarButton 39 from sugar.activity.widgets import StopButton 40 from sugar.activity.widgets import ActivityToolbarButton 35 from sugar3.graphics.toolbarbox import ToolbarBox 36 from sugar3.graphics.toolbarbox import ToolbarButton 37 from sugar3.activity.widgets import StopButton 38 from sugar3.activity.widgets import ActivityToolbarButton 41 39 42 except ImportError: 43 OLD_TOOLBAR = True 40 import gi 41 gi.require_version('Gtk', '3.0') 44 42 45 import pygtk 46 pygtk.require('2.0') 47 48 import gobject 43 from gi.repository import GObject 44 from gi.repository import Gdk 49 45 50 46 import pygst 51 47 pygst.require('0.10') 52 48 import gst 53 49 import gst.interfaces 54 import gtk50 from gi.repository import Gtk 55 51 56 52 import urllib 57 53 from ControlToolbar import Control, ViewToolbar … … class JukeboxActivity(activity.Activity): 74 70 self.max_participants = 1 75 71 self._playlist_jobject = None 76 72 77 if OLD_TOOLBAR:78 toolbox = activity.ActivityToolbox(self)79 self.set_toolbox(toolbox)80 toolbar = gtk.Toolbar()81 self.control = Control(toolbar, self)82 toolbox.add_toolbar(_('Play'), toolbar) 83 84 toolbar.show()85 86 87 88 self.__go_fullscreen_cb)89 90 self.__toggle_playlist_cb)91 toolbox.add_toolbar(_('View'), _view_toolbar)92 _view_toolbar.show()93 94 toolbox.show()95 96 toolbar.grab_focus()97 #self.connect("shared", self._shared_cb) 98 activity_toolbar = toolbox.get_activity_toolbar()99 activity_toolbar.remove(activity_toolbar.share) 100 activity_toolbar.share = None101 activity_toolbar.remove(activity_toolbar.keep) 102 activity_toolbar.keep = None103 self.title_entry = activity_toolbar.title73 toolbar_box = ToolbarBox() 74 activity_button = ActivityToolbarButton(self) 75 activity_toolbar = activity_button.page 76 toolbar_box.toolbar.insert(activity_button, 0) 77 self.title_entry = activity_toolbar.title 78 79 # FIXME: I don't know what is the mission of this line 80 # activity_toolbar.stop.hide() 81 82 _view_toolbar = ViewToolbar() 83 _view_toolbar.connect('go-fullscreen', 84 self.__go_fullscreen_cb) 85 _view_toolbar.connect('toggle-playlist', 86 self.__toggle_playlist_cb) 87 view_toolbar_button = ToolbarButton( 88 page=_view_toolbar, 89 icon_name='toolbar-view') 90 _view_toolbar.show() 91 toolbar_box.toolbar.insert(view_toolbar_button, -1) 92 view_toolbar_button.show() 93 94 self.control = Control(toolbar_box.toolbar, self) 95 96 toolbar_box.toolbar.insert(StopButton(self), -1) 97 98 self.set_toolbar_box(toolbar_box) 99 toolbar_box.show_all() 104 100 105 else:106 toolbar_box = ToolbarBox()107 activity_button = ActivityToolbarButton(self)108 activity_toolbar = activity_button.page109 toolbar_box.toolbar.insert(activity_button, 0)110 self.title_entry = activity_toolbar.title111 activity_toolbar.stop.hide()112 113 _view_toolbar = ViewToolbar()114 _view_toolbar.connect('go-fullscreen',115 self.__go_fullscreen_cb)116 _view_toolbar.connect('toggle-playlist',117 self.__toggle_playlist_cb)118 view_toolbar_button = ToolbarButton(119 page=_view_toolbar,120 icon_name='toolbar-view')121 _view_toolbar.show()122 toolbar_box.toolbar.insert(view_toolbar_button, -1)123 view_toolbar_button.show()124 125 self.control = Control(toolbar_box.toolbar, self)126 127 toolbar_box.toolbar.insert(StopButton(self), -1)128 129 self.set_toolbar_box(toolbar_box)130 toolbar_box.show_all()131 101 self.connect("key_press_event", self._key_press_event_cb) 132 102 133 if handle.uri: 134 pass 135 elif self._shared_activity: 136 if self.get_shared(): 137 pass 138 else: 139 # Wait for a successful join before trying to get the document 140 self.connect("joined", self._joined_cb) 103 # FIXME: this is related with shared activity and it doesn't work 104 # if handle.uri: 105 # pass 106 # elif self._shared_activity: 107 # if self.get_shared(): 108 # pass 109 # else: 110 # # Wait for a successful join before trying to get the document 111 # self.connect("joined", self._joined_cb) 141 112 142 113 self.update_id = -1 143 114 self.changed_id = -1 … … class JukeboxActivity(activity.Activity): 162 133 self.p_position = gst.CLOCK_TIME_NONE 163 134 self.p_duration = gst.CLOCK_TIME_NONE 164 135 165 self.bin = gtk.HBox() 166 self.bin.show() 136 # README: I changed this because I was getting an error when I 137 # tried to modify self.bin with something different than 138 # Gtk.Bin 139 140 # self.bin = Gtk.HBox() 141 # self.bin.show() 142 143 self.canvas = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) 144 167 145 self.playlist_widget = PlayListWidget(self.play) 168 146 self.playlist_widget.update(self.playlist) 169 147 self.playlist_widget.show() 170 self. bin.pack_start(self.playlist_widget, expand=False)171 self._empty_widget = gtk.Label("")148 self.canvas.pack_start(self.playlist_widget, False, True, 0) 149 self._empty_widget = Gtk.Label(label="") 172 150 self._empty_widget.show() 173 151 self.videowidget = VideoWidget() 174 152 self._switch_canvas(show_video=False) 175 self.set_canvas(self. bin)153 self.set_canvas(self.canvas) 176 154 self.show_all() 177 self. bin.connect('size-allocate', self.__size_allocate_cb)155 self.canvas.connect('size-allocate', self.__size_allocate_cb) 178 156 179 157 #From ImageViewer Activity 180 158 self._want_document = True 181 159 if self._object_id is None: 182 self._show_object_picker = gobject.timeout_add(1000, \160 self._show_object_picker = GObject.timeout_add(1000, \ 183 161 self._show_picker_cb) 184 162 185 163 if handle.uri: 186 164 self.uri = handle.uri 187 gobject.idle_add(self._start, self.uri, handle.title)165 GObject.idle_add(self._start, self.uri, handle.title) 188 166 189 167 def _switch_canvas(self, show_video): 190 168 """Show or hide the video visualization in the canvas. … … class JukeboxActivity(activity.Activity): 194 172 195 173 """ 196 174 if show_video: 197 self. bin.remove(self._empty_widget)198 self. bin.pack_end(self.videowidget)175 self.canvas.remove(self._empty_widget) 176 self.canvas.pack_end(self.videowidget, True, True, 0) 199 177 else: 200 self. bin.pack_end(self._empty_widget)201 self. bin.remove(self.videowidget)202 self. bin.queue_draw()178 self.canvas.pack_end(self._empty_widget, True, True, 0) 179 self.canvas.remove(self.videowidget) 180 self.canvas.queue_draw() 203 181 204 182 def __get_tags_cb(self, tags_reader, order, tags): 205 183 self.playlist[order]['title'] = tags['title'] 206 184 self.playlist_widget.update(self.playlist) 207 185 208 186 def __size_allocate_cb(self, widget, allocation): 209 canvas_size = self. bin.get_allocation()187 canvas_size = self.canvas.get_allocation() 210 188 playlist_width = int(canvas_size.width * PLAYLIST_WIDTH_PROP) 211 189 self.playlist_widget.set_size_request(playlist_width, 0) 212 190 … … class JukeboxActivity(activity.Activity): 219 197 #self.currentplaying = None 220 198 #self.playflag = False 221 199 self._want_document = True 222 self._show_object_picker = gobject.timeout_add(1, self._show_picker_cb)200 self._show_object_picker = GObject.timeout_add(1, self._show_picker_cb) 223 201 224 202 def _key_press_event_cb(self, widget, event): 225 keyname = gtk.gdk.keyval_name(event.keyval)203 keyname = Gdk.keyval_name(event.keyval) 226 204 logging.info("Keyname Press: %s, time: %s", keyname, event.time) 227 205 if self.title_entry.has_focus(): 228 206 return False … … class JukeboxActivity(activity.Activity): 289 267 self.player.stop() 290 268 self.player.set_uri(None) 291 269 self.control.set_disabled() 292 self. bin.remove(self.videowidget)293 text = gtk.Label("Error: %s - %s" % (message, detail))270 self.canvas.remove(self.videowidget) 271 text = Gtk.Label("Error: %s - %s" % (message, detail)) 294 272 text.show_all() 295 self. bin.add(text)273 self.canvas.add(text) 296 274 297 275 def _player_new_tag_cb(self, widget, tag, value): 298 276 if not tag in [gst.TAG_TITLE, gst.TAG_ARTIST, gst.TAG_ALBUM]: … … class JukeboxActivity(activity.Activity): 342 320 if not self._want_document: 343 321 return 344 322 345 chooser = ObjectChooser(_('Choose document'), self, 346 gtk.DIALOG_MODAL | 347 gtk.DIALOG_DESTROY_WITH_PARENT, 348 what_filter=mime.GENERIC_TYPE_AUDIO) 323 # README: some arguments are deprecated so I avoid them 324 325 # chooser = ObjectChooser(_('Choose document'), self, 326 # Gtk.DialogFlags.MODAL | 327 # Gtk.DialogFlags.DESTROY_WITH_PARENT, 328 # what_filter=mime.GENERIC_TYPE_AUDIO) 329 330 chooser = ObjectChooser(self, what_filter=mime.GENERIC_TYPE_AUDIO) 349 331 350 332 try: 351 333 result = chooser.run() 352 if result == gtk.RESPONSE_ACCEPT:334 if result == Gtk.ResponseType.ACCEPT: 353 335 jobject = chooser.get_selected_object() 354 336 if jobject and jobject.file_path: 355 337 logging.error('Adding %s', jobject.file_path) … … class JukeboxActivity(activity.Activity): 376 358 if mimetype == 'audio/x-mpegurl': 377 359 # is a M3U playlist: 378 360 for uri in self._read_m3u_playlist(file_path): 379 gobject.idle_add(self._start, uri['url'], uri['title'],361 GObject.idle_add(self._start, uri['url'], uri['title'], 380 362 uri['object_id']) 381 363 else: 382 364 # is another media file: 383 gobject.idle_add(self._start, self.uri, title, object_id)365 GObject.idle_add(self._start, self.uri, title, object_id) 384 366 385 367 def _create_playlist_jobject(self): 386 368 """Create an object in the Journal to store the playlist. … … class JukeboxActivity(activity.Activity): 536 518 else: 537 519 self.player.play() 538 520 if self.update_id == -1: 539 self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL,521 self.update_id = GObject.timeout_add(self.UPDATE_INTERVAL, 540 522 self.update_scale_cb) 541 523 self.control.set_button_pause() 542 524 … … class JukeboxActivity(activity.Activity): 552 534 553 535 # don't timeout-update position during seek 554 536 if self.update_id != -1: 555 gobject.source_remove(self.update_id)537 GObject.source_remove(self.update_id) 556 538 self.update_id = -1 557 539 558 540 # make sure we get changed notifies … … class JukeboxActivity(activity.Activity): 574 556 575 557 self.control.button.set_sensitive(True) 576 558 if self.seek_timeout_id != -1: 577 gobject.source_remove(self.seek_timeout_id)559 GObject.source_remove(self.seek_timeout_id) 578 560 self.seek_timeout_id = -1 579 561 else: 580 562 if self.was_playing: … … class JukeboxActivity(activity.Activity): 583 565 if self.update_id != -1: 584 566 self.error('Had a previous update timeout id') 585 567 else: 586 self.update_id = gobject.timeout_add(self.UPDATE_INTERVAL,568 self.update_id = GObject.timeout_add(self.UPDATE_INTERVAL, 587 569 self.update_scale_cb) 588 570 589 571 def update_scale_cb(self): … … class JukeboxActivity(activity.Activity): 617 599 self.playlist_widget.hide() 618 600 else: 619 601 self.playlist_widget.show_all() 620 self. bin.queue_draw()602 self.canvas.queue_draw() 621 603 622 604 623 class TagReader( gobject.GObject):605 class TagReader(GObject.GObject): 624 606 625 607 __gsignals__ = { 626 'get-tags': ( gobject.SIGNAL_RUN_FIRST, None, [int, object]),608 'get-tags': (GObject.SignalFlags.RUN_FIRST, None, [int, object]), 627 609 } 628 610 629 611 def __init__(self): 630 gobject.GObject.__init__(self)612 GObject.GObject.__init__(self) 631 613 #make a playbin to parse the audio file 632 614 self.pbin = gst.element_factory_make('playbin', 'player') 633 615 fakesink = gst.element_factory_make('fakesink', 'fakesink') … … class TagReader(gobject.GObject): 661 643 self.pbin.set_state(gst.STATE_PAUSED) 662 644 663 645 664 class GstPlayer( gobject.GObject):646 class GstPlayer(GObject.GObject): 665 647 666 648 __gsignals__ = { 667 'error': ( gobject.SIGNAL_RUN_FIRST, None, [str, str]),668 'eos': ( gobject.SIGNAL_RUN_FIRST, None, []),669 'tag': ( gobject.SIGNAL_RUN_FIRST, None, [str, str]),670 'stream-info': ( gobject.SIGNAL_RUN_FIRST, None, [object])649 'error': (GObject.SignalFlags.RUN_FIRST, None, [str, str]), 650 'eos': (GObject.SignalFlags.RUN_FIRST, None, []), 651 'tag': (GObject.SignalFlags.RUN_FIRST, None, [str, str]), 652 'stream-info': (GObject.SignalFlags.RUN_FIRST, None, [object]) 671 653 } 672 654 673 655 def __init__(self, videowidget): 674 gobject.GObject.__init__(self)656 GObject.GObject.__init__(self) 675 657 676 658 self.playing = False 677 659 self.error = False … … class GstPlayer(gobject.GObject): 689 671 self.overlay = None 690 672 videowidget.realize() 691 673 self.videowidget = videowidget 692 self.videowidget_xid = videowidget. window.xid674 self.videowidget_xid = videowidget.get_window().get_xid() 693 675 self._init_video_sink() 694 676 695 677 bus = self.player.get_bus() … … class GstPlayer(gobject.GObject): 831 813 return self.playing 832 814 833 815 834 class VideoWidget( gtk.DrawingArea):816 class VideoWidget(Gtk.DrawingArea): 835 817 def __init__(self): 836 gtk.DrawingArea.__init__(self)837 self.set_events( gtk.gdk.POINTER_MOTION_MASK |838 gtk.gdk.POINTER_MOTION_HINT_MASK |839 gtk.gdk.EXPOSURE_MASK |840 gtk.gdk.KEY_PRESS_MASK |841 gtk.gdk.KEY_RELEASE_MASK)818 GObject.GObject.__init__(self) 819 self.set_events(Gdk.EventMask.POINTER_MOTION_MASK | 820 Gdk.EventMask.POINTER_MOTION_HINT_MASK | 821 Gdk.EventMask.EXPOSURE_MASK | 822 Gdk.EventMask.KEY_PRESS_MASK | 823 Gdk.EventMask.KEY_RELEASE_MASK) 842 824 self.imagesink = None 843 self.unset_flags(gtk.DOUBLE_BUFFERED) 844 self.set_flags(gtk.APP_PAINTABLE) 825 826 self.set_app_paintable(True) 827 self.set_double_buffered(False) 845 828 846 829 def do_expose_event(self, event): 847 830 if self.imagesink: … … class VideoWidget(gtk.DrawingArea): 856 839 857 840 858 841 if __name__ == '__main__': 859 window = gtk.Window()842 window = Gtk.Window() 860 843 861 844 view = VideoWidget() 862 845 … … if __name__ == '__main__': 873 856 player.set_uri('http://78.46.73.237:8000/prog') 874 857 player.play() 875 858 window.show_all() 876 gtk.main()859 Gtk.main() -
setup.py
diff --git a/setup.py b/setup.py index d3ab3a3..2f2c143 100755
a b 16 16 # along with this program; if not, write to the Free Software 17 17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 18 19 from sugar .activity import bundlebuilder19 from sugar3.activity import bundlebuilder 20 20 21 21 bundlebuilder.start() -
widgets.py
diff --git a/widgets.py b/widgets.py index bd09a73..2dd5742 100644
a b 16 16 import logging 17 17 from gettext import gettext as _ 18 18 19 import pygtk20 pygtk.require('2.0')19 import gi 20 gi.require_version('Gtk', '3.0') 21 21 22 import gobject23 import gtk24 import pango22 from gi.repository import GObject 23 from gi.repository import Gtk 24 from gi.repository import Pango 25 25 26 26 27 27 COLUMNS_NAME = ('index', 'media') 28 28 COLUMNS = dict((name, i) for i, name in enumerate(COLUMNS_NAME)) 29 29 30 30 31 class PlayListWidget( gtk.ScrolledWindow):31 class PlayListWidget(Gtk.ScrolledWindow): 32 32 def __init__(self, play_callback): 33 33 self._playlist = None 34 34 self._play_callback = play_callback 35 35 36 gtk.ScrolledWindow.__init__(self, hadjustment=None,36 GObject.GObject.__init__(self, hadjustment=None, 37 37 vadjustment=None) 38 self.set_policy( gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)39 self.listview = gtk.TreeView()40 self.treemodel = gtk.ListStore(int, object)38 self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) 39 self.listview = Gtk.TreeView() 40 self.treemodel = Gtk.ListStore(int, object) 41 41 self.listview.set_model(self.treemodel) 42 42 selection = self.listview.get_selection() 43 selection.set_mode( gtk.SELECTION_SINGLE)43 selection.set_mode(Gtk.SelectionMode.SINGLE) 44 44 45 renderer_idx = gtk.CellRendererText()46 treecol_idx = gtk.TreeViewColumn(_('No.'))45 renderer_idx = Gtk.CellRendererText() 46 treecol_idx = Gtk.TreeViewColumn(_('No.')) 47 47 treecol_idx.pack_start(renderer_idx, True) 48 48 treecol_idx.set_cell_data_func(renderer_idx, self._set_number) 49 49 self.listview.append_column(treecol_idx) 50 50 51 renderer_title = gtk.CellRendererText()52 renderer_title.set_property('ellipsize', pango.ELLIPSIZE_END)53 treecol_title = gtk.TreeViewColumn(_('Play List'))51 renderer_title = Gtk.CellRendererText() 52 renderer_title.set_property('ellipsize', Pango.EllipsizeMode.END) 53 treecol_title = Gtk.TreeViewColumn(_('Play List')) 54 54 treecol_title.pack_start(renderer_title, True) 55 55 treecol_title.set_cell_data_func(renderer_title, self._set_title) 56 56 self.listview.append_column(treecol_title) … … class PlayListWidget(gtk.ScrolledWindow): 64 64 65 65 def __on_row_activated(self, treeview, path, col): 66 66 model = treeview.get_model() 67 media_idx = path[COLUMNS['index']] 67 68 treeiter = model.get_iter(path) 69 media_idx = model.get_value(treeiter, COLUMNS['index']) 68 70 self._play_callback(media_idx) 69 71 70 def _set_number(self, column, cell, model, it ):72 def _set_number(self, column, cell, model, it, data): 71 73 idx = model.get_value(it, COLUMNS['index']) 72 74 cell.set_property('text', idx + 1) 73 75 74 def _set_title(self, column, cell, model, it ):76 def _set_title(self, column, cell, model, it, data): 75 77 playlist_item = model.get_value(it, COLUMNS['media']) 76 78 cell.set_property('text', playlist_item['title']) 77 79 … … class PlayListWidget(gtk.ScrolledWindow): 90 92 selection = self.listview.get_selection() 91 93 sel_model, sel_rows = self.listview.get_selection().get_selected_rows() 92 94 for row in sel_rows: 93 self._playlist.pop(row[0]) 95 index = sel_model.get_value(sel_model.get_iter(row), 0) 96 self._playlist.pop(index) 94 97 self.treemodel.remove(self.treemodel.get_iter(row)) 95 98 self.update(self._playlist)