|
4 | 4 | */ |
5 | 5 |
|
6 | 6 | public class Music.MainWindow : Gtk.ApplicationWindow { |
| 7 | + private Granite.Placeholder queue_placeholder; |
7 | 8 | private Gtk.Button repeat_button; |
8 | 9 | private Gtk.Button shuffle_button; |
9 | | - private Settings settings; |
10 | | - private Gtk.SearchEntry search_entry; |
| 10 | + private Gtk.ListView queue_listview; |
11 | 11 | 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; |
12 | 17 |
|
13 | 18 | construct { |
14 | 19 | var playback_manager = PlaybackManager.get_default (); |
@@ -42,22 +47,29 @@ public class Music.MainWindow : Gtk.ApplicationWindow { |
42 | 47 | queue_header.pack_end (shuffle_button); |
43 | 48 | queue_header.pack_end (repeat_button); |
44 | 49 |
|
45 | | - var queue_placeholder = new Granite.Placeholder (_("Queue is Empty")) { |
| 50 | + queue_placeholder = new Granite.Placeholder (_("Queue is Empty")) { |
46 | 51 | description = _("Audio files opened from Files will appear here"), |
47 | 52 | icon = new ThemedIcon ("playlist-queue") |
48 | 53 | }; |
49 | 54 |
|
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, |
51 | 61 | hexpand = true, |
52 | 62 | vexpand = true |
53 | 63 | }; |
54 | | - queue_listbox.bind_model (playback_manager.queue_liststore, create_queue_row); |
55 | | - queue_listbox.set_placeholder (queue_placeholder); |
56 | 64 |
|
57 | | - var scrolled = new Gtk.ScrolledWindow () { |
58 | | - child = queue_listbox |
| 65 | + scrolled = new Gtk.ScrolledWindow () { |
| 66 | + child = queue_listview |
59 | 67 | }; |
60 | 68 |
|
| 69 | + queue_stack = new Gtk.Stack (); |
| 70 | + queue_stack.add_child (queue_placeholder); |
| 71 | + queue_stack.add_child (scrolled); |
| 72 | + |
61 | 73 | var drop_target = new Gtk.DropTarget (typeof (Gdk.FileList), Gdk.DragAction.COPY); |
62 | 74 |
|
63 | 75 | var add_button_label = new Gtk.Label (_("Open Files…")); |
@@ -98,7 +110,7 @@ public class Music.MainWindow : Gtk.ApplicationWindow { |
98 | 110 |
|
99 | 111 | var queue = new Adw.ToolbarView () { |
100 | 112 | bottom_bar_style = RAISED, |
101 | | - content = scrolled |
| 113 | + content = queue_stack |
102 | 114 | }; |
103 | 115 | queue.add_controller (drop_target); |
104 | 116 | queue.add_css_class (Granite.STYLE_CLASS_VIEW); |
@@ -201,25 +213,39 @@ public class Music.MainWindow : Gtk.ApplicationWindow { |
201 | 213 | } |
202 | 214 | }); |
203 | 215 |
|
204 | | - queue_listbox.row_activated.connect ((row) => { |
205 | | - playback_manager.current_audio = ((TrackRow) row).audio_object; |
| 216 | + factory.setup.connect ((obj) => { |
| 217 | + var list_item = (Gtk.ListItem) obj; |
| 218 | + list_item.child = new TrackRow (); |
| 219 | + }); |
| 220 | + |
| 221 | + factory.bind.connect ((obj) => { |
| 222 | + var list_item = (Gtk.ListItem) obj; |
| 223 | + ((TrackRow) list_item.child).audio_object = (AudioObject) list_item.item; |
| 224 | + }); |
| 225 | + |
| 226 | + factory.unbind.connect ((obj) => { |
| 227 | + var list_item = (Gtk.ListItem) obj; |
| 228 | + ((TrackRow) list_item.child).audio_object = null; |
| 229 | + }); |
| 230 | + |
| 231 | + queue_listview.activate.connect ((index) => { |
| 232 | + playback_manager.current_audio = (AudioObject) selection_model.get_item (index); |
206 | 233 | }); |
207 | 234 |
|
| 235 | + selection_model.items_changed.connect (on_items_changed); |
| 236 | + |
208 | 237 | search_entry.search_changed.connect (() => { |
209 | 238 | int pos = playback_manager.find_title (search_entry.text); |
210 | 239 | if (pos >= 0) { |
211 | | - queue_listbox.select_row (queue_listbox.get_row_at_index (pos)); |
212 | | - var adj = scrolled.vadjustment; |
213 | | - // Search entry is hidden if n_items is zero so no need to check |
214 | | - var ratio = (double)pos / (double)playback_manager.n_items; |
215 | | - adj.@value = adj.upper * ratio; |
| 240 | + queue_listview.scroll_to (pos, SELECT, null); |
216 | 241 | } |
217 | 242 | }); |
218 | 243 |
|
219 | 244 | search_entry.activate.connect (() => { |
220 | | - var selected = queue_listbox.get_selected_row (); |
221 | | - if (selected != null) { |
222 | | - selected.activate (); |
| 245 | + var selected = selection_model.get_selected (); |
| 246 | + if (selected != -1) { |
| 247 | + var selected_audio = (AudioObject) selection_model.get_item (selected); |
| 248 | + playback_manager.current_audio = selected_audio; |
223 | 249 | } |
224 | 250 | }); |
225 | 251 | } |
@@ -301,10 +327,11 @@ public class Music.MainWindow : Gtk.ApplicationWindow { |
301 | 327 | } |
302 | 328 | } |
303 | 329 |
|
304 | | - private Gtk.Widget create_queue_row (GLib.Object object) { |
305 | | - unowned var audio_object = (AudioObject) object; |
306 | | - return new TrackRow () { |
307 | | - audio_object = audio_object |
308 | | - }; |
| 330 | + private void on_items_changed () { |
| 331 | + if (selection_model.n_items > 0) { |
| 332 | + queue_stack.visible_child = scrolled; |
| 333 | + } else { |
| 334 | + queue_stack.visible_child = queue_placeholder; |
| 335 | + } |
309 | 336 | } |
310 | 337 | } |
0 commit comments