diff --git a/gui/queue.c b/gui/queue.c index 2a8bcffd..fa75c368 100644 --- a/gui/queue.c +++ b/gui/queue.c @@ -4,6 +4,39 @@ #include #include +static struct gui_queue *gq_queue = NULL; + +static void __queue_toggle_button(GtkToggleButton *button, + enum queue_flags flag) +{ + GtkWidget *image = gtk_button_get_image(GTK_BUTTON(button)); + + if (gq_queue == NULL) + return; + + /* + * Some GTK themes have trouble with toggle buttons, + * so let's help users by changing image sensitivity. + */ + if (gtk_toggle_button_get_active(button)) { + queue_set_flag(gq_queue->gq_queue, flag); + gtk_widget_set_sensitive(image, true); + } else { + queue_unset_flag(gq_queue->gq_queue, flag); + gtk_widget_set_sensitive(image, false); + } +} + +void __queue_random(GtkToggleButton *button, gpointer data) +{ + __queue_toggle_button(button, Q_RANDOM); +} + +void __queue_repeat(GtkToggleButton *button, gpointer data) +{ + __queue_toggle_button(button, Q_REPEAT); +} + struct gui_queue *gui_queue_alloc(struct queue *queue, const gchar *text, unsigned int flags) { @@ -32,6 +65,8 @@ void gui_queue_show(struct gui_queue *queue) GtkButton *repeat = GTK_BUTTON(gui_builder_widget("o_repeat")); bool has_random = false, has_repeat = false; + gq_queue = queue; + gtk_widget_set_sensitive(GTK_WIDGET(random), gui_queue_can_random(queue)); gtk_widget_set_sensitive(GTK_WIDGET(repeat), gui_queue_can_repeat(queue)); diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade index 1b79a59c..59dcef6c 100644 --- a/share/ocarina/ocarina6.glade +++ b/share/ocarina/ocarina6.glade @@ -635,6 +635,7 @@ True center image9 + False @@ -650,6 +651,7 @@ True center image10 + False diff --git a/tests/gui/queue.c b/tests/gui/queue.c index eb8b4a6d..8338e744 100644 --- a/tests/gui/queue.c +++ b/tests/gui/queue.c @@ -59,6 +59,24 @@ static void test_queue() test_equal(gtk_widget_get_sensitive(random_img), false); test_equal(gtk_widget_get_sensitive(repeat_img), false); + /* Test clicking random button. */ + gtk_toggle_button_set_active(random, true); + test_equal(gtk_widget_get_sensitive(random_img), true); + test_equal(queue_has_flag(&q, Q_RANDOM), (bool)true); + + gtk_toggle_button_set_active(random, false); + test_equal(gtk_widget_get_sensitive(random_img), false); + test_equal(queue_has_flag(&q, Q_RANDOM), (bool)false); + + /* Test clicking repeat button. */ + gtk_toggle_button_set_active(repeat, true); + test_equal(gtk_widget_get_sensitive(repeat_img), true); + test_equal(queue_has_flag(&q, Q_REPEAT), (bool)true); + + gtk_toggle_button_set_active(repeat, false); + test_equal(gtk_widget_get_sensitive(repeat_img), false); + test_equal(queue_has_flag(&q, Q_REPEAT), (bool)false); + /* Show a queue where random and repeat are enabled */ gq->gq_flags = GQ_CAN_RANDOM | GQ_CAN_REPEAT; q.q_flags = Q_RANDOM | Q_REPEAT;