gui/model: Don't require a GuiQueueModel for public functions

We can get by without this now that the model is shared across all
queues.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2016-08-02 11:39:09 -04:00
parent 5c426fc8d7
commit 40bce8cc59
10 changed files with 81 additions and 116 deletions

View File

@ -276,32 +276,45 @@ GType gui_queue_model_get_type()
return queue_type;
}
void gui_queue_model_add(GuiQueueModel *model, unsigned int row)
void gui_queue_model_add(struct queue *queue, unsigned int row)
{
GtkTreePath *path = gtk_tree_path_new_from_indices(row, -1);
GtkTreeIter iter;
GtkTreePath *path;
GtkTreeIter iter;
_queue_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), path, &iter);
if (queue != queue_model->gqm_queue)
return;
path = gtk_tree_path_new_from_indices(row, -1);
_queue_model_get_iter(GTK_TREE_MODEL(queue_model), &iter, path);
gtk_tree_model_row_inserted(GTK_TREE_MODEL(queue_model), path, &iter);
__gui_queue_model_set_runtime();
gtk_tree_path_free(path);
}
void gui_queue_model_remove(GuiQueueModel *model, unsigned int row)
void gui_queue_model_remove(struct queue *queue, unsigned int row)
{
GtkTreePath *path = gtk_tree_path_new_from_indices(row, -1);
gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path);
GtkTreePath *path;
if (queue != queue_model->gqm_queue)
return;
path = gtk_tree_path_new_from_indices(row, -1);
gtk_tree_model_row_deleted(GTK_TREE_MODEL(queue_model), path);
__gui_queue_model_set_runtime();
gtk_tree_path_free(path);
}
void gui_queue_model_clear(GuiQueueModel *model, unsigned int n)
void gui_queue_model_clear(struct queue *queue, unsigned int n)
{
GtkTreePath *path = gtk_tree_path_new_from_indices(n - 1, -1);
GtkTreePath *path;
unsigned int i;
if (queue != queue_model->gqm_queue)
return;
path = gtk_tree_path_new_from_indices(n - 1, -1);
for (i = 0; i < n; i++) {
gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path);
gtk_tree_model_row_deleted(GTK_TREE_MODEL(queue_model), path);
gtk_tree_path_prev(path);
}
@ -309,29 +322,33 @@ void gui_queue_model_clear(GuiQueueModel *model, unsigned int n)
gtk_tree_path_free(path);
}
void gui_queue_model_update(GuiQueueModel *model, unsigned int row)
void gui_queue_model_update(struct queue *queue, unsigned int row)
{
GtkTreePath *path = gtk_tree_path_new_from_indices(row, -1);
GtkTreePath *path;
GtkTreeIter iter;
_queue_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &iter);
if (queue != queue_model->gqm_queue)
return;
path = gtk_tree_path_new_from_indices(row, -1);
_queue_model_get_iter(GTK_TREE_MODEL(queue_model), &iter, path);
gtk_tree_model_row_changed(GTK_TREE_MODEL(queue_model), path, &iter);
__gui_queue_model_set_runtime();
gtk_tree_path_free(path);
}
void gui_queue_model_set_queue(GuiQueueModel *model, struct queue *queue)
void gui_queue_model_set_queue(struct queue *queue)
{
struct queue *cur = model->gqm_queue;
struct queue *cur = queue_model->gqm_queue;
if (cur)
gui_queue_model_clear(model, queue_size(cur));
gui_queue_model_clear(cur, queue_size(cur));
model->gqm_queue = queue;
queue_model->gqm_queue = queue;
__gui_queue_model_set_runtime();
if (queue && queue_size(queue) > 0)
gui_queue_model_add(model, 0);
gui_queue_model_add(queue, 0);
}
struct queue *gui_queue_model_get_queue(void)
@ -339,13 +356,12 @@ struct queue *gui_queue_model_get_queue(void)
return queue_model->gqm_queue;
}
struct track * gui_queue_model_path_get_track(GuiQueueModel *model,
GtkTreePath *path)
struct track * gui_queue_model_path_get_track(GtkTreePath *path)
{
GtkTreeIter iter;
_queue_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
return gui_queue_model_iter_get_track(model, &iter);
_queue_model_get_iter(GTK_TREE_MODEL(queue_model), &iter, path);
return gui_queue_model_iter_get_track(&iter);
}

View File

