diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-12-28 05:44:23 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-12-28 05:44:23 +0000 |
commit | e8af329f4613411e67a0b6e6dea9445b6d001de5 (patch) | |
tree | 12c139caca9353c06c4daf1d29b9841dc47871e4 | |
parent | f1d1f33f6ba6bb2fc38293dd957c0069611b29de (diff) |
avoid some unnecessary filter updates
-rw-r--r-- | src/trg-main-window.c | 2 | ||||
-rw-r--r-- | src/trg-state-selector.c | 50 | ||||
-rw-r--r-- | src/trg-state-selector.h | 2 | ||||
-rw-r--r-- | src/trg-torrent-model.c | 1 |
4 files changed, 31 insertions, 24 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 5461fb3..58f7505 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -1298,7 +1298,7 @@ void trg_main_window_reload_dir_aliases(TrgMainWindow * win) trg_torrent_model_reload_dir_aliases(priv->client, GTK_TREE_MODEL (priv->torrentModel)); - trg_state_selector_update(priv->stateSelector); + trg_state_selector_update(priv->stateSelector, TORRENT_UPDATE_ADDREMOVE); } static TrgTorrentTreeView diff --git a/src/trg-state-selector.c b/src/trg-state-selector.c index 5bad1cc..48d6b01 100644 --- a/src/trg-state-selector.c +++ b/src/trg-state-selector.c @@ -161,26 +161,27 @@ static void trg_state_selector_update_dynamic_filter(GtkTreeModel * model, if (oldSerial != serial) { g_value_init(&gvalue, G_TYPE_INT); g_value_set_int(&gvalue, 1); - gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, STATE_SELECTOR_COUNT, - &gvalue); + gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, + STATE_SELECTOR_COUNT, &gvalue); memset(&gvalue, 0, sizeof(GValue)); g_value_init(&gvalue, G_TYPE_INT64); g_value_set_int64(&gvalue, serial); - gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, STATE_SELECTOR_SERIAL, - &gvalue); + gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, + STATE_SELECTOR_SERIAL, &gvalue); } else { g_value_init(&gvalue, G_TYPE_INT); g_value_set_int(&gvalue, ++oldCount); - gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, STATE_SELECTOR_COUNT, - &gvalue); + gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, + STATE_SELECTOR_COUNT, &gvalue); } gtk_tree_path_free(path); } static void refresh_statelist_cb(GtkWidget * w, gpointer data) { - trg_state_selector_update(TRG_STATE_SELECTOR(data)); + trg_state_selector_update(TRG_STATE_SELECTOR(data), + TORRENT_UPDATE_ADDREMOVE); } static void view_popup_menu(GtkWidget * treeview, GdkEventButton * event, @@ -263,7 +264,7 @@ static void trg_state_selector_insert(TrgStateSelector * s, int offset, gtk_list_store_insert(GTK_LIST_STORE(model), iter, args.pos); } -void trg_state_selector_update(TrgStateSelector * s) { +void trg_state_selector_update(TrgStateSelector * s, guint whatsChanged) { TrgStateSelectorPrivate *priv = TRG_STATE_SELECTOR_GET_PRIVATE(s); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(s)); TrgClient *client = priv->client; @@ -300,7 +301,9 @@ void trg_state_selector_update(TrgStateSelector * s) { if (!t) continue; - if (priv->showTrackers) { + if (priv->showTrackers + && ((whatsChanged & TORRENT_UPDATE_PATH_CHANGE) + || (whatsChanged & TORRENT_UPDATE_ADDREMOVE))) { trackersList = json_array_get_elements( torrent_get_tracker_stats(t)); for (trackerItem = trackersList; trackerItem; @@ -328,9 +331,8 @@ void trg_state_selector_update(TrgStateSelector * s) { STATE_SELECTOR_ICON, GTK_STOCK_NETWORK, STATE_SELECTOR_NAME, announceHost, STATE_SELECTOR_SERIAL, updateSerial, - STATE_SELECTOR_COUNT, 1, - STATE_SELECTOR_BIT, FILTER_FLAG_TRACKER, - STATE_SELECTOR_INDEX, 0, -1); + STATE_SELECTOR_COUNT, 1, STATE_SELECTOR_BIT, + FILTER_FLAG_TRACKER, STATE_SELECTOR_INDEX, 0, -1); g_hash_table_insert(priv->trackers, announceHost, quick_tree_ref_new(model, &iter)); } @@ -338,7 +340,7 @@ void trg_state_selector_update(TrgStateSelector * s) { g_list_free(trackersList); } - if (priv->showDirs) { + if (priv->showTrackers && (whatsChanged & TORRENT_UPDATE_ADDREMOVE)) { gchar *dir; gtk_tree_model_get(torrentModel, &torrentIter, TORRENT_COLUMN_DOWNLOADDIR_SHORT, &dir, -1); @@ -355,8 +357,7 @@ void trg_state_selector_update(TrgStateSelector * s) { STATE_SELECTOR_ICON, GTK_STOCK_DIRECTORY, STATE_SELECTOR_NAME, dir, STATE_SELECTOR_SERIAL, updateSerial, STATE_SELECTOR_BIT, FILTER_FLAG_DIR, - STATE_SELECTOR_COUNT, 1, - STATE_SELECTOR_INDEX, 0, -1); + STATE_SELECTOR_COUNT, 1, STATE_SELECTOR_INDEX, 0, -1); g_hash_table_insert(priv->directories, g_strdup(dir), quick_tree_ref_new(model, &iter)); } @@ -369,13 +370,15 @@ void trg_state_selector_update(TrgStateSelector * s) { cruft.serial = trg_client_get_serial(client); - if (priv->showTrackers) { + if (priv->showTrackers && ((whatsChanged & TORRENT_UPDATE_ADDREMOVE))) { cruft.table = priv->trackers; g_hash_table_foreach_remove(priv->trackers, trg_state_selector_remove_cruft, &cruft); } - if (priv->showDirs) { + if (priv->showDirs + && ((whatsChanged & TORRENT_UPDATE_PATH_CHANGE) + || (whatsChanged & TORRENT_UPDATE_ADDREMOVE))) { cruft.table = priv->directories; g_hash_table_foreach_remove(priv->directories, trg_state_selector_remove_cruft, &cruft); @@ -388,15 +391,18 @@ void trg_state_selector_set_show_dirs(TrgStateSelector * s, gboolean show) { if (!show) g_hash_table_remove_all(priv->directories); else - trg_state_selector_update(s); + trg_state_selector_update(s, TORRENT_UPDATE_PATH_CHANGE); } static void on_torrents_state_change(TrgTorrentModel * model, guint whatsChanged, gpointer data) { TrgStateSelector *selector = TRG_STATE_SELECTOR(data); - trg_state_selector_update(selector); - trg_state_selector_stats_update(selector, - trg_torrent_model_get_stats(model)); + trg_state_selector_update(selector, whatsChanged); + + if ((whatsChanged & TORRENT_UPDATE_ADDREMOVE) + || (whatsChanged & TORRENT_UPDATE_STATE_CHANGE)) + trg_state_selector_stats_update(selector, + trg_torrent_model_get_stats(model)); } void trg_state_selector_set_show_trackers(TrgStateSelector * s, gboolean show) { @@ -405,7 +411,7 @@ void trg_state_selector_set_show_trackers(TrgStateSelector * s, gboolean show) { if (!show) g_hash_table_remove_all(priv->trackers); else - trg_state_selector_update(s); + trg_state_selector_update(s, TORRENT_UPDATE_ADDREMOVE); } static void trg_state_selector_add_state(TrgStateSelector * selector, diff --git a/src/trg-state-selector.h b/src/trg-state-selector.h index f002b3b..2d9af17 100644 --- a/src/trg-state-selector.h +++ b/src/trg-state-selector.h @@ -64,7 +64,7 @@ GType trg_state_selector_get_type(void); TrgStateSelector *trg_state_selector_new(TrgClient * client, TrgTorrentModel *tmodel); G_END_DECLS guint32 trg_state_selector_get_flag(TrgStateSelector * s); -void trg_state_selector_update(TrgStateSelector * s); +void trg_state_selector_update(TrgStateSelector * s, guint whatsChanged); gchar *trg_state_selector_get_selected_text(TrgStateSelector * s); GRegex *trg_state_selector_get_url_host_regex(TrgStateSelector * s); void trg_state_selector_disconnect(TrgStateSelector * s); diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c index e46b876..f9231e8 100644 --- a/src/trg-torrent-model.c +++ b/src/trg-torrent-model.c @@ -249,6 +249,7 @@ static gboolean trg_torrent_model_reload_dir_aliases_foreachfunc( void trg_torrent_model_reload_dir_aliases(TrgClient * tc, GtkTreeModel * model) { gtk_tree_model_foreach(model, trg_torrent_model_reload_dir_aliases_foreachfunc, tc); + g_signal_emit(model, signals[TMODEL_STATE_CHANGED], 0, TORRENT_UPDATE_PATH_CHANGE); } static gboolean trg_torrent_model_stats_scan_foreachfunc(GtkTreeModel * model, |