From 2d1ddd5a357c09cec73e3f011eda69e1f43e138c Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 20 Jan 2016 09:16:01 -0500 Subject: [PATCH] gui/view: Load a track when treeview is double clicked And remove this feature from the C++ code. Signed-off-by: Anna Schumaker --- gui/queue/window.cpp | 17 ----------------- gui/view.c | 33 +++++++++++++++++++++++++++++++++ include/gui/queue/window.h | 2 -- share/ocarina/ocarina6.glade | 1 + tests/gui/view.c | 25 ++++++++++++++++++++++++- 5 files changed, 58 insertions(+), 20 deletions(-) diff --git a/gui/queue/window.cpp b/gui/queue/window.cpp index f8dda1d2..b8f11276 100644 --- a/gui/queue/window.cpp +++ b/gui/queue/window.cpp @@ -22,11 +22,8 @@ QueueWindow :: ~QueueWindow() void QueueWindow :: init(queue *queue) { - _queue = queue; GtkTreeModel *model = GTK_TREE_MODEL(gui_queue(queue)->gq_model); - q_treeview->signal_row_activated().connect(sigc::mem_fun(*this, - &QueueWindow :: on_row_activated)); q_treeview->signal_key_press_event().connect(sigc::mem_fun(*this, &QueueWindow :: on_key_press), false); gtk_tree_view_set_model(q_treeview->gobj(), model); @@ -39,17 +36,3 @@ bool QueueWindow :: on_key_press(GdkEventKey *event) return true; return false; } - -void QueueWindow :: on_row_activated(const Gtk::TreePath &path, - Gtk::TreeViewColumn *col) -{ - GtkTreePath *real = path.gobj_copy(); - struct track *track = gui_queue_model_path_get_track( - gui_queue(_queue)->gq_model, real); - - audio_load(track); - queue_selected(_queue, gtk_tree_path_get_indices(real)[0]); - audio_play(); - - gtk_tree_path_free(real); -} diff --git a/gui/view.c b/gui/view.c index 32764984..76eeeb8e 100644 --- a/gui/view.c +++ b/gui/view.c @@ -1,6 +1,7 @@ /* * Copyright 2016 (c) Anna Schumaker. */ +#include #include #include #include @@ -21,6 +22,37 @@ static const gchar *QUEUE_SETTINGS[Q_MODEL_N_COLUMNS] = { }; static GtkTreeView *view_treeview = NULL; +static GtkTreeModelFilter *view_filter = NULL; + +static inline GuiQueueModel *__view_filter_get_model() +{ + if (view_filter == NULL) + return NULL; + return GUI_QUEUE_MODEL(gtk_tree_model_filter_get_model(view_filter)); +} + +static inline GtkTreePath *__view_filter_convert_path(GtkTreePath *orig) +{ + return gtk_tree_model_filter_convert_path_to_child_path(view_filter, orig); +} + +static struct track *__view_filter_get_track(GtkTreePath *orig) +{ + GuiQueueModel *model = __view_filter_get_model(); + GtkTreePath *real = __view_filter_convert_path(orig); + struct track *track = gui_queue_model_path_get_track(model, real); + + gtk_tree_path_free(real); + return track; +} + +void __view_row_activated(GtkTreeView *treeview, GtkTreePath *path, + GtkTreeViewColumn *col, gpointer data) +{ + audio_load(__view_filter_get_track(path)); + queue_selected(__view_filter_get_model()->gqm_queue, + gtk_tree_path_get_indices(path)[0]); +} void __view_column_resized(GtkTreeViewColumn *col, GParamSpec *pspec, gpointer data) @@ -53,5 +85,6 @@ void gui_view_init() void gui_view_set_model(GtkTreeModelFilter *filter) { + view_filter = filter; gtk_tree_view_set_model(view_treeview, GTK_TREE_MODEL(filter)); } diff --git a/include/gui/queue/window.h b/include/gui/queue/window.h index 6d2539d5..e8c69b3a 100644 --- a/include/gui/queue/window.h +++ b/include/gui/queue/window.h @@ -13,7 +13,6 @@ extern "C" { class QueueWindow : public Gtk::ScrolledWindow { public: Glib::RefPtr _builder; - queue *_queue; Gtk::TreeView *q_treeview; @@ -22,7 +21,6 @@ public: void init(queue *); bool on_key_press(GdkEventKey *); - void on_row_activated(const Gtk::TreePath &, Gtk::TreeViewColumn *); }; #endif /* OCARINA_GUI_QUEUE_WINDOW_H */ diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade index cf70c503..565eb8b3 100644 --- a/share/ocarina/ocarina6.glade +++ b/share/ocarina/ocarina6.glade @@ -1110,6 +1110,7 @@ False True 9 + multiple diff --git a/tests/gui/view.c b/tests/gui/view.c index 04ebfc88..159c0d7d 100644 --- a/tests/gui/view.c +++ b/tests/gui/view.c @@ -7,6 +7,7 @@ #define TEST_NEED_QUEUE #define TEST_NEED_SIDEBAR #define TEST_NEED_WINDOW +#include #include #include #include @@ -31,7 +32,21 @@ const gchar *QUEUE_SETTINGS[Q_MODEL_N_COLUMNS] = { }; GMainLoop *main_loop; -struct core_init_data init_data; +unsigned int load_count = 0; + +static void test_load(struct track *track) { load_count++; } +static void test_state_change(GstState state) {} +static void test_config_pause(int count) {} + +struct audio_ops audio_ops = { + .on_load = test_load, + .on_state_change = test_state_change, + .on_config_pause = test_config_pause, +}; + +struct core_init_data init_data = { + .audio_ops = &audio_ops, +}; static int test_on_idle(gpointer data) { @@ -44,6 +59,8 @@ static void test_treeview() GtkTreeModel *model, *filter; GtkTreeViewColumn *col; GtkTreeView *treeview; + GtkTreePath *path; + GtkTreeIter iter; unsigned int i; int argc = 0; @@ -96,6 +113,12 @@ static void test_treeview() gui_view_set_model(GTK_TREE_MODEL_FILTER(filter)); test_equal((void *)gtk_tree_view_get_model(treeview), (void *)filter); + gtk_tree_model_iter_nth_child(filter, &iter, NULL, 3); + path = gtk_tree_model_get_path(filter, &iter); + gtk_tree_view_row_activated(treeview, path, NULL); + test_equal(load_count, 1); + gtk_tree_path_free(path); + gui_view_set_model(NULL); test_equal((void *)gtk_tree_view_get_model(treeview), NULL); }