summaryrefslogtreecommitdiff
path: root/gnomemusic/widgets/discbox.py
diff options
context:
space:
mode:
Diffstat (limited to 'gnomemusic/widgets/discbox.py')
-rw-r--r--gnomemusic/widgets/discbox.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/gnomemusic/widgets/discbox.py b/gnomemusic/widgets/discbox.py
new file mode 100644
index 00000000..85bcd379
--- /dev/null
+++ b/gnomemusic/widgets/discbox.py
@@ -0,0 +1,116 @@
+# Copyright (c) 2021 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# 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 __future__ import annotations
+from gettext import gettext as _
+import typing
+
+from gi.repository import Gdk, Gio, GObject, Gtk
+
+from gnomemusic.widgets.songwidget import SongWidget
+from gnomemusic.widgets.songwidgetmenu import SongWidgetMenu
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coredisc import CoreDisc
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/DiscBox.ui')
+class DiscBox(Gtk.ListBoxRow):
+ """A widget which compromises one disc
+
+ DiscBox contains a disc label for the disc number on top
+ with a GtkListBox beneath.
+ """
+ __gtype_name__ = 'DiscBox'
+
+ _disc_label = Gtk.Template.Child()
+ _list_box = Gtk.Template.Child()
+
+ __gsignals__ = {
+ 'song-activated': (GObject.SignalFlags.RUN_FIRST, None, (Gtk.Widget,))
+ }
+
+ selection_mode = GObject.Property(type=bool, default=False)
+ show_disc_label = GObject.Property(type=bool, default=False)
+
+ def __init__(
+ self, application: Application, corealbum: CoreAlbum,
+ coredisc: CoreDisc) -> None:
+ """Initialize
+
+ :param Application coredisc: The Application object
+ :param CoreAlbum corealbum: The corealbum of the coredisc
+ :param CoreDisc coredisc: The CoreDisc object to use
+ """
+ super().__init__()
+
+ self._application = application
+ self._corealbum = corealbum
+ self._coredisc = coredisc
+ self._model: Gio.ListModel = coredisc.props.model
+
+ disc_nr: int = coredisc.props.disc_nr
+ self._disc_label.props.label = _("Disc {}").format(disc_nr)
+
+ self.bind_property(
+ 'show-disc-label', self._disc_label, 'visible',
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self._list_box.bind_model(self._model, self._create_widget)
+
+ def select_all(self):
+ """Select all songs"""
+ for coresong in self._model:
+ coresong.props.selected = True
+
+ def deselect_all(self):
+ """Deselect all songs"""
+ for coresong in self._model:
+ coresong.props.selected = False
+
+ def _create_widget(self, coresong):
+ song_widget = SongWidget(coresong)
+ song_widget.props.menu = SongWidgetMenu(
+ self._application, song_widget, self._corealbum)
+
+ self._coredisc.bind_property(
+ "selected", coresong, "selected", GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", song_widget, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ return song_widget
+
+ @Gtk.Template.Callback()
+ def _song_activated(
+ self, list_box: Gtk.ListBox, song_widget: SongWidget) -> bool:
+ if self.props.selection_mode:
+ selection_state = song_widget.props.coresong.props.selected
+ song_widget.props.coresong.props.selected = not selection_state
+ else:
+ self.emit("song-activated", song_widget)
+
+ return Gdk.EVENT_STOP