gui/model: Add support for gtk_tree_model_get_value()

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-01-17 09:24:14 -05:00
parent 9c3adf2b09
commit e59617ffa7
2 changed files with 153 additions and 23 deletions

View File

@ -2,6 +2,7 @@
* Copyright 2016 (c) Anna Schumaker.
*/
#include <core/queue.h>
#include <core/string.h>
#include <gui/model.h>
static const GTypeInfo queue_type_info;
@ -75,6 +76,54 @@ static GtkTreePath *_queue_model_get_path(GtkTreeModel *model, GtkTreeIter *iter
return path;
}
static void _queue_model_get_value(GtkTreeModel *model, GtkTreeIter *iter,
gint column, GValue *value)
{
struct track *track = iter->user_data2;
gchar *str;
g_return_if_fail(iter != NULL);
g_return_if_fail(iter->user_data2 != NULL);
g_return_if_fail(column < Q_MODEL_N_COLUMNS);
g_value_init(value, queue_columns[column]);
switch (column) {
case Q_MODEL_TRACK_NR:
g_value_set_uint(value, track->tr_track);
break;
case Q_MODEL_TITLE:
g_value_set_static_string(value, track->tr_title);
break;
case Q_MODEL_LENGTH:
g_value_take_string(value, string_sec2str(track->tr_length));
break;
case Q_MODEL_ARTIST:
g_value_set_static_string(value, track->tr_artist->ar_name);
break;
case Q_MODEL_ALBUM:
g_value_set_static_string(value, track->tr_album->al_name);
break;
case Q_MODEL_YEAR:
g_value_set_uint(value, track->tr_album->al_year);
break;
case Q_MODEL_GENRE:
g_value_set_static_string(value, track->tr_genre->ge_name);
break;
case Q_MODEL_COUNT:
g_value_set_uint(value, track->tr_count);
break;
case Q_MODEL_LAST_PLAY:
g_value_take_string(value, track_last_play(track));
break;
case Q_MODEL_FILE_PATH:
str = track_path(track);
g_value_take_string(value, g_markup_escape_text(str, -1));
g_free(str);
break;
}
}
static void _queue_model_init(GuiQueueModel *model)
{
model->gqm_stamp = g_random_int();
@ -102,6 +151,7 @@ static void _queue_tree_model_init(GtkTreeModelIface *iface)
iface->get_column_type = _queue_model_get_column_type;
iface->get_iter = _queue_model_get_iter;
iface->get_path = _queue_model_get_path;
iface->get_value = _queue_model_get_value;
}

View File

@ -9,17 +9,12 @@
struct core_init_data init_data;
static void test_model()
static void test_init()
{
GtkTreeModel *treemodel;
GuiQueueModel *model;
GtkTreePath *path;
GtkTreeIter iter;
int argc = 0;
GType type;
core_init(&argc, NULL, &init_data);
model = gui_queue_model_new(collection_get_queue());
test_not_equal((void *)model, NULL);
test_equal(GTK_IS_TREE_MODEL(model), true);
@ -54,27 +49,112 @@ static void test_model()
type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_N_COLUMNS);
test_equal(type, G_TYPE_INVALID);
/* Tests before adding tracks to the collection */
test_equal(gtk_tree_model_get_iter_first(treemodel, &iter), false);
test_equal((void *)gtk_tree_model_get_path(treemodel, &iter), NULL);
/* Okay, now scan a directory and test again */
collection_add("tests/Music/Hyrule Symphony");
while (idle_run_task() == true) {}
test_equal(queue_size(collection_get_queue()), 13);
test_equal(gtk_tree_model_get_iter_first(treemodel, &iter), true);
test_equal(((struct track *)iter.user_data2)->tr_track, 1);
path = gtk_tree_model_get_path(treemodel, &iter);
test_not_equal((void *)path, NULL);
test_equal(gtk_tree_path_get_indices(path)[0], 0);
gtk_tree_path_free(path);
g_object_unref(model);
test_equal(G_IS_OBJECT(model), false);
}
static void test_empty()
{
GtkTreeModel *model;
GtkTreeIter iter;
GValue value;
model = GTK_TREE_MODEL(gui_queue_model_new(collection_get_queue()));
memset(&value, 0, sizeof(GValue));
test_equal(gtk_tree_model_get_iter_first(model, &iter), false);
test_equal((void *)gtk_tree_model_get_path(model, &iter), NULL);
/* These will all trigger assertion failures ... sorry */
gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_TITLE, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_LENGTH, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_ARTIST, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_ALBUM, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_YEAR, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_GENRE, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_COUNT, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_LAST_PLAY, &value);
test_equal(G_IS_VALUE(&value), false);
gtk_tree_model_get_value(model, &iter, Q_MODEL_FILE_PATH, &value);
test_equal(G_IS_VALUE(&value), false);
g_object_unref(model);
}
static void test_model()
{
struct track *track;
GtkTreeModel *model;
GtkTreePath *path;
GtkTreeIter iter;
GValue value;
int argc = 0;
model = GTK_TREE_MODEL(gui_queue_model_new(collection_get_queue()));
memset(&value, 0, sizeof(GValue));
/* Okay, now scan a directory ... */
core_init(&argc, NULL, &init_data);
collection_add("tests/Music/Hyrule Symphony");
while (idle_run_task() == true) {}
test_equal(queue_size(collection_get_queue()), 13);
/* ... and test again */
test_equal(gtk_tree_model_get_iter_first(model, &iter), true);
track = iter.user_data2;
test_equal(track->tr_track, 1);
path = gtk_tree_model_get_path(model, &iter);
test_not_equal((void *)path, NULL);
test_equal(gtk_tree_path_get_indices(path)[0], 0);
gtk_tree_path_free(path);
gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value);
test_equal(g_value_get_uint(&value), track->tr_track);
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_TITLE, &value);
test_equal(g_value_get_string(&value), "Title Theme");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_LENGTH, &value);
test_equal(g_value_get_string(&value), "4:03");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_ARTIST, &value);
test_equal(g_value_get_string(&value), "Koji Kondo");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_ALBUM, &value);
test_equal(g_value_get_string(&value), "Hyrule Symphony");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_YEAR, &value);
test_equal(g_value_get_uint(&value), 1998);
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_GENRE, &value);
test_equal(g_value_get_string(&value), "Game");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_COUNT, &value);
test_equal(g_value_get_uint(&value), 0);
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_LAST_PLAY, &value);
test_equal(g_value_get_string(&value), "Never");
g_value_unset(&value);
gtk_tree_model_get_value(model, &iter, Q_MODEL_FILE_PATH, &value);
test_equal(g_value_get_string(&value),
"tests/Music/Hyrule Symphony/01 - Title Theme.ogg");
g_value_unset(&value);
g_object_unref(model);
}
DECLARE_UNIT_TESTS(
UNIT_TEST("Queue Model Init", test_init),
UNIT_TEST("Queue Model (Empty Queue)", test_empty),
UNIT_TEST("Queue Model", test_model),
);