summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-12-28 05:44:23 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-12-28 05:44:23 +0000
commite8af329f4613411e67a0b6e6dea9445b6d001de5 (patch)
tree12c139caca9353c06c4daf1d29b9841dc47871e4
parentf1d1f33f6ba6bb2fc38293dd957c0069611b29de (diff)
avoid some unnecessary filter updates
-rw-r--r--src/trg-main-window.c2
-rw-r--r--src/trg-state-selector.c50
-rw-r--r--src/trg-state-selector.h2
-rw-r--r--src/trg-torrent-model.c1
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,