summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aclocal.m44
-rw-r--r--configure.ac2
-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
23 files changed, 486 insertions, 213 deletions
diff --git a/aclocal.m4 b/aclocal.m4
index 4325c07..d110b0e 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -13,8 +13,8 @@
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],,
-[m4_warning([this file was generated for autoconf 2.67.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
diff --git a/configure.ac b/configure.ac
index c1cca38..8e5e6f3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
AC_PREREQ(2.63)
-AC_INIT(transmission-remote-gtk, 0.6.1, alan@eth0.org.uk)
+AC_INIT(transmission-remote-gtk, 0.6.2, alan@eth0.org.uk)
AC_CONFIG_SRCDIR(src)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
AM_INIT_AUTOMAKE([foreign])
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);