gui/sidebar: Handle random button clicks

This makes the most sense here, and lets us remove gui/queue.c at some
point in the future.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2016-08-26 10:00:26 -04:00
parent 3562e164b0
commit 828f861d9a
6 changed files with 58 additions and 16 deletions

View File

@ -66,7 +66,7 @@ void gui_queue_free(struct queue *queue)
void gui_queue_show(struct gui_queue *queue)
{
GtkButton *random = GTK_BUTTON(gui_builder_widget("o_random"));
GtkButton *random = GTK_BUTTON(gui_builder_widget("random_button"));
bool has_random = false;
gq_queue = queue;

View File

@ -3,6 +3,7 @@
*/
#include <core/settings.h>
#include <core/string.h>
#include <gui/model.h>
#include <gui/sidebar.h>
#include <gui/treeview.h>
@ -115,6 +116,7 @@ static gboolean __gui_sidebar_can_select(GtkTreeSelection *selection,
void __gui_sidebar_selection_changed(GtkTreeSelection *selection, gpointer data)
{
GtkTreeModel *model = GTK_TREE_MODEL(gui_sidebar_filter());
bool active = false, sensitive = false;
struct playlist *playlist = NULL;
enum playlist_type_t type;
GtkTreeIter iter, child;
@ -125,10 +127,17 @@ void __gui_sidebar_selection_changed(GtkTreeSelection *selection, gpointer data)
name = gui_sidebar_iter_name(&child);
type = gui_sidebar_iter_type(&child);
playlist = playlist_get(type, name);
playlist = playlist_get(type, name);
active = playlist_get_random(type, name);
sensitive = (type != PL_SYSTEM) ||
!string_match(name, "History");
g_free(name);
}
gtk_toggle_button_set_active(gui_random_button(), active);
gtk_widget_set_sensitive(GTK_WIDGET(gui_random_button()), sensitive);
gui_treeview_set_playlist(playlist);
}
@ -137,6 +146,17 @@ void __gui_sidebar_resized(GtkPaned *pane, GParamSpec *pspec, gpointer data)
settings_set(SIDEBAR_SETTING, gtk_paned_get_position(pane));
}
void __gui_sidebar_random_toggled(GtkToggleButton *button, gpointer data)
{
struct playlist *playlist = gui_model_get_playlist();
bool active = gtk_toggle_button_get_active(button);
if (playlist) {
playlist_set_random(playlist->pl_type,
playlist->pl_name, active);
}
}
void gui_sidebar_init()
{
int pos = settings_get(SIDEBAR_SETTING);

View File

@ -75,4 +75,10 @@ static inline GtkTreeView *gui_sidebar_treeview()
return GTK_TREE_VIEW(gui_builder_widget("sidebar_treeview"));
}
/* Called to get the random button. */
static inline GtkToggleButton *gui_random_button()
{
return GTK_TOGGLE_BUTTON(gui_builder_widget("random_button"));
}
#endif /* OCARINA_GUI_SIDEBAR_H */

View File

@ -390,14 +390,14 @@
<property name="valign">end</property>
<property name="layout_style">end</property>
<child>
<object class="GtkToggleButton" id="o_random">
<object class="GtkToggleButton" id="random_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Randomly pick tracks</property>
<property name="halign">start</property>
<property name="valign">center</property>
<signal name="toggled" handler="__queue_random" swapped="no"/>
<signal name="toggled" handler="__gui_sidebar_random_toggled" swapped="no"/>
<child>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
@ -1105,7 +1105,7 @@ audio-volume-medium</property>
</object>
<object class="GtkSizeGroup">
<widgets>
<widget name="o_random"/>
<widget name="random_button"/>
<widget name="o_volume"/>
</widgets>
</object>

View File

