Skip to content

Commit b964052

Browse files
committed
MainWindow: replace ListBox with ListView
1 parent 69025e4 commit b964052

File tree

1 file changed

+46
-24
lines changed

1 file changed

+46
-24
lines changed

src/MainWindow.vala

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
*/
55

66
public 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

Comments
 (0)