fixup! Port UI to GTK 4

This commit is contained in:
coderkun 2023-01-15 14:45:17 +01:00
parent 8359143663
commit 15f8f67de9
11 changed files with 642 additions and 145 deletions

View file

@ -44,27 +44,6 @@ actionbar {
background-color:@theme_unfocused_bg_color; background-color:@theme_unfocused_bg_color;
} }
/* Icon View in regular mode */
iconview.view:selected,
iconview.view:selected:focus {
background-color:@theme_selected_bg_color;
}
iconview.view:hover {
-gtk-icon-effect:highlight;
}
/* Icon View in selection mode */
iconview.view.selection {
-gtk-icon-effect:dim;
}
iconview.view.selection:selected,
iconview.view.selection:selected:focus {
background-color:@theme_selected_bg_color;
-gtk-icon-effect:highlight;
}
iconview.view.selection:hover {
-gtk-icon-effect:none;
}
gridview child { gridview child {
padding: 1px; padding: 10px;
} }

View file

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface> <interface>
<requires lib="gtk+" version="3.10"/> <requires lib="gtk+" version="4.8"/>
<template class="McgAlbumHeaderbar" parent="GtkHeaderBar"> <requires lib="adw" version="1.2" />
<template class="McgAlbumHeaderbar" parent="AdwBin">
<child>
<object class="GtkHeaderBar">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<child type="title"> <child type="title">
@ -21,11 +23,13 @@
<attribute name="scale" value="1"/> <attribute name="scale" value="1"/>
</attributes> </attributes>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkLabel" id="standalone_artist"> <object class="GtkLabel" id="standalone_artist">
@ -34,11 +38,13 @@
<property name="label" translatable="yes">Artist</property> <property name="label" translatable="yes">Artist</property>
<property name="selectable">True</property> <property name="selectable">True</property>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
</child> </child>
@ -57,5 +63,7 @@
</child> </child>
</object> </object>
</child> </child>
</template> </object>
</child>
</template>
</interface> </interface>

View file

@ -53,13 +53,27 @@
<property name="valign">fill</property> <property name="valign">fill</property>
<property name="icon-name">image-x-generic-symbolic</property> <property name="icon-name">image-x-generic-symbolic</property>
<property name="icon-size">large</property> <property name="icon-size">large</property>
<!--
<signal name="button-press-event" handler="on_cover_box_pressed" swapped="no"/>
-->
</object> </object>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<!--
<packing>
<property name="name">cover-scroll</property>
<property name="position">1</property>
</packing>
-->
</child> </child>
</object> </object>
<!--
<packing>
<property name="index">-1</property>
</packing>
-->
</child> </child>
<child type="overlay"> <child type="overlay">
<object class="GtkRevealer" id="info_revealer"> <object class="GtkRevealer" id="info_revealer">
@ -67,7 +81,9 @@
<property name="transition-type">slide-right</property> <property name="transition-type">slide-right</property>
<property name="name">cover_info_revealer</property> <property name="name">cover_info_revealer</property>
<style> <style>
<!--
<class name="sidebar"/> <class name="sidebar"/>
-->
<class name="background"/> <class name="background"/>
</style> </style>
<child> <child>
@ -79,6 +95,9 @@
<property name="name">cover_info_scroll</property> <property name="name">cover_info_scroll</property>
<child> <child>
<object class="GtkViewport"> <object class="GtkViewport">
<!--
<property name="shadow-type">none</property>
-->
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
@ -135,6 +154,14 @@
</object> </object>
</child> </child>
</object> </object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">10</property>
<property name="position">0</property>
</packing>
-->
</child> </child>
<child> <child>
<object class="GtkScale" id="songs_scale"> <object class="GtkScale" id="songs_scale">
@ -144,7 +171,19 @@
<property name="restrict-to-fill-level">False</property> <property name="restrict-to-fill-level">False</property>
<property name="digits">0</property> <property name="digits">0</property>
<property name="draw-value">False</property> <property name="draw-value">False</property>
<!--
<signal name="button-press-event" handler="on_songs_start_change" swapped="no"/>
<signal name="button-release-event" handler="on_songs_change" swapped="no"/>
-->
</object> </object>
<!--
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
-->
</child> </child>
</object> </object>
</child> </child>

View file

