Skip to content

Commit

Permalink
Implement random sort method for collections
Browse files Browse the repository at this point in the history
This patch allows to randomize the collections. (Closes: #2497413)
https://sourceforge.net/tracker/?func=detail&aid=2497413&group_id=222125&atid=1054683
  • Loading branch information
mowgli committed Apr 10, 2009
1 parent 0977d77 commit 6bbb74b
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/collect-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
34 changes: 34 additions & 0 deletions src/collect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions src/collect.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 6bbb74b

Please sign in to comment.