diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-07-16 19:06:09 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-07-16 19:06:09 +0000 |
commit | b8a1599a2ab9eafd496ba23179dda97d6e83e917 (patch) | |
tree | 15d4f824e4814770dfddc5831fc1437e492e3391 /src/trg-state-selector.c | |
parent | 8eddb35a19f2d95f0033cbde071c7a5efe08895e (diff) |
issue 54 - sorted destination combo and trackers/dirs in filter
Diffstat (limited to 'src/trg-state-selector.c')
-rw-r--r-- | src/trg-state-selector.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/src/trg-state-selector.c b/src/trg-state-selector.c index 71b8eb3..f16412b 100644 --- a/src/trg-state-selector.c +++ b/src/trg-state-selector.c @@ -213,6 +213,52 @@ view_onButtonPressed(GtkWidget * treeview, GdkEventButton * event, return FALSE; } +struct state_find_pos { + int offset; + int range; + int pos; + const gchar *name; +}; + +static gboolean trg_state_selector_find_pos_foreach(GtkTreeModel *model, + GtkTreePath *path, GtkTreeIter *iter, gpointer data) +{ + struct state_find_pos *args = (struct state_find_pos*)data; + gchar *name; + gboolean res; + + if (args->pos < args->offset) { + args->pos++; + return FALSE; + } else if (args->range >= 0 && args->pos > args->offset + args->range - 1) { + return TRUE; + } + + gtk_tree_model_get(model, iter, STATE_SELECTOR_NAME, &name, -1); + res = g_strcmp0(name, args->name) >= 0; + g_free(name); + + if (!res) + args->pos++; + + return res; +} + +static void trg_state_selector_insert(TrgStateSelector *s, + int offset, gint range, const gchar *name, GtkTreeIter *iter) +{ + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(s)); + + struct state_find_pos args; + args.offset = offset; + args.pos = 0; + args.range = range; + args.name = name; + + gtk_tree_model_foreach(model, trg_state_selector_find_pos_foreach, &args); + gtk_list_store_insert (GTK_LIST_STORE(model), iter, args.pos); +} + void trg_state_selector_update(TrgStateSelector * s) { TrgStateSelectorPrivate *priv = TRG_STATE_SELECTOR_GET_PRIVATE(s); @@ -272,10 +318,8 @@ void trg_state_selector_update(TrgStateSelector * s) client->updateSerial); g_free(announceHost); } else { - gtk_list_store_insert(GTK_LIST_STORE(model), &iter, - N_CATEGORIES + - g_hash_table_size - (priv->trackers)); + trg_state_selector_insert(s, N_CATEGORIES, + g_hash_table_size(priv->trackers), announceHost, &iter); gtk_list_store_set(GTK_LIST_STORE(model), &iter, STATE_SELECTOR_ICON, GTK_STOCK_NETWORK, @@ -300,7 +344,8 @@ void trg_state_selector_update(TrgStateSelector * s) result, client->updateSerial); } else { - gtk_list_store_append(GTK_LIST_STORE(model), &iter); + trg_state_selector_insert(s, N_CATEGORIES+ + g_hash_table_size(priv->trackers), -1, dir, &iter); gtk_list_store_set(GTK_LIST_STORE(model), &iter, STATE_SELECTOR_ICON, GTK_STOCK_DIRECTORY, |