@ -1,11 +1,278 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface> <interface>
<requires lib="gtk+" version="3.16"/> <requires lib="gtk+" version="4.8"/>
<template class="McgLibraryPanel" parent="GtkStack"> <requires lib="adw" version="1.2" />
<property name="visible">True</property> <object class="GtkAdjustment" id="grid_adjustment">
<property name="can-focus">False</property> <property name="lower">100</property>
<property name="transition-type">slide-left-right</property> <property name="upper">1000</property>
<property name="value">150</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkPopover" id="toolbar_popover">
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="halign">end</property>
<child>
<object class="GtkScale" id="grid_scale">
<property name="width-request">350</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">grid_adjustment</property>
<property name="restrict-to-fill-level">False</property>
<property name="fill-level">-1</property>
<property name="round-digits">0</property>
<property name="digits">0</property>
<property name="has-origin">False</property>
<!--
<signal name="button-release-event" handler="on_grid_scale_changed" swapped="no"/>
-->
<signal name="change-value" handler="on_grid_scale_change" swapped="no"/>
</object>
<!--
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
-->
</child>
<child>
<object class="GtkButton" id="library-toolbar-update">
<property name="label">gtk-refresh</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<!--
<property name="relief">none</property>
<property name="use-stock">True</property>
-->
<signal name="clicked" handler="on_update_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="GtkBox" id="library-toolbar-sort">
<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>
<property name="orientation">vertical</property>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
-->
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Sort</property>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
-->
</child>
<child>
<object class="GtkCheckButton" id="sort_artist">
<property name="label" translatable="yes">sort by artist</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<!--
<property name="draw-indicator">True</property>
-->
<property name="group">sort_year</property>
<signal name="toggled" handler="on_sort_toggled" swapped="no"/>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
-->
</child>
<child>
<object class="GtkCheckButton" id="sort_title">
<property name="label" translatable="yes">sort by title</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<!--
<property name="draw-indicator">True</property>
-->
<property name="group">sort_year</property>
<signal name="toggled" handler="on_sort_toggled" swapped="no"/>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
-->
</child>
<child>
<object class="GtkCheckButton" id="sort_year">
<property name="label" translatable="yes">sort by year</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<!--
<property name="draw-indicator">True</property>
-->
<signal name="toggled" handler="on_sort_toggled" swapped="no"/>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
-->
</child>
<child>
<object class="GtkCheckButton" id="toolbar_sort_order_button">
<property name="label">gtk-sort-descending</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<!--
<property name="use-stock">True</property>
<property name="draw-indicator">True</property>
-->
<property name="active">True</property>
<signal name="toggled" handler="on_sort_order_toggled" swapped="no"/>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
-->
</child>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
-->
</child>
</object>
</child>
</object>
<object class="GtkBox" id="toolbar">
<property name="orientation">horizontal</property>
<property name="halign">end</property>
<property name="spacing">6</property>
<child>
<object class="GtkToggleButton" id="toolbar_search_bar">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Search the library</property>
<signal name="toggled" handler="on_search_toggled" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">system-search-symbolic</property>
</object>
</child>
<!--
<accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-->
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
<property name="non-homogeneous">True</property>
</packing>
-->
</child>
<child>
<object class="GtkToggleButton" id="select_button">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Select multiple albums</property>
<signal name="toggled" handler="on_select_toggled" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">object-select-symbolic</property>
</object>
</child>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="non-homogeneous">True</property>
</packing>
-->
</child>
<child>
<object class="GtkMenuButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Settings and actions</property>
<property name="popover">toolbar_popover</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">open-menu-symbolic</property>
</object>
</child>
</object>
<!--
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
<property name="non-homogeneous">True</property>
</packing>
-->
</child>
</object>
<template class="McgLibraryPanel" parent="AdwBin">
<child>
<object class="GtkStack">
<property name="transition-type">slide-left-right</property>
<child> <child>
<object class="GtkBox" id="panel_normal"> <object class="GtkBox" id="panel_normal">
<property name="visible">True</property> <property name="visible">True</property>
@ -13,27 +280,31 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkSearchBar" id="filter_bar"> <object class="GtkSearchBar" id="filter_bar">
<property name="visible">True</property> <!--
<property name="app-paintable">True</property> <property name="app-paintable">True</property>
<property name="can-focus">False</property> -->
<signal name="notify" handler="on_filter_bar_notify" swapped="no"/> <signal name="notify" handler="on_filter_bar_notify" swapped="no"/>
<child> <child>
<object class="GtkSearchEntry" id="filter_entry"> <object class="GtkSearchEntry" id="filter_entry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<!--
<property name="primary-icon-name">edit-find-symbolic</property> <property name="primary-icon-name">edit-find-symbolic</property>
<property name="primary-icon-activatable">False</property> <property name="primary-icon-activatable">False</property>
<property name="primary-icon-sensitive">False</property> <property name="primary-icon-sensitive">False</property>
-->
<property name="placeholder-text" translatable="yes">search library</property> <property name="placeholder-text" translatable="yes">search library</property>
<signal name="search-changed" handler="on_filter_entry_changed" swapped="no"/> <signal name="search-changed" handler="on_filter_entry_changed" swapped="no"/>
</object> </object>
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<placeholder/> <placeholder/>
@ -62,15 +333,16 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage" id="progress_image"> <object class="GtkImage" id="progress_image">
<property name="visible">True</property> <property name="icon-size">large</property>
<property name="can-focus">False</property> <property name="icon-name">image-x-generic-symbolic</property>
<property name="icon_size">6</property>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkProgressBar" id="progress_bar"> <object class="GtkProgressBar" id="progress_bar">
@ -80,87 +352,135 @@
<property name="pulse-step">0</property> <property name="pulse-step">0</property>
<property name="show-text">True</property> <property name="show-text">True</property>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="name">page1</property> <property name="name">page1</property>
<property name="title">page1</property> <property name="title">page1</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkScrolledWindow" id="scroll"> <object class="GtkScrolledWindow" id="scroll">
<property name="visible">True</property> <property name="vexpand">true</property>
<property name="can-focus">True</property>
<child> <child>
<object class="GtkIconView" id="library_grid"> <object class="GtkGridView" id="library_grid">
<property name="visible">True</property> <property name="orientation">vertical</property>
<property name="can-focus">True</property> <!--
<property name="margin">0</property> <signal name="activate" handler="on_library_grid_clicked" swapped="no"/>
<property name="item-orientation">horizontal</property> <signal name="selection-changed" handler="on_library_grid_selection_changed" swapped="no"/>
<property name="row-spacing">0</property> <signal name="size-allocate" handler="on_resize" swapped="no"/>
<property name="column-spacing">0</property> -->
<property name="tooltip-column">1</property> <style>
<property name="item-padding">0</property> <class name="no-bg"/>
<property name="activate-on-single-click">True</property> </style>
<signal name="item-activated" handler="on_library_grid_clicked" swapped="no"/> <property name="factory">
<signal name="selection-changed" handler="on_library_grid_selection_changed" swapped="no"/> <object class="GtkBuilderListItemFactory">
<signal name="size-allocate" handler="on_resize" swapped="no"/> <property name="bytes">
<style> <![CDATA[
<class name="no-bg"/> <?xml version="1.0" encoding="UTF-8"?>
</style> <interface>
</object> <template class="GtkListItem">
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<!--
<child>
<object class="GtkLabel">
<property name="hexpand">false</property>
<binding name="label">
<lookup name="title" type="GridItem">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</child>
-->
<child>
<object class="GtkPicture">
<property name="content-fit">contain</property>
<property name="can-shrink">false</property>
<binding name="tooltip-markup">
<lookup name="tooltip" type="GridItem">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<binding name="paintable">
<lookup name="cover" type="GridItem">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</child>
</object>
</property>
</template>
</interface>
]]>
</property>
</object>
</property>
</object>
</child> </child>
<style> <style>
<class name="no-bg"/> <class name="no-bg"/>
</style> </style>
</object> </object>
<!--
<packing> <packing>
<property name="name">page0</property> <property name="name">page0</property>
<property name="title">page0</property> <property name="title">page0</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkRevealer" id="actionbar_revealer"> <object class="GtkRevealer" id="actionbar_revealer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="transition-type">none</property> <property name="transition-type">none</property>
<property name="reveal-child">false</property>
<child> <child>
<object class="GtkActionBar" id="library-actionbar"> <object class="GtkActionBar" id="library-actionbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">cancel</property> <property name="label" translatable="yes">cancel</property>
@ -169,10 +489,12 @@
<property name="receives-default">True</property> <property name="receives-default">True</property>
<signal name="clicked" handler="on_selection_cancel_clicked" swapped="no"/> <signal name="clicked" handler="on_selection_cancel_clicked" swapped="no"/>
</object> </object>
<!--
<packing> <packing>
<property name="pack-type">end</property> <property name="pack-type">end</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
@ -182,25 +504,31 @@
<property name="receives-default">True</property> <property name="receives-default">True</property>
<signal name="clicked" handler="on_selection_add_clicked" swapped="no"/> <signal name="clicked" handler="on_selection_add_clicked" swapped="no"/>
</object> </object>
<!--
<packing> <packing>
<property name="pack-type">end</property> <property name="pack-type">end</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="name">page0</property> <property name="name">page0</property>
<property name="title">page0</property> <property name="title">page0</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkBox" id="panel_standalone"> <object class="GtkBox" id="panel_standalone">
@ -217,9 +545,11 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
</object> </object>
<!--
<packing> <packing>
<property name="name">standalone-spinne</property> <property name="name">standalone-spinne</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkScrolledWindow" id="standalone_scroll"> <object class="GtkScrolledWindow" id="standalone_scroll">
@ -227,7 +557,9 @@
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="kinetic-scrolling">False</property> <property name="kinetic-scrolling">False</property>
<property name="overlay-scrolling">False</property> <property name="overlay-scrolling">False</property>
<!--
<signal name="size-allocate" handler="on_standalone_scroll_size_allocate" swapped="no"/> <signal name="size-allocate" handler="on_standalone_scroll_size_allocate" swapped="no"/>
-->
<child> <child>
<object class="GtkViewport"> <object class="GtkViewport">
<property name="visible">True</property> <property name="visible">True</property>
@ -237,23 +569,29 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="icon-name">gtk-missing-image</property> <property name="icon-name">gtk-missing-image</property>
<!--
<property name="icon_size">6</property> <property name="icon_size">6</property>
-->
</object> </object>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="name">standalone-scroll</property> <property name="name">standalone-scroll</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkActionBar" id="library-standalone-actionbar"> <object class="GtkActionBar" id="library-standalone-actionbar">
@ -267,10 +605,12 @@
<property name="receives-default">True</property> <property name="receives-default">True</property>
<signal name="clicked" handler="on_standalone_queue_clicked" swapped="no"/> <signal name="clicked" handler="on_standalone_queue_clicked" swapped="no"/>
</object> </object>
<!--
<packing> <packing>
<property name="pack-type">end</property> <property name="pack-type">end</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
@ -280,24 +620,32 @@
<property name="receives-default">True</property> <property name="receives-default">True</property>
<signal name="clicked" handler="on_standalone_play_clicked" swapped="no"/> <signal name="clicked" handler="on_standalone_play_clicked" swapped="no"/>
</object> </object>
<!--
<packing> <packing>
<property name="pack-type">end</property> <property name="pack-type">end</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</object> </object>
<!--
<packing> <packing>
<property name="name">page1</property> <property name="name">page1</property>
<property name="title">page1</property> <property name="title">page1</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
-->
</child> </child>
</template> </object>
</child>
</template>
</interface> </interface>

