[gnome-music/wip/jfelder/playlistdialog-listbox: 1/2] playlistdialog: Port to GtkListBox
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/playlistdialog-listbox: 1/2] playlistdialog: Port to GtkListBox
- Date: Sun, 26 May 2019 20:34:28 +0000 (UTC)
commit 1045575500f62c4a271b13ce85ace33f578bf25b
Author: Jean Felder <jfelder src gnome org>
Date: Wed May 15 19:17:09 2019 +0200
playlistdialog: Port to GtkListBox
Replace the treeview with a listbox. This improves code readability
and this is a necessary step for the future core rewrite.
A PlaylistDialogRow class is also introduced to simplify the creation
of the listbox rows.
data/org.gnome.Music.gresource.xml | 1 +
data/ui/PlaylistDialog.ui | 22 ++---------
data/ui/PlaylistDialogRow.ui | 16 ++++++++
gnomemusic/widgets/playlistdialog.py | 77 +++++++++++++++++++-----------------
4 files changed, 61 insertions(+), 55 deletions(-)
---
diff --git a/data/org.gnome.Music.gresource.xml b/data/org.gnome.Music.gresource.xml
index 2ac5d2c6..f4c8b1f4 100644
--- a/data/org.gnome.Music.gresource.xml
+++ b/data/org.gnome.Music.gresource.xml
@@ -19,6 +19,7 @@
<file preprocess="xml-stripblanks">ui/PlaylistContextMenu.ui</file>
<file preprocess="xml-stripblanks">ui/PlaylistControls.ui</file>
<file preprocess="xml-stripblanks">ui/PlaylistDialog.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistDialogRow.ui</file>
<file preprocess="xml-stripblanks">ui/SearchBar.ui</file>
<file preprocess="xml-stripblanks">ui/SelectionBarMenuButton.ui</file>
<file preprocess="xml-stripblanks">ui/SelectionToolbar.ui</file>
diff --git a/data/ui/PlaylistDialog.ui b/data/ui/PlaylistDialog.ui
index 6b341b06..8f8e8034 100644
--- a/data/ui/PlaylistDialog.ui
+++ b/data/ui/PlaylistDialog.ui
@@ -201,19 +201,11 @@
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<child>
- <object class="GtkTreeView" id="_view">
+ <object class="GtkListBox" id="_listbox">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="model">_model</property>
- <property name="headers_visible">False</property>
- <property name="search_column">0</property>
- <property name="activate_on_single_click">True</property>
- <signal name="row-activated" handler="_on_item_activated" swapped="no"/>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="_selection">
- <signal name="changed" handler="_on_selection_changed" swapped="no"/>
- </object>
- </child>
+ <property name="selection_mode">single</property>
+ <signal name="row-selected" handler="_on_row_selected" swapped="no"/>
</object>
</child>
</object>
@@ -279,12 +271,4 @@
</packing>
</child>
</object>
- <object class="GtkListStore" id="_model">
- <columns>
- <!-- column-name playlist-name -->
- <column type="gchararray"/>
- <!-- column-name item -->
- <column type="GObject"/>
- </columns>
- </object>
</interface>
diff --git a/data/ui/PlaylistDialogRow.ui b/data/ui/PlaylistDialogRow.ui
new file mode 100644
index 00000000..918ad8c8
--- /dev/null
+++ b/data/ui/PlaylistDialogRow.ui
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaylistDialogRow" parent="GtkListBoxRow">
+ <property name="visible">True</property>
+ <style>
+ <class name="playlistdialog-row"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="_label">
+ <property name="margin">8</property>
+ <property name="visible">True</property>
+ <property name="xalign">0.0</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/gnomemusic/widgets/playlistdialog.py b/gnomemusic/widgets/playlistdialog.py
index b87ca5df..9f326bdb 100644
--- a/gnomemusic/widgets/playlistdialog.py
+++ b/gnomemusic/widgets/playlistdialog.py
@@ -22,7 +22,7 @@
# code, but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version.
-from gi.repository import Gtk, Pango
+from gi.repository import GObject, Grl, Gtk
from gnomemusic import log
from gnomemusic.grilo import grilo
@@ -30,6 +30,29 @@ from gnomemusic.playlists import Playlists
import gnomemusic.utils as utils
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistDialogRow.ui")
+class PlaylistDialogRow(Gtk.ListBoxRow):
+
+ __gtype_name__ = "PlaylistDialogRow"
+
+ playlist = GObject.Property(type=Grl.Media, default=None)
+
+ _label = Gtk.Template.Child()
+
+ def __repr__(self):
+ return "PlaylistDialogRow"
+
+ def __init__(self, playlist):
+ """Create a row of the PlaylistDialog
+
+ :param Grl.Media playlist: the associated playlist
+ """
+ super().__init__()
+
+ self.props.playlist = playlist
+ self._label.props.label = utils.get_media_title(playlist)
+
+
@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistDialog.ui")
class PlaylistDialog(Gtk.Dialog):
"""Dialog for adding items to a playlist"""
@@ -40,9 +63,7 @@ class PlaylistDialog(Gtk.Dialog):
_normal_box = Gtk.Template.Child()
_empty_box = Gtk.Template.Child()
_title_bar = Gtk.Template.Child()
- _view = Gtk.Template.Child()
- _selection = Gtk.Template.Child()
- _model = Gtk.Template.Child()
+ _listbox = Gtk.Template.Child()
_cancel_button = Gtk.Template.Child()
_select_button = Gtk.Template.Child()
_new_playlist_button = Gtk.Template.Child()
@@ -62,7 +83,6 @@ class PlaylistDialog(Gtk.Dialog):
self.props.transient_for = parent
self.set_titlebar(self._title_bar)
- self._add_list_renderers()
self._populate()
self._playlists_todelete_ids = playlists_todelete.keys()
@@ -74,20 +94,12 @@ class PlaylistDialog(Gtk.Dialog):
@log
def get_selected(self):
"""Get the selected playlist"""
- _iter = self._selection.get_selected()[1]
+ selected_row = self._listbox.get_selected_row()
- if not _iter:
+ if not selected_row:
return None
- return self._model[_iter][1]
-
- @log
- def _add_list_renderers(self):
- type_renderer = Gtk.CellRendererText(
- xpad=8, ypad=8, ellipsize=Pango.EllipsizeMode.END, xalign=0.0)
-
- col = Gtk.TreeViewColumn("Name", type_renderer, text=0)
- self._view.append_column(col)
+ return selected_row.props.playlist
@log
def _set_view(self):
@@ -109,12 +121,12 @@ class PlaylistDialog(Gtk.Dialog):
@log
def _add_item(self, source, param, item, remaining=0, data=None):
if item:
- self._add_item_to_model(item)
+ self._add_playlist_to_listbox(item)
if remaining == 0:
self._set_view()
@log
- def _add_item_to_model(self, item):
+ def _add_playlist_to_listbox(self, item):
"""Adds (non-smart only) playlists to the model"""
# Hide playlists that are going to be deleted
@@ -122,10 +134,10 @@ class PlaylistDialog(Gtk.Dialog):
return None
self._user_playlists_available = True
- new_iter = self._model.insert_with_valuesv(
- -1, [0, 1], [utils.get_media_title(item), item])
+ row = PlaylistDialogRow(item)
+ self._listbox.insert(row, -1)
- return new_iter
+ return row
@Gtk.Template.Callback()
@log
@@ -139,15 +151,10 @@ class PlaylistDialog(Gtk.Dialog):
@Gtk.Template.Callback()
@log
- def _on_item_activated(self, view, path, column):
+ def _on_row_selected(self, listbox, row):
self._add_playlist_entry.props.text = ""
self._add_playlist_button.props.sensitive = False
-
- @Gtk.Template.Callback()
- @log
- def _on_selection_changed(self, selection):
- model, _iter = self._selection.get_selected()
- self._select_button.props.sensitive = _iter is not None
+ self._select_button.props.sensitive = row is not None
@Gtk.Template.Callback()
@log
@@ -158,13 +165,11 @@ class PlaylistDialog(Gtk.Dialog):
@log
def _on_playlist_created(self, playlists, item):
- new_iter = self._add_item_to_model(item)
- if new_iter and self._view.get_columns():
- col0 = self._view.get_columns()[0]
- path = self._model.get_path(new_iter)
- self._view.set_cursor(path, col0, False)
- self._view.row_activated(path, col0)
- self.response(Gtk.ResponseType.ACCEPT)
+ row = self._add_playlist_to_listbox(item)
+ if not row:
+ return
+ self._listbox.select_row(row)
+ self.response(Gtk.ResponseType.ACCEPT)
@Gtk.Template.Callback()
@log
@@ -177,4 +182,4 @@ class PlaylistDialog(Gtk.Dialog):
@Gtk.Template.Callback()
@log
def _on_add_playlist_entry_focused(self, editable, data=None):
- self._selection.unselect_all()
+ self._listbox.unselect_all()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]