diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-10-07 18:55:01 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-10-07 18:55:01 +0000 |
commit | 429b32fba6f5ad14db31fe2690974b57df858999 (patch) | |
tree | 54970bd752b8dcf957d4a2db09be5678b79f9af4 /src | |
parent | c3bd3ac55162a88b308a6f700aad88d26cbd5f29 (diff) |
make connect button a menu button with other profiles, also add a connection serial used to discard requests issued before a disconnect which get their callback invoked after a new one is established. add an experimental "repeater" flag on exec commands (eg. %{name}[, ]).
Diffstat (limited to 'src')
-rw-r--r-- | src/installer.nsi | 4 | ||||
-rw-r--r-- | src/protocol-constants.h | 21 | ||||
-rw-r--r-- | src/remote-exec.c | 75 | ||||
-rw-r--r-- | src/remote-exec.h | 2 | ||||
-rw-r--r-- | src/torrent.c | 23 | ||||
-rw-r--r-- | src/torrent.h | 8 | ||||
-rw-r--r-- | src/tpeer.h | 18 | ||||
-rw-r--r-- | src/trg-client.c | 17 | ||||
-rw-r--r-- | src/trg-client.h | 3 | ||||
-rw-r--r-- | src/trg-file-parser.c | 19 | ||||
-rw-r--r-- | src/trg-file-parser.h | 19 | ||||
-rw-r--r-- | src/trg-general-panel.c | 19 | ||||
-rw-r--r-- | src/trg-main-window.c | 135 | ||||
-rw-r--r-- | src/trg-main-window.h | 1 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 43 | ||||
-rw-r--r-- | src/trg-menu-bar.h | 5 | ||||
-rw-r--r-- | src/trg-preferences-dialog.c | 4 | ||||
-rw-r--r-- | src/trg-prefs.c | 18 | ||||
-rw-r--r-- | src/trg-toolbar.c | 250 | ||||
-rw-r--r-- | src/trg-toolbar.h | 7 | ||||
-rw-r--r-- | src/trg-torrent-model.c | 2 |
21 files changed, 483 insertions, 210 deletions
diff --git a/src/installer.nsi b/src/installer.nsi index 97691f9..7b92a3e 100644 --- a/src/installer.nsi +++ b/src/installer.nsi @@ -10,7 +10,7 @@ Name "Transmission Remote GTK" ; The file to write
!ifndef REV
-OutFile "transmission-remote-gtk-0.6.1-installer.exe"
+OutFile "transmission-remote-gtk-0.6.2-installer.exe"
!else
OutFile "transmission-remote-gtk-${REV}-installer.exe"
!endif
@@ -320,4 +320,4 @@ Function .onInit StrCpy $INSTDIR "$PROGRAMFILES\${ProgramFilesDir}"
${Endif}
!endif
-FunctionEnd
\ No newline at end of file +FunctionEnd
diff --git a/src/protocol-constants.h b/src/protocol-constants.h index 139acbc..a807edf 100644 --- a/src/protocol-constants.h +++ b/src/protocol-constants.h @@ -86,6 +86,7 @@ #define FIELD_QUEUE_POSITION "queuePosition" #define FIELD_ACTIVITY_DATE "activityDate" #define FIELD_ISPRIVATE "isPrivate" +#define FIELD_METADATAPERCENTCOMPLETE "metadataPercentComplete" #define FIELD_FILES_WANTED "files-wanted" #define FIELD_FILES_UNWANTED "files-unwanted" @@ -138,6 +139,26 @@ #define PARAM_PAUSED "paused" #define PARAM_TAG "tag" +/* peers structure */ + +#define TPEER_ADDRESS "address" +#define TPEER_CLIENT_NAME "clientName" +#define TPEER_PROGRESS "progress" +#define TPEER_RATE_TO_CLIENT "rateToClient" +#define TPEER_RATE_TO_PEER "rateToPeer" +#define TPEER_IS_ENCRYPTED "isEncrypted" +#define TPEER_IS_DOWNLOADING_FROM "isDownloadingFrom" +#define TPEER_IS_UPLOADING_TO "isUploadingTo" +#define TPEER_FLAGSTR "flagStr" + +#define TPEERFROM_FROMPEX "fromPex" +#define TPEERFROM_FROMDHT "fromDht" +#define TPEERFROM_FROMTRACKERS "fromTracker" +#define TPEERFROM_FROMLTEP "fromLtep" +#define TPEERFROM_FROMRESUME "fromCache" +#define TPEERFROM_FROMINCOMING "fromIncoming" +#define TPEERFROM_FROMLPD "fromLpd" + /* The rpc-version >= that the status field of torrent-get changed */ #define NEW_STATUS_RPC_VERSION 14 diff --git a/src/remote-exec.c b/src/remote-exec.c index 56e4316..75c1d10 100644 --- a/src/remote-exec.c +++ b/src/remote-exec.c @@ -18,8 +18,10 @@ */ #include <glib.h> +#include <gtk/gtk.h> #include <json-glib/json-glib.h> +#include "trg-torrent-model.h" #include "protocol-constants.h" #include "torrent.h" @@ -79,39 +81,75 @@ static gchar *dump_json_value(JsonNode * node) { return g_string_free(buffer, FALSE); } -gchar *build_remote_exec_cmd(TrgPrefs *prefs, JsonObject * torrent, +gchar *build_remote_exec_cmd(TrgPrefs *prefs, GtkTreeModel *model, GList *selection, const gchar * input) { JsonObject *profile = trg_prefs_get_profile(prefs); gchar *work = g_strdup(input); GRegex *regex, *replacerx; GMatchInfo *match_info; - gchar *whole, *id, *tmp, *valuestr; + gchar *whole, *wholeEscaped, *id, *tmp, *valuestr, *repeater; JsonNode *replacement; - regex = g_regex_new("%{([A-Za-z\\-]+)}", 0, 0, NULL); + regex = g_regex_new("%{([A-Za-z\\-]+)}(?:\\[(.*)\\])?", 0, 0, NULL); + g_regex_match_full(regex, input, -1, 0, 0, &match_info, NULL); if (match_info) { while (g_match_info_matches(match_info)) { - id = g_match_info_fetch(match_info, 1); whole = g_match_info_fetch(match_info, 0); - replacerx = g_regex_new(whole, 0, 0, NULL); + wholeEscaped = g_regex_escape_string(whole, -1); + id = g_match_info_fetch(match_info, 1); + repeater = g_match_info_fetch(match_info, 2); + + replacerx = g_regex_new(wholeEscaped, 0, 0, NULL); valuestr = NULL; - if (json_object_has_member(torrent, id)) { - replacement = json_object_get_member(torrent, id); - } else if (json_object_has_member(profile, id)) { + if (json_object_has_member(profile, id)) { replacement = json_object_get_member(profile, id); + if (JSON_NODE_HOLDS_VALUE(replacement)) + valuestr = dump_json_value(replacement); } else { - replacement = NULL; - } - - if (replacement && JSON_NODE_HOLDS_VALUE(replacement)) { - valuestr = dump_json_value(replacement); - } else if (!g_strcmp0(id, "full-dir")) { - valuestr = torrent_get_full_dir(torrent); - } else if (!g_strcmp0(id, "full-path")) { - valuestr = torrent_get_full_path(torrent); + GString *gs = g_string_new (""); + GList *li; + GtkTreeIter iter; + JsonObject *json; + gchar *piece; + + for (li = selection; li; li = g_list_next(li)) { + piece = NULL; + gtk_tree_model_get_iter(model, &iter, (GtkTreePath*)li->data); + gtk_tree_model_get(model, &iter, TORRENT_COLUMN_JSON, &json, -1); + if (json_object_has_member(json, id)) { + replacement = json_object_get_member(json, id); + if (JSON_NODE_HOLDS_VALUE(replacement)) { + piece = dump_json_value(replacement); + } + } + + if (!piece) { + if (!g_strcmp0(id, "full-dir")) { + piece = torrent_get_full_dir(json); + } else if (!g_strcmp0(id, "full-path")) { + piece = torrent_get_full_path(json); + } + } + + if (piece) { + g_string_append(gs, piece); + g_free(piece); + } + + if (!repeater) + break; + + if (piece && li != g_list_last(selection)) + g_string_append(gs, repeater); + } + + if (gs->len > 0) + valuestr = g_string_free (gs, FALSE); + else + g_string_free(gs, TRUE); } if (valuestr) @@ -126,9 +164,12 @@ gchar *build_remote_exec_cmd(TrgPrefs *prefs, JsonObject * torrent, g_regex_unref(replacerx); g_free(whole); + g_free(repeater); + g_free(wholeEscaped); g_free(id); g_match_info_next(match_info, NULL); } + g_match_info_free(match_info); } diff --git a/src/remote-exec.h b/src/remote-exec.h index 0596d04..864f8b5 100644 --- a/src/remote-exec.h +++ b/src/remote-exec.h @@ -20,6 +20,6 @@ #ifndef REMOTE_EXEC_H_ #define REMOTE_EXEC_H_ -gchar *build_remote_exec_cmd(TrgPrefs *prefs, JsonObject * torrent, const gchar * input); +gchar *build_remote_exec_cmd(TrgPrefs *prefs, GtkTreeModel *model, GList *selection, const gchar * input); #endif /* REMOTE_EXEC_H_ */ diff --git a/src/torrent.c b/src/torrent.c index 0455a89..33e7a41 100644 --- a/src/torrent.c +++ b/src/torrent.c @@ -66,6 +66,11 @@ const gchar *torrent_get_download_dir(JsonObject * t) return json_object_get_string_member(t, FIELD_DOWNLOAD_DIR); } +gdouble torrent_get_metadata_percent_complete(JsonObject *t) +{ + return json_double_to_progress(json_object_get_member(t, FIELD_METADATAPERCENTCOMPLETE)); +} + const gchar *torrent_get_name(JsonObject * t) { return json_object_get_string_member(t, FIELD_NAME); @@ -220,6 +225,10 @@ guint32 torrent_get_flags(JsonObject * t, gint64 rpcv, gint64 status, gint64 dow case TR_STATUS_DOWNLOAD: if (!(flags & TORRENT_FLAG_COMPLETE)) flags |= TORRENT_FLAG_DOWNLOADING; + + if (torrent_get_metadata_percent_complete(t) < 100) + flags |= TORRENT_FLAG_DOWNLOADING_METADATA; + flags |= TORRENT_FLAG_ACTIVE; break; case TR_STATUS_SEED_WAIT: @@ -264,6 +273,8 @@ gchar *torrent_get_status_icon(gint64 rpcv, guint flags) { if (flags & TORRENT_FLAG_ERROR) return g_strdup(GTK_STOCK_DIALOG_WARNING); + else if (flags & TORRENT_FLAG_DOWNLOADING_METADATA) + return g_strdup(GTK_STOCK_FIND); else if (flags & TORRENT_FLAG_DOWNLOADING) return g_strdup(GTK_STOCK_GO_DOWN); else if (flags & TORRENT_FLAG_PAUSED) @@ -286,13 +297,16 @@ const gchar *torrent_get_errorstr(JsonObject * t) return json_object_get_string_member(t, FIELD_ERRORSTR); } -gchar *torrent_get_status_string(gint64 rpcv, gint64 value) +gchar *torrent_get_status_string(gint64 rpcv, gint64 value, guint flags) { if (rpcv >= NEW_STATUS_RPC_VERSION) { switch (value) { case TR_STATUS_DOWNLOAD: - return g_strdup(_("Downloading")); + if (flags & TORRENT_FLAG_DOWNLOADING_METADATA) + return g_strdup(_("Metadata Downloading")); + else + return g_strdup(_("Downloading")); case TR_STATUS_DOWNLOAD_WAIT: return g_strdup(_("Queued download")); case TR_STATUS_CHECK_WAIT: @@ -311,7 +325,10 @@ gchar *torrent_get_status_string(gint64 rpcv, gint64 value) { switch (value) { case OLD_STATUS_DOWNLOADING: - return g_strdup(_("Downloading")); + if (flags & TORRENT_FLAG_DOWNLOADING_METADATA) + return g_strdup(_("Metadata Downloading")); + else + return g_strdup(_("Downloading")); case OLD_STATUS_PAUSED: return g_strdup(_("Paused")); case OLD_STATUS_SEEDING: diff --git a/src/torrent.h b/src/torrent.h index 3d78962..01ebda9 100644 --- a/src/torrent.h +++ b/src/torrent.h @@ -37,8 +37,9 @@ #define TORRENT_FLAG_PAUSED (1 << 10) #define TORRENT_FLAG_QUEUED (1 << 11) #define TORRENT_FLAG_ACTIVE (1 << 12) -#define FILTER_FLAG_TRACKER (1 << 13) -#define FILTER_FLAG_DIR (1 << 14) +#define TORRENT_FLAG_DOWNLOADING_METADATA (1 << 13) +#define FILTER_FLAG_TRACKER (1 << 14) +#define FILTER_FLAG_DIR (1 << 15) #define TORRENT_ADD_FLAG_PAUSED (1 << 0) /* 0x01 */ #define TORRENT_ADD_FLAG_DELETE (1 << 1) /* 0x02 */ @@ -55,7 +56,7 @@ const gchar *torrent_get_download_dir(JsonObject * t); gint64 torrent_get_have_unchecked(JsonObject * t); gint64 torrent_get_have_valid(JsonObject * t); gint64 torrent_get_status(JsonObject * t); -gchar *torrent_get_status_string(gint64 rpcv, gint64 value); +gchar *torrent_get_status_string(gint64 rpcv, gint64 value, guint flags); gchar *torrent_get_status_icon(gint64 rpcv, guint flags); guint32 torrent_get_flags(JsonObject * t, gint64 rpcv, gint64 status, gint64 downRate, gint64 upRate); JsonArray *torrent_get_peers(JsonObject * t); @@ -89,6 +90,7 @@ gint64 torrent_get_queue_position(JsonObject *args); gint64 torrent_get_activity_date(JsonObject *t); gchar *torrent_get_full_dir(JsonObject * obj); gchar *torrent_get_full_path(JsonObject *obj); +gdouble torrent_get_metadata_percent_complete(JsonObject *t); /* outer response object */ diff --git a/src/tpeer.h b/src/tpeer.h index 6fc525f..6886655 100644 --- a/src/tpeer.h +++ b/src/tpeer.h @@ -23,24 +23,6 @@ #include <glib-object.h> #include <json-glib/json-glib.h> -#define TPEER_ADDRESS "address" -#define TPEER_CLIENT_NAME "clientName" -#define TPEER_PROGRESS "progress" -#define TPEER_RATE_TO_CLIENT "rateToClient" -#define TPEER_RATE_TO_PEER "rateToPeer" -#define TPEER_IS_ENCRYPTED "isEncrypted" -#define TPEER_IS_DOWNLOADING_FROM "isDownloadingFrom" -#define TPEER_IS_UPLOADING_TO "isUploadingTo" -#define TPEER_FLAGSTR "flagStr" - -#define TPEERFROM_FROMPEX "fromPex" -#define TPEERFROM_FROMDHT "fromDht" -#define TPEERFROM_FROMTRACKERS "fromTracker" -#define TPEERFROM_FROMLTEP "fromLtep" -#define TPEERFROM_FROMRESUME "fromCache" -#define TPEERFROM_FROMINCOMING "fromIncoming" -#define TPEERFROM_FROMLPD "fromLpd" - const gchar *peer_get_address(JsonObject * p); const gchar *peer_get_client_name(JsonObject * p); gboolean peer_get_is_encrypted(JsonObject * p); diff --git a/src/trg-client.c b/src/trg-client.c index 4ee3998..e01da05 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -53,6 +53,7 @@ typedef struct _TrgClientPrivate TrgClientPrivate; struct _TrgClientPrivate { char *session_id; + guint connid; gboolean activeOnlyUpdate; guint failCount; guint interval; @@ -172,10 +173,12 @@ void trg_client_set_session(TrgClient * tc, JsonObject * session) { TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); - if (priv->session) + if (priv->session) { json_object_unref(priv->session); - - session_get_version(session, &priv->version); + } else { + session_get_version(session, &priv->version); + priv->connid++; + } priv->session = session; @@ -323,7 +326,7 @@ void trg_client_status_change(TrgClient *tc, gboolean connected) { TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(tc); - if (!connected) { + if (!connected && priv->session) { json_object_unref(priv->session); priv->session = NULL; } @@ -643,6 +646,8 @@ trg_response *dispatch_str(TrgClient * client, gchar *req) static void dispatch_async_threadfunc(trg_request *req, TrgClient * client) { + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(client); + trg_response *rsp; if (req->str) @@ -652,7 +657,7 @@ static void dispatch_async_threadfunc(trg_request *req, rsp->cb_data = req->cb_data; - if (req->callback) + if (req->callback && req->connid == priv->connid) g_idle_add(req->callback, rsp); else trg_response_free(rsp); @@ -664,10 +669,12 @@ static gboolean dispatch_async_common(TrgClient * client, trg_request *trg_req, GSourceFunc callback, gpointer data) { + TrgClientPrivate *priv = TRG_CLIENT_GET_PRIVATE(client); GError *error = NULL; trg_req->callback = callback; trg_req->cb_data = data; + trg_req->connid = priv->connid; trg_client_thread_pool_push(client, trg_req, &error); if (error) { diff --git a/src/trg-client.h b/src/trg-client.h index 69424bd..0c35edb 100644 --- a/src/trg-client.h +++ b/src/trg-client.h @@ -62,14 +62,15 @@ typedef struct { int status; - char *raw; int size; + char *raw; JsonObject *obj; gpointer cb_data; } trg_response; typedef struct { + int connid; JsonNode *node; gchar *str; GSourceFunc callback; diff --git a/src/trg-file-parser.c b/src/trg-file-parser.c index dc8de3a..c1346aa 100644 --- a/src/trg-file-parser.c +++ b/src/trg-file-parser.c @@ -1,3 +1,22 @@ +/* + * transmission-remote-gtk - Transmission RPC client for GTK + * Copyright (C) 2011 Alan Fitton + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + #include <stdlib.h> #include <string.h> diff --git a/src/trg-file-parser.h b/src/trg-file-parser.h index a7781f1..9f6edf1 100644 --- a/src/trg-file-parser.h +++ b/src/trg-file-parser.h @@ -1,3 +1,22 @@ +/* + * transmission-remote-gtk - Transmission RPC client for GTK + * Copyright (C) 2011 Alan Fitton + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + typedef struct { char *name; gint64 length; diff --git a/src/trg-general-panel.c b/src/trg-general-panel.c index f5b5698..f11b0d5 100644 --- a/src/trg-general-panel.c +++ b/src/trg-general-panel.c @@ -110,12 +110,16 @@ void trg_general_panel_update(TrgGeneralPanel * panel, JsonObject * t, gint sizeOfBuf; gchar *statusString, *fullStatusString; const gchar *errorStr; - gint64 eta, uploaded, downloaded, rpcv; - gint seeders, leechers; + gint64 eta, uploaded, downloaded; GtkLabel *keyLabel; + gint64 seeders = 0, leechers = 0; priv = TRG_GENERAL_PANEL_GET_PRIVATE(panel); - rpcv = trg_client_get_rpc_version(priv->tc); + + gtk_tree_model_get(GTK_TREE_MODEL(priv->model), iter, + TORRENT_COLUMN_SEEDS, &seeders, + TORRENT_COLUMN_LEECHERS, &leechers, + TORRENT_COLUMN_STATUS, &statusString, -1); sizeOfBuf = sizeof(buf); @@ -143,8 +147,7 @@ void trg_general_panel_update(TrgGeneralPanel * panel, JsonObject * t, gtk_label_set_text(GTK_LABEL(priv->gen_ratio_label), _("N/A")); } - statusString = torrent_get_status_string(rpcv, torrent_get_status(t)); - fullStatusString = g_strdup_printf("%s %s", statusString, + fullStatusString = g_strdup_printf("%s %s", statusString, torrent_get_is_private(t) ? _("(Private)") : _("(Public)")); gtk_label_set_text(GTK_LABEL(priv->gen_status_label), fullStatusString); g_free(fullStatusString); @@ -187,12 +190,6 @@ void trg_general_panel_update(TrgGeneralPanel * panel, JsonObject * t, gtk_label_set_text(GTK_LABEL(priv->gen_eta_label), _("N/A")); } - seeders = 0; - leechers = 0; - gtk_tree_model_get(GTK_TREE_MODEL(priv->model), iter, - TORRENT_COLUMN_SEEDS, &seeders, - TORRENT_COLUMN_LEECHERS, &leechers, -1); - snprintf(buf, sizeof(buf), "%d", seeders >= 0 ? seeders : 0); gtk_label_set_text(GTK_LABEL(priv->gen_seeders_label), buf); snprintf(buf, sizeof(buf), "%d", leechers >= 0 ? leechers : 0); diff --git a/src/trg-main-window.c b/src/trg-main-window.c index e143f65..2d63112 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -88,7 +88,6 @@ static void torrent_tv_onRowActivated(GtkTreeView * treeview, static void add_url_cb(GtkWidget * w, gpointer data); static void add_cb(GtkWidget * w, gpointer data); static void disconnect_cb(GtkWidget * w, gpointer data); -static void connect_cb(GtkWidget * w, gpointer data); static void open_local_prefs_cb(GtkWidget * w, gpointer data); static void open_remote_prefs_cb(GtkWidget * w, gpointer data); static TrgToolbar *trg_main_window_toolbar_new(TrgMainWindow * win); @@ -449,12 +448,24 @@ static void disconnect_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { trg_status_bar_reset(priv->statusBar); } -static void connect_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { - TrgMainWindowPrivate *priv; +void connect_cb(GtkWidget * w, gpointer data) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + JsonObject *profile = NULL; + + JsonObject *currentProfile = trg_prefs_get_profile(prefs); + GtkWidget *dialog; int populate_result; - priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + if (w) + profile = (JsonObject*)g_object_get_data(G_OBJECT(w), "profile"); + + disconnect_cb(NULL, data); + + if (profile && currentProfile != profile) + trg_prefs_set_profile(prefs, profile); + populate_result = trg_client_populate_with_settings(priv->client); if (populate_result < 0) { @@ -474,7 +485,7 @@ static void connect_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { GTK_BUTTONS_OK, "%s", msg); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); - + reset_connect_args(TRG_MAIN_WINDOW(data)); return; } @@ -513,10 +524,14 @@ static void main_window_toggle_filter_trackers(GtkCheckMenuItem * w, } static TrgToolbar *trg_main_window_toolbar_new(TrgMainWindow * win) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + TrgPrefs *prefs = trg_client_get_prefs(priv->client); + GObject *b_connect, *b_disconnect, *b_add, *b_resume, *b_pause; GObject *b_remove, *b_delete, *b_props, *b_local_prefs, *b_remote_prefs; - TrgToolbar *toolBar = trg_toolbar_new(); + TrgToolbar *toolBar = trg_toolbar_new(win, prefs); + g_object_get(toolBar, "connect-button", &b_connect, "disconnect-button", &b_disconnect, "add-button", &b_add, "resume-button", &b_resume, "pause-button", &b_pause, "delete-button", &b_delete, @@ -795,18 +810,20 @@ static gboolean on_session_get(gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(response->cb_data); TrgClient *client = priv->client; gboolean isConnected = trg_client_is_connected(client); - JsonObject *newSession; - - if (trg_dialog_error_handler(win, response) == TRUE) { - trg_response_free(response); - reset_connect_args(win); - return FALSE; - } + JsonObject *newSession = NULL; - newSession = get_arguments(response->obj); + if (response->obj) + newSession = get_arguments(response->obj); if (!isConnected) { float version; + + if (trg_dialog_error_handler(win, response) == TRUE) { + trg_response_free(response); + reset_connect_args(win); + return FALSE; + } + if (session_get_version(newSession, &version)==0 || version < TRANSMISSION_MIN_SUPPORTED) { gchar *msg = g_strdup_printf( _("This application supports Transmission %.2f and later, you have %.2f."), @@ -827,14 +844,13 @@ static gboolean on_session_get(gpointer data) { trg_main_window_conn_changed(win, TRUE); } - trg_client_set_session(client, newSession); - - if (!isConnected) - trg_trackers_tree_view_new_connection(priv->trackersTreeView, client); - - json_object_ref(newSession); + if (newSession) { + trg_client_set_session(client, newSession); + json_object_ref(newSession); + } if (!isConnected) { + trg_trackers_tree_view_new_connection(priv->trackersTreeView, client); dispatch_async(client, torrent_get(-1), on_torrent_get_first, win); if (priv->args) trg_add_from_filename(win, priv->args); @@ -1465,48 +1481,46 @@ static GtkWidget *limit_menu_new(TrgMainWindow * win, gchar * title, return toplevel; } -static void exec_cmd_cb(GtkWidget *w, gpointer data) -{ +static void exec_cmd_cb(GtkWidget *w, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); TrgPrefs *prefs = trg_client_get_prefs(priv->client); - JsonObject *cmd_obj = (JsonObject*)g_object_get_data(G_OBJECT(w), "cmd-object"); - GtkTreeSelection *selection; - gint rowCount; - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->torrentTreeView)); - rowCount = gtk_tree_selection_count_selected_rows(selection); - - if (rowCount==1) { - JsonObject *json; - GError *cmd_error = NULL; - gchar *cmd_line, **argv; - if (!get_torrent_data(trg_client_get_torrent_table(priv->client), - priv->selectedTorrentId, &json, - NULL)) - return; - cmd_line = build_remote_exec_cmd(prefs, json, json_object_get_string_member(cmd_obj, TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_CMD)); - g_debug("Exec: %s",cmd_line); - //GTK has bug, won't let you pass a string here containing a quoted param, so use parse and then spawn - // rather than g_spawn_command_line_async(cmd_line,&cmd_error); - g_shell_parse_argv(cmd_line, NULL, &argv, NULL); - g_spawn_async( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, - NULL, NULL, NULL, &cmd_error ); - - g_strfreev( argv ); - g_free( cmd_line ); - - if (cmd_error) - { - GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(data), - GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, "%s", - cmd_error->message); - gtk_window_set_title(GTK_WINDOW(dialog), _("Error")); - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - g_error_free(cmd_error); - } + JsonObject *cmd_obj = (JsonObject*) g_object_get_data(G_OBJECT(w), + "cmd-object"); + GtkTreeSelection *selection = gtk_tree_view_get_selection( + GTK_TREE_VIEW(priv->torrentTreeView)); + GtkTreeModel *model; + GList *selectedRows = gtk_tree_selection_get_selected_rows(selection, &model); + GError *cmd_error = NULL; + gchar *cmd_line, **argv; + + cmd_line = build_remote_exec_cmd( + prefs, + model, + selectedRows, + json_object_get_string_member(cmd_obj, + TRG_PREFS_KEY_EXEC_COMMANDS_SUBKEY_CMD)); + g_debug("Exec: %s",cmd_line); + + //GTK has bug, won't let you pass a string here containing a quoted param, so use parse and then spawn + // rather than g_spawn_command_line_async(cmd_line,&cmd_error); + + g_shell_parse_argv(cmd_line, NULL, &argv, NULL); + g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, + &cmd_error); + + g_list_foreach (selectedRows, (GFunc) gtk_tree_path_free, NULL); + g_list_free(selectedRows); + g_strfreev(argv); + g_free(cmd_line); + + if (cmd_error) { + GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(data), + GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", + cmd_error->message); + gtk_window_set_title(GTK_WINDOW(dialog), _("Error")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_error_free(cmd_error); } } @@ -1840,7 +1854,6 @@ static void on_dropped_file( } } gtk_drag_finish (context, FALSE, FALSE, time); - return; } diff --git a/src/trg-main-window.h b/src/trg-main-window.h index 4a1fd5d..c9e01a7 100644 --- a/src/trg-main-window.h +++ b/src/trg-main-window.h @@ -70,6 +70,7 @@ TrgStateSelector *trg_main_window_get_state_selector(TrgMainWindow * win); gint trg_mw_get_selected_torrent_id(TrgMainWindow * win); GtkTreeModel *trg_main_window_get_torrent_model(TrgMainWindow * win); void trg_main_window_notebook_set_visible(TrgMainWindow *win, gboolean visible); +void connect_cb(GtkWidget * w, gpointer data); G_END_DECLS #endif /* MAIN_WINDOW_H_ */ diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index 1aea8b3..abc4b5b 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -116,7 +116,7 @@ void trg_menu_bar_connected_change(TrgMenuBar * mb, gboolean connected) gtk_widget_set_sensitive(priv->mb_add, connected); gtk_widget_set_sensitive(priv->mb_add_url, connected); - gtk_widget_set_sensitive(priv->mb_connect, !connected); + //gtk_widget_set_sensitive(priv->mb_connect, !connected); gtk_widget_set_sensitive(priv->mb_disconnect, connected); gtk_widget_set_sensitive(priv->mb_remote_prefs, connected); gtk_widget_set_sensitive(priv->mb_view_stats, connected); @@ -275,8 +275,8 @@ trg_menu_bar_install_widget_prop(GObjectClass * class, guint propId, G_PARAM_STATIC_BLURB)); } -GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, char *text, - char *stock_id, gboolean sensitive) +GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, const gchar *text, + const gchar *stock_id, gboolean sensitive) { GtkWidget *item = gtk_image_menu_item_new_with_label(stock_id); gtk_image_menu_item_set_use_stock(GTK_IMAGE_MENU_ITEM(item), TRUE); @@ -389,6 +389,39 @@ GtkWidget *trg_menu_bar_options_menu_new(TrgMenuBarPrivate * priv) return opts; } +static void trg_menu_bar_file_connect_item_new(TrgMainWindow *win, GtkMenuShell *shell, const gchar *text, const gchar *stock, JsonObject *profile) +{ + GtkWidget *item = trg_menu_bar_item_new(shell, text, stock, TRUE); + g_object_set_data(G_OBJECT(item), "profile", profile); + g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(connect_cb), win); +} + +GtkWidget *trg_menu_bar_file_connect_menu_new(TrgMainWindow *win, TrgPrefs *p) +{ + GtkWidget *menu = gtk_menu_new(); + GList *profiles = json_array_get_elements(trg_prefs_get_profiles(p)); + JsonObject *currentProfile = trg_prefs_get_profile(p); + GList *li; + + for (li = profiles; li; li = g_list_next(li)) { + JsonObject *profile = json_node_get_object((JsonNode*) li->data); + const gchar *name_value; + + if (json_object_has_member(profile, TRG_PREFS_KEY_PROFILE_NAME)) { + name_value = json_object_get_string_member(profile, + TRG_PREFS_KEY_PROFILE_NAME); + } else { + name_value = _(TRG_PROFILE_NAME_DEFAULT); + } + + if (profile != currentProfile) + trg_menu_bar_file_connect_item_new(win, GTK_MENU_SHELL(menu), name_value, + GTK_STOCK_CONNECT, profile); + } + + return menu; +} + static GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBarPrivate * priv) { @@ -629,5 +662,7 @@ static void trg_menu_bar_init(TrgMenuBar * self) TrgMenuBar *trg_menu_bar_new(TrgPrefs *prefs) { - return g_object_new(TRG_TYPE_MENU_BAR, "prefs", prefs, NULL); + return g_object_new(TRG_TYPE_MENU_BAR, + + "prefs", prefs, NULL); } diff --git a/src/trg-menu-bar.h b/src/trg-menu-bar.h index 6c1daac..4a2eb2c 100644 --- a/src/trg-menu-bar.h +++ b/src/trg-menu-bar.h @@ -49,13 +49,14 @@ typedef struct { GType trg_menu_bar_get_type(void); TrgMenuBar *trg_menu_bar_new(TrgPrefs * prefs); -GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, char *text, - char *stock_id, gboolean sensitive); +GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, const gchar *text, + const gchar *stock_id, gboolean sensitive); G_END_DECLS void trg_menu_bar_torrent_actions_sensitive(TrgMenuBar * mb, gboolean sensitive); void trg_menu_bar_connected_change(TrgMenuBar * mb, gboolean connected); void trg_menu_bar_set_supports_queues(TrgMenuBar *mb, gboolean supportsQueues); +GtkWidget *trg_menu_bar_file_connect_menu_new(TrgMainWindow *win, TrgPrefs *p); #endif /* TRG_MENU_BAR_H_ */ diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index d56c15f..4b0cd57 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -466,13 +466,15 @@ static void trg_prefs_profile_combo_populate(TrgPreferencesDialog *dialog, for (li = profiles; li; li = g_list_next(li)) { JsonObject *profile = json_node_get_object((JsonNode*) li->data); const gchar *name_value; + GtkTreeIter iter; + if (json_object_has_member(profile, TRG_PREFS_KEY_PROFILE_NAME)) { name_value = json_object_get_string_member(profile, TRG_PREFS_KEY_PROFILE_NAME); } else { name_value = _(TRG_PROFILE_NAME_DEFAULT); } - GtkTreeIter iter; + gtk_list_store_insert_with_values(store, &iter, INT_MAX, 0, profile, 1, name_value, -1); if (i == profile_id) diff --git a/src/trg-prefs.c b/src/trg-prefs.c index c54ed90..cf731f7 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -45,11 +45,17 @@ struct _TrgPrefsPrivate { enum { PREF_CHANGE, + PREF_PROFILE_CHANGE, PREFS_SIGNAL_COUNT }; static guint signals[PREFS_SIGNAL_COUNT] = { 0 }; +static void trg_prefs_profile_change_emit_signal(TrgPrefs *p) +{ + g_signal_emit(p, signals[PREF_PROFILE_CHANGE], 0); +} + void trg_prefs_changed_emit_signal(TrgPrefs *p, gchar *key) { g_signal_emit(p, signals[PREF_CHANGE], 0, key); @@ -133,6 +139,15 @@ static void trg_prefs_class_init(TrgPrefsClass *klass) { pref_changed), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + + signals[PREF_PROFILE_CHANGE] = + g_signal_new("pref-profile-changed", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET(TrgPrefsClass, + pref_changed), NULL, + NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void trg_prefs_init(TrgPrefs *self) { @@ -285,6 +300,7 @@ void trg_prefs_set_profile(TrgPrefs *p, JsonObject *profile) { g_list_free(profiles); trg_prefs_changed_emit_signal(p, NULL); + trg_prefs_profile_change_emit_signal(p); } JsonObject *trg_prefs_new_profile(TrgPrefs *p) { @@ -312,6 +328,8 @@ void trg_prefs_del_profile(TrgPrefs *p, JsonObject *profile) { } g_list_free(profilesList); + + trg_prefs_profile_change_emit_signal(p); } JsonObject* trg_prefs_get_profile(TrgPrefs *p) { diff --git a/src/trg-toolbar.c b/src/trg-toolbar.c index e3132cd..1370514 100644 --- a/src/trg-toolbar.c +++ b/src/trg-toolbar.c @@ -19,7 +19,11 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> + +#include "trg-prefs.h" +#include "trg-main-window.h" #include "trg-toolbar.h" +#include "trg-menu-bar.h" enum { PROP_0, @@ -34,7 +38,9 @@ enum { /*PROP_VERIFY_BUTTON, */ PROP_PROPS_BUTTON, PROP_REMOTE_PREFS_BUTTON, - PROP_LOCAL_PREFS_BUTTON + PROP_LOCAL_PREFS_BUTTON, + PROP_PREFS, + PROP_MAIN_WINDOW }; G_DEFINE_TYPE(TrgToolbar, trg_toolbar, GTK_TYPE_TOOLBAR) @@ -55,9 +61,30 @@ struct _TrgToolbarPrivate { GtkWidget *tb_props; GtkWidget *tb_remote_prefs; GtkWidget *tb_local_prefs; + TrgPrefs *prefs; + TrgMainWindow *main_window; }; static void +trg_toolbar_set_property(GObject * object, + guint prop_id, + const GValue * value, + GParamSpec * pspec G_GNUC_UNUSED) +{ + TrgToolbarPrivate *priv = + TRG_TOOLBAR_GET_PRIVATE(object); + + switch (prop_id) { + case PROP_PREFS: + priv->prefs = g_value_get_pointer(value); + break; + case PROP_MAIN_WINDOW: + priv->main_window = g_value_get_object(value); + break; + } +} + +static void trg_toolbar_get_property(GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { @@ -124,10 +151,147 @@ trg_toolbar_install_widget_prop(GObjectClass * class, guint propId, G_PARAM_STATIC_BLURB)); } +GtkWidget *trg_toolbar_item_new(TrgToolbar * toolbar, + gchar * text, + int *index, gchar * icon, + gboolean sensitive) +{ + GtkToolItem *w = gtk_tool_button_new_from_stock(icon); + gtk_widget_set_sensitive(GTK_WIDGET(w), sensitive); + gtk_tool_item_set_tooltip_text (w,text); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), w, (*index)++); + return GTK_WIDGET(w); +} + +static void trg_toolbar_refresh_menu(GtkWidget *w, gpointer data) +{ + TrgToolbarPrivate *priv = TRG_TOOLBAR_GET_PRIVATE(data); + GtkWidget *old = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(priv->tb_connect)); + GtkWidget *new = trg_menu_bar_file_connect_menu_new(priv->main_window, priv->prefs); + + gtk_widget_destroy(old); + gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(priv->tb_connect), new); + gtk_widget_show_all(new); +} + +static GObject *trg_toolbar_constructor(GType type, + guint + n_construct_properties, + GObjectConstructParam + * construct_params) +{ + GObject *obj = G_OBJECT_CLASS + (trg_toolbar_parent_class)->constructor(type, + n_construct_properties, + construct_params); + TrgToolbarPrivate *priv = TRG_TOOLBAR_GET_PRIVATE(obj); + + GtkToolItem *separator; + GtkWidget *menu; + int position = 0; + + gtk_toolbar_set_icon_size(GTK_TOOLBAR(obj), + GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_toolbar_set_style(GTK_TOOLBAR(obj), GTK_TOOLBAR_ICONS); + + //priv->tb_connect = + /*trg_toolbar_item_new(self, _("Connect"), &position, + GTK_STOCK_CONNECT, TRUE);*/ + + priv->tb_connect = GTK_WIDGET(gtk_menu_tool_button_new_from_stock(GTK_STOCK_CONNECT)); + gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(priv->tb_connect), _("Connect")); + menu = trg_menu_bar_file_connect_menu_new(priv->main_window, priv->prefs); + gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(priv->tb_connect), menu); + gtk_toolbar_insert(GTK_TOOLBAR(obj), GTK_TOOL_ITEM(priv->tb_connect), position++); + gtk_widget_show_all(menu); + + priv->tb_disconnect = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Disconnect"), &position, + GTK_STOCK_DISCONNECT, FALSE); + priv->tb_add = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Add"), &position, GTK_STOCK_ADD, + FALSE); + + /*priv->tb_add_url = + trg_toolbar_item_new(self, "Add URL", 3, GTK_STOCK_ADD, FALSE); */ + + separator = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(obj), separator, position++); + + priv->tb_resume = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Resume"), &position, + GTK_STOCK_MEDIA_PLAY, FALSE); + priv->tb_pause = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Pause"), &position, + GTK_STOCK_MEDIA_PAUSE, FALSE); + + priv->tb_props = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Properties"), &position, + GTK_STOCK_PROPERTIES, FALSE); + + priv->tb_remove = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Remove"), &position, + GTK_STOCK_REMOVE, FALSE); + + priv->tb_delete = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Remove with data"), + &position, GTK_STOCK_CLEAR, FALSE); + + /*priv->tb_verify = + trg_toolbar_item_new(self, "Verify", 11, + GTK_STOCK_REFRESH, FALSE); */ + + separator = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(obj), separator, position++); + + priv->tb_local_prefs = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Local Preferences"), &position, + GTK_STOCK_PREFERENCES, TRUE); + + priv->tb_remote_prefs = + trg_toolbar_item_new(TRG_TOOLBAR(obj), _("Remote Preferences"), + &position, GTK_STOCK_NETWORK, FALSE); + + gtk_toolbar_set_tooltips(GTK_TOOLBAR(obj), TRUE); + + g_signal_connect(G_OBJECT(priv->prefs), "pref-profile-changed", G_CALLBACK(trg_toolbar_refresh_menu), obj); + + return obj; +} + static void trg_toolbar_class_init(TrgToolbarClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); object_class->get_property = trg_toolbar_get_property; + object_class->set_property = trg_toolbar_set_property; + object_class->constructor = trg_toolbar_constructor; + + g_object_class_install_property(object_class, + PROP_PREFS, + g_param_spec_pointer("prefs", + "Prefs", + "Prefs", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT + | + G_PARAM_STATIC_NAME + | + G_PARAM_STATIC_NICK + | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property(object_class, + PROP_MAIN_WINDOW, + g_param_spec_object("mainwindow", + "mainwindow", + "mainwindow", + TRG_TYPE_MAIN_WINDOW, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY + | + G_PARAM_STATIC_NAME + | + G_PARAM_STATIC_NICK + | + G_PARAM_STATIC_BLURB)); trg_toolbar_install_widget_prop(object_class, PROP_CONNECT_BUTTON, "connect-button", "Connect Button"); @@ -163,26 +327,13 @@ static void trg_toolbar_class_init(TrgToolbarClass * klass) g_type_class_add_private(klass, sizeof(TrgToolbarPrivate)); } -static -GtkWidget *trg_toolbar_item_new(TrgToolbar * toolbar, - gchar * text, - int *index, gchar * icon, - gboolean sensitive) -{ - GtkToolItem *w = gtk_tool_button_new_from_stock(icon); - gtk_widget_set_sensitive(GTK_WIDGET(w), sensitive); - gtk_tool_item_set_tooltip_text (w,text); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), w, (*index)++); - return GTK_WIDGET(w); -} - void trg_toolbar_connected_change(TrgToolbar * tb, gboolean connected) { TrgToolbarPrivate *priv = TRG_TOOLBAR_GET_PRIVATE(tb); gtk_widget_set_sensitive(priv->tb_add, connected); /*gtk_widget_set_sensitive(priv->tb_add_url, connected); */ - gtk_widget_set_sensitive(priv->tb_connect, !connected); + //gtk_widget_set_sensitive(priv->tb_connect, !connected); gtk_widget_set_sensitive(priv->tb_disconnect, connected); gtk_widget_set_sensitive(priv->tb_remote_prefs, connected); } @@ -202,70 +353,13 @@ void trg_toolbar_torrent_actions_sensitive(TrgToolbar * tb, static void trg_toolbar_init(TrgToolbar * self) { - GtkToolItem *separator; - TrgToolbarPrivate *priv; - int position = 0; - - priv = TRG_TOOLBAR_GET_PRIVATE(self); - - gtk_toolbar_set_icon_size(GTK_TOOLBAR(self), - GTK_ICON_SIZE_LARGE_TOOLBAR); - gtk_toolbar_set_style(GTK_TOOLBAR(self), GTK_TOOLBAR_ICONS); - - priv->tb_connect = - trg_toolbar_item_new(self, _("Connect"), &position, - GTK_STOCK_CONNECT, TRUE); - priv->tb_disconnect = - trg_toolbar_item_new(self, _("Disconnect"), &position, - GTK_STOCK_DISCONNECT, FALSE); - priv->tb_add = - trg_toolbar_item_new(self, _("Add"), &position, GTK_STOCK_ADD, - FALSE); - - /*priv->tb_add_url = - trg_toolbar_item_new(self, "Add URL", 3, GTK_STOCK_ADD, FALSE); */ - - separator = gtk_separator_tool_item_new(); - gtk_toolbar_insert(GTK_TOOLBAR(self), separator, position++); - - priv->tb_resume = - trg_toolbar_item_new(self, _("Resume"), &position, - GTK_STOCK_MEDIA_PLAY, FALSE); - priv->tb_pause = - trg_toolbar_item_new(self, _("Pause"), &position, - GTK_STOCK_MEDIA_PAUSE, FALSE); - - priv->tb_props = - trg_toolbar_item_new(self, _("Properties"), &position, - GTK_STOCK_PROPERTIES, FALSE); - - priv->tb_remove = - trg_toolbar_item_new(self, _("Remove"), &position, - GTK_STOCK_REMOVE, FALSE); - - priv->tb_delete = - trg_toolbar_item_new(self, _("Remove with data"), - &position, GTK_STOCK_CLEAR, FALSE); - - /*priv->tb_verify = - trg_toolbar_item_new(self, "Verify", 11, - GTK_STOCK_REFRESH, FALSE); */ - - separator = gtk_separator_tool_item_new(); - gtk_toolbar_insert(GTK_TOOLBAR(self), separator, position++); - - priv->tb_local_prefs = - trg_toolbar_item_new(self, _("Local Preferences"), &position, - GTK_STOCK_PREFERENCES, TRUE); - - priv->tb_remote_prefs = - trg_toolbar_item_new(self, _("Remote Preferences"), - &position, GTK_STOCK_NETWORK, FALSE); - - gtk_toolbar_set_tooltips(GTK_TOOLBAR(self), TRUE); + //TrgToolbarPrivate *priv = TRG_TOOLBAR_GET_PRIVATE(self); } -TrgToolbar *trg_toolbar_new(void) +TrgToolbar *trg_toolbar_new(TrgMainWindow *win, TrgPrefs *prefs) { - return g_object_new(TRG_TYPE_TOOLBAR, NULL); + return g_object_new(TRG_TYPE_TOOLBAR, + "prefs", prefs, + "mainwindow", win, + NULL); } diff --git a/src/trg-toolbar.h b/src/trg-toolbar.h index c63d353..5e36503 100644 --- a/src/trg-toolbar.h +++ b/src/trg-toolbar.h @@ -24,6 +24,9 @@ #include <gtk/gtk.h> #include <glib-object.h> +#include "trg-prefs.h" +#include "trg-main-window.h" + G_BEGIN_DECLS #define TRG_TYPE_TOOLBAR trg_toolbar_get_type() #define TRG_TOOLBAR(obj) \ @@ -46,11 +49,11 @@ typedef struct { GType trg_toolbar_get_type(void); -TrgToolbar *trg_toolbar_new(void); +TrgToolbar *trg_toolbar_new(TrgMainWindow *win, TrgPrefs *prefs); G_END_DECLS void trg_toolbar_torrent_actions_sensitive(TrgToolbar * mb, gboolean sensitive); -void trg_toolbar_connected_change(TrgToolbar * mb, gboolean connected); +void trg_toolbar_connected_change(TrgToolbar * tb, gboolean connected); #endif /* TRG_TOOLBAR_H_ */ diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c index 884e7df..bd7b545 100644 --- a/src/trg-torrent-model.c +++ b/src/trg-torrent-model.c @@ -275,8 +275,8 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial, id = torrent_get_id(t); status = torrent_get_status(t); - statusString = torrent_get_status_string(rpcv, status); newFlags = torrent_get_flags(t, rpcv, status, downRate, upRate); + statusString = torrent_get_status_string(rpcv, status, newFlags); statusIcon = torrent_get_status_icon(rpcv, newFlags); pf = torrent_get_peersfrom(t); trackerStats = torrent_get_tracker_stats(t); |