@ -188,13 +188,13 @@ static void *__playlist_init(struct queue *queue, void *data)
static void __playlist_added(struct queue *queue, unsigned int row)
{
gui_queue_added(queue, row);
gui_queue_model_add(queue, row);
__playlist_update_sizes(queue);
}
static void __playlist_removed(struct queue *queue, unsigned int row)
{
gui_queue_removed(queue, row);
gui_queue_model_remove(queue, row);
__playlist_update_sizes(queue);
}
@ -333,6 +333,6 @@ struct queue_ops playlist_ops = {
.qop_added = __playlist_added,
.qop_erase = __playlist_erase,
.qop_removed = __playlist_removed,
.qop_cleared = gui_queue_cleared,
.qop_updated = gui_queue_updated,
.qop_cleared = gui_queue_model_clear,
.qop_updated = gui_queue_model_update,
};

View File

@ -74,7 +74,7 @@ static gboolean __queue_visible_func(GtkTreeModel *model, GtkTreeIter *iter,
if (!gq_queue || !gq_queue->gq_search)
return TRUE;
track = gui_queue_model_iter_get_track(gq_queue->gq_model, iter);
track = gui_queue_model_iter_get_track(iter);
for (i = 0; gq_queue->gq_search[i]; i++) {
token = gq_queue->gq_search[i];
@ -140,7 +140,7 @@ struct gui_queue *gui_queue_alloc(struct playlist *playlist, struct queue *queue
gq->gq_text = g_strdup(text);
gq->gq_search = NULL;
gq->gq_model = g_object_ref(gui_queue_model_get());
gui_queue_model_set_queue(gq->gq_model, queue);
gui_queue_model_set_queue(queue);
gq->gq_filter = gtk_tree_model_filter_new(
GTK_TREE_MODEL(gq->gq_model), NULL);
gq->gq_playlist = playlist;
@ -190,7 +190,7 @@ void gui_queue_show(struct gui_queue *queue)
has_random = queue_has_flag(queue->gq_queue, Q_RANDOM);
has_repeat = queue_has_flag(queue->gq_queue, Q_REPEAT);
is_enabled = queue_has_flag(queue->gq_queue, Q_ENABLED);
gui_queue_model_set_queue(queue->gq_model, queue->gq_queue);
gui_queue_model_set_queue(queue->gq_queue);
gui_view_set_model(GTK_TREE_MODEL_FILTER(queue->gq_filter));
} else
gtk_label_set_text(runtime, "");
@ -216,23 +216,3 @@ void gui_queue_show(struct gui_queue *queue)
} else
gtk_entry_set_text(search, "");
}
void gui_queue_added(struct queue *queue, unsigned int row)
{
gui_queue_model_add(gui_queue(queue)->gq_model, row);
}
void gui_queue_removed(struct queue *queue, unsigned int row)
{
gui_queue_model_remove(gui_queue(queue)->gq_model, row);
}
void gui_queue_cleared(struct queue *queue, unsigned int n)
{
gui_queue_model_clear(gui_queue(queue)->gq_model, n);
}
void gui_queue_updated(struct queue *queue, unsigned int row)
{
gui_queue_model_update(gui_queue(queue)->gq_model, row);
}

View File

@ -24,7 +24,7 @@ static void __tempq_deinit(struct queue *queue)
static void __tempq_added(struct queue *queue, unsigned int pos)
{
gui_queue_added(queue, pos);
gui_queue_model_add(queue, pos);
gui_sidebar_set_size(gui_queue(queue));
tempq_save(queue, Q_ENABLED);
}
@ -36,14 +36,14 @@ static bool __tempq_erase(struct queue *queue, struct track *track)
static void __tempq_removed(struct queue *queue, unsigned int pos)
{
gui_queue_removed(queue, pos);
gui_queue_model_remove(queue, pos);
gui_sidebar_set_size(gui_queue(queue));
tempq_save(queue, Q_ENABLED);
}
static void __tempq_cleared(struct queue *queue, unsigned int n)
{
gui_queue_cleared(queue, n);
gui_queue_model_clear(queue, n);
gui_sidebar_set_size(gui_queue(queue));
}
@ -55,5 +55,5 @@ struct queue_ops tempq_ops = {
.qop_removed = __tempq_removed,
.qop_cleared = __tempq_cleared,
.qop_save = tempq_save,
.qop_updated = gui_queue_updated,
.qop_updated = gui_queue_model_update,
};

View File

