gui/sidebar: Don't set user playlists as editable by default

Instead, watch for a middle click and set the editable state manually
from there.  This fixes a bug where double clicking on a user playlist
put us in editing mode instead of selecting the playlist for playback.

Fixes #110: Cannot select user playlists
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2017-08-25 13:35:09 -04:00
parent 7e303fa2b1
commit 8b17962b4e
4 changed files with 30 additions and 6 deletions

View File

@ -65,6 +65,7 @@ void __gui_pl_user_edited(GtkCellRendererText *renderer, gchar *path,
playlist = gui_sidebar_iter_playlist(&iter);
pl_user_rename(playlist, new_name);
gui_sidebar_iter_update_playlist(&iter, playlist);
gui_sidebar_iter_set_editable(&iter, false);
}
void gui_pl_user_init()

View File

@ -34,11 +34,10 @@ static gchar *__gui_sidebar_size_str(struct playlist *playlist)
static void __gui_sidebar_set(GtkTreeIter *iter, const gchar *name,
const gchar *image, enum playlist_type_t type)
{
bool editable = (type == PL_USER);
gtk_tree_store_set(gui_sidebar_store(), iter, SB_NAME, name,
SB_IMAGE, image,
SB_TYPE, type,
SB_EDITABLE, editable, -1);
SB_EDITABLE, false, -1);
}
static void __gui_sidebar_set_playlist(GtkTreeIter *iter,
@ -155,6 +154,29 @@ bool __gui_sidebar_keypress(GtkTreeView *treeview, GdkEventKey *event,
return true;
}
bool __gui_sidebar_button_press(GtkTreeView *treeview, GdkEventButton *event,
gpointer data)
{
GtkTreeModel *model = gtk_tree_view_get_model(treeview);
GtkTreeViewColumn *column = gtk_tree_view_get_column(treeview, SB_NAME);
GtkTreeIter iter, child;
GtkTreePath *path;
if (event->button != GDK_BUTTON_MIDDLE)
return false;
if (!gtk_tree_view_get_path_at_pos(treeview, event->x, event->y,
&path, NULL, NULL, NULL))
return true;
if (!gtk_tree_model_get_iter(model, &iter, path))
return true;
__gui_sidebar_filter_iter_convert(&iter, &child);
gui_sidebar_iter_set_editable(&child, true);
gtk_tree_view_set_cursor(treeview, path, column, true);
gtk_tree_path_free(path);
return true;
}
void __gui_sidebar_resized(GtkPaned *pane, GParamSpec *pspec, gpointer data)
{
settings_set(SIDEBAR_SETTING, gtk_paned_get_position(pane));

View File

@ -765,6 +765,7 @@ audio-volume-medium</property>
<property name="headers_visible">False</property>
<property name="search_column">1</property>
<property name="enable_tree_lines">True</property>
<signal name="button-press-event" handler="__gui_sidebar_button_press" swapped="no"/>
<signal name="key-press-event" handler="__gui_sidebar_keypress" swapped="no"/>
<signal name="row-activated" handler="__gui_playlist_row_activated" swapped="no"/>
<signal name="row-collapsed" handler="__gui_playlist_row_collapsed" swapped="no"/>

View File

@ -42,20 +42,20 @@ static void test_user()
g_assert_true(gui_sidebar_iter_next(&child));
g_assert_cmpstr_free(gui_sidebar_iter_name(&child), ==, "Test 1");
g_assert_cmpuint(gui_sidebar_iter_type(&child), ==, PL_USER);
g_assert_true(gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, false));
g_assert_false(gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, true));
g_assert_true( gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, false));
g_assert_false(gui_sidebar_iter_editable(&child));
g_assert_true(gui_sidebar_iter_next(&child));
g_assert_cmpstr_free(gui_sidebar_iter_name(&child), ==, "Test 2");
g_assert_cmpuint(gui_sidebar_iter_type(&child), ==, PL_USER);
g_assert_true(gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, false));
g_assert_false(gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, true));
g_assert_true( gui_sidebar_iter_editable(&child));
g_assert_true( gui_sidebar_iter_set_editable(&child, false));
g_assert_false(gui_sidebar_iter_editable(&child));
list = gui_pl_user_list();
g_assert_nonnull(list);