diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-04-21 22:17:01 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-04-21 22:17:01 +0000 |
commit | 682ae4d2444dfb7ddb4d35c578bf3656bca59922 (patch) | |
tree | 679bd4a5c136e951494a0b369e3452ed5135a1c8 /src/trg-main-window.c | |
parent | 004fe9ed03adf35a62ee714319cf3b49887afde0 (diff) |
only lookup the selected torrent id when it changes, remember it until checking every update, use the hash table instead. also fix a crash on multiple consecutive deletes caused by gtktreemodel weirdness.
Diffstat (limited to 'src/trg-main-window.c')
-rw-r--r-- | src/trg-main-window.c | 124 |
1 files changed, 66 insertions, 58 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 3d038aa..96aeaa9 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -69,8 +69,8 @@ #include "trg-remote-prefs-dialog.h" #include "trg-preferences-dialog.h" -static gboolean update_selected_torrent_notebook(TrgMainWindow * win, - gint mode); +static void update_selected_torrent_notebook(TrgMainWindow * win, + gint mode, gint64 id); static void torrent_event_notification(TrgTorrentModel * model, gchar * icon, gchar * desc, gint tmout, gchar * prefKey, @@ -127,10 +127,6 @@ static void on_torrent_get_update(JsonObject * response, int status, static void on_torrent_get_interactive(JsonObject * response, int status, gpointer data); static gboolean trg_update_torrents_timerfunc(gpointer data); -static void trg_main_window_update_notebook_displays(TrgMainWindow * win, - JsonObject * t, - GtkTreeIter * iter, - gint mode); static void open_about_cb(GtkWidget * w, GtkWindow * parent); static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model, GtkTreeIter * iter, @@ -142,7 +138,7 @@ static TrgTorrentTreeView static gboolean trg_dialog_error_handler(TrgMainWindow * win, JsonObject * response, int status); -static gboolean torrent_selection_changed(GtkWidget * w, gpointer data); +static gboolean torrent_selection_changed(GtkTreeSelection * selection, gpointer data); static void trg_main_window_torrent_scrub(TrgMainWindow * win); static void entry_filter_changed_cb(GtkWidget * w, gpointer data); static void torrent_state_selection_changed(TrgStateSelector * selector, @@ -244,31 +240,44 @@ static void trg_main_window_init(TrgMainWindow * self G_GNUC_UNUSED) { } -static gboolean update_selected_torrent_notebook(TrgMainWindow * win, - gint mode) +GtkTreeModel *trg_main_window_get_torrent_model(TrgMainWindow *win) { - TrgMainWindowPrivate *priv; - GtkTreeIter iter; - gint newFirstSelected; - JsonObject *json = NULL; + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + return GTK_TREE_MODEL(priv->torrentModel); +} - priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); - newFirstSelected = - get_first_selected(priv->client, priv->torrentTreeView, &iter, - &json); +gint trg_mw_get_selected_torrent_id(TrgMainWindow *win) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + return priv->selectedTorrentId; +} - if (priv->selectedTorrentId >= 0 - && (priv->selectedTorrentId != newFirstSelected - || newFirstSelected < 0)) { - trg_main_window_torrent_scrub(win); - } +static void update_selected_torrent_notebook(TrgMainWindow * win, + gint mode, gint64 id) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + trg_client *client = priv->client; + JsonObject *t; + GtkTreeIter iter; - if ((priv->selectedTorrentId = newFirstSelected) >= 0) { - trg_main_window_update_notebook_displays(win, json, &iter, mode); - return TRUE; + if (id >= 0 && id != priv->selectedTorrentId && get_torrent_data(client->torrentTable, id, &t, &iter)) { + trg_toolbar_torrent_actions_sensitive(priv->toolBar, TRUE); + trg_menu_bar_torrent_actions_sensitive(priv->menuBar, TRUE); + trg_general_panel_update(priv->genDetails, t, &iter); + trg_trackers_model_update(priv->trackersModel, client->updateSerial, t, + mode); + trg_files_model_update(priv->filesModel, client->updateSerial, t, + mode); + trg_peers_model_update(priv->peersModel, client->updateSerial, t, + mode); + + } else if (id < 0) { + trg_main_window_torrent_scrub(win); + trg_toolbar_torrent_actions_sensitive(priv->toolBar, FALSE); + trg_menu_bar_torrent_actions_sensitive(priv->menuBar, FALSE); } - return FALSE; + priv->selectedTorrentId = id; } static void torrent_event_notification(TrgTorrentModel * model, @@ -768,7 +777,7 @@ GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) gtk_widget_set_size_request(notebook, -1, 175); - priv->genDetails = trg_general_panel_new(priv->sortedTorrentModel); + priv->genDetails = trg_general_panel_new(GTK_TREE_MODEL(priv->torrentModel)); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), GTK_WIDGET(priv->genDetails), gtk_label_new(_("General"))); @@ -933,7 +942,7 @@ on_torrent_get(JsonObject * response, int mode, int status, gpointer data) trg_torrent_model_update(priv->torrentModel, priv->client, response, &stats, mode); - update_selected_torrent_notebook(TRG_MAIN_WINDOW(data), mode); + update_selected_torrent_notebook(TRG_MAIN_WINDOW(data), mode, priv->selectedTorrentId); trg_status_bar_update(priv->statusBar, &stats, client); @@ -988,23 +997,6 @@ static gboolean trg_update_torrents_timerfunc(gpointer data) return FALSE; } -static void -trg_main_window_update_notebook_displays(TrgMainWindow * win, - JsonObject * t, - GtkTreeIter * iter, gint mode) -{ - TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); - trg_client *client = priv->client; - - trg_general_panel_update(priv->genDetails, t, iter); - trg_trackers_model_update(priv->trackersModel, client->updateSerial, t, - mode); - trg_files_model_update(priv->filesModel, client->updateSerial, t, - mode); - trg_peers_model_update(priv->peersModel, client->updateSerial, t, - mode); -} - static void open_about_cb(GtkWidget * w G_GNUC_UNUSED, GtkWindow * parent) { GtkWidget *aboutDialog = trg_about_window_new(parent); @@ -1122,19 +1114,34 @@ trg_dialog_error_handler(TrgMainWindow * win, JsonObject * response, } static gboolean -torrent_selection_changed(GtkWidget * w G_GNUC_UNUSED, gpointer data) +torrent_selection_changed(GtkTreeSelection * selection, gpointer data) { - TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); TrgMainWindow *win = TRG_MAIN_WINDOW(data); - gboolean isSelected = - update_selected_torrent_notebook(win, TORRENT_GET_MODE_FIRST); + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + GList *selectionList; + GList *firstNode; + gint64 id; - trg_toolbar_torrent_actions_sensitive(priv->toolBar, isSelected); - trg_menu_bar_torrent_actions_sensitive(priv->menuBar, isSelected); + if (trg_torrent_model_is_remove_in_progress(priv->torrentModel)) + return FALSE; + + selectionList = gtk_tree_selection_get_selected_rows(selection, NULL); + firstNode = g_list_first(selectionList); + id = -1; + + if (firstNode) { + GtkTreeIter iter; + if (gtk_tree_model_get_iter + (priv->sortedTorrentModel, &iter, (GtkTreePath *) firstNode->data)) { + gtk_tree_model_get(GTK_TREE_MODEL(priv->sortedTorrentModel), &iter, + TORRENT_COLUMN_ID, &id, -1); + } + } + + g_list_foreach(selectionList, (GFunc) gtk_tree_path_free, NULL); + g_list_free(selectionList); - if (!isSelected) - trg_trackers_model_set_no_selection(TRG_TRACKERS_MODEL - (priv->trackersModel)); + update_selected_torrent_notebook(win, TORRENT_GET_MODE_FIRST, id); return TRUE; } @@ -1177,6 +1184,8 @@ void trg_main_window_torrent_scrub(TrgMainWindow * win) gtk_list_store_clear(GTK_LIST_STORE(priv->trackersModel)); gtk_list_store_clear(GTK_LIST_STORE(priv->peersModel)); trg_general_panel_clear(priv->genDetails); + trg_trackers_model_set_no_selection(TRG_TRACKERS_MODEL + (priv->trackersModel)); } static void entry_filter_changed_cb(GtkWidget * w, gpointer data) @@ -1436,17 +1445,16 @@ static GtkWidget *limit_menu_new(TrgMainWindow * win, gchar * title, JsonArray * ids) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); - + trg_client *client = priv->client; JsonObject *current = NULL; GtkTreeIter iter; GtkWidget *toplevel, *menu, *item; gint64 limit; if (ids) - get_first_selected(priv->client, priv->torrentTreeView, &iter, - ¤t); + get_torrent_data(client->torrentTable, priv->selectedTorrentId, ¤t, &iter); else - current = priv->client->session; + current = client->session; limit = json_object_get_boolean_member(current, enabledKey) ? json_object_get_int_member(current, speedKey) : -1; |