diff options
-rw-r--r-- | src/trg-main-window.c | 2 | ||||
-rw-r--r-- | src/trg-state-selector.c | 55 | ||||
-rw-r--r-- | src/trg-state-selector.h | 1 | ||||
-rw-r--r-- | src/util.c | 2 |
4 files changed, 52 insertions, 8 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 8236914..13c1d99 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -785,7 +785,7 @@ GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) GtkWidget *notebook = priv->notebook = gtk_notebook_new(); - gtk_widget_set_size_request(notebook, -1, 175); + gtk_widget_set_size_request(notebook, -1, 185); priv->genDetails = trg_general_panel_new(GTK_TREE_MODEL(priv->torrentModel)); 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, diff --git a/src/trg-state-selector.h b/src/trg-state-selector.h index 30a1455..03e4f1e 100644 --- a/src/trg-state-selector.h +++ b/src/trg-state-selector.h @@ -17,7 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - #ifndef TRG_STATE_LIST_H_ #define TRG_STATE_LIST_H_ @@ -109,7 +109,7 @@ gboolean g_slist_str_set_add(GSList ** list, const gchar * string) if (!g_strcmp0((gchar *) li->data, string)) return FALSE; - *list = g_slist_append(*list, g_strdup(string)); + *list = g_slist_insert_sorted(*list, g_strdup(string), (GCompareFunc)g_strcmp0); return TRUE; } |