/* * Copyright 2015 (c) Anna Schumaker. */ #include #include #include enum sidebar_columns { SB_IMAGE, SB_NAME, SB_TYPE, }; const gchar *SIDEBAR_SETTING = "gui.sidebar.pos"; static gchar *__gui_sidebar_size_str(struct playlist *playlist) { const gchar *fmt = "%s\n%d track%s"; unsigned int size; if (!playlist) return NULL; size = playlist_size(playlist->pl_type, playlist->pl_name); if (playlist_cur() == playlist) fmt = "%s\n%d track%s"; return g_markup_printf_escaped(fmt, playlist->pl_name, size, (size != 1) ? "s" : ""); } static void __gui_sidebar_set(GtkTreeIter *iter, const gchar *name, const gchar *image, enum playlist_type_t type) { gtk_tree_store_set(gui_sidebar_store(), iter, SB_NAME, name, SB_IMAGE, image, SB_TYPE, type, -1); } static void __gui_sidebar_add_header(GtkTreeIter *iter, const gchar *name, const gchar *image) { gchar *formatted = g_strdup_printf("%s", name); gtk_tree_store_insert(gui_sidebar_store(), iter, NULL, -1); __gui_sidebar_set(iter, NULL, NULL, PL_MAX_TYPE); gtk_tree_store_insert(gui_sidebar_store(), iter, NULL, -1); __gui_sidebar_set(iter, formatted, image, PL_MAX_TYPE); g_free(formatted); } void __gui_sidebar_resized(GtkPaned *pane, GParamSpec *pspec, gpointer data) { settings_set(SIDEBAR_SETTING, gtk_paned_get_position(pane)); } void gui_sidebar_init() { int pos = settings_get(SIDEBAR_SETTING); GtkTreeIter iter; gui_sidebar_iter_first(&iter); __gui_sidebar_add_header(&iter, "Playlists", "emblem-documents"); __gui_sidebar_add_header(&iter, "Dynamic", "emblem-generic"); __gui_sidebar_add_header(&iter, "Library", "emblem-system"); if (pos > 0) gtk_paned_set_position(gui_sidebar(), pos); } gboolean gui_sidebar_iter_first(GtkTreeIter *iter) { return gtk_tree_model_get_iter_first(gui_sidebar_model(), iter); } gboolean gui_sidebar_iter_next(GtkTreeIter *iter) { return gtk_tree_model_iter_next(gui_sidebar_model(), iter); } gchar *gui_sidebar_iter_name(GtkTreeIter *iter) { gchar *text = NULL, *parsed = NULL, *name, **split; gtk_tree_model_get(gui_sidebar_model(), iter, SB_NAME, &text, -1); if (!text) return g_strdup(""); pango_parse_markup(text, -1, 0, NULL, &parsed, NULL, NULL); if (!parsed) return g_strdup(""); split = g_strsplit(parsed, "\n", 2); name = g_strdup(split[0]); g_strfreev(split); g_free(parsed); g_free(text); return name; } enum playlist_type_t gui_sidebar_iter_type(GtkTreeIter *iter) { enum playlist_type_t type; gtk_tree_model_get(gui_sidebar_model(), iter, SB_TYPE, &type, -1); return type; } void gui_sidebar_iter_add(GtkTreeIter *iter, struct playlist *playlist, const gchar *image) { gchar *text = __gui_sidebar_size_str(playlist); GtkTreeIter new; gtk_tree_store_insert_before(gui_sidebar_store(), &new, NULL, iter); __gui_sidebar_set(&new, text, image, playlist->pl_type); g_free(text); } gboolean gui_sidebar_iter_find(GtkTreeIter *iter, const gchar *name, enum playlist_type_t type) { bool match; gchar *cur; do { if (gui_sidebar_iter_type(iter) != type) continue; cur = gui_sidebar_iter_name(iter); match = string_match(cur, name); g_free(cur); if (match) return TRUE; } while (gui_sidebar_iter_next(iter)); return FALSE; }