diff --git a/gui/playlist.c b/gui/playlist.c
index 69fb5ee0..35a928e3 100644
--- a/gui/playlist.c
+++ b/gui/playlist.c
@@ -27,6 +27,18 @@ void __playlist_row_activated(GtkTreeView *treeview, GtkTreePath *path,
__gui_playlist_update_size(playlist_cur());
}
+void __playlist_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter,
+ GtkTreePath *path, gpointer data)
+{
+ gui_sidebar_filter_row_expanded(iter, false);
+}
+
+void __playlist_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter,
+ GtkTreePath *path, gpointer data)
+{
+ gui_sidebar_filter_row_expanded(iter, true);
+}
+
static void *__playlist_init(struct queue *queue, void *data)
{
struct playlist *playlist = (struct playlist *)data;
diff --git a/gui/sidebar.c b/gui/sidebar.c
index 2511d9c1..f9d8e90e 100644
--- a/gui/sidebar.c
+++ b/gui/sidebar.c
@@ -83,6 +83,14 @@ static inline void __gui_sidebar_filter_iter_convert(GtkTreeIter *iter,
child, iter);
}
+static gchar *__gui_sidebar_filter_iter_name(GtkTreeIter *iter)
+{
+ GtkTreeIter child;
+
+ __gui_sidebar_filter_iter_convert(iter, &child);
+ return gui_sidebar_iter_name(&child);
+}
+
static gboolean __gui_sidebar_visible_func(GtkTreeModel *model,
GtkTreeIter *iter,
gpointer data)
@@ -317,6 +325,17 @@ void gui_sidebar_filter_path_select(GtkTreePath *path)
g_free(name);
}
+void gui_sidebar_filter_row_expanded(GtkTreeIter *iter, bool expanded)
+{
+ gchar *name = __gui_sidebar_filter_iter_name(iter);
+ gchar *setting = g_strdup_printf("gui.sidebar.expand.%s", name);
+
+ settings_set(setting, expanded);
+
+ g_free(setting);
+ g_free(name);
+}
+
gboolean gui_sidebar_iter_find(GtkTreeIter *iter, const gchar *name,
enum playlist_type_t type)
{
diff --git a/include/gui/sidebar.h b/include/gui/sidebar.h
index 184e9c89..de03efae 100644
--- a/include/gui/sidebar.h
+++ b/include/gui/sidebar.h
@@ -44,6 +44,9 @@ void gui_sidebar_iter_update(GtkTreeIter *);
/* Called to set the playlist at the given iterator as the default. */
void gui_sidebar_filter_path_select(GtkTreePath *);
+/* Called when a playlist treeview row is expanded or collapsed. */
+void gui_sidebar_filter_row_expanded(GtkTreeIter *, bool);
+
/*
* Called to find a playlist with the given name and type,
* starting from the current iterator position.
diff --git a/share/ocarina/ocarina.ui b/share/ocarina/ocarina.ui
index 0fd5c721..b50b39a9 100644
--- a/share/ocarina/ocarina.ui
+++ b/share/ocarina/ocarina.ui
@@ -749,6 +749,8 @@ audio-volume-medium
True
+
+