44 */
55
66public class Music.MainWindow : Gtk .ApplicationWindow {
7+ private Granite . Placeholder queue_placeholder;
78 private Gtk . Button repeat_button;
89 private Gtk . Button shuffle_button;
9- private Settings settings;
10- private Gtk . SearchEntry search_entry;
10+ private Gtk . ListView queue_listview;
1111 private Gtk . Revealer search_revealer;
12+ private Gtk . ScrolledWindow scrolled;
13+ private Gtk . SearchEntry search_entry;
14+ private Gtk . SingleSelection selection_model;
15+ private Gtk . Stack queue_stack;
16+ private Settings settings;
1217
1318 construct {
1419 var playback_manager = PlaybackManager . get_default ();
@@ -42,22 +47,29 @@ public class Music.MainWindow : Gtk.ApplicationWindow {
4247 queue_header.pack_end (shuffle_button );
4348 queue_header.pack_end (repeat_button );
4449
45- var queue_placeholder = new Granite .Placeholder (_(" Queue is Empty" )) {
50+ queue_placeholder = new Granite .Placeholder (_(" Queue is Empty" )) {
4651 description = _ ("Audio files opened from Files will appear here "),
4752 icon = new ThemedIcon ("playlist -queue ")
4853 };
4954
50- var queue_listbox = new Gtk .ListBox () {
55+ selection_model = new Gtk .SingleSelection (playback_manager. queue_liststore);
56+
57+ var factory = new Gtk .SignalListItemFactory ();
58+
59+ queue_listview = new Gtk .ListView (selection_model, factory) {
60+ single_click_activate = true ,
5161 hexpand = true ,
5262 vexpand = true
5363 };
54- queue_listbox.bind_model (playback_manager .queue_liststore , create_queue_row );
55- queue_listbox.set_placeholder (queue_placeholder );
5664
57- var scrolled = new Gtk .ScrolledWindow () {
58- child = queue_listbox
65+ scrolled = new Gtk .ScrolledWindow () {
66+ child = queue_listview
5967 };
6068
69+ queue_stack = new Gtk .Stack ();
70+ queue_stack.add_child (queue_placeholder );
71+ queue_stack.add_child (scrolled );
72+
6173 var drop_target = new Gtk .DropTarget (typeof (Gdk . FileList ), Gdk . DragAction . COPY );
6274
6375 var add_button_label = new Gtk .Label (_(" Open Files…" ));
@@ -78,7 +90,7 @@ public class Music.MainWindow : Gtk.ApplicationWindow {
7890
7991 var queue = new Adw .ToolbarView () {
8092 bottom_bar_style = RAISED ,
81- content = scrolled
93+ content = queue_stack
8294 };
8395 queue.add_controller (drop_target );
8496 queue.add_css_class (Granite .STYLE_CLASS_VIEW );
@@ -181,25 +193,34 @@ public class Music.MainWindow : Gtk.ApplicationWindow {
181193 }
182194 });
183195
184- queue_listbox.row_activated.connect ((row ) => {
185- playback_manager. current_audio = ((TrackRow ) row). audio_object;
196+ factory.setup.connect ((obj ) => {
197+ var list_item = (Gtk . ListItem ) obj;
198+ list_item. child = new TrackRow ();
186199 });
187200
201+ factory.bind.connect ((obj ) => {
202+ var list_item = (Gtk . ListItem ) obj;
203+ ((TrackRow ) list_item. child). audio_object = (AudioObject ) list_item. item;
204+ });
205+
206+ queue_listview.activate.connect ((index ) => {
207+ playback_manager. current_audio = (AudioObject ) selection_model. get_item (index);
208+ });
209+
210+ selection_model.items_changed.connect (on_items_changed );
211+
188212 search_entry.search_changed.connect (() => {
189213 int pos = playback_manager. find_title (search_entry. text);
190214 if (pos >= 0 ) {
191- queue_listbox. select_row (queue_listbox. get_row_at_index (pos));
192- var adj = scrolled. vadjustment;
193- // Search entry is hidden if n_items is zero so no need to check
194- var ratio = (double )pos / (double )playback_manager. n_items;
195- adj. @value = adj. upper * ratio;
215+ queue_listview. scroll_to (pos, SELECT , null );
196216 }
197217 });
198218
199219 search_entry.activate.connect (() => {
200- var selected = queue_listbox. get_selected_row ();
201- if (selected != null ) {
202- selected. activate ();
220+ var selected = selection_model. get_selected ();
221+ if (selected != - 1 ) {
222+ var selected_audio = (AudioObject ) selection_model. get_item (selected);
223+ playback_manager. current_audio = selected_audio;
203224 }
204225 });
205226 }
@@ -281,10 +302,11 @@ public class Music.MainWindow : Gtk.ApplicationWindow {
281302 }
282303 }
283304
284- private Gtk .Widget create_queue_row (GLib .Object object ) {
285- unowned var audio_object = (AudioObject ) object ;
286- return new TrackRow () {
287- audio_object = audio_object
288- };
305+ private void on_items_changed () {
306+ if (selection_model. n_items > 0 ) {
307+ queue_stack. visible_child = scrolled;
308+ } else {
309+ queue_stack. visible_child = queue_placeholder;
310+ }
289311 }
290312}
0 commit comments