diff --git a/gui/model.c b/gui/model.c index 9add5754..6afdf0e7 100644 --- a/gui/model.c +++ b/gui/model.c @@ -7,12 +7,11 @@ #include #include -static const GInterfaceInfo gui_tree_model; -static const GTypeInfo gui_model_type_info; +static gboolean __gui_model_iter_nth_child(GtkTreeModel *, GtkTreeIter *, + GtkTreeIter *, gint); + static GObjectClass *parent_class = NULL; static GuiModel *queue_model = NULL; -static gchar *font_current = "bold"; -static gchar *font_regular = ""; static GType gui_model_columns[GUI_MODEL_N_COLUMNS] = { [GUI_MODEL_TRACK_NR] = G_TYPE_UINT, @@ -28,19 +27,6 @@ static GType gui_model_columns[GUI_MODEL_N_COLUMNS] = { [GUI_MODEL_FONT] = G_TYPE_STRING, }; -static gboolean __gui_model_iter_nth(GuiModel *model, GtkTreeIter *iter, gint n) -{ - if (!model->gm_queue || n >= queue_size(model->gm_queue)) - return FALSE; - - queue_iter_set(model->gm_queue, &model->gm_iter, n); - iter->stamp = model->gm_stamp; - iter->user_data = &model->gm_iter; - iter->user_data2 = queue_iter_val(&model->gm_iter); - return TRUE; -} - - static GtkTreeModelFlags __gui_model_get_flags(GtkTreeModel *model) { return GTK_TREE_MODEL_LIST_ONLY; @@ -53,8 +39,8 @@ static gint __gui_model_get_n_columns(GtkTreeModel *model) static GType __gui_model_get_column_type(GtkTreeModel *model, gint index) { - g_return_val_if_fail(index >= 0 && index < GUI_MODEL_N_COLUMNS, - G_TYPE_INVALID); + g_return_val_if_fail(index >= 0, G_TYPE_INVALID); + g_return_val_if_fail(index < GUI_MODEL_N_COLUMNS, G_TYPE_INVALID); return gui_model_columns[index]; } @@ -67,7 +53,7 @@ static gboolean __gui_model_get_iter(GtkTreeModel *model, GtkTreeIter *iter, indices = gtk_tree_path_get_indices_with_depth(path, &depth); g_assert(depth == 1); - return __gui_model_iter_nth(GUI_MODEL(model), iter, indices[0]); + return __gui_model_iter_nth_child(model, iter, NULL, indices[0]); } static GtkTreePath *__gui_model_get_path(GtkTreeModel *model, GtkTreeIter *iter) @@ -131,8 +117,8 @@ static void __gui_model_get_value(GtkTreeModel *model, GtkTreeIter *iter, g_free(str); break; case GUI_MODEL_FONT: - str = (track == audio_cur_track()) ? font_current : font_regular; - g_value_set_static_string(value, str); + str = (track == audio_cur_track()) ? "bold" : ""; + g_value_take_string(value, g_strdup(str)); break; } } @@ -158,9 +144,7 @@ static gboolean __gui_model_iter_next(GtkTreeModel *model, GtkTreeIter *iter) static gboolean __gui_model_iter_children(GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent) { - if (parent) - return FALSE; - return __gui_model_iter_nth(GUI_MODEL(model), iter, 0); + return __gui_model_iter_nth_child(model, iter, parent, 0); } static gboolean __gui_model_iter_has_child(GtkTreeModel *model, GtkTreeIter *iter) @@ -180,9 +164,15 @@ static gboolean __gui_model_iter_nth_child(GtkTreeModel *model, GtkTreeIter *parent, gint n) { - if (parent) + if (parent || !queue_model->gm_queue || + n >= queue_size(queue_model->gm_queue)) return FALSE; - return __gui_model_iter_nth(GUI_MODEL(model), iter, n); + + queue_iter_set(queue_model->gm_queue, &queue_model->gm_iter, n); + iter->stamp = queue_model->gm_stamp; + iter->user_data = &queue_model->gm_iter; + iter->user_data2 = queue_iter_val(&queue_model->gm_iter); + return TRUE; } static gboolean __gui_model_iter_parent(GtkTreeModel *model, GtkTreeIter *iter, @@ -203,12 +193,10 @@ static void __gui_model_finalize(GObject *object) static void __gui_model_class_init(GuiModelClass *class) { - GObjectClass *object_class; - - parent_class = g_type_class_peek_parent(class); - object_class = (GObjectClass *)class; + GObjectClass *object_class = (GObjectClass *)class; object_class->finalize = __gui_model_finalize; + parent_class = g_type_class_peek_parent(class); } static void __gui_tree_model_init(GtkTreeModelIface *iface) @@ -227,6 +215,24 @@ static void __gui_tree_model_init(GtkTreeModelIface *iface) iface->iter_parent = __gui_model_iter_parent; } +static const GTypeInfo gui_model_type_info = { + .class_size = sizeof(GuiModelClass), + .base_init = NULL, + .base_finalize = NULL, + .class_init = (GClassInitFunc)__gui_model_class_init, + .class_finalize = NULL, + .class_data = NULL, + .instance_size = sizeof(GuiModel), + .n_preallocs = 0, + .instance_init = (GInstanceInitFunc)__gui_model_init, +}; + +static const GInterfaceInfo gui_tree_model = { + .interface_init = (GInterfaceInitFunc)__gui_tree_model_init, + .interface_finalize = NULL, + .interface_data = NULL, +}; + static void __gui_model_set_runtime(void) { @@ -307,7 +313,7 @@ void gui_model_clear(struct queue *queue, unsigned int n) GtkTreePath *path; unsigned int i; - if (queue != queue_model->gm_queue) + if (!queue_model || queue != queue_model->gm_queue) return; path = gtk_tree_path_new_from_indices(n - 1, -1); @@ -351,7 +357,7 @@ void gui_model_set_queue(struct queue *queue) struct queue *gui_model_get_queue(void) { - return queue_model->gm_queue; + return queue_model ? queue_model->gm_queue : NULL; } struct track * gui_model_path_get_track(GtkTreePath *path) @@ -361,22 +367,3 @@ struct track * gui_model_path_get_track(GtkTreePath *path) __gui_model_get_iter(GTK_TREE_MODEL(queue_model), &iter, path); return gui_model_iter_get_track(&iter); } - - -static const GTypeInfo gui_model_type_info = { - .class_size = sizeof(GuiModelClass), - .base_init = NULL, - .base_finalize = NULL, - .class_init = (GClassInitFunc)__gui_model_class_init, - .class_finalize = NULL, - .class_data = NULL, - .instance_size = sizeof(GuiModel), - .n_preallocs = 0, - .instance_init = (GInstanceInitFunc)__gui_model_init, -}; - -static const GInterfaceInfo gui_tree_model = { - .interface_init = (GInterfaceInitFunc)__gui_tree_model_init, - .interface_finalize = NULL, - .interface_data = NULL, -}; diff --git a/tests/gui/model.c b/tests/gui/model.c index b713c5aa..83469787 100644 --- a/tests/gui/model.c +++ b/tests/gui/model.c @@ -55,20 +55,18 @@ struct core_init_data init_data = { static void test_init() { - GtkTreeModel *treemodel; - GuiModel *model; + GuiModel *model = gui_model_get(); + GtkTreeModel *treemodel = GTK_TREE_MODEL(model); GType type; - gui_model_init(); - model = gui_model_get(); g_assert_null(gui_model_get_queue()); gui_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection")); g_assert_nonnull(model); g_assert_true(GTK_IS_TREE_MODEL(model)); g_assert(gui_model_get_queue() == playlist_get_queue(PL_SYSTEM, "Collection")); - treemodel = GTK_TREE_MODEL(model); - g_assert_cmpuint(gtk_tree_model_get_flags(treemodel), ==, GTK_TREE_MODEL_LIST_ONLY); + g_assert_cmpuint(gtk_tree_model_get_flags(treemodel), ==, + GTK_TREE_MODEL_LIST_ONLY); g_assert_cmpuint(gtk_tree_model_get_n_columns(treemodel), ==, 11); type = gtk_tree_model_get_column_type(treemodel, GUI_MODEL_TRACK_NR); @@ -93,20 +91,15 @@ static void test_init() g_assert_cmpuint(type, ==, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, GUI_MODEL_FONT); g_assert_cmpuint(type, ==, G_TYPE_STRING); - - gui_model_deinit(); - g_assert_false(G_IS_OBJECT(model)); } static void __test_empty_subprocess() { - GtkTreeModel *model; + GtkTreeModel *model = GTK_TREE_MODEL(gui_model_get()); GtkTreeIter iter; GValue value; GType type; - gui_model_init(); - model = GTK_TREE_MODEL(gui_model_get()); gui_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection")); memset(&value, 0, sizeof(GValue)); @@ -148,8 +141,6 @@ static void __test_empty_subprocess() g_assert_cmpuint(gtk_tree_model_iter_n_children(model, NULL), ==, 0); g_assert_false(gtk_tree_model_iter_nth_child(model, &iter, NULL, 3)); g_assert_false(gtk_tree_model_iter_parent(model, &iter, &iter)); - - gui_model_deinit(); } static void test_empty() @@ -165,16 +156,14 @@ static void test_empty() static void test_model() { + GtkLabel *label = GTK_LABEL(gui_builder_widget("o_runtime")); + GtkTreeModel *model = GTK_TREE_MODEL(gui_model_get()); struct db_entry *dbe, *next; struct track *track; - GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; - GtkLabel *label; GValue value; - model = GTK_TREE_MODEL(gui_model_get()); - label = GTK_LABEL(gui_builder_widget("o_runtime")); gui_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection")); g_assert_cmpstr(gtk_label_get_text(label), ==, ""); memset(&value, 0, sizeof(GValue)); @@ -285,13 +274,12 @@ static void test_model() db_for_each(dbe, next, track_db_get()) playlist_remove(PL_SYSTEM, "Collection", TRACK(dbe)); g_assert_cmpuint(count_delete, ==, 29); - - core_deinit(); - gui_model_deinit(); } int main(int argc, char **argv) { + int ret; + gtk_init(&argc, NULL); core_init(&argc, NULL, &init_data); gui_builder_init("share/ocarina/ocarina.ui"); @@ -299,8 +287,16 @@ int main(int argc, char **argv) while (idle_run_task()) {}; g_test_init(&argc, &argv, NULL); - g_test_add_func("/Gui/Queue Model/Init", test_init); - g_test_add_func("/Gui/Queue Model/Empty", test_empty); - g_test_add_func("/Gui/Queue Model", test_model); - return g_test_run(); + g_test_add_func("/Gui/Model/Init", test_init); + g_test_add_func("/Gui/Model/Empty", test_empty); + g_test_add_func("/Gui/Model/Tracks", test_model); + ret = g_test_run(); + + gui_model_deinit(); + gui_builder_deinit(); + core_deinit(); + + g_assert_false(G_IS_OBJECT(gui_model_get())); + g_assert_null(gui_model_get_queue()); + return ret; }