@ -47,7 +47,7 @@ static void test_queue()
struct queue q;
search = GTK_ENTRY(gui_filter_search());
random = GTK_TOGGLE_BUTTON(gui_builder_widget("o_random"));
random = GTK_TOGGLE_BUTTON(gui_builder_widget("random_button"));
/* Test initialization */
queue_init(&q, Q_ENABLED, &test_ops, NULL);
@ -65,13 +65,6 @@ static void test_queue()
g_assert_false(gtk_toggle_button_get_active(random));
g_assert_cmpstr(gtk_entry_get_text(search), ==, "");
/* Test clicking random button. */
gtk_toggle_button_set_active(random, true);
g_assert_true(queue_has_flag(&q, Q_RANDOM));
gtk_toggle_button_set_active(random, false);
g_assert_false(queue_has_flag(&q, Q_RANDOM));
/* Show a queue where random and repeat are enabled */
gq->gq_flags = GQ_CAN_RANDOM;
q.q_flags = Q_RANDOM | Q_REPEAT | Q_ENABLED;

View File

@ -35,6 +35,9 @@ static void test_sidebar()
g_assert_nonnull(gui_sidebar_treeview());
g_assert_true(GTK_IS_TREE_VIEW(gui_sidebar_treeview()));
g_assert_nonnull(gui_random_button());
g_assert_true(GTK_IS_TOGGLE_BUTTON(gui_random_button()));
g_assert_true(gui_sidebar_iter_first(&iter));
gui_sidebar_iter_add(&iter, playlist_get(PL_SYSTEM, "Collection"), NULL);
gui_sidebar_iter_add(&iter, playlist_get(PL_SYSTEM, "History"), NULL);
@ -98,6 +101,7 @@ static void test_sidebar()
static void test_sidebar_selection()
{
GtkTreeSelection *selection;
GtkToggleButton *random;
GtkTreeModel *filter;
GtkTreePath *path;
GtkTreeIter iter;
@ -105,6 +109,7 @@ static void test_sidebar_selection()
selection = gtk_tree_view_get_selection(gui_sidebar_treeview());
filter = GTK_TREE_MODEL(gui_sidebar_filter());
random = gui_random_button();
g_assert_cmpuint(gtk_tree_model_iter_n_children(filter, NULL), ==, 6);
playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony");
@ -112,6 +117,7 @@ static void test_sidebar_selection()
playlist_add(PL_SYSTEM, "History", track_get(0));
gtk_tree_model_filter_refilter(gui_sidebar_filter());
g_assert_cmpuint(gtk_tree_model_iter_n_children(filter, NULL), ==, 8);
playlist_set_random(PL_SYSTEM, "Collection", true);
g_assert_true(gui_sidebar_iter_first(&iter));
path = gtk_tree_model_get_path(gui_sidebar_model(), &iter);
@ -119,14 +125,31 @@ static void test_sidebar_selection()
gtk_tree_selection_select_path(selection, path);
n = gtk_tree_selection_count_selected_rows(selection);
g_assert_cmpuint(n, ==, (i < 2) ? 1 : 0);
if (i == 0)
if (i == 0) {
g_assert(gui_model_get_playlist() ==
playlist_get(PL_SYSTEM, "Collection"));
else if (i == 1)
g_assert_true(gtk_toggle_button_get_active(random));
g_assert_true(gtk_widget_get_sensitive(
GTK_WIDGET(random)));
gtk_toggle_button_set_active(random, false);
g_assert_false(
playlist_get_random(PL_SYSTEM, "Collection"));
gtk_toggle_button_set_active(random, true);
g_assert_true(
playlist_get_random(PL_SYSTEM, "Collection"));
} else if (i == 1) {
g_assert(gui_model_get_playlist() ==
playlist_get(PL_SYSTEM, "History"));
else
g_assert_false(gtk_toggle_button_get_active(random));
g_assert_false(gtk_widget_get_sensitive(
GTK_WIDGET(random)));
} else {
g_assert_null(gui_model_get_playlist());
g_assert_false(gtk_toggle_button_get_active(random));
g_assert_false(gtk_widget_get_sensitive(
GTK_WIDGET(random)));
}
gtk_tree_selection_unselect_all(selection);
gtk_tree_path_next(path);
}