View file

@ -12,7 +12,9 @@
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Select multiple albums</property> <property name="tooltip-text" translatable="yes">Select multiple albums</property>
<!--
<signal name="toggled" handler="on_select_toggled" swapped="no"/> <signal name="toggled" handler="on_select_toggled" swapped="no"/>
-->
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="icon-name">object-select-symbolic</property> <property name="icon-name">object-select-symbolic</property>
@ -26,7 +28,9 @@
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Clear the playlist</property> <property name="tooltip-text" translatable="yes">Clear the playlist</property>
<!--
<signal name="clicked" handler="on_clear_clicked" swapped="no"/> <signal name="clicked" handler="on_clear_clicked" swapped="no"/>
-->
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="visible">True</property> <property name="visible">True</property>
@ -50,8 +54,14 @@
<child> <child>
<object class="GtkGridView" id="playlist_grid"> <object class="GtkGridView" id="playlist_grid">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<!--
<property name="item-padding">0</property>
-->
<property name="single-click-activate">true</property> <property name="single-click-activate">true</property>
<signal name="activate" handler="on_playlist_grid_clicked"/> <signal name="activate" handler="on_playlist_grid_clicked"/>
<!--
<signal name="selection-changed" handler="on_playlist_grid_selection_changed" swapped="no"/>
-->
<style> <style>
<class name="no-bg"/> <class name="no-bg"/>
</style> </style>
@ -106,14 +116,18 @@
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">cancel</property> <property name="label" translatable="yes">cancel</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<!--
<signal name="clicked" handler="on_selection_cancel_clicked" swapped="no"/> <signal name="clicked" handler="on_selection_cancel_clicked" swapped="no"/>
-->
</object> </object>
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">remove</property> <property name="label" translatable="yes">remove</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<!--
<signal name="clicked" handler="on_selection_remove_clicked" swapped="no"/> <signal name="clicked" handler="on_selection_remove_clicked" swapped="no"/>
-->
</object> </object>
</child> </child>
</object> </object>
@ -139,6 +153,9 @@
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="kinetic-scrolling">False</property> <property name="kinetic-scrolling">False</property>
<property name="overlay-scrolling">False</property> <property name="overlay-scrolling">False</property>
<!--
<signal name="size-allocate" handler="on_standalone_scroll_size_allocate" swapped="no"/>
-->
<child> <child>
<object class="GtkViewport"> <object class="GtkViewport">
<property name="visible">True</property> <property name="visible">True</property>
@ -146,6 +163,9 @@
<child> <child>
<object class="GtkImage" id="standalone_image"> <object class="GtkImage" id="standalone_image">
<property name="icon-name">gtk-missing-image</property> <property name="icon-name">gtk-missing-image</property>
<!--
<property name="icon_size">6</property>
-->
</object> </object>
</child> </child>
</object> </object>
@ -160,14 +180,18 @@
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">remove</property> <property name="label" translatable="yes">remove</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<!--
<signal name="clicked" handler="on_standalone_remove_clicked" swapped="no"/> <signal name="clicked" handler="on_standalone_remove_clicked" swapped="no"/>
-->
</object> </object>
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">play</property> <property name="label" translatable="yes">play</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<!--
<signal name="clicked" handler="on_standalone_play_clicked" swapped="no"/> <signal name="clicked" handler="on_standalone_play_clicked" swapped="no"/>
-->
</object> </object>
</child> </child>
</object> </object>

