summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPedro Algarvio <ufs@ufsoft.org>2011-04-28 16:53:20 +0100
committerPedro Algarvio <ufs@ufsoft.org>2011-04-28 16:59:01 +0100
commit63d0d0c69bbc77f151c2bf38b806895b603e039f (patch)
tree1848ce82991f075bb5285b0d34282c796772a14d
parent1be59bb1160ff90866e41f21eea3e4af409ee91d (diff)
downloaddeluge-63d0d0c69bbc.tar.gz
deluge-63d0d0c69bbc.tar.bz2
deluge-63d0d0c69bbc.zip
GTK UI connection manager fixes.
Auto-connecting to daemon now works. Fixes #1815. Auto-starting a `localhost` daemon now also works, the reconnecting attempts were not being "triggered". When not connected to a daemon, "Quit & Shutdown Daemon" is not present. So #1818 is also fixed. Some more work regarding #1819 was done. Client now disconnects before shutting down the GTK UI.
-rw-r--r--deluge/ui/client.py4
-rw-r--r--deluge/ui/gtkui/connectionmanager.py78
-rw-r--r--deluge/ui/gtkui/glade/connection_manager.glade29
-rw-r--r--deluge/ui/gtkui/gtkui.py46
-rw-r--r--deluge/ui/gtkui/mainwindow.py16
5 files changed, 140 insertions, 33 deletions
diff --git a/deluge/ui/client.py b/deluge/ui/client.py
index a6b17b922..dc39fb192 100644
--- a/deluge/ui/client.py
+++ b/deluge/ui/client.py
@@ -607,13 +607,15 @@ class Client(object):
self._daemon_proxy = DaemonSSLProxy(dict(self.__event_handlers))
self._daemon_proxy.set_disconnect_callback(self.__on_disconnect)
d = self._daemon_proxy.connect(host, port)
+ auth_deferred = defer.Deferred()
+
def on_connect_fail(reason):
self.disconnect()
+ auth_deferred.errback(reason)
return reason
d.addErrback(on_connect_fail)
if not skip_authentication:
- auth_deferred = defer.Deferred()
def on_authenticate(result, daemon_info):
log.debug("Authentication sucessfull: %s", result)
diff --git a/deluge/ui/gtkui/connectionmanager.py b/deluge/ui/gtkui/connectionmanager.py
index 1dfd3b401..09341c8b6 100644
--- a/deluge/ui/gtkui/connectionmanager.py
+++ b/deluge/ui/gtkui/connectionmanager.py
@@ -95,11 +95,12 @@ class ConnectionManager(component.Component):
def __init__(self):
component.Component.__init__(self, "ConnectionManager")
self.gtkui_config = ConfigManager("gtkui.conf")
+ self.config = self.__load_config()
self.running = False
# Component overrides
def start(self):
- self.config = self.__load_config()
+ pass
def stop(self):
# Close this dialog when we are shutting down
@@ -184,23 +185,22 @@ class ConnectionManager(component.Component):
column = gtk.TreeViewColumn(_("Version"), render, text=HOSTLIST_COL_VERSION)
self.hostlist.append_column(column)
+ # Connect the signals to the handlers
+ self.glade.signal_autoconnect(self)
+
# Load any saved host entries
self.__load_hostlist()
self.__load_options()
+ self.__update_list()
- # Select the first host if possible
+ self.running = True
+ # Trigger the on_selection_changed code and select the first host
+ # if possible
+ self.hostlist.get_selection().unselect_all()
if len(self.liststore) > 0:
self.hostlist.get_selection().select_path("0")
- # Connect the signals to the handlers
- self.glade.signal_autoconnect(self)
- self.hostlist.get_selection().connect(
- "changed", self.on_hostlist_selection_changed
- )
-
- self.__update_list()
-
- self.running = True
+ # Run the dialog
response = self.connection_manager.run()
self.running = False
@@ -361,9 +361,13 @@ class ConnectionManager(component.Component):
"""
Set the widgets to show the correct options from the config.
"""
- self.glade.get_widget("chk_autoconnect").set_active(self.gtkui_config["autoconnect"])
- self.glade.get_widget("chk_autostart").set_active(self.gtkui_config["autostart_localhost"])
- self.glade.get_widget("chk_donotshow").set_active(not self.gtkui_config["show_connection_manager_on_start"])
+ self.autoconnect_host_id = self.gtkui_config['autoconnect_host_id']
+ self.glade.get_widget("chk_autostart").set_active(
+ self.gtkui_config["autostart_localhost"]
+ )
+ self.glade.get_widget("chk_donotshow").set_active(
+ not self.gtkui_config["show_connection_manager_on_start"]
+ )
def __save_options(self):
"""
@@ -385,18 +389,26 @@ class ConnectionManager(component.Component):
self.glade.get_widget("image_startdaemon").set_from_stock(
gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU)
self.glade.get_widget("label_startdaemon").set_text("_Start Daemon")
+ self.glade.get_widget("chk_autoconnect").set_sensitive(False)
model, row = self.hostlist.get_selection().get_selected()
if not row:
self.glade.get_widget("button_edithost").set_sensitive(False)
+ self.glade.get_widget("chk_autoconnect").set_sensitive(False)
return
self.glade.get_widget("button_edithost").set_sensitive(True)
+ self.glade.get_widget("chk_autoconnect").set_sensitive(True)
# Get some values about the selected host
status = model[row][HOSTLIST_COL_STATUS]
+ hostid = model[row][HOSTLIST_COL_ID]
host = model[row][HOSTLIST_COL_HOST]
+ self.glade.get_widget("chk_autoconnect").set_active(
+ hostid == self.gtkui_config["autoconnect_host_id"]
+ )
+
log.debug("Status: %s", status)
# Check to see if we have a localhost entry selected
localhost = False
@@ -700,6 +712,44 @@ class ConnectionManager(component.Component):
def on_askpassword_dialog_entry_activate(self, entry):
self.askpassword_dialog.response(gtk.RESPONSE_OK)
+ def on_hostlist_cursor_changed(self, widget):
+ paths = self.hostlist.get_selection().get_selected_rows()[1]
+ if len(paths) < 1:
+ self.glade.get_widget("chk_autoconnect").set_sensitive(False)
+ return
+ else:
+ self.glade.get_widget("chk_autoconnect").set_sensitive(True)
+
+ hostid = self.liststore[paths[0]][HOSTLIST_COL_ID]
+ self.glade.get_widget("chk_autoconnect").set_active(
+ hostid == self.gtkui_config["autoconnect_host_id"]
+ )
+
+ def on_chk_autoconnect_toggled(self, widget):
+ paths = self.hostlist.get_selection().get_selected_rows()[1]
+ if len(paths) < 1:
+ self.glade.get_widget("chk_autoconnect").set_sensitive(False)
+ self.glade.get_widget("chk_autostart").set_sensitive(False)
+ return
+ else:
+ self.glade.get_widget("chk_autoconnect").set_sensitive(True)
+
+ self.glade.get_widget("chk_autostart").set_sensitive(widget.get_active())
+
+ hostid = self.liststore[paths[0]][HOSTLIST_COL_ID]
+
+ if widget.get_active():
+ if self.autoconnect_host_id != hostid:
+ self.gtkui_config["autoconnect_host_id"] = hostid
+ self.autoconnect_host_id = hostid
+ self.gtkui_config.save()
+ return
+
+ if self.autoconnect_host_id == hostid:
+ self.gtkui_config["autoconnect_host_id"] = None
+ self.autoconnect_host_id = None
+ self.gtkui_config.save()
+
def __migrate_config_1_to_2(self, config):
localclient_username, localclient_password = get_localhost_auth()
if not localclient_username:
diff --git a/deluge/ui/gtkui/glade/connection_manager.glade b/deluge/ui/gtkui/glade/connection_manager.glade
index fa93556dc..35cea0e4c 100644
--- a/deluge/ui/gtkui/glade/connection_manager.glade
+++ b/deluge/ui/gtkui/glade/connection_manager.glade
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<glade-interface>
<!-- interface-requires gtk+ 2.6 -->
<!-- interface-naming-policy toplevel-contextual -->
@@ -10,7 +10,6 @@
<property name="window_position">center</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
- <property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="dialog-vbox3">
<property name="visible">True</property>
@@ -230,7 +229,6 @@
<property name="default_height">300</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
- <property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="dialog-vbox2">
<property name="visible">True</property>
@@ -294,6 +292,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <signal name="cursor_changed" handler="on_hostlist_cursor_changed"/>
<signal name="row_activated" handler="on_hostlist_row_activated"/>
</widget>
</child>
@@ -471,14 +470,21 @@
</packing>
</child>
<child>
- <widget class="GtkCheckButton" id="chk_autostart">
- <property name="label" translatable="yes">Automatically start localhost if needed</property>
+ <widget class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="on_chk_autostart_toggled"/>
+ <property name="left_padding">15</property>
+ <child>
+ <widget class="GtkCheckButton" id="chk_autostart">
+ <property name="label" translatable="yes">Automatically start localhost if needed</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_autostart_toggled"/>
+ </widget>
+ </child>
</widget>
<packing>
<property name="position">1</property>
@@ -585,7 +591,6 @@
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property>
- <property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="dialog-vbox5">
<property name="visible">True</property>
@@ -608,7 +613,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">●</property>
<signal name="activate" handler="on_askpassword_dialog_entry_activate"/>
</widget>
<packing>
diff --git a/deluge/ui/gtkui/gtkui.py b/deluge/ui/gtkui/gtkui.py
index 0a8aed334..849660542 100644
--- a/deluge/ui/gtkui/gtkui.py
+++ b/deluge/ui/gtkui/gtkui.py
@@ -333,28 +333,66 @@ Please see the details below for more information."), details=traceback.format_e
# Check to see if we need to start the localhost daemon
if self.config["autostart_localhost"] and host[1] in ("localhost", "127.0.0.1"):
log.debug("Autostarting localhost:%s", host[2])
- try_connect = client.start_daemon(host[2], deluge.configmanager.get_config_dir())
+ try_connect = client.start_daemon(
+ host[2], deluge.configmanager.get_config_dir()
+ )
log.debug("Localhost started: %s", try_connect)
if not try_connect:
dialogs.ErrorDialog(
_("Error Starting Daemon"),
- _("There was an error starting the daemon process. Try running it from a console to see if there is an error.")).run()
+ _("There was an error starting the daemon "
+ "process. Try running it from a console "
+ "to see if there is an error.")
+ ).run()
+
+# def refresh_connection_manager_list():
+# try:
+# self.connectionmanager.glade.get_widget(
+# "button_refresh"
+# ).emit("clicked")
+# except:
+# pass
+#
+# reactor.callLatter(1, refresh_connection_manager_list)
+
+ def update_connection_manager():
+ if not self.connectionmanager.running:
+ return
+ self.connectionmanager.glade.get_widget(
+ "button_refresh"
+ ).emit("clicked")
+
+ def close_connection_manager():
+ if not self.connectionmanager.running:
+ return
+ self.connectionmanager.glade.get_widget(
+ "button_close"
+ ).emit("clicked")
+
def on_connect(connector):
+ print 'ON GTK UI CONNECT!!!!\n\n'
component.start()
+ reactor.callLater(0.5, update_connection_manager)
+ reactor.callLater(1, close_connection_manager)
+
def on_connect_fail(result, try_counter):
log.error("Connection to host failed..")
# We failed connecting to the daemon, but lets try again
if try_counter:
- log.info("Retrying connection.. Retries left: %s", try_counter)
+ log.info("Retrying connection.. Retries left: "
+ "%s", try_counter)
try_counter -= 1
import time
time.sleep(0.5)
do_connect(try_counter)
+ reactor.callLater(0.5, update_connection_manager)
return result
def do_connect(try_counter):
- client.connect(*host[1:]).addCallback(on_connect).addErrback(on_connect_fail, try_counter)
+ d = client.connect(*host[1:])
+ d.addCallback(on_connect)
+ d.addErrback(on_connect_fail, try_counter)
if try_connect:
do_connect(6)
diff --git a/deluge/ui/gtkui/mainwindow.py b/deluge/ui/gtkui/mainwindow.py
index a3265d813..572284e25 100644
--- a/deluge/ui/gtkui/mainwindow.py
+++ b/deluge/ui/gtkui/mainwindow.py
@@ -161,8 +161,20 @@ class MainWindow(component.Component):
:type shutdown: boolean
"""
if shutdown:
- client.daemon.shutdown()
- reactor.stop()
+ def on_daemon_shutdown(result):
+ reactor.stop()
+ client.daemon.shutdown().addCallback(on_daemon_shutdown)
+ return
+ if client.is_classicmode():
+ reactor.stop()
+ return
+ if not client.connected():
+ reactor.stop()
+ return
+ def on_client_disconnected(result):
+ reactor.stop()
+ client.disconnect().addCallback(on_client_disconnected)
+
def load_window_state(self):
x = self.config["window_x_pos"]