Implement random sort method for collections
authorKlaus Ethgen <Klaus@Ethgen.de>
Fri, 10 Apr 2009 13:44:37 +0000 (13:44 +0000)
committerKlaus Ethgen <Klaus@Ethgen.de>
Fri, 10 Apr 2009 13:44:37 +0000 (13:44 +0000)
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
src/collect.c
src/collect.h

index 621a2eb..ed47dc8 100644 (file)
@@ -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);
index 6704845..2a78318 100644 (file)
@@ -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)
 {
index 7aa96d3..e90ac3f 100644 (file)
@@ -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);