View file

@ -4,9 +4,11 @@
<file>gtk.css</file> <file>gtk.css</file>
<file>noise-texture.png</file> <file>noise-texture.png</file>
<file>ui/window.ui</file> <file>ui/window.ui</file>
<!--
<file>ui/gtk.menu.ui</file> <file>ui/gtk.menu.ui</file>
<file>ui/info-dialog.ui</file> <file>ui/info-dialog.ui</file>
<file>ui/shortcuts-dialog.ui</file> <file>ui/shortcuts-dialog.ui</file>
-->
<file>ui/connection-panel.ui</file> <file>ui/connection-panel.ui</file>
<file>ui/album-headerbar.ui</file> <file>ui/album-headerbar.ui</file>
<file>ui/server-panel.ui</file> <file>ui/server-panel.ui</file>

View file

@ -10,7 +10,7 @@ gi.require_version('Adw', '1')
from gi.repository import Gio, Gtk, Gdk, GLib, Adw from gi.repository import Gio, Gtk, Gdk, GLib, Adw
from .window import Window from .window import Window
from .infodialog import InfoDialog #from .infodialog import InfoDialog
@ -50,10 +50,12 @@ class Application(Gtk.Application):
def on_menu_info(self, action, value): def on_menu_info(self, action, value):
if not self._info_dialog: # FIXME Info dialog
self._info_dialog = InfoDialog() #if not self._info_dialog:
self._info_dialog.run() # self._info_dialog = InfoDialog()
self._info_dialog.hide() #self._info_dialog.run()
#self._info_dialog.hide()
pass
def on_menu_quit(self, action, value): def on_menu_quit(self, action, value):
@ -97,9 +99,10 @@ class Application(Gtk.Application):
def _load_appmenu(self): def _load_appmenu(self):
builder = Gtk.Builder() builder = Gtk.Builder()
builder.set_translation_domain(Application.DOMAIN) # FIXME Handle menu
builder.add_from_resource(self._get_resource_path('ui/gtk.menu.ui')) #builder.set_translation_domain(Application.DOMAIN)
self.set_app_menu(builder.get_object('app-menu')) #builder.add_from_resource(self._get_resource_path('ui/gtk.menu.ui'))
#self.set_app_menu(builder.get_object('app-menu'))
def _get_resource_path(self, path): def _get_resource_path(self, path):

View file

@ -55,7 +55,7 @@ class CoverPanel(Gtk.Overlay):
self._icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) self._icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
self._fullscreened = False self._fullscreened = False
self._current_size = None self._current_size = None
self._cover_pixbuf = self._get_default_image() #self._cover_pixbuf = self._get_default_image()
# Widgets # Widgets
self.cover_stack.set_visible_child(self.cover_scroll) self.cover_stack.set_visible_child(self.cover_scroll)
@ -72,10 +72,11 @@ class CoverPanel(Gtk.Overlay):
pass pass
@Gtk.Template.Callback() # FIXME on_cover_box_pressed()
def on_cover_box_pressed(self, widget, event): #@Gtk.Template.Callback()
if self._current_album and event.type == Gdk.EventType._2BUTTON_PRESS: #def on_cover_box_pressed(self, widget, event):
self.emit('toggle-fullscreen') # if self._current_album and event.type == Gdk.EventType._2BUTTON_PRESS:
# self.emit('toggle-fullscreen')
def set_width(self, width): def set_width(self, width):
@ -83,14 +84,15 @@ class CoverPanel(Gtk.Overlay):
self.cover_info_scroll.set_max_content_width(width // 2) self.cover_info_scroll.set_max_content_width(width // 2)
@Gtk.Template.Callback() # FIXME on_songs_start_change()
def on_songs_start_change(self, widget, event): #@Gtk.Template.Callback()
if self._timer: #def on_songs_start_change(self, widget, event):
GObject.source_remove(self._timer) # if self._timer:
self._timer = None # GObject.source_remove(self._timer)
# self._timer = None
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_songs_change(self, widget, event): def on_songs_change(self, widget, event):
value = int(self.songs_scale.get_value()) value = int(self.songs_scale.get_value())
time = self._current_album.get_length() time = self._current_album.get_length()
@ -170,6 +172,7 @@ class CoverPanel(Gtk.Overlay):
else: else:
# Reset image # Reset image
self._cover_pixbuf = self._get_default_image() self._cover_pixbuf = self._get_default_image()
self._cover_pixbuf = None
self._current_size = None self._current_size = None
self._current_cover_album = album self._current_cover_album = album
# Show image # Show image
@ -228,6 +231,7 @@ class CoverPanel(Gtk.Overlay):
"""Diese Methode skaliert das geladene Bild aus dem Pixelpuffer """Diese Methode skaliert das geladene Bild aus dem Pixelpuffer
auf die Größe des Fensters unter Beibehalt der Seitenverhältnisse auf die Größe des Fensters unter Beibehalt der Seitenverhältnisse
""" """
# FIXME Get size
size_width = self.cover_stack.get_size(Gtk.Orientation.HORIZONTAL) size_width = self.cover_stack.get_size(Gtk.Orientation.HORIZONTAL)
size_height = self.cover_stack.get_size(Gtk.Orientation.HORIZONTAL) size_height = self.cover_stack.get_size(Gtk.Orientation.HORIZONTAL)
# Abort if size is the same # Abort if size is the same
@ -254,5 +258,7 @@ class CoverPanel(Gtk.Overlay):
height = int(math.floor(pixbuf.get_height()*ratio)) height = int(math.floor(pixbuf.get_height()*ratio))
if width <= 0 or height <= 0: if width <= 0 or height <= 0:
return return
# FIXME Pixelpuffer auf Oberfläche zeichnen
#self.cover_image.set_allocation(self.cover_scroll.get_allocation())
self.cover_image.set_from_pixbuf(pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) self.cover_image.set_from_pixbuf(pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER))
self.cover_image.show() self.cover_image.show()

