summaryrefslogtreecommitdiff
path: root/data/ui
diff options
context:
space:
mode:
authorIslam Bahnasy <ifbahnasy@gmail.com>2018-09-05 14:27:24 +0200
committerMarinus Schraal <mschraal@gnome.org>2018-09-06 13:20:15 +0200
commit1cb143dfad500756cd34a89096ae3d2d8794c7a7 (patch)
treecb79fa18f25185cd4751666283a5bc7e35cf115c /data/ui
parentd90af7b07ab59c33943db9c79a2c0e2a8909d3fb (diff)
data: Move ui files to ui/ subdir
Fixes #193
Diffstat (limited to 'data/ui')
-rw-r--r--data/ui/AboutDialog.ui.in154
-rw-r--r--data/ui/AlbumCover.ui74
-rw-r--r--data/ui/AlbumWidget.ui262
-rw-r--r--data/ui/ArtistAlbumWidget.ui93
-rw-r--r--data/ui/ArtistAlbumsWidget.ui41
-rw-r--r--data/ui/DiscBox.ui45
-rw-r--r--data/ui/DropDown.ui29
-rw-r--r--data/ui/EmptyView.ui82
-rw-r--r--data/ui/FilterView.ui15
-rw-r--r--data/ui/HeaderBar.ui103
-rw-r--r--data/ui/PlayerToolbar.ui322
-rw-r--r--data/ui/PlaylistContextMenu.ui21
-rw-r--r--data/ui/PlaylistControls.ui131
-rw-r--r--data/ui/PlaylistDialog.ui321
-rw-r--r--data/ui/Searchbar.ui40
-rw-r--r--data/ui/SelectionBarMenuButton.ui55
-rw-r--r--data/ui/SelectionToolbar.ui21
-rw-r--r--data/ui/SidebarRow.ui38
-rw-r--r--data/ui/SongWidget.ui153
-rw-r--r--data/ui/TwoLineTip.ui26
-rw-r--r--data/ui/app-menu.ui24
-rw-r--r--data/ui/help-overlay.ui129
-rw-r--r--data/ui/meson.build24
23 files changed, 2203 insertions, 0 deletions
diff --git a/data/ui/AboutDialog.ui.in b/data/ui/AboutDialog.ui.in
new file mode 100644
index 00000000..4b363623
--- /dev/null
+++ b/data/ui/AboutDialog.ui.in
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <template class="AboutDialog" parent="GtkAboutDialog">
+ <property name="can_focus">False</property>
+ <property name="modal">True</property>
+ <property name="program_name">@PROGRAM_NAME@</property>
+ <property name="version">@PACKAGE_VERSION@</property>
+ <property name="copyright" translatable="yes">Copyright © 2018 GNOME Music Developers</property>
+ <property name="comments" translatable="yes">A music player and management application for GNOME.</property>
+ <property name="website">@PACKAGE_URL@</property>
+ <property name="website_label" translatable="yes">Visit GNOME Music website</property>
+ <property name="license" translatable="yes">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.
+
+“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 https://www.flickr.com/photos/_spy_/12270839403</property>
+ <property name="authors">Abhinav Singh
+Adrian Solom
+Alberto Fanjul
+Alexander Mikhaylenko
+Andreas Nilsson
+Apostol Bakalov
+Arnel A. Borja
+Ashwin Mohan
+Benoît Legat
+Bilal Elmoussaoui
+Billy Barrow
+Bruce Cowan
+Carlos Garnacho
+Carlos Soriano
+Clayton G. Hobbs
+Divyanshu Vishwakarma
+Eslam Mostafa
+Elias Entrup
+Evandro Giovanini
+Fabiano Fidêncio
+Felipe Borges
+Florian Darfeuille
+Gaurav Narula
+Georges Basile Stavracas Neto
+Guillaume Quintard
+Gyanesh Malhotra
+Janne Körkkö
+Jan-Michael Brummer
+Jean Felder
+Jeremy Bicha
+Jordan Petridis
+Juan José González
+Juan Suarez
+Kainaat Singh
+Kalev Lember
+Kevin Haller
+Konstantin Pospelov
+Marinus Schraal
+Nick Richards
+Niels De Graef
+Pablo Palácios
+Phil Dawson
+Piotr Drąg
+Prashant Tyagi
+Rashi Sah
+Robert Greener
+Sai Suman Prayaga
+Sambhav Kothari
+Seif Lotfy
+Shivani Poddar
+Subhadip Jana
+Suyash Garg
+Taylor Garcia
+Vadim Rutkovsky
+Yash Singh
+ </property>
+ <property name="artists">Allan Day
+Jakub Steiner
+William Jon McCann
+ </property>
+ <property name="translator_credits">Adolfo Jayme Barrientos
+Alain Lojewski
+Alexandre Franke
+Anders Jonsson
+Andika Triwidada
+Anish Sheela
+Arash Mousavi
+Ask Hjorth Larsen
+Aurimas Černius
+Balázs Meskó
+Balázs Úr
+Baurzhan Muftakhidinov
+Bruce Cowan
+Cédric Valmary
+Chao-Hsiung Liao
+Charles Monzat
+Cheng Lu
+Cheng-Chia Tseng
+Daniel Korostil
+Daniel Mustieles
+Daniel Șerbănescu
+David King
+Dušan Kazik
+Efstathios Iosifidis
+Emin Tufan Çetin
+Enrico Nicoletto
+Fábio Nogueira
+Fabio Tomat
+Fran Diéguez
+Furkan Tokaç
+Gábor Kelemen
+Gil Forcada Codinachs
+Goran Vidović
+Guillaume Bernard
+Inaki Larranaga Murgoitio
+Jiri Grönroos
+Joe Hansen
+Jordi Mas
+Justin van Steijn
+Kjartan Maraas
+Kristjan Schmidt
+Kukuh Syafaat
+Marek Černocký
+Mario Blättermann
+Matej Urbančič
+Milo Casagrande
+Mingcong Bai
+Марко Костић
+Мирослав Николић
+Милош Поповић
+Nathan Follens
+Osman Karagöz
+Piotr Drąg
+Rafael Fontenelle
+Rūdolfs Mazurs
+Sebastian Rasmussen
+Seong-ho Cho
+Stas Solovey
+Sveinn í Felli
+Tiago Santos
+Tom Tryfonidis
+Trần Ngọc Quân
+Vinzenz Vietzke
+Xavi Ivars
+Yi-Jyun Pan
+Yosef Or Boczko
+Yuras Shumovich
+Yuri Myasoedov
+ </property>
+ <property name="logo_icon_name">@APPID@</property>
+ <property name="wrap_license">True</property>
+ </template>
+</interface>
diff --git a/data/ui/AlbumCover.ui b/data/ui/AlbumCover.ui
new file mode 100644
index 00000000..46d21b3c
--- /dev/null
+++ b/data/ui/AlbumCover.ui
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.18"/>
+ <template class="AlbumCover" 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_album_event" swapped="no"/>
+ <child>
+ <object class="CoverStack" id="_cover_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="_title_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">2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <style>
+ <class name="albumcover-artist-label"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="tile"/>
+ </style>
+ </template>
+</interface>
diff --git a/data/ui/AlbumWidget.ui b/data/ui/AlbumWidget.ui
new file mode 100644
index 00000000..cf19f250
--- /dev/null
+++ b/data/ui/AlbumWidget.ui
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <template class="AlbumWidget" parent="GtkEventBox">
+ <style>
+ <class name="view"/>
+ <class name="content-view"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="albumInfo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_start">32</property>
+ <property name="margin_end">32</property>
+ <property name="margin_top">64</property>
+ <property name="margin_bottom">32</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="albumDetails">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkImage" id="_cover">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin_start">1</property>
+ <property name="margin_end">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="artistBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ <property name="ellipsize">middle</property>
+ <style>
+ <class name="title-artist"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ <property name="ellipsize">middle</property>
+ <style>
+ <class name="title-artist"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">21</property>
+ <property name="column_spacing">32</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="released_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">2</property>
+ <property name="margin_bottom">2</property>
+ <property name="label" translatable="yes">Released</property>
+ <property name="use_markup">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="running_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes">Running Length</property>
+ <property name="use_markup">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_released_info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_top">2</property>
+ <property name="margin_bottom">2</property>
+ <property name="label">----</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_running_info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label">--:--</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_composer_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="halign">end</property>
+ <property name="margin_top">2</property>
+ <property name="margin_bottom">2</property>
+ <property name="label" translatable="yes">Composer</property>
+ <property name="use_markup">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_composer_info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="halign">start</property>
+ <property name="margin_top">2</property>
+ <property name="margin_bottom">2</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <child>
+ <object class="GtkViewport" id="_viewport">
+ <property name="width_request">600</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- TODO: The top of the coverart is the same vertical -->
+ <!-- position as the top of the album songs, however -->
+ <!-- since we set a top margins for the discbox -->
+ <!-- subtract that margin here. A cleaner solution is appreciated. -->
+ <object class="DiscListBox" id="_disc_listbox">
+ <property name="can_focus">False</property>
+ <property name="margin_top">48</property>
+ <property name="margin_bottom">64</property>
+ <property name="margin_end">32</property>
+ <property name="orientation">vertical</property>
+ <property name="selection_mode_allowed">True</property>
+ <property name="visible">True</property>
+ <signal name="selection-changed" handler="_on_selection_changed" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/ArtistAlbumWidget.ui b/data/ui/ArtistAlbumWidget.ui
new file mode 100644
index 00000000..fffc703e
--- /dev/null
+++ b/data/ui/ArtistAlbumWidget.ui
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <template parent="GtkBox" class="ArtistAlbumWidget">
+ <child>
+ <object class="CoverStack" id="_cover_stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="album-cover"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="_album_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_start">6</property>
+ <property name="margin_end">6</property>
+ <property name="ellipsize">middle</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <style>
+ <class name="album-title"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_year">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="DiscListBox" id="_disc_list_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/ArtistAlbumsWidget.ui b/data/ui/ArtistAlbumsWidget.ui
new file mode 100644
index 00000000..c3bfa5d7
--- /dev/null
+++ b/data/ui/ArtistAlbumsWidget.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.12 -->
+ <template class="ArtistAlbumsWidget" parent="GtkBox">
+ <property name="name">ArtistAlbumsWidget</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_start">24</property>
+ <property name="margin_top">18</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label">label</property>
+ <property name="ellipsize">middle</property>
+ <style>
+ <class name="artist-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/DiscBox.ui b/data/ui/DiscBox.ui
new file mode 100644
index 00000000..c869d46a
--- /dev/null
+++ b/data/ui/DiscBox.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <template parent="GtkBox" class="DiscBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="margin_top">16</property>
+ <child>
+ <object class="GtkLabel" id="_disc_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_start">60</property>
+ <property name="margin_bottom">4</property>
+ <property name="no_show_all">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="DiscSongsFlowBox" id="_disc_songs_flowbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <property name="max_children_per_line">0</property>
+ <property name="selection_mode">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/DropDown.ui b/data/ui/DropDown.ui
new file mode 100644
index 00000000..fd4bffe3
--- /dev/null
+++ b/data/ui/DropDown.ui
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="DropDown" parent="GtkRevealer">
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame">
+ <property name="opacity">0.9</property>
+ <property name="shadow-type">in</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkGrid" id="_grid">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="FilterView" id="_source_filter">
+ </object>
+ </child>
+ <child>
+ <object class="FilterView" id="_search_filter">
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/EmptyView.ui b/data/ui/EmptyView.ui
new file mode 100644
index 00000000..c500348f
--- /dev/null
+++ b/data/ui/EmptyView.ui
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <template class="EmptyView" parent="GtkStack">
+ <property name="transition_type">crossfade</property>
+ <child>
+ <object class="GtkBox" id="_container">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkImage" id="_icon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">emblem-music-symbolic</property>
+ <property name="icon_size">0</property>
+ <property name="margin_bottom">18</property>
+ <style>
+ <class name="grey-image"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="_main_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin_bottom">12</property>
+ <style>
+ <class name="no-music-found-label"/>
+ <class name="dim-label"/>
+ </style>
+
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_information_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="justify">left</property>
+ <property name="use_markup">true</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/FilterView.ui b/data/ui/FilterView.ui
new file mode 100644
index 00000000..36816ae8
--- /dev/null
+++ b/data/ui/FilterView.ui
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="FilterView" parent="GtkTreeView">
+ <property name="activate-on-single-click">True</property>
+ <property name="enable-search">False</property>
+ <property name="headers-visible">False</property>
+ <property name="visible">True</property>
+ <signal name="row-activated" handler="_on_row_activated"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <property name="mode">none</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/HeaderBar.ui b/data/ui/HeaderBar.ui
new file mode 100644
index 00000000..d2dd7926
--- /dev/null
+++ b/data/ui/HeaderBar.ui
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="HeaderBar" parent="GtkHeaderBar">
+ <property name="visible">True</property>
+ <property name="vexpand">False</property>
+ <child>
+ <object class="GtkToggleButton" id="_search_button">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="tooltip_text" translatable="yes">Search</property>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="_search_button_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">edit-find-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="_select_button">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="tooltip_text" translatable="yes">Select</property>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="_select_button_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">object-select-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_cancel_button">
+ <property name="visible">False</property>
+ <property name="no_show_all">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
+ <style>
+ <class name="text-button"/>
+ </style>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_back_button">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="tooltip_text" translatable="yes">Back</property>
+ <signal name="clicked" handler="_on_back_button_clicked" swapped="no"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="_back_button_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">go-previous-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">start</property>
+ </packing>
+ </child>
+ </template>
+ <object class="GtkSizeGroup" id="size1">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="_search_button"/>
+ <widget name="_cancel_button"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/data/ui/PlayerToolbar.ui b/data/ui/PlayerToolbar.ui
new file mode 100644
index 00000000..58bff15b
--- /dev/null
+++ b/data/ui/PlayerToolbar.ui
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <menu id="repeatMenu">
+ <item>
+ <attribute name="label" translatable="yes">Shuffle</attribute>
+ <attribute name="action">win.repeat</attribute>
+ <attribute name="target">shuffle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Repeat All</attribute>
+ <attribute name="action">win.repeat</attribute>
+ <attribute name="target">all</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Repeat Song</attribute>
+ <attribute name="action">win.repeat</attribute>
+ <attribute name="target">song</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes" comments="Causes tracks to play in random order">Shuffle/Repeat Off</attribute>
+ <attribute name="action">win.repeat</attribute>
+ <attribute name="target">none</attribute>
+ </item>
+ </menu>
+ <object class="GtkImage" id="next_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">1</property>
+ <property name="icon_name">media-skip-forward-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="_pause_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">1</property>
+ <property name="icon_name">media-playback-pause-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="_play_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">1</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <object class="GtkImage" id="previous_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">1</property>
+ <property name="icon_name">media-skip-backward-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <template class="PlayerToolbar" parent="GtkActionBar">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <child>
+ <object class="GtkBox" id="buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="_prev_button">
+ <property name="width_request">42</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">previous_image</property>
+ <property name="always_show_image">True</property>
+ <property name="tooltip_text" translatable="yes">Previous</property>
+ <signal name="clicked" handler="_on_prev_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_play_button">
+ <property name="width_request">60</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">_play_image</property>
+ <property name="always_show_image">True</property>
+ <property name="tooltip_text" translatable="yes">Play</property>
+ <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_next_button">
+ <property name="width_request">42</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">next_image</property>
+ <property name="always_show_image">True</property>
+ <property name="tooltip_text" translatable="yes">Next</property>
+ <signal name="clicked" handler="_on_next_button_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_song_info_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="has_tooltip">True</property>
+ <property name="valign">center</property>
+ <property name="spacing">8</property>
+ <signal name="query-tooltip" handler="_on_tooltip_query"/>
+ <child>
+ <object class="CoverStack" id="_cover_stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="nowplaying_labels">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="xalign">0</property>
+ <property name="ellipsize">middle</property>
+ <property name="width_chars">8</property>
+ <property name="max_width_chars">42</property>
+ <style>
+ <class name="player-title-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="xalign">0</property>
+ <property name="ellipsize">middle</property>
+ <property name="width_chars">8</property>
+ <property name="max_width_chars">42</property>
+ <style>
+ <class name="player-artist-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="SmoothScale" id="_progress_scale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="draw_value">False</property>
+ <signal name = "seek-finished" handler="_on_seek_finished" swapped="no"/>
+ <signal name = "value-changed" handler="_on_progress_value_changed" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="timer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="_progress_time_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">0:00</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">/</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_duration_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">0:00</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="menuBox">
+ <property name="height_request">34</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkMenuButton" id="menuButton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_popover">True</property>
+ <property name="menu_model">repeatMenu</property>
+ <child>
+ <object class="GtkBox" id="replayBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="_repeat_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">media-playlist-consecutive-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="downArrow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-down-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkRadioMenuItem" id="radiomenuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="draw_as_radio">True</property>
+ </object>
+</interface>
diff --git a/data/ui/PlaylistContextMenu.ui b/data/ui/PlaylistContextMenu.ui
new file mode 100644
index 00000000..985daee3
--- /dev/null
+++ b/data/ui/PlaylistContextMenu.ui
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <menu id="_song_menu">
+ <item>
+ <attribute name="label" translatable="yes" context="context menu item">Play</attribute>
+ <attribute name="action">win.play_song</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Add to Playlist…</attribute>
+ <attribute name="action">win.add_song_to_playlist</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Remove From Playlist</attribute>
+ <attribute name="action">win.remove_song</attribute>
+ </item>
+ </menu>
+ <template class="PlaylistContextMenu" parent="GtkPopover">
+ <property name="position">3</property>
+ </template>
+</interface>
+
diff --git a/data/ui/PlaylistControls.ui b/data/ui/PlaylistControls.ui
new file mode 100644
index 00000000..64456fdd
--- /dev/null
+++ b/data/ui/PlaylistControls.ui
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.12 -->
+ <menu id="playlistMenu">
+ <item>
+ <attribute name="label" translatable="yes">_Play</attribute>
+ <attribute name="action">win.playlist_play</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Delete</attribute>
+ <attribute name="action">win.playlist_delete</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rename…</attribute>
+ <attribute name="action">win.playlist_rename</attribute>
+ </item>
+ </menu>
+ <template class="PlaylistControls" parent="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_start">18</property>
+ <property name="margin_end">24</property>
+ <property name="margin_top">18</property>
+ <property name="margin_bottom">18</property>
+ <child>
+ <object class="GtkStack" id="_name_stack">
+ <child>
+ <object class="GtkLabel" id="_name_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Playlist Name</property>
+ <property name="ellipsize">middle</property>
+ <style>
+ <class name="playlist-name-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
+ <style>
+ <class name="linked"/>
+ </style>
+ <child>
+ <object class="GtkEntry" id="_rename_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="is_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="activate" handler="_on_playlist_renamed" swapped="no"/>
+ <signal name="changed" handler="_on_rename_entry_changed" swapped="no"/>
+ <signal name="key-press-event" handler="_on_rename_entry_key_pressed" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_rename_done_button">
+ <property name="visible">True</property>
+ <property name="no_show_all">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">_Done</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <signal name="clicked" handler="_on_playlist_renamed" swapped="no" />
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">renaming_dialog</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_songs_count_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label">3 Songs</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="_menubutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="focus_on_click">False</property>
+ <property name="menu-model">playlistMenu</property>
+ <property name="direction">none</property>
+ <property name="use_popover">True</property>
+ <style>
+ <class name="image-button"/>
+ <class name="circular"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistDialog.ui b/data/ui/PlaylistDialog.ui
new file mode 100644
index 00000000..d31c073a
--- /dev/null
+++ b/data/ui/PlaylistDialog.ui
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="PlaylistDialog" parent="GtkDialog">
+ <property name="width_request">400</property>
+ <property name="height_request">500</property>
+ <property name="can_focus">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkStack" id="_add_playlist_stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="transition_duration">250</property>
+ <child>
+ <object class="GtkBox" id="_empty_box">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">end</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">100</property>
+ <property name="icon_name">emblem-music-symbolic</property>
+ <property name="icon_size">0</property>
+ <property name="margin_bottom">16</property>
+ <style>
+ <class name="grey-image"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">18</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Enter a name for your first playlist</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="_first_playlist_entry">
+ <property name="width_request">300</property>
+ <property name="height_request">10</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">center</property>
+ <property name="margin_bottom">16</property>
+ <signal name="activate" handler="_on_editing_done" swapped="no"/>
+ <signal name="changed" handler="_on_add_playlist_entry_changed" swapped="no"/>
+ <signal name="focus-in-event" handler="_on_add_playlist_entry_focused" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">18</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_first_playlist_button">
+ <property name="label" translatable="yes">C_reate</property>
+ <property name="use_underline">True</property>
+ <property name="width_request">120</property>
+ <property name="height_request">25</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin_top">10</property>
+ <property name="margin_bottom">20</property>
+ <signal name="clicked" handler="_on_editing_done" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ <property name="padding">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_normal_box">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="new-playlist-hbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <child>
+ <object class="GtkEntry" id="_new_playlist_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="placeholder_text" translatable="yes">New Playlist…</property>
+ <signal name="activate" handler="_on_editing_done" swapped="no"/>
+ <signal name="changed" handler="_on_add_playlist_entry_changed" swapped="no"/>
+ <signal name="focus-in-event" handler="_on_add_playlist_entry_focused" swapped="no"/>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="_new_playlist_button">
+ <property name="label" translatable="yes">Add</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_editing_done" swapped="no"/>
+ <style>
+ <class name="suggested-action"/>
+ <class name="linked"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkTreeView" id="_view">
+ <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>
+ <style>
+ <class name="list-row"/>
+ <class name="playlists-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkHeaderBar" id="_title_bar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Add to Playlist</property>
+ <child>
+ <object class="GtkButton" id="_cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
+ <style>
+ <class name="text-button"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_select_button">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="sensitive">False</property>
+ <property name="use_underline">True</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_selection" swapped="no"/>
+ <style>
+ <class name="suggested-action"/>
+ <class name="text-button"/>
+ </style>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </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/Searchbar.ui b/data/ui/Searchbar.ui
new file mode 100644
index 00000000..981f486f
--- /dev/null
+++ b/data/ui/Searchbar.ui
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="Searchbar" parent="GtkSearchBar">
+ <child>
+ <object class="GtkBox">
+ <property name="halign">center</property>
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GdTaggedEntry" id="_search_entry">
+ <property name="halign">center</property>
+ <property name="visible">True</property>
+ <property name="width-request">500</property>
+ <signal name="changed" handler="_search_entry_timeout"/>
+ <signal name="tag-button-clicked" handler="_tag_button_clicked"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="_drop_down_button">
+ <property name="visible">True</property>
+ <signal name="toggled" handler="_drop_down_button_toggled"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">pan-down-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SelectionBarMenuButton.ui b/data/ui/SelectionBarMenuButton.ui
new file mode 100644
index 00000000..b2bde8b2
--- /dev/null
+++ b/data/ui/SelectionBarMenuButton.ui
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <menu id="selection-menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select All</attribute>
+ <attribute name="action">win.select_all</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Select None</attribute>
+ <attribute name="action">win.select_none</attribute>
+ </item>
+ </section>
+ </menu>
+ <template class="SelectionBarMenuButton" parent="GtkMenuButton">
+ <property name="menu-model">selection-menu</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="relief">none</property>
+ <child>
+ <object class="GtkBox" id="selection-menu-button-box">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="_menu_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes">Click on items to select them</property>
+ </object>
+ <packing>
+ <property name="pack-type">start</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">go-down-symbolic</property>
+ </object>
+ <packing>
+ <property name="pack-type">start</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="selection-menu"/>
+ </style>
+ </template>
+</interface>
diff --git a/data/ui/SelectionToolbar.ui b/data/ui/SelectionToolbar.ui
new file mode 100644
index 00000000..ec64876c
--- /dev/null
+++ b/data/ui/SelectionToolbar.ui
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.12 -->
+ <template class="SelectionToolbar" parent="GtkActionBar">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="_add_to_playlist_button">
+ <property name="label" translatable="yes">_Add to Playlist</property>
+ <property name="use_underline">True</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="_on_add_to_playlist_button_clicked" swapped="no"/>
+ <style>
+ <class name="text-button"/>
+ </style>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SidebarRow.ui b/data/ui/SidebarRow.ui
new file mode 100644
index 00000000..040ae153
--- /dev/null
+++ b/data/ui/SidebarRow.ui
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="SidebarRow" parent="GtkListBoxRow">
+ <child>
+ <object class="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="expand">False</property>
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRevealer" id="_revealer">
+ <property name="halign">fill</property>
+ <property name="hexpand">False</property>
+ <property name="reveal-child">False</property>
+ <property name="transition-type">slide-right</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkCheckButton" id="_check">
+ <property name="margin-start">12</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_label">
+ <property name="can_focus">False</property>
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="margin">16</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SongWidget.ui b/data/ui/SongWidget.ui
new file mode 100644
index 00000000..c8837536
--- /dev/null
+++ b/data/ui/SongWidget.ui
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="SongWidget" parent="GtkEventBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <signal name="notify::selected" handler="_on_selection_changed"/>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="width_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkEventBox" id="eventbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImage" id="_play_icon">
+ <property name="can_focus">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="_select_button">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_number_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="justify">right</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">1</property>
+ <property name="margin_bottom">1</property>
+ <child>
+ <object class="DzlBoldingLabel" id="_title_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">90</property>
+ <property name="justify">fill</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">9</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_duration_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="single_line_mode">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="_star_eventbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="visible_window">True</property>
+ <signal name="button-release-event" handler="_on_star_toggle" swapped="no"/>
+ <signal name="enter-notify-event" handler="_on_star_hover" swapped="no"/>
+ <signal name="leave-notify-event" handler="_on_star_unhover" swapped="no"/>
+ <child>
+ <object class="StarImage" id="_star_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_start">10</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/TwoLineTip.ui b/data/ui/TwoLineTip.ui
new file mode 100644
index 00000000..588abc3f
--- /dev/null
+++ b/data/ui/TwoLineTip.ui
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="TwoLineTip" parent="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="expand">False</property>
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="tooltip-title"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_subtitle_label">
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/app-menu.ui b/data/ui/app-menu.ui
new file mode 100644
index 00000000..cf12e41d
--- /dev/null
+++ b/data/ui/app-menu.ui
@@ -0,0 +1,24 @@
+<interface>
+ <menu id="app-menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
+ <attribute name="action">win.show-help-overlay</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="action">app.help</attribute>
+ <attribute name="accel">F1</attribute>
+ </item>
+ <item>
+ <attribute name="action">app.about</attribute>
+ <attribute name="label" translatable="yes">_About</attribute>
+ </item>
+ <item>
+ <attribute name="action">app.quit</attribute>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel">&lt;Primary&gt;q</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/data/ui/help-overlay.ui b/data/ui/help-overlay.ui
new file mode 100644
index 00000000..ebddf7c4
--- /dev/null
+++ b/data/ui/help-overlay.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkShortcutsWindow" id="help_overlay">
+ <property name="modal">True</property>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">True</property>
+ <property name="section-name">shortcuts</property>
+ <property name="max-height">17</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">General</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Close window</property>
+ <property name="accelerator">&lt;Primary&gt;Q</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Search</property>
+ <property name="accelerator">&lt;Primary&gt;F</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Help</property>
+ <property name="accelerator">F1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Shortcuts</property>
+ <property name="accelerator">&lt;Primary&gt;question &lt;Primary&gt;F1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Playback</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Play/Pause</property>
+ <property name="accelerator">&lt;Ctrl&gt;space</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Next song</property>
+ <property name="accelerator">&lt;Ctrl&gt;N</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Previous song</property>
+ <property name="accelerator">&lt;Ctrl&gt;B</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Toggle repeat</property>
+ <property name="accelerator">&lt;Ctrl&gt;R</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Toggle shuffle</property>
+ <property name="accelerator">&lt;Ctrl&gt;S</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Navigation</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Go to Albums</property>
+ <property name="accelerator">&lt;Alt&gt;1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Go to Artists</property>
+ <property name="accelerator">&lt;Alt&gt;2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Go to Songs</property>
+ <property name="accelerator">&lt;Alt&gt;3</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Go to Playlists</property>
+ <property name="accelerator">&lt;Alt&gt;4</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes" context="shortcut window">Go back</property>
+ <property name="accelerator">&lt;Alt&gt;Left</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/data/ui/meson.build b/data/ui/meson.build
new file mode 100644
index 00000000..73d1f554
--- /dev/null
+++ b/data/ui/meson.build
@@ -0,0 +1,24 @@
+# AboutDialog.ui configuration
+VCS_TAG = ''
+if get_option('profile') != 'default'
+ git = find_program('git', required : false)
+ if git.found()
+ VCS_TAG = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip()
+ endif
+ if VCS_TAG == ''
+ VCS_TAG = '-devel'
+ else
+ VCS_TAG = '-@0@'.format(VCS_TAG)
+ endif
+endif
+about_dialog_conf = configuration_data()
+about_dialog_conf.set('PACKAGE_VERSION', '@0@@1@'.format(meson.project_version(), VCS_TAG))
+about_dialog_conf.set('PACKAGE_URL', PACKAGE_URL)
+about_dialog_conf.set('PROGRAM_NAME', 'Music' + NAME_SUFFIX)
+about_dialog_conf.set('APPID', APPLICATION_ID)
+
+about_dialog = configure_file(
+ input: 'AboutDialog.ui.in',
+ output: 'AboutDialog.ui',
+ configuration: about_dialog_conf
+) \ No newline at end of file