[gnome-music/wip/jfelder/searchview-new-style: 2/2] Add ArtistSearchTile



commit f8f34df2fc63e7d74bf2643202f229d5f1bd06e3
Author: Marinus Schraal <mschraal gnome org>
Date:   Fri Aug 2 12:01:38 2019 +0200

    Add ArtistSearchTile

 data/org.gnome.Music.gresource.xml     |   1 +
 data/ui/ArtistSearchTile.ui            |  62 +++++++++++++++++++
 gnomemusic/views/searchview.py         |   6 +-
 gnomemusic/widgets/artistsearchtile.py | 109 +++++++++++++++++++++++++++++++++
 4 files changed, 175 insertions(+), 3 deletions(-)
---
diff --git a/data/org.gnome.Music.gresource.xml b/data/org.gnome.Music.gresource.xml
index 8326914c..2b45aaf8 100644
--- a/data/org.gnome.Music.gresource.xml
+++ b/data/org.gnome.Music.gresource.xml
@@ -8,6 +8,7 @@
     <file preprocess="xml-stripblanks">ui/AlbumCover.ui</file>
     <file preprocess="xml-stripblanks">ui/AlbumWidget.ui</file>
     <file preprocess="xml-stripblanks">ui/AlbumsView.ui</file>
+    <file preprocess="xml-stripblanks">ui/ArtistSearchTile.ui</file>
     <file preprocess="xml-stripblanks">ui/AppMenu.ui</file>
     <file preprocess="xml-stripblanks">ui/ArtistAlbumWidget.ui</file>
     <file preprocess="xml-stripblanks">ui/ArtistTile.ui</file>
diff --git a/data/ui/ArtistSearchTile.ui b/data/ui/ArtistSearchTile.ui
new file mode 100644
index 00000000..7dbf788e
--- /dev/null
+++ b/data/ui/ArtistSearchTile.ui
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="3.18"/>
+  <template class="ArtistSearchTile" parent="GtkFlowBoxChild">
+    <child>
+      <object class="GtkBox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="has_tooltip">True</property>
+        <property name="valign">start</property>
+        <property name="orientation">vertical</property>
+        <signal name="query-tooltip" handler="_on_tooltip_query"/>
+        <child>
+          <object class="GtkOverlay">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="margin_bottom">4</property>
+            <child>
+              <object class="GtkEventBox" id="_events">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <signal name="button-release-event" handler="_on_artist_event" swapped="no"/>
+                <child>
+                  <object class="ArtistArtStack" id="_artistart_stack">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="vexpand">True</property>
+                    <property name="valign">end</property>
+                    <property name="halign">center</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="overlay">
+              <object class="GtkCheckButton" id="_check">
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="halign">end</property>
+                <property name="valign">end</property>
+                <property name="draw_indicator">True</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel" id="_artist_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="justify">center</property>
+            <property name="wrap">True</property>
+            <property name="ellipsize">middle</property>
+            <property name="max_width_chars">20</property>
+            <property name="lines">1</property>
+          </object>
+        </child>
+      </object>
+    </child>
+    <style>
+      <class name="tile"/>
+    </style>
+  </template>
+</interface>
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index 29295cdf..3c6a4abb 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -32,7 +32,7 @@ from gnomemusic.widgets.albumcover import AlbumCover
 from gnomemusic.widgets.albumwidget import AlbumWidget
 from gnomemusic.widgets.headerbar import HeaderBar
 from gnomemusic.widgets.artistalbumswidget import ArtistAlbumsWidget
-from gnomemusic.widgets.artisttile import ArtistTile
+from gnomemusic.widgets.artistsearchtile import ArtistSearchTile
 from gnomemusic.widgets.songwidget import SongWidget
 
 
@@ -159,8 +159,8 @@ class SearchView(Gtk.Stack):
         return album_widget
 
     def _create_artist_widget(self, coreartist):
-        artist_tile = ArtistTile(coreartist)
-        artist_tile.props.text = coreartist.props.artist
+        artist_tile = ArtistSearchTile(coreartist)
+        # artist_tile.props.text = coreartist.props.artist
         artist_tile.connect('button-release-event', self._artist_activated)
 
         self.bind_property(
diff --git a/gnomemusic/widgets/artistsearchtile.py b/gnomemusic/widgets/artistsearchtile.py
new file mode 100644
index 00000000..684d39e1
--- /dev/null
+++ b/gnomemusic/widgets/artistsearchtile.py
@@ -0,0 +1,109 @@
+# Copyright 2019 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 gi.repository import Gdk, GObject, Gtk
+
+from gnomemusic.albumartcache import Art
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.widgets.artistartstack import ArtistArtStack  # noqa: F401
+from gnomemusic.widgets.twolinetip import TwoLineTip
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/ArtistSearchTile.ui")
+class ArtistSearchTile(Gtk.FlowBoxChild):
+    """Artist search tile
+
+    Contains artist art and name
+    """
+
+    __gtype_name__ = "ArtistSearchTile"
+
+    _artist_label = Gtk.Template.Child()
+    _artistart_stack = Gtk.Template.Child()
+    _check = Gtk.Template.Child()
+    _events = Gtk.Template.Child()
+
+    coreartist = GObject.Property(
+        type=CoreArtist, default=None, flags=GObject.ParamFlags.READWRITE)
+    selected = GObject.Property(
+        type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+    selection_mode = GObject.Property(
+        type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+
+    def __repr__(self):
+        return "<ArtistSearchTile>"
+
+    def __init__(self, coreartist):
+        """Initialize the ArtistSearchTile
+
+        :param Grl.Media media: The media object to use
+        """
+        super().__init__()
+
+        self.props.coreartist = coreartist
+
+        self._artistart_stack.props.size = Art.Size.MEDIUM
+        self._artistart_stack.props.coreartist = self.props.coreartist
+
+        self._tooltip = TwoLineTip()
+        self._tooltip.props.subtitle_visible = False
+
+        artist = self.props.coreartist.props.artist
+        self._artist_label.props.label = artist
+        self._tooltip.props.title = artist
+
+        self.props.coreartist.connect(
+            "notify::thumbnail", self._on_thumbnail_changed)
+        # trigger
+        self.props.coreartist.props.thumbnail
+
+        self.bind_property(
+            "selected", self._check, "active",
+            GObject.BindingFlags.BIDIRECTIONAL
+            | GObject.BindingFlags.SYNC_CREATE)
+        self.bind_property(
+            "selection-mode", self._check, "visible",
+            GObject.BindingFlags.BIDIRECTIONAL)
+
+        self._events.add_events(Gdk.EventMask.TOUCH_MASK)
+
+        self.show()
+
+    def _on_thumbnail_changed(self, klass, data):
+        print("thumbnail changed", klass, data)
+
+    @Gtk.Template.Callback()
+    def _on_artist_event(self, evbox, event, data=None):
+        modifiers = Gtk.accelerator_get_default_mod_mask()
+        if ((event.get_state() & modifiers) == Gdk.ModifierType.CONTROL_MASK
+                and not self.props.selection_mode):
+            self.props.selection_mode = True
+
+        if self.props.selection_mode:
+            self.props.selected = not self.props.selected
+
+    @Gtk.Template.Callback()
+    def _on_tooltip_query(self, widget, x, y, kb, tooltip, data=None):
+        tooltip.set_custom(self._tooltip)
+        return True


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]