View file

@ -24,6 +24,17 @@ from mcg.utils import GridItem
class LibraryPanel(Adw.Bin): class LibraryPanel(Adw.Bin):
__gtype_name__ = 'McgLibraryPanel' __gtype_name__ = 'McgLibraryPanel'
__gsignals__ = { __gsignals__ = {
'open-standalone': (GObject.SIGNAL_RUN_FIRST, None, ()),
'close-standalone': (GObject.SIGNAL_RUN_FIRST, None, ()),
'update': (GObject.SIGNAL_RUN_FIRST, None, ()),
'play': (GObject.SIGNAL_RUN_FIRST, None, (str,)),
'queue': (GObject.SIGNAL_RUN_FIRST, None, (str,)),
'queue-multiple': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
'item-size-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
'sort-order-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
'sort-type-changed': (GObject.SIGNAL_RUN_FIRST, None, (Gtk.SortType,)),
'albumart': (GObject.SIGNAL_RUN_FIRST, None, (str,)),
'select': (GObject.SIGNAL_RUN_FIRST, None, (bool,)), 'select': (GObject.SIGNAL_RUN_FIRST, None, (bool,)),
'toggle-search': (GObject.SIGNAL_RUN_FIRST, None, (bool,)), 'toggle-search': (GObject.SIGNAL_RUN_FIRST, None, (bool,)),
'update': (GObject.SIGNAL_RUN_FIRST, None, ()), 'update': (GObject.SIGNAL_RUN_FIRST, None, ()),
@ -33,6 +44,7 @@ class LibraryPanel(Adw.Bin):
'sort-type': (GObject.SIGNAL_RUN_FIRST, None, (Gtk.SortType,)) 'sort-type': (GObject.SIGNAL_RUN_FIRST, None, (Gtk.SortType,))
} }
# Widgets # Widgets
panel_standalone = Gtk.Template.Child() panel_standalone = Gtk.Template.Child()
actionbar_revealer = Gtk.Template.Child() actionbar_revealer = Gtk.Template.Child()
@ -86,27 +98,30 @@ class LibraryPanel(Adw.Bin):
self._is_selected = False self._is_selected = False
# Widgets # Widgets
self._toolbar = LibraryToolbar(self._item_size) # FIXME Toolbar signals
self._toolbar.connect('select', self.on_toolbar_select) #self._toolbar.connect('select', self.on_toolbar_select)
self._toolbar.connect('toggle-search', self.on_toolbar_toggle_search) #self._toolbar.connect('toggle-search', self.on_toolbar_toggle_search)
self._toolbar.connect('update', self.on_toolbar_update) #self._toolbar.connect('update', self.on_toolbar_update)
self._toolbar.connect('start-scale', self.on_toolbar_scale) #self._toolbar.connect('start-scale', self.on_toolbar_scale)
self._toolbar.connect('end-scale', self.on_toolbar_scaled) #self._toolbar.connect('end-scale', self.on_toolbar_scaled)
self._toolbar.connect('sort', self.on_toolbar_sort) #self._toolbar.connect('sort', self.on_toolbar_sort)
self._toolbar.connect('sort-type', self.on_toolbar_sort_type) #self._toolbar.connect('sort-type', self.on_toolbar_sort_type)
# Header bar # Header bar
self._headerbar_standalone = AlbumHeaderbar() self._headerbar_standalone = AlbumHeaderbar()
self._headerbar_standalone.connect('close', self.on_standalone_close_clicked) self._headerbar_standalone.connect('close', self.on_standalone_close_clicked)
# Progress Bar
self.progress_image.set_from_pixbuf(self._get_default_image())
# Library Grid: Model # Library Grid: Model
self._library_grid_model = Gio.ListStore() self._library_grid_model = Gio.ListStore()
self._library_grid_selection = Gtk.MultiSelection.new(self._library_grid_model) self._library_grid_selection = Gtk.MultiSelection.new(self._library_grid_model)
self._library_grid_filter = self._library_grid_selection
# Library Grid # Library Grid
self.library_grid.set_model(self._library_grid_filter) self.library_grid.set_model(self._library_grid_filter)
self.library_grid.set_pixbuf_column(0) # Toolbar menu
self.library_grid.set_text_column(-1) self.grid_scale.set_value(self._item_size)
self.library_grid.set_tooltip_column(1) self._toolbar_sort_buttons = {
SortOrder.ARTIST: self.sort_artist,
SortOrder.TITLE: self.sort_title,
SortOrder.YEAR: self.sort_year
}
def get_headerbar_standalone(self): def get_headerbar_standalone(self):
@ -121,7 +136,52 @@ class LibraryPanel(Adw.Bin):
self._is_selected = selected self._is_selected = selected
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_select_toggled(self, widget):
self.emit('select', widget.get_active())
#@Gtk.Template.Callback()
def on_search_toggled(self, widget):
self.emit('toggle-search', widget.get_active())
#@Gtk.Template.Callback()
def on_update_clicked(self, widget):
self.emit('update')
# FXME on_grid_scale_changed
#@Gtk.Template.Callback()
def on_grid_scale_change(self, widget, scroll, value):
self.emit('start-scale', value)
# FXME on_grid_scale_changed
#@Gtk.Template.Callback()
def on_grid_scale_changed(self, widget, event):
self.emit('end-scale', self.grid_scale.get_value())
self.toolbar_popover.popdown()
#@Gtk.Template.Callback()
def on_sort_toggled(self, widget):
if widget.get_active():
sort = [key for key, value in self._toolbar_sort_buttons.items() if value is widget][0]
self.emit('sort', sort)
#@Gtk.Template.Callback()
def on_sort_order_toggled(self, button):
if button.get_active():
sort_type = Gtk.SortType.DESCENDING
else:
sort_type = Gtk.SortType.ASCENDING
self.emit('sort-type', sort_type)
# FIXME on_resize()
#@Gtk.Template.Callback()
def on_resize(self, widget, event): def on_resize(self, widget, event):
new_allocation = (widget.get_allocation().width, widget.get_allocation().height) new_allocation = (widget.get_allocation().width, widget.get_allocation().height)
if new_allocation == self._allocation: if new_allocation == self._allocation:
@ -169,7 +229,7 @@ class LibraryPanel(Adw.Bin):
if size < range.get_lower() or size > range.get_upper(): if size < range.get_lower() or size > range.get_upper():
return return
self._item_size = size self._item_size = size
GObject.idle_add(self.library_grid.set_item_padding, size / 100) #GObject.idle_add(self.library_grid.set_item_padding, size / 100)
GObject.idle_add(self._set_widget_grid_size, self.library_grid, size, True) GObject.idle_add(self._set_widget_grid_size, self.library_grid, size, True)
@ -189,23 +249,24 @@ class LibraryPanel(Adw.Bin):
def on_toolbar_sort_type(self, widget, sort_type): def on_toolbar_sort_type(self, widget, sort_type):
self._sort_type = sort_type self._sort_type = sort_type
self._library_grid_model.set_sort_column_id(2, sort_type) #self._library_grid_model.set_sort_column_id(2, sort_type)
self.emit('sort-type-changed', sort_type) self.emit('sort-type-changed', sort_type)
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_filter_bar_notify(self, widget, value): def on_filter_bar_notify(self, widget, value):
if self.toolbar_search_bar.get_active() is not self.filter_bar.get_search_mode(): if self.toolbar_search_bar.get_active() is not self.filter_bar.get_search_mode():
self.toolbar_search_bar.set_active(self.filter_bar.get_search_mode()) self.toolbar_search_bar.set_active(self.filter_bar.get_search_mode())
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_filter_entry_changed(self, widget): def on_filter_entry_changed(self, widget):
self._filter_string = self.filter_entry.get_text() self._filter_string = self.filter_entry.get_text()
GObject.idle_add(self._library_grid_filter.refilter) GObject.idle_add(self._library_grid_filter.refilter)
@Gtk.Template.Callback() # FIXME on_library_grid_clicked()
#@Gtk.Template.Callback()
def on_library_grid_clicked(self, widget, path): def on_library_grid_clicked(self, widget, path):
# Get selected album # Get selected album
path = self._library_grid_filter.convert_path_to_child_path(path) path = self._library_grid_filter.convert_path_to_child_path(path)
@ -228,7 +289,8 @@ class LibraryPanel(Adw.Bin):
self.standalone_spinner.start() self.standalone_spinner.start()
@Gtk.Template.Callback() # FIXME on_library_grid_selection_changed()
#@Gtk.Template.Callback()
def on_library_grid_selection_changed(self, widget): def on_library_grid_selection_changed(self, widget):
self._selected_albums = [] self._selected_albums = []
for path in widget.get_selected_items(): for path in widget.get_selected_items():
@ -246,30 +308,31 @@ class LibraryPanel(Adw.Bin):
return album.filter(self._filter_string) return album.filter(self._filter_string)
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_selection_cancel_clicked(self, widget): def on_selection_cancel_clicked(self, widget):
self._toolbar.exit_selection() self.select_button.set_active(False)
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_selection_add_clicked(self, widget): def on_selection_add_clicked(self, widget):
ids = [album.get_id() for album in self._selected_albums] ids = [album.get_id() for album in self._selected_albums]
self.emit('queue-multiple', ids) self.emit('queue-multiple', ids)
self._toolbar.exit_selection() self.select_button.set_active(False)
@Gtk.Template.Callback() # FIXME on_standalone_scroll_size_allocate()
#@Gtk.Template.Callback()
def on_standalone_scroll_size_allocate(self, widget, allocation): def on_standalone_scroll_size_allocate(self, widget, allocation):
self._resize_standalone_image() self._resize_standalone_image()
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_standalone_play_clicked(self, widget): def on_standalone_play_clicked(self, widget):
self.emit('play', self._selected_albums[0].get_id()) self.emit('play', self._selected_albums[0].get_id())
self._close_standalone() self._close_standalone()
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_standalone_queue_clicked(self, widget): def on_standalone_queue_clicked(self, widget):
self.emit('queue', self._selected_albums[0].get_id()) self.emit('queue', self._selected_albums[0].get_id())
self._close_standalone() self._close_standalone()
@ -373,6 +436,7 @@ class LibraryPanel(Adw.Bin):
def _set_albums(self, host, albums, size): def _set_albums(self, host, albums, size):
"""
if not self._is_selected and albums != self._albums: if not self._is_selected and albums != self._albums:
GObject.idle_add( GObject.idle_add(
self.get_parent().child_set_property, self.get_parent().child_set_property,
@ -380,15 +444,16 @@ class LibraryPanel(Adw.Bin):
'needs-attention', 'needs-attention',
True True
) )
"""
self._library_lock.acquire() self._library_lock.acquire()
self._library_stop.clear() self._library_stop.clear()
self._albums = albums self._albums = albums
GObject.idle_add(self.stack.set_visible_child, self.progress_box) GObject.idle_add(self.stack.set_visible_child, self.progress_box)
GObject.idle_add(self.progress_bar.set_fraction, 0.0) GObject.idle_add(self.progress_bar.set_fraction, 0.0)
GObject.idle_add(self.library_grid.set_item_padding, size / 100) #GObject.idle_add(self.library_grid.set_item_padding, size / 100)
self.library_grid.set_model(None) self.library_grid.set_model(None)
self.library_grid.freeze_child_notify() #self.library_grid.freeze_child_notify()
self._library_grid_model.clear() self._library_grid_model.remove_all()
i = 0 i = 0
n = len(albums) n = len(albums)
@ -425,8 +490,8 @@ class LibraryPanel(Adw.Bin):
return return
self.library_grid.set_model(self._library_grid_filter) self.library_grid.set_model(self._library_grid_filter)
self.library_grid.thaw_child_notify() #self.library_grid.thaw_child_notify()
self.library_grid.set_item_width(-1) #self.library_grid.set_item_width(-1)
self._library_lock.release() self._library_lock.release()
self.stack.set_visible_child(self.scroll) self.stack.set_visible_child(self.scroll)

