summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-07 18:55:01 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-07 18:55:01 +0000
commit429b32fba6f5ad14db31fe2690974b57df858999 (patch)
tree54970bd752b8dcf957d4a2db09be5678b79f9af4 /src
parentc3bd3ac55162a88b308a6f700aad88d26cbd5f29 (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.nsi4
-rw-r--r--src/protocol-constants.h21
-rw-r--r--src/remote-exec.c75
-rw-r--r--src/remote-exec.h2
-rw-r--r--src/torrent.c23
-rw-r--r--src/torrent.h8
-rw-r--r--src/tpeer.h18
-rw-r--r--src/trg-client.c17
-rw-r--r--src/trg-client.h3
-rw-r--r--src/trg-file-parser.c19
-rw-r--r--src/trg-file-parser.h19
-rw-r--r--src/trg-general-panel.c19
-rw-r--r--src/trg-main-window.c135
-rw-r--r--src/trg-main-window.h1
-rw-r--r--src/trg-menu-bar.c43
-rw-r--r--src/trg-menu-bar.h5
-rw-r--r--src/trg-preferences-dialog.c4
-rw-r--r--src/trg-prefs.c18
-rw-r--r--src/trg-toolbar.c250
-rw-r--r--src/trg-toolbar.h7
-rw-r--r--src/trg-torrent-model.c2
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);