@ -49,9 +49,8 @@ static inline GtkTreePath *__view_filter_convert_path(GtkTreePath *orig)
static struct track *__view_filter_get_track(GtkTreePath *orig)
{
GuiQueueModel *model = gui_queue_model_get();
GtkTreePath *real = __view_filter_convert_path(orig);
struct track *track = gui_queue_model_path_get_track(model, real);
GtkTreePath *real = __view_filter_convert_path(orig);
struct track *track = gui_queue_model_path_get_track(real);
gtk_tree_path_free(real);
return track;

View File

@ -55,19 +55,19 @@ GuiQueueModel *gui_queue_model_get(void);
GType gui_queue_model_get_type();
/* Called to add a row to the model */
void gui_queue_model_add(GuiQueueModel *, unsigned int);
void gui_queue_model_add(struct queue *, unsigned int);
/* Called to remove a row from the model */
void gui_queue_model_remove(GuiQueueModel *, unsigned int);
void gui_queue_model_remove(struct queue *, unsigned int);
/* Called to remove all rows from the model */
void gui_queue_model_clear(GuiQueueModel *, unsigned int);
void gui_queue_model_clear(struct queue *, unsigned int);
/* Called to update a row in the model */
void gui_queue_model_update(GuiQueueModel *, unsigned int);
void gui_queue_model_update(struct queue *, unsigned int);
/* Called to change the queue represented by the model. */
void gui_queue_model_set_queue(GuiQueueModel *, struct queue *);
void gui_queue_model_set_queue(struct queue *);
/* Called to get the queue currently attached to the model. */
struct queue *gui_queue_model_get_queue(void);
@ -75,8 +75,7 @@ struct queue *gui_queue_model_get_queue(void);
/* Called to convert a GtkTreeIter into a struct track */
static inline
struct track *gui_queue_model_iter_get_track(GuiQueueModel *model,
GtkTreeIter *iter)
struct track *gui_queue_model_iter_get_track(GtkTreeIter *iter)
{
g_return_val_if_fail(iter != NULL, NULL);
g_return_val_if_fail(iter->user_data2 != NULL, NULL);
@ -84,6 +83,6 @@ struct track *gui_queue_model_iter_get_track(GuiQueueModel *model,
}
/* Called to convert a GtkTreePath into a struct track */
struct track *gui_queue_model_path_get_track(GuiQueueModel *, GtkTreePath *);
struct track *gui_queue_model_path_get_track(GtkTreePath *);
#endif /* OCARINA_GUI_MODEL_H */

View File

@ -66,16 +66,4 @@ static inline bool gui_queue_can_disable(struct gui_queue *gq)
/* Called to set the correct state of the random and repeat buttons. */
void gui_queue_show(struct gui_queue *);
/* Called when a track is added to the queue. */
void gui_queue_added(struct queue *, unsigned int);
/* Called when a track is removed from the queue. */
void gui_queue_removed(struct queue *, unsigned int);
/* Called when a queue is cleared. */
void gui_queue_cleared(struct queue *, unsigned int);
/* Called when a track is updated. */
void gui_queue_updated(struct queue *, unsigned int);
#endif /* OCARINA_GUI_QUEUE_H */

View File

@ -26,18 +26,7 @@ void *test_queue_init(struct queue *queue, void *data)
{ return NULL; }
void test_queue_deinit(struct queue *queue)
{ }
void test_queue_added(struct queue *queue, unsigned int row)
{
if (queue->q_private)
gui_queue_model_add(queue->q_private, row);
}
void test_queue_removed(struct queue *queue, unsigned int row)
{ gui_queue_model_remove(queue->q_private, row); }
void test_queue_cleared(struct queue *queue, unsigned int n)
{ gui_queue_model_get_type(queue->q_private, n); }
void test_queue_save(struct queue *queue, enum queue_flags flag) {}
void test_queue_updated(struct queue *queue, unsigned int row)
{ gui_queue_model_update(queue->q_private, row); }
void test_on_load(struct track *track) {}
void test_on_state_change(GstState state) {}
void test_on_config_pause(int count) {}
@ -45,11 +34,11 @@ void test_on_config_pause(int count) {}
struct queue_ops test_ops = {
.qop_init = test_queue_init,
.qop_deinit = test_queue_deinit,
.qop_added = test_queue_added,
.qop_removed = test_queue_removed,
.qop_cleared = test_queue_cleared,
.qop_added = gui_queue_model_add,
.qop_removed = gui_queue_model_remove,
.qop_cleared = gui_queue_model_clear,
.qop_save = test_queue_save,
.qop_updated = test_queue_updated,
.qop_updated = gui_queue_model_update,
};
struct audio_ops test_audio_ops = {
@ -72,7 +61,7 @@ static void test_init()
gui_queue_model_init();
model = gui_queue_model_get();
test_equal((void *)gui_queue_model_get_queue(), NULL);
gui_queue_model_set_queue(model, playlist_get_queue(PL_SYSTEM, "Collection"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
test_not_equal((void *)model, NULL);
test_equal(GTK_IS_TREE_MODEL(model), true);
test_equal((void *)gui_queue_model_get_queue(),
@ -121,14 +110,12 @@ static void test_empty()
gui_queue_model_init();
model = GTK_TREE_MODEL(gui_queue_model_get());
gui_queue_model_set_queue(GUI_QUEUE_MODEL(model),
playlist_get_queue(PL_SYSTEM, "Collection"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
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);
test_equal((void *)gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model),
&iter), NULL);
test_equal((void *)gui_queue_model_iter_get_track(&iter), NULL);
/* These will all trigger assertion failures ... sorry */
gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value);
@ -184,8 +171,7 @@ static void test_model()
model = GTK_TREE_MODEL(gui_queue_model_get());
label = GTK_LABEL(gui_builder_widget("o_runtime"));
gui_queue_model_set_queue(GUI_QUEUE_MODEL(model),
playlist_get_queue(PL_SYSTEM, "Collection"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
test_equal(gtk_label_get_text(label), "");
memset(&value, 0, sizeof(GValue));
@ -209,15 +195,14 @@ static void test_model()
/* ... and test again */
test_equal(gtk_tree_model_get_iter_first(model, &iter), true);
track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter);
track = gui_queue_model_iter_get_track(&iter);
test_equal(track->tr_track, 1);
audio_load(track);
path = gtk_tree_model_get_path(model, &iter);
test_not_equal((void *)path, NULL);
test_equal(gtk_tree_path_get_indices(path)[0], 0);
test_equal((void *)gui_queue_model_path_get_track(GUI_QUEUE_MODEL(model),
path), (void *)track);
test_equal((void *)gui_queue_model_path_get_track(path), (void *)track);
gtk_tree_path_free(path);
gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value);
@ -256,35 +241,33 @@ static void test_model()
g_value_unset(&value);
test_equal(gtk_tree_model_iter_next(model, &iter), true);
track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter);
track = gui_queue_model_iter_get_track(&iter);
test_equal(track->tr_track, 2);
gtk_tree_model_get_value(model, &iter, Q_MODEL_FONT, &value);
test_equal(g_value_get_string(&value), "");
g_value_unset(&value);
test_equal(gtk_tree_model_iter_children(model, &iter, NULL), true);
track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter);
track = gui_queue_model_iter_get_track(&iter);
test_equal(track->tr_track, 1);
test_equal(gtk_tree_model_iter_has_child(model, &iter), false);
test_equal(gtk_tree_model_iter_n_children(model, &iter), 0);
test_equal(gtk_tree_model_iter_n_children(model, NULL), 13);
gui_queue_model_set_queue(GUI_QUEUE_MODEL(model),
playlist_get_queue(PL_SYSTEM, "Favorites"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Favorites"));
test_equal(count_delete, 13);
test_equal(count_insert, 14);
test_equal(gtk_tree_model_iter_n_children(model, NULL), 3);
test_equal(gtk_label_get_text(label), "10 minutes, 46 seconds");
gui_queue_model_set_queue(GUI_QUEUE_MODEL(model),
playlist_get_queue(PL_SYSTEM, "Collection"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
test_equal(gtk_label_get_text(label), "42 minutes, 45 seconds");
test_equal(count_delete, 16);
test_equal(count_insert, 15);
test_equal(gtk_tree_model_iter_nth_child(model, &iter, NULL, 3), true);
track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter);
track = gui_queue_model_iter_get_track(&iter);
test_equal(track->tr_track, 4);
test_equal(gtk_tree_model_iter_parent(model, &iter, &iter), false);

View File

@ -26,11 +26,11 @@ static void test_queue_save(struct queue *queue, unsigned int row) {}
static struct queue_ops test_ops = {
.qop_init = test_queue_init,
.qop_deinit = gui_queue_free,
.qop_cleared = gui_queue_cleared,
.qop_added = gui_queue_added,
.qop_removed = gui_queue_removed,
.qop_cleared = gui_queue_model_clear,
.qop_added = gui_queue_model_add,
.qop_removed = gui_queue_model_remove,
.qop_save = test_queue_save,
.qop_updated = gui_queue_updated,
.qop_updated = gui_queue_model_update,
};
struct core_init_data init_data = {
@ -169,6 +169,7 @@ static void test_tracks()
test_not_equal((void *)gq, NULL);
test_not_equal((void *)gq->gq_filter, NULL);
test_equal(gtk_tree_model_iter_n_children(gq->gq_filter, NULL), 13);
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
gtk_entry_set_text(search, "zelda");
g_signal_emit_by_name(search, "search-changed");

View File

@ -76,8 +76,7 @@ static void test_treeview()
playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony");
while (idle_run_task() == true) {}
model = GTK_TREE_MODEL(gui_queue_model_get());
gui_queue_model_set_queue(GUI_QUEUE_MODEL(model),
playlist_get_queue(PL_SYSTEM, "Collection"));
gui_queue_model_set_queue(playlist_get_queue(PL_SYSTEM, "Collection"));
filter = gtk_tree_model_filter_new(model, NULL);
treeview = GTK_TREE_VIEW(gui_builder_widget("o_treeview"));