View file

@ -28,7 +28,10 @@ class PlaylistPanel(Adw.Bin):
'remove-album': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), 'remove-album': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
'remove-multiple-albums': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), 'remove-multiple-albums': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
'play': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), 'play': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
'albumart': (GObject.SIGNAL_RUN_FIRST, None, (str,)) 'albumart': (GObject.SIGNAL_RUN_FIRST, None, (str,)),
'select': (GObject.SIGNAL_RUN_FIRST, None, (bool,)),
'clear-playlist': (GObject.SIGNAL_RUN_FIRST, None, ())
} }
@ -66,9 +69,9 @@ class PlaylistPanel(Adw.Bin):
self._is_selected = False self._is_selected = False
# Widgets # Widgets
self._toolbar = PlaylistToolbar() # FIXME Toolbar signals
self._toolbar.connect('select', self.on_toolbar_select) #self._toolbar.connect('select', self.on_toolbar_select)
self._toolbar.connect('clear-playlist', self.on_toolbar_clear) #self._toolbar.connect('clear-playlist', self.on_toolbar_clear)
# Header bar # Header bar
self._headerbar_standalone = AlbumHeaderbar() self._headerbar_standalone = AlbumHeaderbar()
self._headerbar_standalone.connect('close', self.on_headerbar_close_clicked) self._headerbar_standalone.connect('close', self.on_headerbar_close_clicked)
@ -106,6 +109,19 @@ class PlaylistPanel(Adw.Bin):
self.emit('clear-playlist') self.emit('clear-playlist')
# FIXME on_select_toggled()
#@Gtk.Template.Callback()
def on_select_toggled(self, widget):
self.emit('select', widget.get_active())
# FIXME on_clear_clicked()
#@Gtk.Template.Callback()
def on_clear_clicked(self, widget):
if widget is self.playlist_clear_button:
self.emit('clear-playlist')
@Gtk.Template.Callback() @Gtk.Template.Callback()
def on_playlist_grid_clicked(self, widget, position): def on_playlist_grid_clicked(self, widget, position):
# Get selected album # Get selected album
@ -115,7 +131,8 @@ class PlaylistPanel(Adw.Bin):
self._selected_albums = [album] self._selected_albums = [album]
self.emit('albumart', id) self.emit('albumart', id)
# Show standalone album # FIXME Show standalone album
return
if widget.get_selection_mode() == Gtk.SelectionMode.SINGLE: if widget.get_selection_mode() == Gtk.SelectionMode.SINGLE:
# Set labels # Set labels
self._headerbar_standalone.set_album(album) self._headerbar_standalone.set_album(album)
@ -128,7 +145,8 @@ class PlaylistPanel(Adw.Bin):
self.standalone_spinner.start() self.standalone_spinner.start()
@Gtk.Template.Callback() # FIXME on_playlist_grid_selection_changed()
#@Gtk.Template.Callback()
def on_playlist_grid_selection_changed(self, widget): def on_playlist_grid_selection_changed(self, widget):
self._selected_albums = [] self._selected_albums = []
for path in widget.get_selected_items(): for path in widget.get_selected_items():
@ -137,18 +155,19 @@ class PlaylistPanel(Adw.Bin):
self._selected_albums.append(self._playlist_albums[hash]) self._selected_albums.append(self._playlist_albums[hash])
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_selection_cancel_clicked(self, widget): def on_selection_cancel_clicked(self, widget):
self._toolbar.exit_selection() self.select_button.set_active(False)
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_selection_remove_clicked(self, widget): def on_selection_remove_clicked(self, widget):
self.emit('remove-multiple-albums', self._selected_albums) self.emit('remove-multiple-albums', self._selected_albums)
self._toolbar.exit_selection() self.select_button.set_active(False)
@Gtk.Template.Callback() # FIXME on_standalone_scroll_size_allocate()
#@Gtk.Template.Callback()
def on_standalone_scroll_size_allocate(self, widget, allocation): def on_standalone_scroll_size_allocate(self, widget, allocation):
self._resize_standalone_image() self._resize_standalone_image()
@ -157,13 +176,13 @@ class PlaylistPanel(Adw.Bin):
self._close_standalone() self._close_standalone()
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_standalone_remove_clicked(self, widget): def on_standalone_remove_clicked(self, widget):
self.emit('remove-album', self._selected_albums[0]) self.emit('remove-album', self._selected_albums[0])
self._close_standalone() self._close_standalone()
@Gtk.Template.Callback() #@Gtk.Template.Callback()
def on_standalone_play_clicked(self, widget): def on_standalone_play_clicked(self, widget):
self.emit('play', self._selected_albums[0]) self.emit('play', self._selected_albums[0])
self._close_standalone() self._close_standalone()
@ -205,6 +224,7 @@ class PlaylistPanel(Adw.Bin):
def _set_playlist(self, host, playlist, size): def _set_playlist(self, host, playlist, size):
"""
if not self._is_selected and self._playlist != playlist: if not self._is_selected and self._playlist != playlist:
GObject.idle_add( GObject.idle_add(
self.get_parent().child_set_property, self.get_parent().child_set_property,
@ -212,6 +232,7 @@ class PlaylistPanel(Adw.Bin):
'needs-attention', 'needs-attention',
True True
) )
"""
self._playlist_lock.acquire() self._playlist_lock.acquire()
self._playlist_stop.clear() self._playlist_stop.clear()
self._playlist = playlist self._playlist = playlist
@ -219,6 +240,8 @@ class PlaylistPanel(Adw.Bin):
for album in playlist: for album in playlist:
self._playlist_albums[album.get_id()] = album self._playlist_albums[album.get_id()] = album
self._playlist_grid_model.remove_all() self._playlist_grid_model.remove_all()
# FIXME Set item padding dynamically?
#GObject.idle_add(self.playlist_grid.set_item_padding, size / 100)
cache = client.MCGCache(host, size) cache = client.MCGCache(host, size)
for album in playlist: for album in playlist:
@ -248,8 +271,6 @@ class PlaylistPanel(Adw.Bin):
return return
self.playlist_grid.set_model(self._playlist_grid_selection) self.playlist_grid.set_model(self._playlist_grid_selection)
# TODO why set_columns()?
#self.playlist_grid.set_columns(len(playlist))
self._playlist_lock.release() self._playlist_lock.release()

