>From b9c0afee81421b0be98c578a05e14f07df181a95 Mon Sep 17 00:00:00 2001 From: Andreas Winkelmann Date: Fri, 20 Jun 2014 02:20:33 +0200 Subject: [PATCH] Fixes problems with an assertion in Action_Select_Browser_Style() and the current row selection jumping randomly while changing between Tree and Artist/Album View When changing to Artist/Album-View the Browser-List gets cleared. While clearing GTK emits a changed signal for each row. So Browser_List_Row_Selected() gets triggered, unfortunately with a previously selected row so the function does everything for files not anymore in the List and at the end strange things. Added a funtion which clears the list but stops Browser_List_Row_Selected() while clearing. --- src/browser.c | 26 ++++++++++++++++++++++++-- src/browser.h | 1 + src/et_core.c | 5 ++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/browser.c b/src/browser.c index 8f10b10..c7ac956 100644 --- a/src/browser.c +++ b/src/browser.c @@ -1026,7 +1026,7 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select) g_return_if_fail (BrowserList != NULL); - gtk_list_store_clear(fileListModel); + browser_file_model_clear(); for (l = g_list_first (etfilelist); l != NULL; l = g_list_next (l)) { @@ -1725,13 +1725,35 @@ ET_File *Browser_List_Select_File_By_DLM (const gchar* string, gboolean select_i return retval; } +void +browser_file_model_clear (void) +{ + GtkTreeSelection *selection; + + /* Empty Model, Disable Browser_List_Row_Selected() during clear + * because it is called and causes weired things. + */ + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (BrowserList)); + + g_signal_handlers_block_by_func (selection, + G_CALLBACK (Browser_List_Row_Selected), + NULL); + + gtk_list_store_clear (fileListModel); + + g_signal_handlers_unblock_by_func (selection, + G_CALLBACK (Browser_List_Row_Selected), + NULL); +} + /* * Clear all entries on the file list */ void Browser_List_Clear() { - gtk_list_store_clear(fileListModel); + browser_file_model_clear(); browser_artist_model_clear (); browser_album_model_clear (); diff --git a/src/browser.h b/src/browser.h index c1bcfb5..425754f 100644 --- a/src/browser.h +++ b/src/browser.h @@ -147,6 +147,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent); void browser_album_model_clear (void); void browser_artist_model_clear (void); +void browser_file_model_clear (void); gboolean Browser_Tree_Select_Dir (const gchar *current_path); void Browser_Tree_Rebuild (gchar *path_to_load); diff --git a/src/et_core.c b/src/et_core.c index b278494..c74d52b 100644 --- a/src/et_core.c +++ b/src/et_core.c @@ -2100,7 +2100,10 @@ GList *ET_Displayed_File_List_By_Etfile (ET_File *ETFile) if (ETFile == (ET_File *)etfilelist->data) break; } - ETCore->ETFileDisplayedList = etfilelist; // To "save" the position like in ET_File_List_Next... (not very good - FIX ME) + if ( etfilelist ) + { + ETCore->ETFileDisplayedList = etfilelist; // To "save" the position like in ET_File_List_Next... (not very good - FIX ME) + } return etfilelist; } -- 1.8.4.5