summaryrefslogtreecommitdiffstats
path: root/deluge/ui/gtk3/preferences.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/ui/gtk3/preferences.py')
-rw-r--r--deluge/ui/gtk3/preferences.py125
1 files changed, 57 insertions, 68 deletions
diff --git a/deluge/ui/gtk3/preferences.py b/deluge/ui/gtk3/preferences.py
index b196128..a008a95 100644
--- a/deluge/ui/gtk3/preferences.py
+++ b/deluge/ui/gtk3/preferences.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
# Copyright (C) 2011 Pedro Algarvio <pedro@algarvio.me>
@@ -8,11 +7,10 @@
# See LICENSE for more details.
#
-from __future__ import unicode_literals
-
import logging
import os
from hashlib import sha1 as sha
+from urllib.parse import urlparse
from gi import require_version
from gi.repository import Gtk
@@ -21,6 +19,7 @@ from gi.repository.Gdk import Color
import deluge.common
import deluge.component as component
from deluge.configmanager import ConfigManager, get_config_dir
+from deluge.decorators import maybe_coroutine
from deluge.error import AuthManagerError, NotAuthorizedError
from deluge.i18n import get_languages
from deluge.ui.client import client
@@ -31,12 +30,6 @@ from .dialogs import AccountDialog, ErrorDialog, InformationDialog, YesNoDialog
from .path_chooser import PathChooser
try:
- from urllib.parse import urlparse
-except ImportError:
- # PY2 fallback
- from urlparse import urlparse # pylint: disable=ungrouped-imports
-
-try:
require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 # noqa: F401
except (ImportError, ValueError):
@@ -77,7 +70,7 @@ class Preferences(component.Component):
self.load_pref_dialog_state()
self.builder.get_object('image_magnet').set_from_file(
- deluge.common.get_pixmap('magnet.png')
+ deluge.common.get_pixmap('magnet16.png')
)
# Hide the unused associate magnet button on OSX see: #2420
@@ -255,11 +248,10 @@ class Preferences(component.Component):
vbox.pack_start(label, False, True, 0)
sep = Gtk.HSeparator()
vbox.pack_start(sep, False, True, 0)
- align = Gtk.Alignment()
- align.set_padding(5, 0, 0, 0)
- align.set(0, 0, 1, 1)
- align.add(widget)
- vbox.pack_start(align, True, True, 0)
+ widget.set_margin_top(7)
+ widget.set_vexpand(True)
+ widget.set_hexpand(True)
+ vbox.pack_start(widget, True, True, 0)
scrolled = Gtk.ScrolledWindow()
viewport = Gtk.Viewport()
viewport.set_shadow_type(Gtk.ShadowType.NONE)
@@ -571,6 +563,9 @@ class Preferences(component.Component):
self.builder.get_object('piecesbar_toggle').set_active(
self.gtkui_config['show_piecesbar']
)
+ self.builder.get_object('urldetect_toggle').set_active(
+ self.gtkui_config['detect_urls']
+ )
self.__set_color('completed', from_config=True)
self.__set_color('downloading', from_config=True)
self.__set_color('waiting', from_config=True)
@@ -677,11 +672,15 @@ class Preferences(component.Component):
'chk_random_outgoing_ports'
).get_active()
incoming_address = self.builder.get_object('entry_interface').get_text().strip()
- if deluge.common.is_ip(incoming_address) or not incoming_address:
+ if deluge.common.is_interface(incoming_address) or not incoming_address:
new_core_config['listen_interface'] = incoming_address
- new_core_config['outgoing_interface'] = (
+ outgoing_address = (
self.builder.get_object('entry_outgoing_interface').get_text().strip()
)
+ if deluge.common.is_interface(outgoing_address) or not outgoing_address:
+ new_core_config['outgoing_interface'] = (
+ self.builder.get_object('entry_outgoing_interface').get_text().strip()
+ )
new_core_config['peer_tos'] = self.builder.get_object(
'entry_peer_tos'
).get_text()
@@ -937,7 +936,7 @@ class Preferences(component.Component):
not self.gtkui_config['standalone']
)
- mode = 'Thinclient' if was_standalone else 'Standalone'
+ mode = _('Thinclient') if was_standalone else _('Standalone')
dialog = YesNoDialog(
_('Switching Deluge Client Mode...'),
_('Do you want to restart to use %s mode?' % mode),
@@ -946,6 +945,7 @@ class Preferences(component.Component):
def hide(self):
self.window_open = False
+ self.builder.get_object('port_spinner').stop()
self.builder.get_object('port_img').hide()
self.pref_dialog.hide()
@@ -958,7 +958,6 @@ class Preferences(component.Component):
'label_cache_num_blocks_written',
'label_cache_read_hit_ratio',
'label_cache_write_hit_ratio',
- 'label_cache_num_blocks_cache_hits',
'label_cache_disk_blocks_in_use',
'label_cache_read_cache_blocks',
)
@@ -1091,6 +1090,8 @@ class Preferences(component.Component):
log.debug('on_test_port_clicked')
def on_get_test(status):
+ self.builder.get_object('port_spinner').stop()
+ self.builder.get_object('port_spinner').hide()
if status:
self.builder.get_object('port_img').set_from_icon_name(
'emblem-ok-symbolic', Gtk.IconSize.MENU
@@ -1103,12 +1104,9 @@ class Preferences(component.Component):
self.builder.get_object('port_img').show()
client.core.test_listen_port().addCallback(on_get_test)
- # XXX: Consider using gtk.Spinner() instead of the loading gif
- # It requires gtk.ver > 2.12
- self.builder.get_object('port_img').set_from_file(
- deluge.common.get_pixmap('loading.gif')
- )
- self.builder.get_object('port_img').show()
+ self.builder.get_object('port_spinner').start()
+ self.builder.get_object('port_spinner').show()
+ self.builder.get_object('port_img').hide()
client.force_call()
def on_plugin_toggled(self, renderer, path):
@@ -1180,8 +1178,8 @@ class Preferences(component.Component):
chooser.destroy()
return
- from base64 import b64encode
import shutil
+ from base64 import b64encode
filename = os.path.split(filepath)[1]
shutil.copyfile(filepath, os.path.join(get_config_dir(), 'plugins', filename))
@@ -1332,58 +1330,46 @@ class Preferences(component.Component):
(model, itr) = treeselection.get_selected()
if not itr:
return
- username = model[itr][0]
- if username:
+ level = model[itr][1]
+ if level:
self.builder.get_object('accounts_edit').set_sensitive(True)
self.builder.get_object('accounts_delete').set_sensitive(True)
else:
self.builder.get_object('accounts_edit').set_sensitive(False)
self.builder.get_object('accounts_delete').set_sensitive(False)
- def on_accounts_add_clicked(self, widget):
+ @maybe_coroutine
+ async def on_accounts_add_clicked(self, widget):
dialog = AccountDialog(
levels_mapping=client.auth_levels_mapping, parent=self.pref_dialog
)
+ response = await dialog.run()
+ if response != Gtk.ResponseType.OK:
+ return
- def dialog_finished(response_id):
- username = dialog.get_username()
- password = dialog.get_password()
- authlevel = dialog.get_authlevel()
-
- def add_ok(rv):
- accounts_iter = self.accounts_liststore.append()
- self.accounts_liststore.set_value(
- accounts_iter, ACCOUNTS_USERNAME, username
- )
- self.accounts_liststore.set_value(
- accounts_iter, ACCOUNTS_LEVEL, authlevel
- )
- self.accounts_liststore.set_value(
- accounts_iter, ACCOUNTS_PASSWORD, password
- )
-
- def add_fail(failure):
- if failure.type == AuthManagerError:
- ErrorDialog(
- _('Error Adding Account'),
- _('Authentication failed'),
- parent=self.pref_dialog,
- details=failure.getErrorMessage(),
- ).run()
- else:
- ErrorDialog(
- _('Error Adding Account'),
- _('An error occurred while adding account'),
- parent=self.pref_dialog,
- details=failure.getErrorMessage(),
- ).run()
-
- if response_id == Gtk.ResponseType.OK:
- client.core.create_account(username, password, authlevel).addCallback(
- add_ok
- ).addErrback(add_fail)
-
- dialog.run().addCallback(dialog_finished)
+ account = dialog.account
+ try:
+ await client.core.create_account(*account)
+ except AuthManagerError as ex:
+ return ErrorDialog(
+ _('Error Adding Account'),
+ _('Authentication failed'),
+ parent=self.pref_dialog,
+ details=ex,
+ ).run()
+ except Exception as ex:
+ return ErrorDialog(
+ _('Error Adding Account'),
+ _(f'An error occurred while adding account: {account}'),
+ parent=self.pref_dialog,
+ details=ex,
+ ).run()
+
+ self.accounts_liststore.set(
+ self.accounts_liststore.append(),
+ [ACCOUNTS_USERNAME, ACCOUNTS_LEVEL, ACCOUNTS_PASSWORD],
+ [account.username, account.authlevel, account.password],
+ )
def on_accounts_edit_clicked(self, widget):
(model, itr) = self.accounts_listview.get_selection().get_selected()
@@ -1463,6 +1449,9 @@ class Preferences(component.Component):
colors_widget = self.builder.get_object('piecebar_colors_expander')
colors_widget.set_visible(widget.get_active())
+ def on_urldetect_toggle_toggled(self, widget):
+ self.gtkui_config['detect_urls'] = widget.get_active()
+
def on_checkbutton_language_toggled(self, widget):
self.language_combo.set_visible(not self.language_checkbox.get_active())