View file

@ -15,7 +15,7 @@ import logging
from gi.repository import Gtk, Adw, Gdk, GObject, GLib, Gio from gi.repository import Gtk, Adw, Gdk, GObject, GLib, Gio
from . import client from . import client
from .shortcutsdialog import ShortcutsDialog #from .shortcutsdialog import ShortcutsDialog
from .connectionpanel import ConnectionPanel from .connectionpanel import ConnectionPanel
from .serverpanel import ServerPanel from .serverpanel import ServerPanel
from .coverpanel import CoverPanel from .coverpanel import CoverPanel
@ -64,9 +64,9 @@ class Window(Adw.ApplicationWindow):
toolbar_stack = Gtk.Template.Child() toolbar_stack = Gtk.Template.Child()
# Headerbar # Headerbar
headerbar = Gtk.Template.Child() headerbar = Gtk.Template.Child()
headerbar_title_stack = Gtk.Template.Child() #headerbar_title_stack = Gtk.Template.Child()
headerbar_panel_switcher = Gtk.Template.Child() headerbar_panel_switcher = Gtk.Template.Child()
headerbar_connection_label = Gtk.Template.Child() #headerbar_connection_label = Gtk.Template.Child()
headerbar_button_connect = Gtk.Template.Child() headerbar_button_connect = Gtk.Template.Child()
headerbar_button_playpause = Gtk.Template.Child() headerbar_button_playpause = Gtk.Template.Child()
headerbar_button_volume = Gtk.Template.Child() headerbar_button_volume = Gtk.Template.Child()
@ -86,12 +86,11 @@ class Window(Adw.ApplicationWindow):
self._headerbar_connection_button_active = True self._headerbar_connection_button_active = True
self._headerbar_playpause_button_active = True self._headerbar_playpause_button_active = True
# Help/Shortcuts dialog # FIXME Help/Shortcuts dialog
self.set_help_overlay(ShortcutsDialog()) #self.set_help_overlay(ShortcutsDialog())
# Login screen # Login screen
self._connection_panel = ConnectionPanel() self._connection_panel = ConnectionPanel()
self._panels.append(self._connection_panel)
# Server panel # Server panel
self._server_panel = ServerPanel() self._server_panel = ServerPanel()
self._panels.append(self._server_panel) self._panels.append(self._server_panel)
@ -100,13 +99,13 @@ class Window(Adw.ApplicationWindow):
self._panels.append(self._cover_panel) self._panels.append(self._cover_panel)
# Playlist panel # Playlist panel
self._playlist_panel = PlaylistPanel(self._mcg) self._playlist_panel = PlaylistPanel(self._mcg)
self._playlist_panel.connect('open-standalone', self.on_panel_open_standalone) #self._playlist_panel.connect('open-standalone', self.on_panel_open_standalone)
self._playlist_panel.connect('close-standalone', self.on_panel_close_standalone) #self._playlist_panel.connect('close-standalone', self.on_panel_close_standalone)
self._panels.append(self._playlist_panel) self._panels.append(self._playlist_panel)
# Library panel # Library panel
self._library_panel = LibraryPanel(self._mcg) self._library_panel = LibraryPanel(self._mcg)
self._library_panel.connect('open-standalone', self.on_panel_open_standalone) #self._library_panel.connect('open-standalone', self.on_panel_open_standalone)
self._library_panel.connect('close-standalone', self.on_panel_close_standalone) #self._library_panel.connect('close-standalone', self.on_panel_close_standalone)
self._panels.append(self._library_panel) self._panels.append(self._library_panel)
# Stack # Stack
self.content_stack.add_child(self._connection_panel) self.content_stack.add_child(self._connection_panel)
@ -115,8 +114,8 @@ class Window(Adw.ApplicationWindow):
self.panel_stack.add_titled(self._playlist_panel, 'playlist-panel', locale.gettext("Playlist")) self.panel_stack.add_titled(self._playlist_panel, 'playlist-panel', locale.gettext("Playlist"))
self.panel_stack.add_titled(self._library_panel, 'library-panel', locale.gettext("Library")) self.panel_stack.add_titled(self._library_panel, 'library-panel', locale.gettext("Library"))
# Header # Header
self._playlist_panel.get_headerbar_standalone().connect('close', self.on_panel_close_standalone) #self._playlist_panel.get_headerbar_standalone().connect('close', self.on_panel_close_standalone)
self._library_panel.get_headerbar_standalone().connect('close', self.on_panel_close_standalone) #self._library_panel.get_headerbar_standalone().connect('close', self.on_panel_close_standalone)
# Toolbar stack # Toolbar stack
self.toolbar_stack.add_child(self._server_panel.get_toolbar()) self.toolbar_stack.add_child(self._server_panel.get_toolbar())
self.toolbar_stack.add_child(self._cover_panel.get_toolbar()) self.toolbar_stack.add_child(self._cover_panel.get_toolbar())
@ -291,13 +290,13 @@ class Window(Adw.ApplicationWindow):
self._save_visible_panel() self._save_visible_panel()
self._set_menu_visible_panel() self._set_menu_visible_panel()
for panel in self._panels: for panel in self._panels:
GObject.idle_add(
self.panel_stack.child_set_property,
self.panel_stack.get_visible_child(),
'needs-attention',
False
)
panel.set_selected(panel == self.panel_stack.get_visible_child()) panel.set_selected(panel == self.panel_stack.get_visible_child())
#GObject.idle_add(
# self.panel_stack.child_set_property,
# self.panel_stack.get_visible_child(),
# 'needs-attention',
# False
#)
def on_panel_open_standalone(self, panel): def on_panel_open_standalone(self, panel):
self.set_titlebar(panel.get_headerbar_standalone()) self.set_titlebar(panel.get_headerbar_standalone())
@ -466,6 +465,8 @@ class Window(Adw.ApplicationWindow):
def on_mcg_custom(self, name): def on_mcg_custom(self, name):
pass
"""
if name == Window._CUSTOM_STARTUP_COMPLETE: if name == Window._CUSTOM_STARTUP_COMPLETE:
for panel in self._panels: for panel in self._panels:
GObject.idle_add( GObject.idle_add(
@ -474,6 +475,7 @@ class Window(Adw.ApplicationWindow):
'needs-attention', 'needs-attention',
False False
) )
"""
def on_mcg_error(self, error): def on_mcg_error(self, error):