From 6bbb74b31e8fad738645bb98ff008b7e241da279 Mon Sep 17 00:00:00 2001 From: Klaus Ethgen Date: Fri, 10 Apr 2009 13:44:37 +0000 Subject: [PATCH] Implement random sort method for collections This patch allows to randomize the collections. (Closes: #2497413) https://sourceforge.net/tracker/?func=detail&aid=2497413&group_id=222125&atid=1054683 --- src/collect-table.c | 19 ++++++++++++++++++- src/collect.c | 34 ++++++++++++++++++++++++++++++++++ src/collect.h | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/collect-table.c b/src/collect-table.c index 621a2eb7..ed47dc89 100644 --- a/src/collect-table.c +++ b/src/collect-table.c @@ -720,6 +720,17 @@ static void collection_table_popup_sort_cb(GtkWidget *widget, gpointer data) collection_set_sort_method(ct->cd, type); } +static void collection_table_popup_randomize_cb(GtkWidget *widget, gpointer data) +{ + CollectTable *ct; + + ct = submenu_item_get_data(widget); + + if (!ct) return; + + collection_randomize(ct->cd); +} + static void collection_table_popup_view_new_cb(GtkWidget *widget, gpointer data) { CollectTable *ct = data; @@ -902,7 +913,13 @@ static GtkWidget *collection_table_popup_menu(CollectTable *ct, gboolean over_ic G_CALLBACK(collection_table_popup_copy_path_cb), ct); menu_item_add_divider(menu); - submenu_add_sort(menu, G_CALLBACK(collection_table_popup_sort_cb), ct, FALSE, TRUE, FALSE, 0); + submenu = submenu_add_sort(NULL, G_CALLBACK(collection_table_popup_sort_cb), ct, FALSE, TRUE, FALSE, 0); + menu_item_add_divider(submenu); + menu_item_add(submenu, _("Randomize"), + G_CALLBACK(collection_table_popup_randomize_cb), ct); + item = menu_item_add(menu, _("_Sort"), NULL, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); + menu_item_add_check(menu, _("Show filename _text"), ct->show_text, G_CALLBACK(collection_table_popup_show_names_cb), ct); menu_item_add_divider(menu); diff --git a/src/collect.c b/src/collect.c index 67048457..2a783185 100644 --- a/src/collect.c +++ b/src/collect.c @@ -176,6 +176,30 @@ GList *collection_list_sort(GList *list, SortType method) return g_list_sort(list, collection_list_sort_cb); } +GList *collection_list_randomize(GList *list) +{ + guint random, length, i; + gpointer tmp; + GList *nlist, *olist; + + length = g_list_length(list); + if (!length) return NULL; + + srand((unsigned int)time(NULL)); // Initialize random generator (hasn't to be that much strong) + + for (i = 0; i < length; i++) + { + random = (guint) (1.0 * length * rand()/(RAND_MAX + 1.0)); + olist = g_list_nth(list, i); + nlist = g_list_nth(list, random); + tmp = olist->data; + olist->data = nlist->data; + nlist->data = tmp; + } + + return list; +} + GList *collection_list_add(GList *list, CollectInfo *ci, SortType method) { if (method != SORT_NONE) @@ -577,6 +601,16 @@ void collection_set_sort_method(CollectionData *cd, SortType method) collection_window_refresh(collection_window_find(cd)); } +void collection_randomize(CollectionData *cd) +{ + if (!cd) return; + + cd->list = collection_list_randomize(cd->list); + if (cd->list) cd->changed = TRUE; + + collection_window_refresh(collection_window_find(cd)); +} + void collection_set_update_info_func(CollectionData *cd, void (*func)(CollectionData *, CollectInfo *, gpointer), gpointer data) { diff --git a/src/collect.h b/src/collect.h index 7aa96d3d..e90ac3ff 100644 --- a/src/collect.h +++ b/src/collect.h @@ -59,6 +59,7 @@ CollectInfo *collection_get_first(CollectionData *cd); CollectInfo *collection_get_last(CollectionData *cd); void collection_set_sort_method(CollectionData *cd, SortType method); +void collection_randomize(CollectionData *cd); void collection_set_update_info_func(CollectionData *cd, void (*func)(CollectionData *, CollectInfo *, gpointer), gpointer data); -- 2.20.1