/* * Copyright 2015 (c) Anna Schumaker. */ #include #include #include #include #include #include #include const gchar *SIDEBAR_SETTING = "gui.sidebar.pos"; const gchar *COLLECTION_FMT = "Collection\n%d track%s"; const gchar *HISTORY_FMT = "History\n%d track%s"; static GtkListStore *sb_store; enum sidebar_columns { SB_IMAGE, SB_IMAGE_SZ, SB_TEXT, SB_QUEUE, }; static void __sidebar_set_size(GtkTreeIter *iter, const gchar *name, unsigned int size) { const gchar *fmt = "%s\n%d track%s"; gchar *text; text = g_strdup_printf(fmt, name, size, (size == 1) ? "" : "s"); gtk_list_store_set(sb_store, iter, SB_TEXT, text, -1); g_free(text); } static void __sidebar_set_queue(GtkTreeIter *iter, struct queue *queue) { gtk_list_store_set(sb_store, iter, SB_QUEUE, queue, -1); } static struct queue *__sidebar_get_queue(GtkTreeIter *iter) { struct queue *queue; gtk_tree_model_get(GTK_TREE_MODEL(sb_store), iter, SB_QUEUE, &queue, -1); return queue; } static bool __sidebar_find_queue(struct queue *queue, GtkTreeIter *iter) { gtk_tree_model_get_iter_first(GTK_TREE_MODEL(sb_store), iter); do { if (__sidebar_get_queue(iter) == queue) return true; } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(sb_store), iter)); return false; } void __sidebar_resize(GtkPaned *pane, GParamSpec *pspec, gpointer data) { gui_settings_set(SIDEBAR_SETTING, gtk_paned_get_position(pane)); } void __sidebar_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkNotebook *notebook = GTK_NOTEBOOK(gui_builder_widget("o_notebook")); GtkTreeModel *model = GTK_TREE_MODEL(sb_store); GtkTreeIter iter; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkTreePath *path = gtk_tree_model_get_path(model, &iter); unsigned int page = gtk_tree_path_get_indices(path)[0]; gtk_notebook_set_current_page(notebook, page); gui_sidebar_selected(SB_SIDEBAR); gtk_tree_path_free(path); } } void __sidebar_deselect(const gchar *widget) { GtkTreeView *treeview = GTK_TREE_VIEW(gui_builder_widget(widget)); GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); gtk_tree_selection_unselect_all(selection); } void gui_sidebar_init() { GtkPaned *pane = GTK_PANED(gui_builder_widget("o_sidebar")); GtkTreeIter iter; int pos, i; /* Set up entries in the liststore. */ sb_store = GTK_LIST_STORE(gui_builder_object("o_sidebar_store")); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(sb_store), &iter); __sidebar_set_queue(&iter, collection_get_queue()); gtk_tree_model_iter_next(GTK_TREE_MODEL(sb_store), &iter); __sidebar_set_queue(&iter, history_get_queue()); for (i = 0; i < tempq_count(); i++) gui_sidebar_add(tempq_get(i)); /* Set sidebar width. */ pos = gui_settings_get(SIDEBAR_SETTING); if (pos > 0) gtk_paned_set_position(pane, pos); } gboolean gui_sidebar_on_select(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean selected, gpointer data) { return gtk_tree_path_get_depth(path) != 1; } void gui_sidebar_selected(enum sidebar_selection_t selected) { if (selected != SB_COLLECTION) __sidebar_deselect("o_collection_view"); if (selected != SB_PLAYLIST) __sidebar_deselect("o_playlist_view"); if (selected != SB_SIDEBAR) __sidebar_deselect("o_sidebar_view"); } void gui_sidebar_add(struct queue *queue) { const gchar *text = "Queued Tracks\n0 tracks"; GtkTreeIter iter, sibling; gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(sb_store), &sibling, NULL, tempq_count() - 1); gtk_list_store_insert_before(sb_store, &iter, &sibling); gtk_list_store_set(sb_store, &iter, SB_IMAGE, "audio-x-generic", SB_IMAGE_SZ, GTK_ICON_SIZE_BUTTON, SB_TEXT, text, SB_QUEUE, queue, -1); } void gui_sidebar_set_size(struct queue *queue) { const gchar *name = "Queued Tracks"; GtkTreeIter iter; if (!__sidebar_find_queue(queue, &iter)) return; if (queue == collection_get_queue()) name = "Collection"; else if (queue == history_get_queue()) name = "History"; __sidebar_set_size(&iter, name, queue_size(queue)); }