[Python-Modernize] lib2to3.fixes.fix_ws_comma

* Fixer that changes 'a ,b' into 'a, b'.
This commit is contained in:
Calum Lind 2014-09-03 15:42:27 +01:00
parent 3a53f4002a
commit 38bc5d07f0
31 changed files with 544 additions and 544 deletions

View file

@ -10,7 +10,7 @@ def scan_for_methods(obj):
'__doc__': 'Methods available in %s' % obj.__name__.lower()
}
for d in dir(obj):
if not hasattr(getattr(obj,d), '_rpcserver_export'):
if not hasattr(getattr(obj, d), '_rpcserver_export'):
continue
methods[d] = getattr(obj, d)
cobj = classobj(obj.__name__.lower(), (object,), methods)

View file

@ -51,14 +51,14 @@ log = logging.getLogger(__name__)
RE_VALID = re.compile("[a-z0-9_\-\.]*\Z")
KNOWN_STATES = ['Downloading','Seeding','Paused','Checking','Queued','Error']
KNOWN_STATES = ['Downloading', 'Seeding', 'Paused', 'Checking', 'Queued', 'Error']
STATE = "state"
TRACKER = "tracker"
KEYWORD = "keyword"
LABEL = "label"
CONFIG_DEFAULTS = {
"torrent_labels":{}, #torrent_id:label_id
"labels":{}, #label_id:{name:value}
"torrent_labels": {}, #torrent_id:label_id
"labels": {}, #label_id:{name:value}
}
CORE_OPTIONS = ["auto_add_trackers"]
@ -157,7 +157,7 @@ class Core(CorePluginBase):
"""remove invalid data from config-file"""
for torrent_id, label_id in list(self.torrent_labels.iteritems()):
if (not label_id in self.labels) or (not torrent_id in self.torrents):
log.debug("label: rm %s:%s" % (torrent_id,label_id))
log.debug("label: rm %s:%s" % (torrent_id, label_id))
del self.torrent_labels[torrent_id]
def clean_initial_config(self):
@ -191,9 +191,9 @@ class Core(CorePluginBase):
see label_set_options for more options.
"""
label_id = label_id.lower()
CheckInput(RE_VALID.match(label_id) , _("Invalid label, valid characters:[a-z0-9_-]"))
CheckInput(RE_VALID.match(label_id), _("Invalid label, valid characters:[a-z0-9_-]"))
CheckInput(label_id, _("Empty Label"))
CheckInput(not (label_id in self.labels) , _("Label already exists"))
CheckInput(not (label_id in self.labels), _("Label already exists"))
self.labels[label_id] = dict(OPTIONS_DEFAULTS)
self.config.save()
@ -259,7 +259,7 @@ class Core(CorePluginBase):
}
)
def _has_auto_match(self, torrent ,label_options):
def _has_auto_match(self, torrent, label_options):
"""match for auto_add fields"""
for tracker_match in label_options["auto_add_trackers"]:
for tracker in torrent.trackers:
@ -281,7 +281,7 @@ class Core(CorePluginBase):
"move_completed_to":string() or None
}
"""
CheckInput(label_id in self.labels , _("Unknown Label"))
CheckInput(label_id in self.labels, _("Unknown Label"))
for key in options_dict.keys():
if not key in OPTIONS_DEFAULTS:
raise Exception("label: Invalid options_dict key:%s" % key)
@ -289,16 +289,16 @@ class Core(CorePluginBase):
self.labels[label_id].update(options_dict)
#apply
for torrent_id,label in self.torrent_labels.iteritems():
for torrent_id, label in self.torrent_labels.iteritems():
if label_id == label and torrent_id in self.torrents:
self._set_torrent_options(torrent_id , label_id)
self._set_torrent_options(torrent_id, label_id)
#auto add
options = self.labels[label_id]
if options["auto_add"]:
for torrent_id, torrent in self.torrents.iteritems():
if self._has_auto_match(torrent, options):
self.set_torrent(torrent_id , label_id)
self.set_torrent(torrent_id, label_id)
self.config.save()
@ -308,7 +308,7 @@ class Core(CorePluginBase):
return self.labels[label_id]
@export
def set_torrent(self, torrent_id , label_id):
def set_torrent(self, torrent_id, label_id):
"""
assign a label to a torrent
removes a label if the label_id parameter is empty.
@ -316,8 +316,8 @@ class Core(CorePluginBase):
if label_id == NO_LABEL:
label_id = None
CheckInput((not label_id) or (label_id in self.labels) , _("Unknown Label"))
CheckInput(torrent_id in self.torrents , _("Unknown Torrent"))
CheckInput((not label_id) or (label_id in self.labels), _("Unknown Label"))
CheckInput(torrent_id in self.torrents, _("Unknown Torrent"))
if torrent_id in self.torrent_labels:
self._unset_torrent_options(torrent_id, self.torrent_labels[torrent_id])

View file

@ -79,16 +79,16 @@ class LabelSidebarMenu(object):
self.menu.connect("show", self.on_show, None)
def _add_item(self, id, label ,stock):
def _add_item(self, id, label, stock):
"""I hate glade.
id is automatically-added as self.item_<id>
"""
func = getattr(self,"on_%s" % id)
func = getattr(self, "on_%s" % id)
item = gtk.ImageMenuItem(stock)
item.get_children()[0].set_label(label)
item.connect("activate", func)
self.menu.prepend(item)
setattr(self,"item_%s" % id, item)
setattr(self, "item_%s" % id, item)
self.items.append(item)
return item
@ -145,8 +145,8 @@ class AddDialog(object):
self.dialog.set_transient_for(component.get("MainWindow").window)
self.glade.signal_autoconnect({
"on_add_ok":self.on_ok,
"on_add_cancel":self.on_cancel,
"on_add_ok": self.on_ok,
"on_add_cancel": self.on_cancel,
})
self.dialog.run()
@ -184,8 +184,8 @@ class OptionsDialog(object):
self.dialog = self.glade.get_widget("dlg_label_options")
self.dialog.set_transient_for(component.get("MainWindow").window)
self.glade.signal_autoconnect({
"on_options_ok":self.on_ok,
"on_options_cancel":self.on_cancel,
"on_options_ok": self.on_ok,
"on_options_cancel": self.on_cancel,
})
# Show the label name in the header label
@ -193,7 +193,7 @@ class OptionsDialog(object):
for chk_id, group in self.sensitive_groups:
chk = self.glade.get_widget(chk_id)
chk.connect("toggled",self.apply_sensitivity)
chk.connect("toggled", self.apply_sensitivity)
client.label.get_options(self.label).addCallback(self.load_options)
@ -245,7 +245,7 @@ class OptionsDialog(object):
self.dialog.destroy()
def apply_sensitivity(self, event=None):
for chk_id , sensitive_list in self.sensitive_groups:
for chk_id, sensitive_list in self.sensitive_groups:
chk = self.glade.get_widget(chk_id)
sens = chk.get_active() and chk.get_property("sensitive")
for widget_id in sensitive_list:

View file

@ -74,12 +74,12 @@ class LabelMenu(gtk.MenuItem):
if label == NO_LABEL:
item = gtk.MenuItem(_(NO_LABEL))
else:
item = gtk.MenuItem(label.replace("_","__"))
item = gtk.MenuItem(label.replace("_", "__"))
item.connect("activate", self.on_select_label, label)
self.sub_menu.append(item)
self.show_all()
def on_select_label(self, widget=None, label_id=None):
log.debug("select label:%s,%s" % (label_id ,self.get_torrent_ids()) )
log.debug("select label:%s,%s" % (label_id, self.get_torrent_ids()) )
for torrent_id in self.get_torrent_ids():
client.label.set_torrent(torrent_id, label_id)

View file

@ -54,17 +54,17 @@ id = sclient.get_session_state()[0]
print("#add")
sclient.label_add("test")
print("#set")
sclient.label_set_torrent(id,"test")
sclient.label_set_torrent(id, "test")
print(sclient.get_torrents_status({"label":"test"},"name"))
print(sclient.get_torrents_status({"label":"test"}, "name"))
print("#set options")
sclient.label_set_options("test",{"max_download_speed":999}, True)
print(sclient.get_torrent_status(id, ["max_download_speed"]) , "999")
sclient.label_set_options("test",{"max_download_speed":9}, True)
print(sclient.get_torrent_status(id, ["max_download_speed"]) , "9")
sclient.label_set_options("test",{"max_download_speed":888}, False)
print(sclient.get_torrent_status(id, ["max_download_speed"]) , "9 (888)")
sclient.label_set_options("test", {"max_download_speed":999}, True)
print(sclient.get_torrent_status(id, ["max_download_speed"]), "999")
sclient.label_set_options("test", {"max_download_speed":9}, True)
print(sclient.get_torrent_status(id, ["max_download_speed"]), "9")
sclient.label_set_options("test", {"max_download_speed":888}, False)
print(sclient.get_torrent_status(id, ["max_download_speed"]), "9 (888)")
print(sclient.get_torrent_status(id,['name', 'tracker_host', 'label']))
print(sclient.get_torrent_status(id, ['name', 'tracker_host', 'label']))

View file

@ -63,12 +63,12 @@ class SchedulerSelectWidget(gtk.DrawingArea):
self.colors = [[115.0/255, 210.0/255, 22.0/255], [237.0/255, 212.0/255, 0.0/255], [204.0/255, 0.0/255, 0.0/255]]
self.button_state = [[0] * 7 for dummy in xrange(24)]
self.start_point = [0,0]
self.hover_point = [-1,-1]
self.start_point = [0, 0]
self.hover_point = [-1, -1]
self.hover_label = hover
self.hover_days = DAYS
self.mouse_press = False
self.set_size_request(350,150)
self.set_size_request(350, 150)
def set_button_state(self, state):
self.button_state = []
@ -104,7 +104,7 @@ class SchedulerSelectWidget(gtk.DrawingArea):
if y > 6: y = 6
elif y < 0: y = 0
return [x,y]
return [x, y]
#mouse down
def mouse_down(self, widget, event):
@ -148,7 +148,7 @@ class SchedulerSelectWidget(gtk.DrawingArea):
#clear hover text on mouse leave
def mouse_leave(self, widget, event):
self.hover_label.set_text("")
self.hover_point = [-1,-1]
self.hover_point = [-1, -1]
class GtkUI(GtkPluginBase):
def enable(self):

View file

@ -59,7 +59,7 @@ def default_formatter(value):
def size_formatter_scale(value):
scale = 1.0
for i in range(0,3):
for i in range(0, 3):
scale = scale * 1024.0
if value / scale < 1024:
return scale
@ -86,9 +86,9 @@ class Graph:
self.mean_selected = True
self.legend_selected = True
self.max_selected = True
self.black = (0, 0 , 0,)
self.black = (0, 0, 0,)
self.interval = 2 # 2 secs
self.text_bg = (255, 255 , 255, 128) # prototyping
self.text_bg = (255, 255, 255, 128) # prototyping
self.set_left_axis()
def set_left_axis(self, **kargs):

View file

@ -19,7 +19,7 @@ def test_sync():
n.savedUpSpeeds = upload
n.savedDownSpeeds = download
n.draw(800,200)
n.draw(800, 200)
n.surface.write_to_png('output_sync.png')
def test_async():
@ -69,7 +69,7 @@ def test_write():
surface.write_to_png(file_like)
data = "".join(file_like.data)
f = open("file_like.png","wb")
f = open("file_like.png", "wb")
f.write(data)
f.close()

View file

@ -5,7 +5,7 @@ sclient.set_core_uri()
def print_totals(totals):
for name, value in totals.iteritems():
print(name , fsize(value))
print(name, fsize(value))
print("overhead:")
print("up:", fsize(totals["total_upload"] - totals["total_payload_upload"] ))

View file

@ -14,11 +14,11 @@ import os
import sys
import deluge.common
parser = OptionParser()
parser.add_option("-n", "--name", dest="name",help="plugin name")
parser.add_option("-m", "--module-name", dest="module",help="plugin name")
parser.add_option("-p", "--basepath", dest="path",help="base path")
parser.add_option("-a", "--author-name", dest="author_name",help="author name,for the GPL header")
parser.add_option("-e", "--author-email", dest="author_email",help="author email,for the GPL header")
parser.add_option("-n", "--name", dest="name", help="plugin name")
parser.add_option("-m", "--module-name", dest="module", help="plugin name")
parser.add_option("-p", "--basepath", dest="path", help="base path")
parser.add_option("-a", "--author-name", dest="author_name", help="author name,for the GPL header")
parser.add_option("-e", "--author-email", dest="author_email", help="author email,for the GPL header")
parser.add_option("-u", "--url", dest="url", help="Homepage URL")
parser.add_option("-c", "--config", dest="configdir", help="location of deluge configuration")
@ -83,7 +83,7 @@ def create_plugin():
}
filename = os.path.join(path, filename)
f = open(filename,"w")
f = open(filename, "w")
if filename.endswith(".py") and include_gpl:
f.write(GPL % args)
f.write(template % args)
@ -97,20 +97,20 @@ def create_plugin():
os.mkdir(data_dir)
print("creating files..")
write_file(plugin_base,"setup.py", SETUP)
write_file(plugin_base, "setup.py", SETUP)
write_file(deluge_namespace, "__init__.py", NAMESPACE_INIT, False)
write_file(plugins_namespace, "__init__.py", NAMESPACE_INIT, False)
write_file(src,"__init__.py", INIT)
write_file(src,"gtkui.py", GTKUI)
write_file(src,"webui.py", WEBUI)
write_file(src,"core.py", CORE)
write_file(src, "__init__.py", INIT)
write_file(src, "gtkui.py", GTKUI)
write_file(src, "webui.py", WEBUI)
write_file(src, "core.py", CORE)
write_file(src, "common.py", COMMON)
write_file(data_dir, "config.glade", GLADE)
write_file(data_dir, "%s.js" % safe_name, DEFAULT_JS)
#add an input parameter for this?
print("building dev-link..")
write_file(plugin_base,"create_dev_link.sh", CREATE_DEV_LINK)
write_file(plugin_base, "create_dev_link.sh", CREATE_DEV_LINK)
dev_link_path = os.path.join(plugin_base, "create_dev_link.sh")
os.system("chmod +x %s" % dev_link_path) #lazy..
os.system(dev_link_path)

View file

@ -49,7 +49,7 @@ print("\n\n")
if 0: #aclient non-core
methods = sorted([m for m in dir(aclient) if not m.startswith('_')
if not m in ['add_torrent_file', 'has_callback', 'get_method',
'methodHelp','methodSignature','list_methods','add_torrent_file_binary']])
'methodHelp', 'methodSignature', 'list_methods', 'add_torrent_file_binary']])
for m in methods:
func = getattr(aclient, m)
@ -109,7 +109,7 @@ if 0: #keys
{{{
#!python
>>>sorted(sclient.get_status_keys())""")
print("\n".join(textwrap.wrap(str(sorted(sclient.get_status_keys())),100)))
print("\n".join(textwrap.wrap(str(sorted(sclient.get_status_keys())), 100)))
print("""}}}""")

View file

@ -151,7 +151,7 @@ class Win32IcoFile (object):
# change tile dimension to only encompass XOR image
im.size = im.size[0], im.size[1] / 2
d, e, o, a = im.tile[0]
im.tile[0] = d, (0,0) + im.size, o, a
im.tile[0] = d, (0, 0) + im.size, o, a
# figure out where AND mask image starts
mode = a[0]

View file

@ -59,16 +59,16 @@ color_pairs = {
# Some default color schemes
schemes = {
"input": ("white", "black"),
"normal": ("white","black"),
"normal": ("white", "black"),
"status": ("yellow", "blue", "bold"),
"info": ("white", "black", "bold"),
"error": ("red", "black", "bold"),
"success": ("green", "black", "bold"),
"event": ("magenta", "black", "bold"),
"selected": ("black", "white", "bold"),
"marked": ("white","blue","bold"),
"selectedmarked": ("blue","white","bold"),
"header": ("green","black","bold"),
"marked": ("white", "blue", "bold"),
"selectedmarked": ("blue", "white", "bold"),
"header": ("green", "black", "bold"),
"filterstatus": ("green", "blue", "bold")
}
@ -107,7 +107,7 @@ def init_colors():
# but can also fail on others, so we try/except
try:
curses.init_pair(counter, curses.COLOR_WHITE, curses.COLOR_BLACK)
color_pairs[("white","black")] = counter
color_pairs[("white", "black")] = counter
except:
pass

View file

@ -46,7 +46,7 @@ class Command(BaseCommand):
try:
at = component.get("AllTorrents")
except KeyError:
at = AllTorrents(console.stdscr,console.encoding)
at = AllTorrents(console.stdscr, console.encoding)
console.set_mode(at)
at._go_top = True
at.resume()

View file

@ -77,7 +77,7 @@ class Console(_UI):
self.console_cmds = load_commands(os.path.join(UI_PATH, 'commands'))
class CommandOptionGroup(optparse.OptionGroup):
def __init__(self, parser, title, description=None, cmds=None):
optparse.OptionGroup.__init__(self,parser, title, description)
optparse.OptionGroup.__init__(self, parser, title, description)
self.cmds = cmds
def format_help(self, formatter):
@ -91,7 +91,7 @@ class Console(_UI):
allnames = [cname]
allnames.extend(cmd.aliases)
cname = "/".join(allnames)
result += formatter.format_heading(" - ".join([cname,cmd.__doc__]))
result += formatter.format_heading(" - ".join([cname, cmd.__doc__]))
formatter.indent()
result += "%*s%s\n" % (formatter.current_indent, "", cmd.usage.split('\n')[0])
formatter.dedent()
@ -400,7 +400,7 @@ Please use commands from the command line, eg:\n
no matches are found.
"""
if self.interactive and isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if self.interactive and isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
return self.screen.match_torrent(string)
matches = []
@ -413,7 +413,7 @@ Please use commands from the command line, eg:\n
def get_torrent_name(self, torrent_id):
if self.interactive and hasattr(self.screen,"get_torrent_name"):
if self.interactive and hasattr(self.screen, "get_torrent_name"):
return self.screen.get_torrent_name(torrent_id)
for tid, name in self.torrents:
@ -424,15 +424,15 @@ Please use commands from the command line, eg:\n
def set_batch_write(self, batch):
if self.interactive and isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if self.interactive and isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
return self.screen.set_batch_write(batch)
def tab_complete_torrent(self, line):
if self.interactive and isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if self.interactive and isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
return self.screen.tab_complete_torrent(line)
def tab_complete_path(self, line, type="file", ext="", sort="name", dirs_first=True):
if self.interactive and isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if self.interactive and isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
return self.screen.tab_complete_path(line, type=type, ext=ext, sort=sort, dirs_first=dirs_first)
def set_mode(self, mode):
@ -447,7 +447,7 @@ Please use commands from the command line, eg:\n
def write(self, s):
if self.interactive:
if isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
self.screen.write(s)
else:
component.get("LegacyUI").add_line(s, False)
@ -457,7 +457,7 @@ Please use commands from the command line, eg:\n
def write_event(self, s):
if self.interactive:
if isinstance(self.screen,deluge.ui.console.modes.legacy.Legacy):
if isinstance(self.screen, deluge.ui.console.modes.legacy.Legacy):
self.events.append(s)
self.screen.write(s)
else:

View file

@ -41,7 +41,7 @@ import deluge.component as component
from deluge.ui.common import TorrentInfo
import deluge.common
import os,base64,glob
import os, base64, glob
import logging
log = logging.getLogger(__name__)
@ -56,9 +56,9 @@ def __bracket_fixup(path):
if sentinal > 65535:
log.error("Can't fix brackets in path, path contains all possible sentinal characters")
return path
newpath = path.replace("]",unichr(sentinal))
newpath = newpath.replace("[","[[]")
newpath = newpath.replace(unichr(sentinal),"[]]")
newpath = path.replace("]", unichr(sentinal))
newpath = newpath.replace("[", "[[]")
newpath = newpath.replace(unichr(sentinal), "[]]")
return newpath
def add_torrent(t_file, options, success_cb, fail_cb, ress):
@ -78,29 +78,29 @@ def add_torrent(t_file, options, success_cb, fail_cb, ress):
ress["total"] = num_files
if num_files <= 0:
fail_cb("Doesn't exist",t_file,ress)
fail_cb("Doesn't exist", t_file, ress)
for f in files:
if is_url:
client.core.add_torrent_url(f, t_options).addCallback(success_cb,f,ress).addErrback(fail_cb,f,ress)
client.core.add_torrent_url(f, t_options).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress)
elif is_mag:
client.core.add_torrent_magnet(f, t_options).addCallback(success_cb,f,ress).addErrback(fail_cb,f,ress)
client.core.add_torrent_magnet(f, t_options).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress)
else:
if not os.path.exists(f):
fail_cb("Doesn't exist",f,ress)
fail_cb("Doesn't exist", f, ress)
continue
if not os.path.isfile(f):
fail_cb("Is a directory",f,ress)
fail_cb("Is a directory", f, ress)
continue
try:
TorrentInfo(f)
except Exception as e:
fail_cb(e.message,f,ress)
fail_cb(e.message, f, ress)
continue
filename = os.path.split(f)[-1]
filedump = base64.encodestring(open(f).read())
client.core.add_torrent_file(filename, filedump, t_options).addCallback(success_cb,f,ress).addErrback(fail_cb,f,ress)
client.core.add_torrent_file(filename, filedump, t_options).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress)

View file

@ -260,7 +260,7 @@ class AddTorrents(BaseMode, component.Component):
if (self.view_offset + self._listing_space) <= self.cursel + 1:
self.view_offset = self.cursel - self._listing_space + 1
def set_popup(self,pu):
def set_popup(self, pu):
self.popup = pu
self.refresh()
@ -431,21 +431,21 @@ class AddTorrents(BaseMode, component.Component):
"total": len(self.marked),
"fmsg":[]}
def fail_cb(msg,t_file,ress):
log.debug("failed to add torrent: %s: %s"%(t_file,msg))
def fail_cb(msg, t_file, ress):
log.debug("failed to add torrent: %s: %s"%(t_file, msg))
ress["fail"]+=1
ress["fmsg"].append("{!input!} * %s: {!error!}%s"%(t_file,msg))
ress["fmsg"].append("{!input!} * %s: {!error!}%s"%(t_file, msg))
if (ress["succ"]+ress["fail"]) >= ress["total"]:
self.alltorrentmode._report_add_status(ress["succ"],ress["fail"],ress["fmsg"])
self.alltorrentmode._report_add_status(ress["succ"], ress["fail"], ress["fmsg"])
def success_cb(tid,t_file,ress):
def success_cb(tid, t_file, ress):
if tid:
log.debug("added torrent: %s (%s)"%(t_file,tid))
log.debug("added torrent: %s (%s)"%(t_file, tid))
ress["succ"]+=1
if (ress["succ"]+ress["fail"]) >= ress["total"]:
self.alltorrentmode._report_add_status(ress["succ"],ress["fail"],ress["fmsg"])
self.alltorrentmode._report_add_status(ress["succ"], ress["fail"], ress["fmsg"])
else:
fail_cb("Already in session (probably)",t_file,ress)
fail_cb("Already in session (probably)", t_file, ress)
for m in self.marked:
filename = m
@ -472,7 +472,7 @@ class AddTorrents(BaseMode, component.Component):
ap = 0
else:
ap = 1
self.popup = InputPopup(self,"Add Torrents (Esc to cancel)",close_cb=_do_add, height_req=17)
self.popup = InputPopup(self, "Add Torrents (Esc to cancel)", close_cb=_do_add, height_req=17)
msg = "Adding torrent files:"
for i, m in enumerate(self.marked):
@ -485,8 +485,8 @@ class AddTorrents(BaseMode, component.Component):
self.popup.add_text(msg)
self.popup.add_spaces(1)
self.popup.add_text_input("Download Folder:","location", dl)
self.popup.add_select_input("Add Paused:","add_paused",["Yes","No"],[True,False],ap)
self.popup.add_text_input("Download Folder:", "location", dl)
self.popup.add_select_input("Add Paused:", "add_paused", ["Yes", "No"], [True, False], ap)
def _go_up(self):

View file

@ -56,7 +56,7 @@ from legacy import Legacy
from twisted.internet import defer
import format_utils,column
import format_utils, column
try:
import curses
@ -220,8 +220,8 @@ DEFAULT_PREFS = {
column_pref_names = ["queue", "name", "size", "state", "progress", "seeds",
"peers", "downspeed", "upspeed", "eta", "ratio", "avail",
"added", "tracker", "savepath","downloaded","uploaded",
"remaining", "owner","downloading_time","seeding_time",
"added", "tracker", "savepath", "downloaded", "uploaded",
"remaining", "owner", "downloading_time", "seeding_time",
"completed", "seeds_peers_ratio", "complete_seen",
"down_limit", "up_limit", "shared",
]
@ -339,7 +339,7 @@ class AllTorrents(BaseMode, component.Component):
component.start(["AllTorrents"])
self._info_fields = [
("Name",None, ("name",)),
("Name", None, ("name",)),
("State", None, ("state",)),
("Down Speed", format_utils.format_speed, ("download_payload_rate",)),
("Up Speed", format_utils.format_speed, ("upload_payload_rate",)),
@ -350,7 +350,7 @@ class AllTorrents(BaseMode, component.Component):
("Uploaded", deluge.common.fsize, ("total_uploaded",)),
("Share Ratio", format_utils.format_float, ("ratio",)),
("Seeds", format_utils.format_seeds_peers, ("num_seeds", "total_seeds")),
("Peers", format_utils.format_seeds_peers,("num_peers", "total_peers")),
("Peers", format_utils.format_seeds_peers, ("num_peers", "total_peers")),
("Active Time", deluge.common.ftime, ("active_time",)),
("Seeding Time", deluge.common.ftime, ("seeding_time",)),
("Complete Seen", format_utils.format_date_never, ("last_seen_complete",)),
@ -372,21 +372,21 @@ class AllTorrents(BaseMode, component.Component):
self.legacy_mode = Legacy(self.stdscr, self.encoding)
if self.config["first_run"]:
self.popup = MessagePopup(self,"Welcome to Deluge", HELP_STR, width_req=0.75)
self.popup = MessagePopup(self, "Welcome to Deluge", HELP_STR, width_req=0.75)
self.config["first_run"] = False
self.config.save()
# component start/update
def start(self):
component.get("SessionProxy").get_torrents_status(self.__status_dict, self.__status_fields).addCallback(self.set_state,False)
component.get("SessionProxy").get_torrents_status(self.__status_dict, self.__status_fields).addCallback(self.set_state, False)
def update(self):
component.get("SessionProxy").get_torrents_status(self.__status_dict, self.__status_fields).addCallback(self.set_state,True)
component.get("SessionProxy").get_torrents_status(self.__status_dict, self.__status_fields).addCallback(self.set_state, True)
if self.__torrent_info_id:
component.get("SessionProxy").get_torrent_status(self.__torrent_info_id, self.__status_keys).addCallback(self._on_torrent_status)
def update_config(self):
self.config = ConfigManager("console.conf",DEFAULT_PREFS)
self.config = ConfigManager("console.conf", DEFAULT_PREFS)
s_primary = self.config["sort_primary"]
s_secondary = self.config["sort_secondary"]
self.__cols_to_show = [
@ -417,14 +417,14 @@ class AllTorrents(BaseMode, component.Component):
def __update_columns(self):
self.column_widths = [self.config["%s_width"%c] for c in self.__cols_to_show]
req = sum(filter(lambda x:x >= 0,self.column_widths))
req = sum(filter(lambda x:x >= 0, self.column_widths))
if (req > self.cols): # can't satisfy requests, just spread out evenly
cw = int(self.cols/len(self.__columns))
for i in range(0,len(self.column_widths)):
for i in range(0, len(self.column_widths)):
self.column_widths[i] = cw
else:
rem = self.cols - req
var_cols = len(filter(lambda x: x < 0,self.column_widths))
var_cols = len(filter(lambda x: x < 0, self.column_widths))
if (var_cols > 0):
vw = int(rem/var_cols)
for i in range(0, len(self.column_widths)):
@ -473,21 +473,21 @@ class AllTorrents(BaseMode, component.Component):
self.refresh()
def get_torrent_name(self, torrent_id):
for p,i in enumerate(self._sorted_ids):
for p, i in enumerate(self._sorted_ids):
if torrent_id == i:
return self.torrent_names[p]
return None
def _scroll_up(self, by):
prevoff = self.curoff
self.cursel = max(self.cursel - by,1)
self.cursel = max(self.cursel - by, 1)
if ((self.cursel - 1) < self.curoff):
self.curoff = max(self.cursel - 1,1)
self.curoff = max(self.cursel - 1, 1)
return prevoff != self.curoff
def _scroll_down(self, by):
prevoff = self.curoff
self.cursel = min(self.cursel + by,self.numtorrents)
self.cursel = min(self.cursel + by, self.numtorrents)
if ((self.curoff + self.rows - 5) < self.cursel):
self.curoff = self.cursel - self.rows + 5
return prevoff != self.curoff
@ -510,14 +510,14 @@ class AllTorrents(BaseMode, component.Component):
name = state["name"]
off = int((self.cols/4)-(len(name)/2))
self.popup.set_title(name)
for i,f in enumerate(self._info_fields):
for i, f in enumerate(self._info_fields):
if f[1] != None:
args = []
try:
for key in f[2]:
args.append(state[key])
except:
log.debug("Could not get info field: %s",e)
log.debug("Could not get info field: %s", e)
continue
info = f[1](*args)
else:
@ -525,14 +525,14 @@ class AllTorrents(BaseMode, component.Component):
nl = len(f[0])+4
if (nl+len(info))>self.popup.width:
self.popup.add_line("{!info!}%s: {!input!}%s"%(f[0],info[:(self.popup.width - nl)]))
self.popup.add_line("{!info!}%s: {!input!}%s"%(f[0], info[:(self.popup.width - nl)]))
info = info[(self.popup.width - nl):]
n = self.popup.width-3
chunks = [info[i:i+n] for i in xrange(0, len(info), n)]
for c in chunks:
self.popup.add_line(" %s"%c)
else:
self.popup.add_line("{!info!}%s: {!input!}%s"%(f[0],info))
self.popup.add_line("{!info!}%s: {!input!}%s"%(f[0], info))
self.refresh()
else:
self.__torrent_info_id = None
@ -627,34 +627,34 @@ class AllTorrents(BaseMode, component.Component):
def dodeets(arg):
if arg and True in arg[0]:
self.stdscr.erase()
component.get("ConsoleUI").set_mode(AddTorrents(self,self.stdscr, self.config, self.encoding))
component.get("ConsoleUI").set_mode(AddTorrents(self, self.stdscr, self.config, self.encoding))
else:
self.messages.append(("Error","An error occurred trying to display add torrents screen"))
self.messages.append(("Error", "An error occurred trying to display add torrents screen"))
component.stop(["AllTorrents"]).addCallback(dodeets)
def show_torrent_details(self,tid):
def show_torrent_details(self, tid):
def dodeets(arg):
if arg and True in arg[0]:
self.stdscr.erase()
component.get("ConsoleUI").set_mode(TorrentDetail(self,tid,self.stdscr, self.config, self.encoding))
component.get("ConsoleUI").set_mode(TorrentDetail(self, tid, self.stdscr, self.config, self.encoding))
else:
self.messages.append(("Error","An error occurred trying to display torrent details"))
self.messages.append(("Error", "An error occurred trying to display torrent details"))
component.stop(["AllTorrents"]).addCallback(dodeets)
def show_preferences(self):
def _on_get_config(config):
client.core.get_listen_port().addCallback(_on_get_listen_port,config)
client.core.get_listen_port().addCallback(_on_get_listen_port, config)
def _on_get_listen_port(port,config):
client.core.get_cache_status().addCallback(_on_get_cache_status,port,config)
def _on_get_listen_port(port, config):
client.core.get_cache_status().addCallback(_on_get_cache_status, port, config)
def _on_get_cache_status(status,port,config):
def _on_get_cache_status(status, port, config):
def doprefs(arg):
if arg and True in arg[0]:
self.stdscr.erase()
component.get("ConsoleUI").set_mode(Preferences(self,config,self.config,port,status,self.stdscr,self.encoding))
component.get("ConsoleUI").set_mode(Preferences(self, config, self.config, port, status, self.stdscr, self.encoding))
else:
self.messages.append(("Error","An error occurred trying to display preferences"))
self.messages.append(("Error", "An error occurred trying to display preferences"))
component.stop(["AllTorrents"]).addCallback(doprefs)
client.core.get_config().addCallback(_on_get_config)
@ -664,9 +664,9 @@ class AllTorrents(BaseMode, component.Component):
def doevents(arg):
if arg and True in arg[0]:
self.stdscr.erase()
component.get("ConsoleUI").set_mode(EventView(self,self.stdscr,self.encoding))
component.get("ConsoleUI").set_mode(EventView(self, self.stdscr, self.encoding))
else:
self.messages.append(("Error","An error occurred trying to display events"))
self.messages.append(("Error", "An error occurred trying to display events"))
component.stop(["AllTorrents"]).addCallback(doevents)
def __legacy_mode(self):
@ -677,7 +677,7 @@ class AllTorrents(BaseMode, component.Component):
self.legacy_mode.refresh()
curses.curs_set(2)
else:
self.messages.append(("Error","An error occurred trying to switch to legacy mode"))
self.messages.append(("Error", "An error occurred trying to switch to legacy mode"))
component.stop(["AllTorrents"]).addCallback(dolegacy)
def _torrent_filter(self, idx, data):
@ -716,26 +716,26 @@ class AllTorrents(BaseMode, component.Component):
return True
def _show_torrent_filter_popup(self):
self.popup = SelectablePopup(self,"Filter Torrents", self._torrent_filter)
self.popup.add_line("_All",data=FILTER.ALL)
self.popup.add_line("Ac_tive",data=FILTER.ACTIVE)
self.popup.add_line("_Downloading",data=FILTER.DOWNLOADING,foreground="green")
self.popup.add_line("_Seeding",data=FILTER.SEEDING,foreground="cyan")
self.popup.add_line("_Paused",data=FILTER.PAUSED)
self.popup.add_line("_Error",data=FILTER.ERROR,foreground="red")
self.popup.add_line("_Checking",data=FILTER.CHECKING,foreground="blue")
self.popup.add_line("Q_ueued",data=FILTER.QUEUED,foreground="yellow")
self.popup.add_line("A_llocating",data=FILTER.ALLOCATING,foreground="yellow")
self.popup.add_line("_Moving",data=FILTER.MOVING,foreground="green")
self.popup = SelectablePopup(self, "Filter Torrents", self._torrent_filter)
self.popup.add_line("_All", data=FILTER.ALL)
self.popup.add_line("Ac_tive", data=FILTER.ACTIVE)
self.popup.add_line("_Downloading", data=FILTER.DOWNLOADING, foreground="green")
self.popup.add_line("_Seeding", data=FILTER.SEEDING, foreground="cyan")
self.popup.add_line("_Paused", data=FILTER.PAUSED)
self.popup.add_line("_Error", data=FILTER.ERROR, foreground="red")
self.popup.add_line("_Checking", data=FILTER.CHECKING, foreground="blue")
self.popup.add_line("Q_ueued", data=FILTER.QUEUED, foreground="yellow")
self.popup.add_line("A_llocating", data=FILTER.ALLOCATING, foreground="yellow")
self.popup.add_line("_Moving", data=FILTER.MOVING, foreground="green")
def _report_add_status(self, succ_cnt, fail_cnt, fail_msgs):
if fail_cnt == 0:
self.report_message("Torrents Added","{!success!}Successfully added %d torrent(s)"%succ_cnt)
self.report_message("Torrents Added", "{!success!}Successfully added %d torrent(s)"%succ_cnt)
else:
msg = ("{!error!}Failed to add the following %d torrent(s):\n {!input!}"%fail_cnt)+"\n ".join(fail_msgs)
if succ_cnt != 0:
msg += "\n \n{!success!}Successfully added %d torrent(s)"%succ_cnt
self.report_message("Torrent Add Report",msg)
self.report_message("Torrent Add Report", msg)
def _show_torrent_add_popup(self):
@ -767,7 +767,7 @@ class AllTorrents(BaseMode, component.Component):
elif deluge.common.is_url(url):
client.core.add_torrent_url(url, t_options).addCallback(success_cb, url).addErrback(fail_cb, url)
else:
self.messages.append(("Error","{!error!}Invalid URL or magnet link: %s" % url))
self.messages.append(("Error", "{!error!}Invalid URL or magnet link: %s" % url))
return
log.debug("Adding Torrent(s): %s (dl path: %s) (paused: %d)", url, result["path"], result["add_paused"])
@ -786,7 +786,7 @@ class AllTorrents(BaseMode, component.Component):
except KeyError:
pass
self.popup = InputPopup(self,"Add Torrent (Esc to cancel)", close_cb=do_add_from_url)
self.popup = InputPopup(self, "Add Torrent (Esc to cancel)", close_cb=do_add_from_url)
self.popup.add_text_input("Enter torrent URL or Magnet link:", "url")
self.popup.add_text_input("Enter save path:", "path", dl)
self.popup.add_select_input("Add Paused:", "add_paused", ["Yes", "No"], [True, False], ap)
@ -801,7 +801,7 @@ class AllTorrents(BaseMode, component.Component):
elif data == 2:
show_add_url_popup()
self.popup = SelectablePopup(self,"Add torrent", option_chosen)
self.popup = SelectablePopup(self, "Add torrent", option_chosen)
self.popup.add_line("From _File(s)", data=1)
self.popup.add_line("From _URL or Magnet", data=2)
self.popup.add_line("_Cancel", data=0)
@ -834,14 +834,14 @@ class AllTorrents(BaseMode, component.Component):
self.popup.add_checked_input(name, prop, state)
def report_message(self,title,message):
self.messages.append((title,message))
def report_message(self, title, message):
self.messages.append((title, message))
def clear_marks(self):
self.marked = []
self.last_mark = -1
def set_popup(self,pu):
def set_popup(self, pu):
self.popup = pu
self.refresh()
@ -857,8 +857,8 @@ class AllTorrents(BaseMode, component.Component):
# show a message popup if there's anything queued
if self.popup == None and self.messages:
title,msg = self.messages.popleft()
self.popup = MessagePopup(self,title,msg, width_req=1.0)
title, msg = self.messages.popleft()
self.popup = MessagePopup(self, title, msg, width_req=1.0)
if not lines:
if component.get("ConsoleUI").screen != self:
@ -867,10 +867,10 @@ class AllTorrents(BaseMode, component.Component):
# Update the status bars
if self._curr_filter == None:
self.add_string(0,self.statusbars.topbar)
self.add_string(0, self.statusbars.topbar)
else:
self.add_string(0,"%s {!filterstatus!}Current filter: %s"%(self.statusbars.topbar,self._curr_filter))
self.add_string(1,self.column_string)
self.add_string(0, "%s {!filterstatus!}Current filter: %s"%(self.statusbars.topbar, self._curr_filter))
self.add_string(1, self.column_string)
if self.entering_search:
string = {
@ -914,7 +914,7 @@ class AllTorrents(BaseMode, component.Component):
def draw_row(index):
if index not in cr:
ts = curstate[sorted_ids[index]]
cr[index] = (fr([gcv(name,ts) for name in cols],colw),ts["state"])
cr[index] = (fr([gcv(name, ts) for name in cols], colw), ts["state"])
return cr[index]
if lines:
@ -980,12 +980,12 @@ class AllTorrents(BaseMode, component.Component):
attr = "bold"
if attr:
colorstr = "{!%s,%s,%s!}"%(fg,bg,attr)
colorstr = "{!%s,%s,%s!}"%(fg, bg, attr)
else:
colorstr = "{!%s,%s!}"%(fg,bg)
colorstr = "{!%s,%s!}"%(fg, bg)
try:
self.add_string(currow,"%s%s"%(colorstr,row[0]),trim=False)
self.add_string(currow, "%s%s"%(colorstr, row[0]), trim=False)
except:
#Yeah, this should be fixed in some better way
pass
@ -1014,7 +1014,7 @@ class AllTorrents(BaseMode, component.Component):
curses.doupdate()
def _mark_unmark(self,idx):
def _mark_unmark(self, idx):
if idx in self.marked:
self.marked.remove(idx)
self.last_mark = -1
@ -1059,7 +1059,7 @@ class AllTorrents(BaseMode, component.Component):
search_space = reversed(search_space)
search_string = self.search_string.lower()
for i,n in search_space:
for i, n in search_space:
n = n.lower()
if n.find(search_string) != -1:
if skip > 0:
@ -1130,7 +1130,7 @@ class AllTorrents(BaseMode, component.Component):
elif c in [10, curses.KEY_ENTER]:
self.last_mark = -1
tid = self.current_torrent_id()
torrent_actions_popup(self, [tid] ,details=True)
torrent_actions_popup(self, [tid], details=True)
elif c == 27:
self.search_string = ""
@ -1202,13 +1202,13 @@ class AllTorrents(BaseMode, component.Component):
if c == curses.KEY_UP:
if self.cursel == 1: return
if not self._scroll_up(1):
effected_lines = [self.cursel-1,self.cursel]
effected_lines = [self.cursel-1, self.cursel]
elif c == curses.KEY_PPAGE:
self._scroll_up(int(self.rows/2))
elif c == curses.KEY_DOWN:
if self.cursel >= self.numtorrents: return
if not self._scroll_down(1):
effected_lines = [self.cursel-2,self.cursel-1]
effected_lines = [self.cursel-2, self.cursel-1]
elif c == curses.KEY_NPAGE:
self._scroll_down(int(self.rows/2))
elif c == curses.KEY_HOME:
@ -1219,7 +1219,7 @@ class AllTorrents(BaseMode, component.Component):
if self.cursel not in self.marked:
self.marked.append(self.cursel)
self.last_mark = self.cursel
torrent_actions_popup(self,self._selected_torrent_ids(), action=ACTION.REMOVE)
torrent_actions_popup(self, self._selected_torrent_ids(), action=ACTION.REMOVE)
elif c == curses.KEY_RIGHT:
# We enter a new mode for the selected torrent here
@ -1233,7 +1233,7 @@ class AllTorrents(BaseMode, component.Component):
if self.cursel not in self.marked:
self.marked.append(self.cursel)
self.last_mark = self.cursel
torrent_actions_popup(self,self._selected_torrent_ids(),details=True)
torrent_actions_popup(self, self._selected_torrent_ids(), details=True)
return
else:
if c > 31 and c < 256:
@ -1244,15 +1244,15 @@ class AllTorrents(BaseMode, component.Component):
self.__do_search("next")
elif chr(c) == 'j':
if not self._scroll_up(1):
effected_lines = [self.cursel-1,self.cursel]
effected_lines = [self.cursel-1, self.cursel]
elif chr(c) == 'k':
if not self._scroll_down(1):
effected_lines = [self.cursel-2,self.cursel-1]
effected_lines = [self.cursel-2, self.cursel-1]
elif chr(c) == 'i':
cid = self.current_torrent_id()
if cid:
def cb(): self.__torrent_info_id = None
self.popup = Popup(self,"Info",close_cb=cb, height_req=20)
self.popup = Popup(self, "Info", close_cb=cb, height_req=20)
self.popup.add_line("Getting torrent info...")
self.__torrent_info_id = cid
elif chr(c) == 'm':
@ -1261,9 +1261,9 @@ class AllTorrents(BaseMode, component.Component):
elif chr(c) == 'M':
if self.last_mark >= 0:
if (self.cursel+1) > self.last_mark:
mrange = range(self.last_mark,self.cursel+1)
mrange = range(self.last_mark, self.cursel+1)
else:
mrange = range(self.cursel-1,self.last_mark)
mrange = range(self.cursel-1, self.last_mark)
self.marked.extend(mrange[1:])
effected_lines = mrange
else:

View file

@ -122,7 +122,7 @@ class BaseMode(CursesStdIO):
def on_resize_norefresh(self, *args):
log.debug("on_resize_from_signal")
# Get the new rows and cols value
self.rows, self.cols = struct.unpack("hhhh", ioctl(0, termios.TIOCGWINSZ ,"\000"*8))[0:2]
self.rows, self.cols = struct.unpack("hhhh", ioctl(0, termios.TIOCGWINSZ, "\000"*8))[0:2]
curses.resizeterm(self.rows, self.cols)
def on_resize(self, *args):
@ -177,7 +177,7 @@ class BaseMode(CursesStdIO):
# This is the last string so lets append some " " to it
s += " " * (self.cols - (col + len(s)) - 1)
if trim:
y,x = screen.getmaxyx()
y, x = screen.getmaxyx()
if (col+len(s)) > x:
s = "%s..."%s[0:x-4-col]
screen.addstr(row, col, s, color)
@ -192,7 +192,7 @@ class BaseMode(CursesStdIO):
pass
# This mode doesn't do anything with popups
def set_popup(self,popup):
def set_popup(self, popup):
pass
# This mode doesn't support marking
@ -209,7 +209,7 @@ class BaseMode(CursesStdIO):
self.draw_statusbars()
# Update the status bars
self.add_string(1,"{!info!}Base Mode (or subclass hasn't overridden refresh)")
self.add_string(1, "{!info!}Base Mode (or subclass hasn't overridden refresh)")
self.stdscr.redrawwin()
self.stdscr.refresh()

View file

@ -35,7 +35,7 @@
# a mode that show's a popup to select which host to connect to
import hashlib,time
import hashlib, time
from collections import deque
@ -47,7 +47,7 @@ import deluge.component as component
from alltorrents import AllTorrents
from basemode import BaseMode
from popup import SelectablePopup,MessagePopup
from popup import SelectablePopup, MessagePopup
from input_popup import InputPopup
@ -78,13 +78,13 @@ class ConnectionManager(BaseMode):
self.__update_popup()
def __update_popup(self):
self.popup = SelectablePopup(self,"Select Host",self.__host_selected)
self.popup.add_line("{!white,black,bold!}'Q'=quit, 'r'=refresh, 'a'=add new host, 'D'=delete host",selectable=False)
self.popup = SelectablePopup(self, "Select Host", self.__host_selected)
self.popup.add_line("{!white,black,bold!}'Q'=quit, 'r'=refresh, 'a'=add new host, 'D'=delete host", selectable=False)
for host in self.config["hosts"]:
if host[0] in self.statuses:
self.popup.add_line("%s:%d [Online] (%s)"%(host[1],host[2],self.statuses[host[0]]),data=host[0],foreground="green")
self.popup.add_line("%s:%d [Online] (%s)"%(host[1], host[2], self.statuses[host[0]]), data=host[0], foreground="green")
else:
self.popup.add_line("%s:%d [Offline]"%(host[1],host[2]),data=host[0],foreground="red")
self.popup.add_line("%s:%d [Offline]"%(host[1], host[2]), data=host[0], foreground="red")
self.inlist = True
self.refresh()
@ -119,7 +119,7 @@ class ConnectionManager(BaseMode):
d.addCallback(on_connect, c, host[0])
d.addErrback(on_connect_failed, host[0])
def __on_connected(self,result):
def __on_connected(self, result):
component.start()
self.stdscr.erase()
at = AllTorrents(self.stdscr, self.encoding)
@ -132,18 +132,18 @@ class ConnectionManager(BaseMode):
client.connect(host[1], host[2], host[3], host[4]).addCallback(self.__on_connected)
return False
def __do_add(self,result):
def __do_add(self, result):
hostname = result["hostname"]
try:
port = int(result["port"])
except ValueError:
self.report_message("Can't add host","Invalid port. Must be an integer")
self.report_message("Can't add host", "Invalid port. Must be an integer")
return
username = result["username"]
password = result["password"]
for host in self.config["hosts"]:
if (host[1],host[2],host[3]) == (hostname, port, username):
self.report_message("Can't add host","Host already in list")
if (host[1], host[2], host[3]) == (hostname, port, username):
self.report_message("Can't add host", "Host already in list")
return
newid = hashlib.sha1(str(time.time())).hexdigest()
self.config["hosts"].append((newid, hostname, port, username, password))
@ -152,24 +152,24 @@ class ConnectionManager(BaseMode):
def __add_popup(self):
self.inlist = False
self.popup = InputPopup(self,"Add Host (up & down arrows to navigate, esc to cancel)",close_cb=self.__do_add)
self.popup.add_text_input("Hostname:","hostname")
self.popup.add_text_input("Port:","port")
self.popup.add_text_input("Username:","username")
self.popup.add_text_input("Password:","password")
self.popup = InputPopup(self, "Add Host (up & down arrows to navigate, esc to cancel)", close_cb=self.__do_add)
self.popup.add_text_input("Hostname:", "hostname")
self.popup.add_text_input("Port:", "port")
self.popup.add_text_input("Username:", "username")
self.popup.add_text_input("Password:", "password")
self.refresh()
def __delete_current_host(self):
idx,data = self.popup.current_selection()
log.debug("deleting host: %s",data)
idx, data = self.popup.current_selection()
log.debug("deleting host: %s", data)
for host in self.config["hosts"]:
if host[0] == data:
self.config["hosts"].remove(host)
break
self.config.save()
def report_message(self,title,message):
self.messages.append((title,message))
def report_message(self, title, message):
self.messages.append((title, message))
def refresh(self):
self.stdscr.erase()
@ -177,8 +177,8 @@ class ConnectionManager(BaseMode):
self.stdscr.noutrefresh()
if self.popup == None and self.messages:
title,msg = self.messages.popleft()
self.popup = MessagePopup(self,title,msg)
title, msg = self.messages.popleft()
self.popup = MessagePopup(self, title, msg)
if not self.popup:
self.__update_popup()

View file

@ -61,7 +61,7 @@ class EventView(BaseMode):
self.stdscr.erase()
self.add_string(0,self.statusbars.topbar)
self.add_string(0, self.statusbars.topbar)
hstr = "%sPress [h] for help"%(" "*(self.cols - len(self.statusbars.bottombar) - 10))
#This will quite likely fail when switching modes
try:
@ -76,7 +76,7 @@ class EventView(BaseMode):
pass
if events:
for i,event in enumerate(events):
for i, event in enumerate(events):
if i - self.offset >= self.rows - 2:
more = len(events) - self.offset - self.rows + 2
if more > 0:
@ -86,11 +86,11 @@ class EventView(BaseMode):
elif i - self.offset < 0:
continue
try:
self.add_string(i+1-self.offset,event)
self.add_string(i+1-self.offset, event)
except curses.error:
pass #This'll just cut the line. Note: This seriously should be fixed in a better way
else:
self.add_string(1,"{!white,black,bold!}No events to show yet")
self.add_string(1, "{!white,black,bold!}No events to show yet")
if component.get("ConsoleUI").screen != self:
return

View file

@ -72,7 +72,7 @@ def format_float(x):
return "%.3f"%x
def format_seeds_peers(num, total):
return "%d (%d)"%(num,total)
return "%d (%d)"%(num, total)
def format_progress(perc):
if perc < 100:
@ -81,7 +81,7 @@ def format_progress(perc):
return "100%"
def format_pieces(num, size):
return "%d (%s)"%(num,deluge.common.fsize(size))
return "%d (%s)"%(num, deluge.common.fsize(size))
def format_priority(prio):
if prio == -2: return "[Mixed]"
@ -104,7 +104,7 @@ def trim_string(string, w, have_dbls):
idx = 0
while width < w:
chrs.append(string[idx])
if unicodedata.east_asian_width(string[idx]) in ['W','F']:
if unicodedata.east_asian_width(string[idx]) in ['W', 'F']:
width += 2
else:
width += 1
@ -126,16 +126,16 @@ def format_column(col, lim):
# for unicode strings.
if haveud and col.__class__ is unicode:
# might have some double width chars
col = ud_normalize("NFC",col)
col = ud_normalize("NFC", col)
dbls = sum(eaw(c) in 'WF' for c in col)
size = len(col)+dbls
if (size >= lim - 1):
return trim_string(col,lim,dbls>0)
return trim_string(col, lim, dbls>0)
else:
return "%s%s"%(col," "*(lim-size))
return "%s%s"%(col, " "*(lim-size))
def format_row(row, column_widths):
return "".join([format_column(row[i],column_widths[i]) for i in range(0,len(row))])
return "".join([format_column(row[i], column_widths[i]) for i in range(0, len(row))])
import re
_strip_re = re.compile("\{!.*?!\}")
@ -157,13 +157,13 @@ def wrap_string(string,width,min_lines=0,strip_colors=True):
ret = []
s1 = string.split("\n")
def insert_clr(s,offset,mtchs,clrs):
def insert_clr(s, offset, mtchs, clrs):
end_pos = offset+len(s)
while mtchs and (mtchs[0] <= end_pos) and (mtchs[0] >= offset):
mtc = mtchs.popleft()-offset
clr = clrs.popleft()
end_pos += len(clr)
s = "%s%s%s"%(s[:mtc],clr,s[mtc:])
s = "%s%s%s"%(s[:mtc], clr, s[mtc:])
return s
for s in s1:
@ -174,16 +174,16 @@ def wrap_string(string,width,min_lines=0,strip_colors=True):
for m in _strip_re.finditer(s):
mtchs.append(m.start())
clrs.append(m.group())
cstr = _strip_re.sub('',s)
cstr = _strip_re.sub('', s)
else:
cstr = s
while len(cstr) > width:
sidx = cstr.rfind(" ",0,width-1)
sidx = cstr.rfind(" ", 0, width-1)
sidx += 1
if sidx > 0:
if strip_colors:
to_app = cstr[0:sidx]
to_app = insert_clr(to_app,offset,mtchs,clrs)
to_app = insert_clr(to_app, offset, mtchs, clrs)
ret.append(to_app)
offset += len(to_app)
else:
@ -196,7 +196,7 @@ def wrap_string(string,width,min_lines=0,strip_colors=True):
# can't find a reasonable split, just split at width
if strip_colors:
to_app = cstr[0:width]
to_app = insert_clr(to_app,offset,mtchs,clrs)
to_app = insert_clr(to_app, offset, mtchs, clrs)
ret.append(to_app)
offset += len(to_app)
else:
@ -207,12 +207,12 @@ def wrap_string(string,width,min_lines=0,strip_colors=True):
break
if cstr != None:
if strip_colors:
ret.append(insert_clr(cstr,offset,mtchs,clrs))
ret.append(insert_clr(cstr, offset, mtchs, clrs))
else:
ret.append(cstr)
if min_lines>0:
for i in range(len(ret),min_lines):
for i in range(len(ret), min_lines):
ret.append(" ")
#Carry colors over to the next line
@ -236,7 +236,7 @@ def strwidth(string):
if not isinstance(string, unicode):
string = unicode(string, 'utf-8')
eaw = east_asian_width
length = sum( [1 + (eaw(c) in ['W','F']) for c in string] )
length = sum( [1 + (eaw(c) in ['W', 'F']) for c in string] )
#Using list comprehenstion for improved performance
#The code above is equal to:
#length = 0

View file

@ -42,7 +42,7 @@ try:
except ImportError:
pass
import logging,os,os.path
import logging, os, os.path
from popup import Popup, ALIGN
@ -69,7 +69,7 @@ class InputField:
pass
def set_depend(self,i,inverse=False):
if not isinstance(i,CheckedInput):
if not isinstance(i, CheckedInput):
raise Exception("Can only depend on CheckedInputs")
self.depend = i
self.inverse = inverse
@ -98,13 +98,13 @@ class CheckedInput(InputField):
def render(self, screen, row, width, active, col=1):
if self.checked and active:
self.parent.add_string(row,self.chkd_act,screen,col,False,True)
self.parent.add_string(row, self.chkd_act, screen, col, False, True)
elif self.checked:
self.parent.add_string(row,self.chkd_inact,screen,col,False,True)
self.parent.add_string(row, self.chkd_inact, screen, col, False, True)
elif active:
self.parent.add_string(row,self.unchkd_act,screen,col,False,True)
self.parent.add_string(row, self.unchkd_act, screen, col, False, True)
else:
self.parent.add_string(row,self.unchkd_inact,screen,col,False,True)
self.parent.add_string(row, self.unchkd_inact, screen, col, False, True)
return 1
def handle_read(self, c):
@ -137,28 +137,28 @@ class CheckedPlusInput(InputField):
def render(self, screen, row, width, active, col=1):
isact = active and not self.child_active
if self.checked and isact:
self.parent.add_string(row,self.chkd_act,screen,col,False,True)
self.parent.add_string(row, self.chkd_act, screen, col, False, True)
elif self.checked:
self.parent.add_string(row,self.chkd_inact,screen,col,False,True)
self.parent.add_string(row, self.chkd_inact, screen, col, False, True)
elif isact:
self.parent.add_string(row,self.unchkd_act,screen,col,False,True)
self.parent.add_string(row, self.unchkd_act, screen, col, False, True)
else:
self.parent.add_string(row,self.unchkd_inact,screen,col,False,True)
self.parent.add_string(row, self.unchkd_inact, screen, col, False, True)
if active and self.checked and self.child_active:
self.parent.add_string(row+1,"(esc to leave)",screen,col,False,True)
self.parent.add_string(row+1, "(esc to leave)", screen, col, False, True)
elif active and self.checked:
self.parent.add_string(row+1,"(right arrow to edit)",screen,col,False,True)
self.parent.add_string(row+1, "(right arrow to edit)", screen, col, False, True)
rows = 2
# show child
if self.checked:
if isinstance(self.child,(TextInput,IntSpinInput,FloatSpinInput)):
crows = self.child.render(screen,row,width-self.msglen,self.child_active and active,col+self.msglen,self.msglen)
if isinstance(self.child, (TextInput, IntSpinInput, FloatSpinInput)):
crows = self.child.render(screen, row, width-self.msglen, self.child_active and active, col+self.msglen, self.msglen)
else:
crows = self.child.render(screen,row,width-self.msglen,self.child_active and active,col+self.msglen)
rows = max(rows,crows)
crows = self.child.render(screen, row, width-self.msglen, self.child_active and active, col+self.msglen)
rows = max(rows, crows)
else:
self.parent.add_string(row,"(enable to view/edit value)",screen,col+self.msglen,False,True)
self.parent.add_string(row, "(enable to view/edit value)", screen, col+self.msglen, False, True)
return rows
def handle_read(self, c):
@ -239,16 +239,16 @@ class IntSpinInput(InputField):
except:
self.real_value = False
if not self.valstr:
self.parent.add_string(row,"%s {!input!}[ ]"%self.message,screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ ]"%self.message, screen, col, False, True)
elif active:
self.parent.add_string(row,"%s {!input!}[ {!black,white,bold!}%s{!input!} ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ {!black,white,bold!}%s{!input!} ]"%(self.message, self.valstr), screen, col, False, True)
elif self.additional_formatting and self.valstr == self.default_str:
self.parent.add_string(row,"%s {!input!}[ {!magenta,black!}%s{!input!} ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ {!magenta,black!}%s{!input!} ]"%(self.message, self.valstr), screen, col, False, True)
else:
self.parent.add_string(row,"%s {!input!}[ %s ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ %s ]"%(self.message, self.valstr), screen, col, False, True)
if active:
self.move_func(row,self.cursor+self.cursoff+cursor_offset)
self.move_func(row, self.cursor+self.cursoff+cursor_offset)
return 1
@ -273,10 +273,10 @@ class IntSpinInput(InputField):
self.cursor = len(self.valstr)
elif c == curses.KEY_LEFT:
if not self.real_value: return None
self.cursor = max(0,self.cursor-1)
self.cursor = max(0, self.cursor-1)
elif c == curses.KEY_RIGHT:
if not self.real_value: return None
self.cursor = min(len(self.valstr),self.cursor+1)
self.cursor = min(len(self.valstr), self.cursor+1)
elif c == curses.KEY_HOME:
if not self.real_value: return None
self.cursor = 0
@ -409,15 +409,15 @@ class FloatSpinInput(InputField):
self.real_value = False
if not self.valstr:
self.parent.add_string(row,"%s {!input!}[ ]"%self.message,screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ ]"%self.message, screen, col, False, True)
elif active:
self.parent.add_string(row,"%s {!input!}[ {!black,white,bold!}%s{!white,black!} ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ {!black,white,bold!}%s{!white,black!} ]"%(self.message, self.valstr), screen, col, False, True)
elif self.additional_formatting and self.valstr == self.default_str:
self.parent.add_string(row,"%s {!input!}[ {!magenta,black!}%s{!input!} ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ {!magenta,black!}%s{!input!} ]"%(self.message, self.valstr), screen, col, False, True)
else:
self.parent.add_string(row,"%s {!input!}[ %s ]"%(self.message,self.valstr),screen,col,False,True)
self.parent.add_string(row, "%s {!input!}[ %s ]"%(self.message, self.valstr), screen, col, False, True)
if active:
self.move_func(row,self.cursor+self.cursoff+cursor_offset)
self.move_func(row, self.cursor+self.cursoff+cursor_offset)
return 1
@ -444,10 +444,10 @@ class FloatSpinInput(InputField):
self.cursor = len(self.valstr)
elif c == curses.KEY_LEFT:
if not self.real_value: return None
self.cursor = max(0,self.cursor-1)
self.cursor = max(0, self.cursor-1)
elif c == curses.KEY_RIGHT:
if not self.real_value: return None
self.cursor = min(len(self.valstr),self.cursor+1)
self.cursor = min(len(self.valstr), self.cursor+1)
elif c == curses.KEY_HOME:
if not self.real_value: return None
self.cursor = 0
@ -552,21 +552,21 @@ class SelectInput(InputField):
def render(self, screen, row, width, selected, col=1):
if self.message:
self.parent.add_string(row,self.message,screen,col,False,True)
self.parent.add_string(row, self.message, screen, col, False, True)
row += 1
off = col+1
for i,opt in enumerate(self.opts):
for i, opt in enumerate(self.opts):
if selected and i == self.selidx:
self.parent.add_string(row,"{!black,white,bold!}[%s]"%opt,screen,off,False,True)
self.parent.add_string(row, "{!black,white,bold!}[%s]"%opt, screen, off, False, True)
elif i == self.selidx:
if self.additional_formatting and i == self.default_option:
self.parent.add_string(row,"[{!magenta,black!}%s{!white,black!}]"%opt,screen,off,False,True)
self.parent.add_string(row, "[{!magenta,black!}%s{!white,black!}]"%opt, screen, off, False, True)
elif self.additional_formatting:
self.parent.add_string(row,"[{!white,blue!}%s{!white,black!}]"%opt,screen,off,False,True)
self.parent.add_string(row, "[{!white,blue!}%s{!white,black!}]"%opt, screen, off, False, True)
else:
self.parent.add_string(row,"[{!white,black,underline!}%s{!white,black!}]"%opt,screen,off,False,True)
self.parent.add_string(row, "[{!white,black,underline!}%s{!white,black!}]"%opt, screen, off, False, True)
else:
self.parent.add_string(row,"[%s]"%opt,screen,off,False,True)
self.parent.add_string(row, "[%s]"%opt, screen, off, False, True)
off += len(opt)+3
if self.message:
return 2
@ -575,15 +575,15 @@ class SelectInput(InputField):
def handle_read(self, c):
if c == curses.KEY_LEFT:
self.selidx = max(0,self.selidx-1)
self.selidx = max(0, self.selidx-1)
if c == curses.KEY_RIGHT:
self.selidx = min(len(self.opts)-1,self.selidx+1)
self.selidx = min(len(self.opts)-1, self.selidx+1)
def get_value(self):
return self.vals[self.selidx]
def set_value(self, nv):
for i,val in enumerate(self.vals):
for i, val in enumerate(self.vals):
if nv == val:
self.selidx = i
return
@ -617,15 +617,15 @@ class TextInput(InputField):
self.cursor = len(self.value)
if self.message:
self.parent.add_string(row,self.message,screen,col,False,True)
self.parent.add_string(row, self.message, screen, col, False, True)
row += 1
if selected:
if self.opts:
self.parent.add_string(row+1,self.opts[self.opt_off:],screen,col,False,True)
self.parent.add_string(row+1, self.opts[self.opt_off:], screen, col, False, True)
if self.cursor > (width-3):
self.move_func(row,width-2)
self.move_func(row, width-2)
else:
self.move_func(row,self.cursor+1+cursor_offset)
self.move_func(row, self.cursor+1+cursor_offset)
slen = len(self.value)+3
if slen > width:
vstr = self.value[(slen-width):]
@ -633,9 +633,9 @@ class TextInput(InputField):
vstr = self.value.ljust(width-2)
if self.additional_formatting and len(self.value) != 0 and self.value == self.default_value:
self.parent.add_string(row,"{!magenta,white!}%s"%vstr,screen,col,False,False)
self.parent.add_string(row, "{!magenta,white!}%s"%vstr, screen, col, False, False)
else:
self.parent.add_string(row,"{!black,white,bold!}%s"%vstr,screen,col,False,False)
self.parent.add_string(row, "{!black,white,bold!}%s"%vstr, screen, col, False, False)
if self.message:
return 3
@ -645,12 +645,12 @@ class TextInput(InputField):
def get_value(self):
return self.value
def set_value(self,val):
def set_value(self, val):
self.value = val
self.cursor = len(self.value)
# most of the cursor,input stuff here taken from ui/console/screen.py
def handle_read(self,c):
def handle_read(self, c):
if c == 9 and self.docmp:
# Keep track of tab hit count to know when it's double-hit
self.tab_count += 1
@ -668,7 +668,7 @@ class TextInput(InputField):
self.opt_off += self.width-3
# now find previous double space, best guess at a split point
# in future could keep opts unjoined to get this really right
self.opt_off = self.opts.rfind(" ",0,self.opt_off)+2
self.opt_off = self.opts.rfind(" ", 0, self.opt_off)+2
if second_hit and self.opt_off == prev: # double tap and we're at the end
self.opt_off = 0
else:
@ -689,9 +689,9 @@ class TextInput(InputField):
# Cursor movement
elif c == curses.KEY_LEFT:
self.cursor = max(0,self.cursor-1)
self.cursor = max(0, self.cursor-1)
elif c == curses.KEY_RIGHT:
self.cursor = min(len(self.value),self.cursor+1)
self.cursor = min(len(self.value), self.cursor+1)
elif c == curses.KEY_HOME:
self.cursor = 0
elif c == curses.KEY_END:
@ -730,7 +730,7 @@ class TextInput(InputField):
self.cursor+=1
def complete(self,line):
def complete(self, line):
line = os.path.abspath(os.path.expanduser(line))
ret = []
if os.path.exists(line):
@ -773,7 +773,7 @@ class InputPopup(Popup):
close_cb=None,
additional_formatting=True,
immediate_action=False):
Popup.__init__(self,parent_mode,title, width_req=width_req, height_req=height_req, align=align, close_cb=close_cb)
Popup.__init__(self, parent_mode, title, width_req=width_req, height_req=height_req, align=align, close_cb=close_cb)
self.inputs = []
self.lines = []
self.current_input = 0
@ -784,7 +784,7 @@ class InputPopup(Popup):
#We need to replicate some things in order to wrap our inputs
self.encoding = parent_mode.encoding
def move(self,r,c):
def move(self, r, c):
self._cursor_row = r
self._cursor_col = c
@ -826,7 +826,7 @@ class InputPopup(Popup):
additional_formatting = self.additional_formatting))
def add_checked_input(self, message, name, checked=False):
self.inputs.append(CheckedInput(self,message,name,checked,
self.inputs.append(CheckedInput(self, message, name, checked,
additional_formatting = self.additional_formatting))
#def add_checked_plus_input(self, message, name, child)
@ -866,12 +866,12 @@ class InputPopup(Popup):
crow = 1 - self.lineoff
spos = 0
for i,ipt in enumerate(self.inputs):
for i, ipt in enumerate(self.inputs):
for line in self.lines:
if line[0] == i:
self.add_string(crow, line[1], self.screen, 1, pad=False)
crow += 1
crow += ipt.render(self.screen,crow,self.width,i==self.current_input)
crow += ipt.render(self.screen, crow, self.width, i==self.current_input)
if (self.content_height > (self.height-2)):
lts = self.content_height-(self.height-3)
@ -879,16 +879,16 @@ class InputPopup(Popup):
sb_pos = int((self.height-2)*perc_sc)+1
if (sb_pos == 1) and (self.lineoff != 0):
sb_pos += 1
self.add_string(sb_pos, "{!red,black,bold!}#",self.screen,col=(self.width-1),pad=False,trim=False)
self.add_string(sb_pos, "{!red,black,bold!}#", self.screen, col=(self.width-1), pad=False, trim=False)
if self._cursor_row >= 0:
curses.curs_set(2)
self.screen.move(self._cursor_row,self._cursor_col)
self.screen.move(self._cursor_row, self._cursor_col)
def handle_read(self, c):
if c == curses.KEY_UP:
self.current_input = max(0,self.current_input-1)
self.current_input = max(0, self.current_input-1)
elif c == curses.KEY_DOWN:
self.current_input = min(len(self.inputs)-1,self.current_input+1)
self.current_input = min(len(self.inputs)-1, self.current_input+1)
elif c == curses.KEY_ENTER or c == 10:
if self.close_cb:
vals = {}

View file

@ -51,7 +51,7 @@ import deluge.configmanager
from deluge.ui.console.modes import format_utils
strwidth = format_utils.strwidth
import logging,os
import logging, os
log = logging.getLogger(__name__)
import re
@ -907,7 +907,7 @@ class Legacy(BaseMode, component.Component):
# Find all possible matches
for torrent_id, torrent_name in self.torrents:
#Escape spaces to avoid, for example, expanding "Doc" into "Doctor Who" and removing everything containing one of these words
escaped_name = torrent_name.replace(" ","\\ ")
escaped_name = torrent_name.replace(" ", "\\ ")
#If we only matched one torrent, don't add the full name or it'll also get autocompleted
if match_count == 1:
if torrent_id.startswith(line):

View file

@ -102,7 +102,7 @@ class Popup:
for line in self._lines[self.lineoff:]:
if (crow >= self.height-1):
break
self.parent.add_string(crow,line,self.screen,1,False,True)
self.parent.add_string(crow, line, self.screen, 1, False, True)
crow+=1
def handle_resize(self):
@ -148,17 +148,17 @@ class Popup:
elif self.align in [ALIGN.TOP_RIGHT, ALIGN.MIDDLE_RIGHT, ALIGN.BOTTOM_RIGHT]:
bx = self.parent.cols - wr - 1
self.screen = curses.newwin(hr,wr,by,bx)
self.screen = curses.newwin(hr, wr, by, bx)
self.x, self.y = bx, by
self.height,self.width = self.screen.getmaxyx()
self.height, self.width = self.screen.getmaxyx()
def refresh(self):
self.screen.erase()
self.screen.border(0,0,0,0)
self.screen.border(0, 0, 0, 0)
toff = max(1, (self.width//2) - (len(self.title)//2))
self.parent.add_string(0,"{!white,black,bold!}%s"%self.title,self.screen,toff,False,True)
self.parent.add_string(0, "{!white,black,bold!}%s"%self.title, self.screen, toff, False, True)
self._refresh_lines()
if (len(self._lines) > (self.height-2)):
@ -167,7 +167,7 @@ class Popup:
sb_pos = int((self.height-2)*perc_sc)+1
if (sb_pos == 1) and (self.lineoff != 0):
sb_pos += 1
self.parent.add_string(sb_pos, "{!red,black,bold!}#",self.screen,col=(self.width-1),pad=False,trim=False)
self.parent.add_string(sb_pos, "{!red,black,bold!}#", self.screen, col=(self.width-1), pad=False, trim=False)
self.screen.redrawwin()
self.screen.noutrefresh()
@ -178,9 +178,9 @@ class Popup:
def handle_read(self, c):
p_off = self.height - 3
if c == curses.KEY_UP:
self.lineoff = max(0,self.lineoff -1)
self.lineoff = max(0, self.lineoff -1)
elif c == curses.KEY_PPAGE:
self.lineoff = max(0,self.lineoff - p_off)
self.lineoff = max(0, self.lineoff - p_off)
elif c == curses.KEY_HOME:
self.lineoff = 0
elif c == curses.KEY_DOWN:
@ -223,7 +223,7 @@ class SelectablePopup(Popup):
are added.
"""
def __init__(self,parent_mode,title, selection_callback, args=(), align=ALIGN.DEFAULT, immediate_action=False):
Popup.__init__(self,parent_mode, title, align=align)
Popup.__init__(self, parent_mode, title, align=align)
self._selection_callback = selection_callback
self._selection_args = args
self._selectable_lines = []
@ -244,7 +244,7 @@ class SelectablePopup(Popup):
self._udxs[len(self._lines)+1] = udx
c = string[udx].lower()
self._hotkeys[c] = len(self._lines)
Popup.add_line(self,string)
Popup.add_line(self, string)
self._line_foregrounds.append(foreground)
if selectable:
self._selectable_lines.append(len(self._lines)-1)
@ -254,7 +254,7 @@ class SelectablePopup(Popup):
def _refresh_lines(self):
crow = 1
for row,line in enumerate(self._lines):
for row, line in enumerate(self._lines):
if (crow >= self.height-1):
break
if (row < self.lineoff):
@ -272,18 +272,18 @@ class SelectablePopup(Popup):
if udx >= 0:
ustr = "{!%s,black,underline!}"%fg
if udx == 0:
self.parent.add_string(crow,"- %s%c%s%s"%(ustr,line[0],colorstr,line[1:]),self.screen,1,False,True)
self.parent.add_string(crow, "- %s%c%s%s"%(ustr, line[0], colorstr, line[1:]), self.screen, 1, False, True)
elif udx > 0:
# well, this is a litte gross
self.parent.add_string(crow,"- %s%s%s%c%s%s"%(colorstr,line[:udx],ustr,line[udx],colorstr,line[udx+1:]),self.screen,1,False,True)
self.parent.add_string(crow, "- %s%s%s%c%s%s"%(colorstr, line[:udx], ustr, line[udx], colorstr, line[udx+1:]), self.screen, 1, False, True)
else:
self.parent.add_string(crow,"- %s%s"%(colorstr,line),self.screen,1,False,True)
self.parent.add_string(crow, "- %s%s"%(colorstr, line), self.screen, 1, False, True)
crow+=1
def current_selection(self):
"Returns a tuple of (selected index, selected data)"
idx = self._selectable_lines.index(self._selected)
return (idx,self._select_data[idx])
return (idx, self._select_data[idx])
def add_divider(self,color="white"):
if not self.divider:
@ -354,13 +354,13 @@ class MessagePopup(Popup):
def __init__(self, parent_mode, title, message, align=ALIGN.DEFAULT, width_req=0.5):
self.message = message
#self.width= int(parent_mode.cols/2)
Popup.__init__(self,parent_mode, title, align=align, width_req=width_req)
lns = format_utils.wrap_string(self.message,self.width-2,3,True)
self.height_req = min(len(lns)+2,int(parent_mode.rows*2/3))
Popup.__init__(self, parent_mode, title, align=align, width_req=width_req)
lns = format_utils.wrap_string(self.message, self.width-2, 3, True)
self.height_req = min(len(lns)+2, int(parent_mode.rows*2/3))
self.handle_resize()
self._lines = lns
def handle_resize(self):
Popup.handle_resize(self)
self.clear()
self._lines = format_utils.wrap_string(self.message,self.width-2,3,True)
self._lines = format_utils.wrap_string(self.message, self.width-2, 3, True)

View file

@ -33,7 +33,7 @@
#
#
from deluge.ui.console.modes.input_popup import TextInput,SelectInput,CheckedInput,IntSpinInput,FloatSpinInput,CheckedPlusInput
from deluge.ui.console.modes.input_popup import TextInput, SelectInput, CheckedInput, IntSpinInput, FloatSpinInput, CheckedPlusInput
import deluge.ui.console.modes.alltorrents
from deluge.common import is_ip
@ -63,28 +63,28 @@ class Header(NoInput):
if self.space_above:
row += 1
rows += 1
self.parent.add_string(row,self.header,screen,offset-1,False,True)
self.parent.add_string(row, self.header, screen, offset-1, False, True)
if self.space_below: rows += 1
return rows
class InfoField(NoInput):
def __init__(self,parent,label,value,name):
def __init__(self, parent, label, value, name):
self.parent = parent
self.label = label
self.value = value
self.txt = "%s %s"%(label,value)
self.txt = "%s %s"%(label, value)
self.name = name
def render(self, screen, row, width, active, offset):
self.parent.add_string(row,self.txt,screen,offset-1,False,True)
self.parent.add_string(row, self.txt, screen, offset-1, False, True)
return 1
def set_value(self, v):
self.value = v
if type(v) == float:
self.txt = "%s %.2f"%(self.label,self.value)
self.txt = "%s %.2f"%(self.label, self.value)
else:
self.txt = "%s %s"%(self.label,self.value)
self.txt = "%s %s"%(self.label, self.value)
class BasePane:
def __init__(self, offset, parent, width):
@ -97,22 +97,22 @@ class BasePane:
# have we scrolled down in the list
self.input_offset = 0
def move(self,r,c):
def move(self, r, c):
self._cursor_row = r
self._cursor_col = c
def add_config_values(self,conf_dict):
def add_config_values(self, conf_dict):
for ipt in self.inputs:
if not isinstance(ipt,NoInput):
if not isinstance(ipt, NoInput):
# gross, have to special case in/out ports since they are tuples
if ipt.name in ("listen_ports_to", "listen_ports_from", "out_ports_from", "out_ports_to",
"i2p_port", "i2p_hostname", "proxy_type", "proxy_username", "proxy_hostnames",
"proxy_password", "proxy_hostname", "proxy_port", "proxy_peer_connections",
"listen_interface"):
if ipt.name == "listen_ports_to":
conf_dict["listen_ports"] = (self.infrom.get_value(),self.into.get_value())
conf_dict["listen_ports"] = (self.infrom.get_value(), self.into.get_value())
elif ipt.name == "out_ports_to":
conf_dict["outgoing_ports"] = (self.outfrom.get_value(),self.outto.get_value())
conf_dict["outgoing_ports"] = (self.outfrom.get_value(), self.outto.get_value())
elif ipt.name == "listen_interface":
interface = ipt.get_value().strip()
if is_ip(interface) or not interface:
@ -139,18 +139,18 @@ class BasePane:
else:
conf_dict[ipt.name] = ipt.get_value()
if hasattr(ipt,"get_child"):
if hasattr(ipt, "get_child"):
c = ipt.get_child()
conf_dict[c.name] = c.get_value()
def update_values(self, conf_dict):
for ipt in self.inputs:
if not isinstance(ipt,NoInput):
if not isinstance(ipt, NoInput):
try:
ipt.set_value(conf_dict[ipt.name])
except KeyError: # just ignore if it's not in dict
pass
if hasattr(ipt,"get_child"):
if hasattr(ipt, "get_child"):
try:
c = ipt.get_child()
c.set_value(conf_dict[c.name])
@ -160,13 +160,13 @@ class BasePane:
def render(self, mode, screen, width, active):
self._cursor_row = -1
if self.active_input < 0:
for i,ipt in enumerate(self.inputs):
if not isinstance(ipt,NoInput):
for i, ipt in enumerate(self.inputs):
if not isinstance(ipt, NoInput):
self.active_input = i
break
drew_act = not active
crow = 1
for i,ipt in enumerate(self.inputs):
for i, ipt in enumerate(self.inputs):
if ipt.depend_skip() or i<self.input_offset:
if active and i==self.active_input:
self.input_offset-=1
@ -175,7 +175,7 @@ class BasePane:
continue
act = active and i==self.active_input
if act: drew_act = True
crow += ipt.render(screen,crow,width, act, self.offset)
crow += ipt.render(screen, crow, width, act, self.offset)
if crow >= (mode.prefs_height):
break
@ -186,19 +186,19 @@ class BasePane:
if active and self._cursor_row >= 0:
curses.curs_set(2)
screen.move(self._cursor_row,self._cursor_col+self.offset-1)
screen.move(self._cursor_row, self._cursor_col+self.offset-1)
else:
curses.curs_set(0)
return crow
# just handles setting the active input
def handle_read(self,c):
def handle_read(self, c):
if not self.inputs: # no inputs added yet
return
if c == curses.KEY_UP:
nc = max(0,self.active_input-1)
nc = max(0, self.active_input-1)
while isinstance(self.inputs[nc], NoInput) or self.inputs[nc].depend_skip():
nc-=1
if nc <= 0: break
@ -206,7 +206,7 @@ class BasePane:
self.active_input = nc
elif c == curses.KEY_DOWN:
ilen = len(self.inputs)
nc = min(self.active_input+1,ilen-1)
nc = min(self.active_input+1, ilen-1)
while isinstance(self.inputs[nc], NoInput) or self.inputs[nc].depend_skip():
nc+=1
if nc >= ilen:
@ -225,50 +225,50 @@ class BasePane:
self.inputs.append(InfoField(self.parent, label, value, name))
def add_text_input(self, name, msg, dflt_val):
self.inputs.append(TextInput(self.parent,self.move,self.width,msg,name,dflt_val,False))
self.inputs.append(TextInput(self.parent, self.move, self.width, msg, name, dflt_val, False))
def add_select_input(self, name, msg, opts, vals, selidx):
self.inputs.append(SelectInput(self.parent,msg,name,opts,vals,selidx))
self.inputs.append(SelectInput(self.parent, msg, name, opts, vals, selidx))
def add_checked_input(self, name, message, checked):
self.inputs.append(CheckedInput(self.parent,message,name,checked))
self.inputs.append(CheckedInput(self.parent, message, name, checked))
def add_checkedplus_input(self, name, message, child, checked):
self.inputs.append(CheckedPlusInput(self.parent,message,name,child,checked))
self.inputs.append(CheckedPlusInput(self.parent, message, name, child, checked))
def add_int_spin_input(self, name, message, value, min_val, max_val):
self.inputs.append(IntSpinInput(self.parent,message,name,self.move,value,min_val,max_val))
self.inputs.append(IntSpinInput(self.parent, message, name, self.move, value, min_val, max_val))
def add_float_spin_input(self, name, message, value, inc_amt, precision, min_val, max_val):
self.inputs.append(FloatSpinInput(self.parent,message,name,self.move,value,inc_amt,precision,min_val,max_val))
self.inputs.append(FloatSpinInput(self.parent, message, name, self.move, value, inc_amt, precision, min_val, max_val))
class InterfacePane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("General options", False)
self.add_checked_input("ring_bell","Ring system bell when a download finishes",parent.console_config["ring_bell"])
self.add_checked_input("ring_bell", "Ring system bell when a download finishes", parent.console_config["ring_bell"])
self.add_header("New Console UI", True)
self.add_checked_input("separate_complete","List complete torrents after incomplete regardless of sorting order",parent.console_config["separate_complete"])
self.add_checked_input("move_selection","Move selection when moving torrents in the queue",parent.console_config["move_selection"])
self.add_checked_input("separate_complete", "List complete torrents after incomplete regardless of sorting order", parent.console_config["separate_complete"])
self.add_checked_input("move_selection", "Move selection when moving torrents in the queue", parent.console_config["move_selection"])
self.add_header("Legacy Mode", True)
self.add_checked_input("ignore_duplicate_lines","Do not store duplicate input in history",parent.console_config["ignore_duplicate_lines"])
self.add_checked_input("save_legacy_history","Store and load command line history in Legacy mode",parent.console_config["save_legacy_history"])
self.add_checked_input("ignore_duplicate_lines", "Do not store duplicate input in history", parent.console_config["ignore_duplicate_lines"])
self.add_checked_input("save_legacy_history", "Store and load command line history in Legacy mode", parent.console_config["save_legacy_history"])
self.add_header("", False)
self.add_checked_input("third_tab_lists_all","Third tab lists all remaining torrents in legacy mode",parent.console_config["third_tab_lists_all"])
self.add_int_spin_input("torrents_per_tab_press","Torrents per tab press",parent.console_config["torrents_per_tab_press"], 5, 100)
self.add_checked_input("third_tab_lists_all", "Third tab lists all remaining torrents in legacy mode", parent.console_config["third_tab_lists_all"])
self.add_int_spin_input("torrents_per_tab_press", "Torrents per tab press", parent.console_config["torrents_per_tab_press"], 5, 100)
class ColumnsPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Columns To Display", True)
default_prefs = deluge.ui.console.modes.alltorrents.DEFAULT_PREFS
@ -282,29 +282,29 @@ class ColumnsPane(BasePane):
self.add_checked_input(pn,
deluge.ui.console.modes.alltorrents.prefs_to_names[cpn],
parent.console_config[pn])
self.add_header("Column Widths (-1 = expand)",True)
self.add_header("Column Widths (-1 = expand)", True)
for cpn in deluge.ui.console.modes.alltorrents.column_pref_names:
pn = "%s_width"%cpn
if pn not in default_prefs:
continue
self.add_int_spin_input(pn,
deluge.ui.console.modes.alltorrents.prefs_to_names[cpn],
parent.console_config[pn],-1,100)
parent.console_config[pn], -1, 100)
class DownloadsPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Folders")
self.add_text_input("download_location","Download To:",parent.core_config["download_location"])
cmptxt = TextInput(self.parent,self.move,self.width,None,"move_completed_path",parent.core_config["move_completed_path"],False)
self.add_checkedplus_input("move_completed","Move completed to:",cmptxt,parent.core_config["move_completed"])
copytxt = TextInput(self.parent,self.move,self.width,None,"torrentfiles_location",parent.core_config["torrentfiles_location"],False)
self.add_checkedplus_input("copy_torrent_file","Copy of .torrent files to:",copytxt,parent.core_config["copy_torrent_file"])
self.add_checked_input("del_copy_torrent_file","Delete copy of torrent file on remove",parent.core_config["del_copy_torrent_file"])
self.add_text_input("download_location", "Download To:", parent.core_config["download_location"])
cmptxt = TextInput(self.parent, self.move, self.width, None, "move_completed_path", parent.core_config["move_completed_path"], False)
self.add_checkedplus_input("move_completed", "Move completed to:", cmptxt, parent.core_config["move_completed"])
copytxt = TextInput(self.parent, self.move, self.width, None, "torrentfiles_location", parent.core_config["torrentfiles_location"], False)
self.add_checkedplus_input("copy_torrent_file", "Copy of .torrent files to:", copytxt, parent.core_config["copy_torrent_file"])
self.add_checked_input("del_copy_torrent_file", "Delete copy of torrent file on remove", parent.core_config["del_copy_torrent_file"])
self.add_header("Options",True)
self.add_header("Options", True)
self.add_checked_input("prioritize_first_last_pieces", "Prioritize first and last pieces of torrent",
parent.core_config["prioritize_first_last_pieces"])
self.add_checked_input("sequential_download", "",
@ -316,108 +316,108 @@ class DownloadsPane(BasePane):
class NetworkPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Incomming Ports")
inrand = CheckedInput(parent,"Use Random Ports Active Port: %d"%parent.active_port,"random_port",parent.core_config["random_port"])
inrand = CheckedInput(parent, "Use Random Ports Active Port: %d"%parent.active_port, "random_port", parent.core_config["random_port"])
self.inputs.append(inrand)
listen_ports = parent.core_config["listen_ports"]
self.infrom = IntSpinInput(self.parent," From:","listen_ports_from",self.move,listen_ports[0],0,65535)
self.infrom.set_depend(inrand,True)
self.into = IntSpinInput(self.parent," To: ","listen_ports_to",self.move,listen_ports[1],0,65535)
self.into.set_depend(inrand,True)
self.infrom = IntSpinInput(self.parent, " From:", "listen_ports_from", self.move, listen_ports[0], 0, 65535)
self.infrom.set_depend(inrand, True)
self.into = IntSpinInput(self.parent, " To: ", "listen_ports_to", self.move, listen_ports[1], 0, 65535)
self.into.set_depend(inrand, True)
self.inputs.append(self.infrom)
self.inputs.append(self.into)
self.add_header("Outgoing Ports",True)
outrand = CheckedInput(parent,"Use Random Ports","random_outgoing_ports",parent.core_config["random_outgoing_ports"])
self.add_header("Outgoing Ports", True)
outrand = CheckedInput(parent, "Use Random Ports", "random_outgoing_ports", parent.core_config["random_outgoing_ports"])
self.inputs.append(outrand)
out_ports = parent.core_config["outgoing_ports"]
self.outfrom = IntSpinInput(self.parent," From:","out_ports_from",self.move,out_ports[0],0,65535)
self.outfrom.set_depend(outrand,True)
self.outto = IntSpinInput(self.parent," To: ","out_ports_to",self.move,out_ports[1],0,65535)
self.outto.set_depend(outrand,True)
self.outfrom = IntSpinInput(self.parent, " From:", "out_ports_from", self.move, out_ports[0], 0, 65535)
self.outfrom.set_depend(outrand, True)
self.outto = IntSpinInput(self.parent, " To: ", "out_ports_to", self.move, out_ports[1], 0, 65535)
self.outto.set_depend(outrand, True)
self.inputs.append(self.outfrom)
self.inputs.append(self.outto)
self.add_header("Interface",True)
self.add_text_input("listen_interface","IP address of the interface to listen on (leave empty for default):",parent.core_config["listen_interface"])
self.add_header("Interface", True)
self.add_text_input("listen_interface", "IP address of the interface to listen on (leave empty for default):", parent.core_config["listen_interface"])
self.add_header("TOS",True)
self.add_text_input("peer_tos","Peer TOS Byte:",parent.core_config["peer_tos"])
self.add_header("TOS", True)
self.add_text_input("peer_tos", "Peer TOS Byte:", parent.core_config["peer_tos"])
self.add_header("Network Extras")
self.add_checked_input("upnp","UPnP",parent.core_config["upnp"])
self.add_checked_input("natpmp","NAT-PMP",parent.core_config["natpmp"])
self.add_checked_input("utpex","Peer Exchange",parent.core_config["utpex"])
self.add_checked_input("lt_tex","Tracker Exchange",parent.core_config["lt_tex"])
self.add_checked_input("lsd","LSD",parent.core_config["lsd"])
self.add_checked_input("dht","DHT",parent.core_config["dht"])
self.add_checked_input("upnp", "UPnP", parent.core_config["upnp"])
self.add_checked_input("natpmp", "NAT-PMP", parent.core_config["natpmp"])
self.add_checked_input("utpex", "Peer Exchange", parent.core_config["utpex"])
self.add_checked_input("lt_tex", "Tracker Exchange", parent.core_config["lt_tex"])
self.add_checked_input("lsd", "LSD", parent.core_config["lsd"])
self.add_checked_input("dht", "DHT", parent.core_config["dht"])
self.add_header("Encryption",True)
self.add_select_input("enc_in_policy","Inbound:",["Forced","Enabled","Disabled"],[0,1,2],parent.core_config["enc_in_policy"])
self.add_select_input("enc_out_policy","Outbound:",["Forced","Enabled","Disabled"],[0,1,2],parent.core_config["enc_out_policy"])
self.add_select_input("enc_level","Level:",["Handshake","Full Stream","Either"],[0,1,2],parent.core_config["enc_level"])
self.add_header("Encryption", True)
self.add_select_input("enc_in_policy", "Inbound:", ["Forced", "Enabled", "Disabled"], [0, 1, 2], parent.core_config["enc_in_policy"])
self.add_select_input("enc_out_policy", "Outbound:", ["Forced", "Enabled", "Disabled"], [0, 1, 2], parent.core_config["enc_out_policy"])
self.add_select_input("enc_level", "Level:", ["Handshake", "Full Stream", "Either"], [0, 1, 2], parent.core_config["enc_level"])
class BandwidthPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Global Bandwidth Usage")
self.add_int_spin_input("max_connections_global","Maximum Connections:",parent.core_config["max_connections_global"],-1,9000)
self.add_int_spin_input("max_upload_slots_global","Maximum Upload Slots:",parent.core_config["max_upload_slots_global"],-1,9000)
self.add_float_spin_input("max_download_speed","Maximum Download Speed (KiB/s):",parent.core_config["max_download_speed"],1.0,1,-1.0,60000.0)
self.add_float_spin_input("max_upload_speed","Maximum Upload Speed (KiB/s):",parent.core_config["max_upload_speed"],1.0,1,-1.0,60000.0)
self.add_int_spin_input("max_half_open_connections","Maximum Half-Open Connections:",parent.core_config["max_half_open_connections"],-1,9999)
self.add_int_spin_input("max_connections_per_second","Maximum Connection Attempts per Second:",parent.core_config["max_connections_per_second"],-1,9999)
self.add_checked_input("ignore_limits_on_local_network","Ignore limits on local network",parent.core_config["ignore_limits_on_local_network"])
self.add_checked_input("rate_limit_ip_overhead","Rate Limit IP Overhead",parent.core_config["rate_limit_ip_overhead"])
self.add_header("Per Torrent Bandwidth Usage",True)
self.add_int_spin_input("max_connections_per_torrent","Maximum Connections:",parent.core_config["max_connections_per_torrent"],-1,9000)
self.add_int_spin_input("max_upload_slots_per_torrent","Maximum Upload Slots:",parent.core_config["max_upload_slots_per_torrent"],-1,9000)
self.add_float_spin_input("max_download_speed_per_torrent","Maximum Download Speed (KiB/s):",parent.core_config["max_download_speed_per_torrent"],1.0,1,-1.0,60000.0)
self.add_float_spin_input("max_upload_speed_per_torrent","Maximum Upload Speed (KiB/s):",parent.core_config["max_upload_speed_per_torrent"],1.0,1,-1.0,60000.0)
self.add_int_spin_input("max_connections_global", "Maximum Connections:", parent.core_config["max_connections_global"], -1, 9000)
self.add_int_spin_input("max_upload_slots_global", "Maximum Upload Slots:", parent.core_config["max_upload_slots_global"], -1, 9000)
self.add_float_spin_input("max_download_speed", "Maximum Download Speed (KiB/s):", parent.core_config["max_download_speed"], 1.0, 1, -1.0, 60000.0)
self.add_float_spin_input("max_upload_speed", "Maximum Upload Speed (KiB/s):", parent.core_config["max_upload_speed"], 1.0, 1, -1.0, 60000.0)
self.add_int_spin_input("max_half_open_connections", "Maximum Half-Open Connections:", parent.core_config["max_half_open_connections"], -1, 9999)
self.add_int_spin_input("max_connections_per_second", "Maximum Connection Attempts per Second:", parent.core_config["max_connections_per_second"], -1, 9999)
self.add_checked_input("ignore_limits_on_local_network", "Ignore limits on local network", parent.core_config["ignore_limits_on_local_network"])
self.add_checked_input("rate_limit_ip_overhead", "Rate Limit IP Overhead", parent.core_config["rate_limit_ip_overhead"])
self.add_header("Per Torrent Bandwidth Usage", True)
self.add_int_spin_input("max_connections_per_torrent", "Maximum Connections:", parent.core_config["max_connections_per_torrent"], -1, 9000)
self.add_int_spin_input("max_upload_slots_per_torrent", "Maximum Upload Slots:", parent.core_config["max_upload_slots_per_torrent"], -1, 9000)
self.add_float_spin_input("max_download_speed_per_torrent", "Maximum Download Speed (KiB/s):", parent.core_config["max_download_speed_per_torrent"], 1.0, 1, -1.0, 60000.0)
self.add_float_spin_input("max_upload_speed_per_torrent", "Maximum Upload Speed (KiB/s):", parent.core_config["max_upload_speed_per_torrent"], 1.0, 1, -1.0, 60000.0)
class OtherPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("System Information")
self.add_info_field(" Help us improve Deluge by sending us your","","")
self.add_info_field(" Python version, PyGTK version, OS and processor","","")
self.add_info_field(" types. Absolutely no other information is sent.","","")
self.add_checked_input("send_info","Yes, please send anonymous statistics.",parent.core_config["send_info"])
self.add_header("GeoIP Database",True)
self.add_text_input("geoip_db_location","Location:",parent.core_config["geoip_db_location"])
self.add_info_field(" Help us improve Deluge by sending us your", "", "")
self.add_info_field(" Python version, PyGTK version, OS and processor", "", "")
self.add_info_field(" types. Absolutely no other information is sent.", "", "")
self.add_checked_input("send_info", "Yes, please send anonymous statistics.", parent.core_config["send_info"])
self.add_header("GeoIP Database", True)
self.add_text_input("geoip_db_location", "Location:", parent.core_config["geoip_db_location"])
class DaemonPane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Port")
self.add_int_spin_input("daemon_port","Daemon Port:",parent.core_config["daemon_port"],0,65535)
self.add_header("Connections",True)
self.add_checked_input("allow_remote","Allow remote connections",parent.core_config["allow_remote"])
self.add_header("Other",True)
self.add_checked_input("new_release_check","Periodically check the website for new releases",parent.core_config["new_release_check"])
self.add_int_spin_input("daemon_port", "Daemon Port:", parent.core_config["daemon_port"], 0, 65535)
self.add_header("Connections", True)
self.add_checked_input("allow_remote", "Allow remote connections", parent.core_config["allow_remote"])
self.add_header("Other", True)
self.add_checked_input("new_release_check", "Periodically check the website for new releases", parent.core_config["new_release_check"])
class QueuePane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("General")
self.add_checked_input("queue_new_to_top","Queue new torrents to top",parent.core_config["queue_new_to_top"])
self.add_header("Active Torrents",True)
self.add_int_spin_input("max_active_limit","Total active:",parent.core_config["max_active_limit"],-1,9999)
self.add_int_spin_input("max_active_downloading","Total active downloading:",parent.core_config["max_active_downloading"],-1,9999)
self.add_int_spin_input("max_active_seeding","Total active seeding:",parent.core_config["max_active_seeding"],-1,9999)
self.add_checked_input("dont_count_slow_torrents","Do not count slow torrents",parent.core_config["dont_count_slow_torrents"])
self.add_checked_input("auto_manage_prefer_seeds","Prefer Seeding over Downloading",parent.core_config["auto_manage_prefer_seeds"])
self.add_header("Seeding",True)
self.add_float_spin_input("share_ratio_limit","Share Ratio Limit:",parent.core_config["share_ratio_limit"],1.0,2,-1.0,100.0)
self.add_float_spin_input("seed_time_ratio_limit","Share Time Ratio:",parent.core_config["seed_time_ratio_limit"],1.0,2,-1.0,100.0)
self.add_int_spin_input("seed_time_limit","Seed time (m):",parent.core_config["seed_time_limit"],-1,10000)
seedratio = FloatSpinInput(self.parent,"","stop_seed_ratio",self.move,parent.core_config["stop_seed_ratio"],0.1,2,0.5,100.0)
self.add_checkedplus_input("stop_seed_at_ratio","Stop seeding when share ratio reaches:",seedratio,parent.core_config["stop_seed_at_ratio"])
self.add_checked_input("remove_seed_at_ratio","Remove torrent when share ratio reached",parent.core_config["remove_seed_at_ratio"])
self.add_checked_input("queue_new_to_top", "Queue new torrents to top", parent.core_config["queue_new_to_top"])
self.add_header("Active Torrents", True)
self.add_int_spin_input("max_active_limit", "Total active:", parent.core_config["max_active_limit"], -1, 9999)
self.add_int_spin_input("max_active_downloading", "Total active downloading:", parent.core_config["max_active_downloading"], -1, 9999)
self.add_int_spin_input("max_active_seeding", "Total active seeding:", parent.core_config["max_active_seeding"], -1, 9999)
self.add_checked_input("dont_count_slow_torrents", "Do not count slow torrents", parent.core_config["dont_count_slow_torrents"])
self.add_checked_input("auto_manage_prefer_seeds", "Prefer Seeding over Downloading", parent.core_config["auto_manage_prefer_seeds"])
self.add_header("Seeding", True)
self.add_float_spin_input("share_ratio_limit", "Share Ratio Limit:", parent.core_config["share_ratio_limit"], 1.0, 2, -1.0, 100.0)
self.add_float_spin_input("seed_time_ratio_limit", "Share Time Ratio:", parent.core_config["seed_time_ratio_limit"], 1.0, 2, -1.0, 100.0)
self.add_int_spin_input("seed_time_limit", "Seed time (m):", parent.core_config["seed_time_limit"], -1, 10000)
seedratio = FloatSpinInput(self.parent, "", "stop_seed_ratio", self.move, parent.core_config["stop_seed_ratio"], 0.1, 2, 0.5, 100.0)
self.add_checkedplus_input("stop_seed_at_ratio", "Stop seeding when share ratio reaches:", seedratio, parent.core_config["stop_seed_at_ratio"])
self.add_checked_input("remove_seed_at_ratio", "Remove torrent when share ratio reached", parent.core_config["remove_seed_at_ratio"])
class ProxyPane(BasePane):
def __init__(self, offset, parent, width):
@ -425,7 +425,7 @@ class ProxyPane(BasePane):
self.add_header("Proxy Settings")
self.add_header("Proxy", True)
proxy = parent.core_config["proxy"]
self.add_int_spin_input("proxy_type","Type:", proxy["type"],0,5)
self.add_int_spin_input("proxy_type", "Type:", proxy["type"], 0, 5)
self.add_info_field(" 0: None 1: Socks4 2: Socks5", "", "")
self.add_info_field(" 3: Socks5 Auth 4: HTTP 5: HTTP Auth", "", "")
self.add_text_input("proxy_username", "Username:", proxy["username"])
@ -435,7 +435,7 @@ class ProxyPane(BasePane):
self.add_checked_input("proxy_hostnames", "Proxy hostnames", proxy["proxy_hostnames"])
self.add_checked_input("proxy_peer_connections", "Proxy peer connections", proxy["proxy_peer_connections"])
self.add_header("I2P Proxy",True)
self.add_header("I2P Proxy", True)
i2p_proxy = parent.core_config["i2p_proxy"]
self.add_text_input("i2p_hostname", "Hostname:", i2p_proxy["hostname"])
self.add_int_spin_input("i2p_port", "Port:", i2p_proxy["port"], 0, 65535)
@ -444,27 +444,27 @@ class ProxyPane(BasePane):
class CachePane(BasePane):
def __init__(self, offset, parent, width):
BasePane.__init__(self,offset,parent,width)
BasePane.__init__(self, offset, parent, width)
self.add_header("Settings")
self.add_int_spin_input("cache_size","Cache Size (16 KiB blocks):",parent.core_config["cache_size"],0,99999)
self.add_int_spin_input("cache_expiry","Cache Expiry (seconds):",parent.core_config["cache_expiry"],1,32000)
self.add_header("Status (press 'r' to refresh status)",True)
self.add_int_spin_input("cache_size", "Cache Size (16 KiB blocks):", parent.core_config["cache_size"], 0, 99999)
self.add_int_spin_input("cache_expiry", "Cache Expiry (seconds):", parent.core_config["cache_expiry"], 1, 32000)
self.add_header("Status (press 'r' to refresh status)", True)
self.add_header(" Write")
self.add_info_field(" Blocks Written:",self.parent.status["blocks_written"],"blocks_written")
self.add_info_field(" Writes:",self.parent.status["writes"],"writes")
self.add_info_field(" Write Cache Hit Ratio:","%.2f"%self.parent.status["write_hit_ratio"],"write_hit_ratio")
self.add_info_field(" Blocks Written:", self.parent.status["blocks_written"], "blocks_written")
self.add_info_field(" Writes:", self.parent.status["writes"], "writes")
self.add_info_field(" Write Cache Hit Ratio:", "%.2f"%self.parent.status["write_hit_ratio"], "write_hit_ratio")
self.add_header(" Read")
self.add_info_field(" Blocks Read:",self.parent.status["blocks_read"],"blocks_read")
self.add_info_field(" Blocks Read hit:",self.parent.status["blocks_read_hit"],"blocks_read_hit")
self.add_info_field(" Reads:",self.parent.status["reads"],"reads")
self.add_info_field(" Read Cache Hit Ratio:","%.2f"%self.parent.status["read_hit_ratio"],"read_hit_ratio")
self.add_info_field(" Blocks Read:", self.parent.status["blocks_read"], "blocks_read")
self.add_info_field(" Blocks Read hit:", self.parent.status["blocks_read_hit"], "blocks_read_hit")
self.add_info_field(" Reads:", self.parent.status["reads"], "reads")
self.add_info_field(" Read Cache Hit Ratio:", "%.2f"%self.parent.status["read_hit_ratio"], "read_hit_ratio")
self.add_header(" Size")
self.add_info_field(" Cache Size:",self.parent.status["cache_size"],"cache_size")
self.add_info_field(" Read Cache Size:",self.parent.status["read_cache_size"],"read_cache_size")
self.add_info_field(" Cache Size:", self.parent.status["cache_size"], "cache_size")
self.add_info_field(" Read Cache Size:", self.parent.status["read_cache_size"], "read_cache_size")
def update_cache_status(self, status):
for ipt in self.inputs:
if isinstance(ipt,InfoField):
if isinstance(ipt, InfoField):
try:
ipt.set_value(status[ipt.name])
except KeyError:

View file

@ -130,7 +130,7 @@ class Preferences(BaseMode):
# create the panes
self.__calc_sizes()
self.action_input = SelectInput(self,None,None,["Cancel","Apply","OK"],[0,1,2],0)
self.action_input = SelectInput(self, None, None, ["Cancel", "Apply", "OK"], [0, 1, 2], 0)
self.refresh()
def __calc_sizes(self):
@ -151,22 +151,22 @@ class Preferences(BaseMode):
]
def __draw_catetories(self):
for i,category in enumerate(self.categories):
for i, category in enumerate(self.categories):
if i == self.cur_cat and self.active_zone == ZONE.CATEGORIES:
self.add_string(i+1,"- {!black,white,bold!}%s"%category,pad=False)
self.add_string(i+1, "- {!black,white,bold!}%s"%category, pad=False)
elif i == self.cur_cat:
self.add_string(i+1,"- {!black,white!}%s"%category,pad=False)
self.add_string(i+1, "- {!black,white!}%s"%category, pad=False)
else:
self.add_string(i+1,"- %s"%category)
self.stdscr.vline(1,self.div_off,'|',self.rows-2)
self.add_string(i+1, "- %s"%category)
self.stdscr.vline(1, self.div_off, '|', self.rows-2)
def __draw_preferences(self):
self.panes[self.cur_cat].render(self,self.stdscr, self.prefs_width, self.active_zone == ZONE.PREFRENCES)
self.panes[self.cur_cat].render(self, self.stdscr, self.prefs_width, self.active_zone == ZONE.PREFRENCES)
def __draw_actions(self):
selected = self.active_zone == ZONE.ACTIONS
self.stdscr.hline(self.rows-3,self.div_off+1,"_",self.cols)
self.action_input.render(self.stdscr,self.rows-2,self.cols,selected,self.cols-22)
self.stdscr.hline(self.rows-3, self.div_off+1, "_", self.cols)
self.action_input.render(self.stdscr, self.rows-2, self.cols, selected, self.cols-22)
def on_resize(self, *args):
BaseMode.on_resize_norefresh(self, *args)
@ -180,13 +180,13 @@ class Preferences(BaseMode):
def refresh(self):
if self.popup == None and self.messages:
title,msg = self.messages.popleft()
self.popup = MessagePopup(self,title,msg)
title, msg = self.messages.popleft()
self.popup = MessagePopup(self, title, msg)
self.stdscr.erase()
self.add_string(0,self.statusbars.topbar)
self.add_string(0, self.statusbars.topbar)
hstr = "%sPress [h] for help"%(" "*(self.cols - len(self.statusbars.bottombar) - 10))
self.add_string(self.rows - 1, "%s%s"%(self.statusbars.bottombar,hstr))
self.add_string(self.rows - 1, "%s%s"%(self.statusbars.bottombar, hstr))
self.__draw_catetories()
self.__draw_actions()
@ -207,9 +207,9 @@ class Preferences(BaseMode):
def __category_read(self, c):
# Navigate prefs
if c == curses.KEY_UP:
self.cur_cat = max(0,self.cur_cat-1)
self.cur_cat = max(0, self.cur_cat-1)
elif c == curses.KEY_DOWN:
self.cur_cat = min(len(self.categories)-1,self.cur_cat+1)
self.cur_cat = min(len(self.categories)-1, self.cur_cat+1)
def __prefs_read(self, c):
self.panes[self.cur_cat].handle_read(c)
@ -217,7 +217,7 @@ class Preferences(BaseMode):
def __apply_prefs(self):
new_core_config = {}
for pane in self.panes:
if not isinstance(pane,InterfacePane) and not isinstance(pane, ColumnsPane):
if not isinstance(pane, InterfacePane) and not isinstance(pane, ColumnsPane):
pane.add_config_values(new_core_config)
# Apply Core Prefs
if client.connected():
@ -241,7 +241,7 @@ class Preferences(BaseMode):
for pane in self.panes:
# could just access panes by index, but that would break if panes
# are ever reordered, so do it the slightly slower but safer way
if isinstance(pane,InterfacePane) or isinstance(pane, ColumnsPane):
if isinstance(pane, InterfacePane) or isinstance(pane, ColumnsPane):
pane.add_config_values(new_console_config)
for key in new_console_config.keys():
# The values do not match so this needs to be updated
@ -254,7 +254,7 @@ class Preferences(BaseMode):
self.parent_mode.update_config()
def __update_preferences(self,core_config):
def __update_preferences(self, core_config):
self.core_config = core_config
for pane in self.panes:
pane.update_values(core_config)
@ -298,7 +298,7 @@ class Preferences(BaseMode):
reactor.stop()
return
elif chr(c) == 'h':
self.popup = Popup(self,"Preferences Help")
self.popup = Popup(self, "Preferences Help")
for l in HELP_LINES:
self.popup.add_line(l)
@ -313,7 +313,7 @@ class Preferences(BaseMode):
if self.active_zone < ZONE.CATEGORIES:
self.active_zone = ZONE.ACTIONS
elif c == 114 and isinstance(self.panes[self.cur_cat],CachePane):
elif c == 114 and isinstance(self.panes[self.cur_cat], CachePane):
client.core.get_cache_status().addCallback(self.panes[self.cur_cat].update_cache_status)
else:

View file

@ -91,21 +91,21 @@ class ACTION:
QUEUE_BOTTOM=14
TORRENT_OPTIONS=15
def action_error(error,mode):
def action_error(error, mode):
rerr = error.value
mode.report_message("An Error Occurred","%s got error %s: %s"%(rerr.method,rerr.exception_type,rerr.exception_msg))
mode.report_message("An Error Occurred", "%s got error %s: %s"%(rerr.method, rerr.exception_type, rerr.exception_msg))
mode.refresh()
def torrent_action(idx, data, mode, ids):
if ids:
if data==ACTION.PAUSE:
log.debug("Pausing torrents: %s",ids)
client.core.pause_torrent(ids).addErrback(action_error,mode)
log.debug("Pausing torrents: %s", ids)
client.core.pause_torrent(ids).addErrback(action_error, mode)
elif data==ACTION.RESUME:
log.debug("Resuming torrents: %s", ids)
client.core.resume_torrent(ids).addErrback(action_error,mode)
client.core.resume_torrent(ids).addErrback(action_error, mode)
elif data==ACTION.QUEUE:
def do_queue(idx,qact,mode,ids):
def do_queue(idx, qact, mode, ids):
def move_selection(r):
if mode.config["move_selection"]:
queue_length = 0
@ -153,11 +153,11 @@ def torrent_action(idx, data, mode, ids):
if len(ids) == 1:
mode.clear_marks()
return True
popup = SelectablePopup(mode,"Queue Action", do_queue, (mode, ids))
popup.add_line("_Top",data=ACTION.QUEUE_TOP)
popup.add_line("_Up",data=ACTION.QUEUE_UP)
popup.add_line("_Down",data=ACTION.QUEUE_DOWN)
popup.add_line("_Bottom",data=ACTION.QUEUE_BOTTOM)
popup = SelectablePopup(mode, "Queue Action", do_queue, (mode, ids))
popup.add_line("_Top", data=ACTION.QUEUE_TOP)
popup.add_line("_Up", data=ACTION.QUEUE_UP)
popup.add_line("_Down", data=ACTION.QUEUE_DOWN)
popup.add_line("_Bottom", data=ACTION.QUEUE_BOTTOM)
mode.set_popup(popup)
return False
elif data==ACTION.REMOVE:
@ -168,7 +168,7 @@ def torrent_action(idx, data, mode, ids):
wd = data["remove_files"]
for tid in ids:
log.debug("Removing torrent: %s, %d", tid, wd)
client.core.remove_torrent(tid,wd).addErrback(action_error,mode)
client.core.remove_torrent(tid, wd).addErrback(action_error, mode)
rem_msg = ""
@ -209,23 +209,23 @@ def torrent_action(idx, data, mode, ids):
def do_move(res):
import os.path
if os.path.exists(res["path"]) and not os.path.isdir(res["path"]):
mode.report_message("Cannot Move Download Folder","{!error!}%s exists and is not a directory"%res["path"])
mode.report_message("Cannot Move Download Folder", "{!error!}%s exists and is not a directory"%res["path"])
else:
log.debug("Moving %s to: %s",ids,res["path"])
client.core.move_storage(ids,res["path"]).addErrback(action_error,mode)
log.debug("Moving %s to: %s", ids, res["path"])
client.core.move_storage(ids, res["path"]).addErrback(action_error, mode)
if len(ids) == 1:
mode.clear_marks()
return True
popup = InputPopup(mode,"Move Download Folder (Esc to cancel)",close_cb=do_move)
popup.add_text_input("Enter path to move to:","path")
popup = InputPopup(mode, "Move Download Folder (Esc to cancel)", close_cb=do_move)
popup.add_text_input("Enter path to move to:", "path")
mode.set_popup(popup)
return False
elif data==ACTION.RECHECK:
log.debug("Rechecking torrents: %s", ids)
client.core.force_recheck(ids).addErrback(action_error,mode)
client.core.force_recheck(ids).addErrback(action_error, mode)
elif data==ACTION.REANNOUNCE:
log.debug("Reannouncing torrents: %s",ids)
client.core.force_reannounce(ids).addErrback(action_error,mode)
log.debug("Reannouncing torrents: %s", ids)
client.core.force_reannounce(ids).addErrback(action_error, mode)
elif data==ACTION.DETAILS:
log.debug("Torrent details")
tid = mode.current_torrent_id()
@ -268,7 +268,7 @@ def torrent_action(idx, data, mode, ids):
def create_popup(status):
cb = lambda result, ids=ids: _do_set_torrent_options(ids, result)
option_popup = InputPopup(mode,"Set torrent options (Esc to cancel)",close_cb=cb, height_req=22)
option_popup = InputPopup(mode, "Set torrent options (Esc to cancel)", close_cb=cb, height_req=22)
for (field, field_type) in torrent_options:
caption = "{!info!}" + torrent_options_to_names[field]
@ -319,20 +319,20 @@ def torrent_actions_popup(mode,tids,details=False, action = None):
if action != None:
torrent_action(-1, action, mode, tids)
return
popup = SelectablePopup(mode,"Torrent Actions",torrent_action, (mode, tids))
popup.add_line("_Pause",data=ACTION.PAUSE)
popup.add_line("_Resume",data=ACTION.RESUME)
popup = SelectablePopup(mode, "Torrent Actions", torrent_action, (mode, tids))
popup.add_line("_Pause", data=ACTION.PAUSE)
popup.add_line("_Resume", data=ACTION.RESUME)
if details:
popup.add_divider()
popup.add_line("Queue",data=ACTION.QUEUE)
popup.add_line("Queue", data=ACTION.QUEUE)
popup.add_divider()
popup.add_line("_Update Tracker",data=ACTION.REANNOUNCE)
popup.add_line("_Update Tracker", data=ACTION.REANNOUNCE)
popup.add_divider()
popup.add_line("Remo_ve Torrent",data=ACTION.REMOVE)
popup.add_line("_Force Recheck",data=ACTION.RECHECK)
popup.add_line("_Move Download Folder",data=ACTION.MOVE_STORAGE)
popup.add_line("Remo_ve Torrent", data=ACTION.REMOVE)
popup.add_line("_Force Recheck", data=ACTION.RECHECK)
popup.add_line("_Move Download Folder", data=ACTION.MOVE_STORAGE)
popup.add_divider()
if details:
popup.add_line("Torrent _Details",data=ACTION.DETAILS)
popup.add_line("Torrent _Options",data=ACTION.TORRENT_OPTIONS)
popup.add_line("Torrent _Details", data=ACTION.DETAILS)
popup.add_line("Torrent _Options", data=ACTION.TORRENT_OPTIONS)
mode.set_popup(popup)

View file

@ -45,7 +45,7 @@ from collections import deque
from deluge.ui.sessionproxy import SessionProxy
from popup import Popup,SelectablePopup,MessagePopup
from popup import Popup, SelectablePopup, MessagePopup
from add_util import add_torrent
from input_popup import InputPopup
import deluge.ui.console.colors as colors
@ -158,12 +158,12 @@ class TorrentDetail(BaseMode, component.Component):
# don't keep getting the files once we've got them once
if state.get("files"):
self.files_sep = "{!green,black,bold,underline!}%s"%(("Files (torrent has %d files)"%len(state["files"])).center(self.cols))
self.file_list,self.file_dict = self.build_file_list(state["files"],state["file_progress"],state["file_priorities"])
self.file_list, self.file_dict = self.build_file_list(state["files"], state["file_progress"], state["file_priorities"])
self._status_keys.remove("files")
else:
self.files_sep = "{!green,black,bold,underline!}%s"%(("Files (File list unknown)").center(self.cols))
need_prio_update = True
self.__fill_progress(self.file_list,state["file_progress"])
self.__fill_progress(self.file_list, state["file_progress"])
for i, prio in enumerate(state["file_priorities"]):
if self.file_dict[i][6] != prio:
need_prio_update = True
@ -185,7 +185,7 @@ class TorrentDetail(BaseMode, component.Component):
#
# Also returns a dictionary that maps index values to the file leaves
# for fast updating of progress and priorities
def build_file_list(self, file_tuples,prog,prio):
def build_file_list(self, file_tuples, prog, prio):
ret = []
retdict = {}
diridx = maxint
@ -197,12 +197,12 @@ class TorrentDetail(BaseMode, component.Component):
if not cur or p != cur[-1][0]:
cl = []
if p == fin:
ent = [p,f["index"],f["size"],cl,False,
ent = [p, f["index"], f["size"], cl, False,
format_utils.format_progress(prog[f["index"]]*100),
prio[f["index"]]]
retdict[f["index"]] = ent
else:
ent = [p,diridx,-1,cl,False,0,-1]
ent = [p, diridx, -1, cl, False, 0, -1]
retdict[diridx] = ent
diridx-=1
cur.append(ent)
@ -210,8 +210,8 @@ class TorrentDetail(BaseMode, component.Component):
else:
cur = cur[-1][3]
self.__build_sizes(ret)
self.__fill_progress(ret,prog)
return (ret,retdict)
self.__fill_progress(ret, prog)
return (ret, retdict)
# fill in the sizes of the directory entries based on their children
def __build_sizes(self, fs):
@ -227,12 +227,12 @@ class TorrentDetail(BaseMode, component.Component):
# fills in progress fields in all entries based on progs
# returns the # of bytes complete in all the children of fs
def __fill_progress(self,fs,progs):
def __fill_progress(self, fs, progs):
if not progs: return 0
tb = 0
for f in fs:
if f[3]: # dir, has some children
bd = self.__fill_progress(f[3],progs)
bd = self.__fill_progress(f[3], progs)
f[5] = format_utils.format_progress((bd/f[2])*100)
else: # file, update own prog and add to total
bd = f[2]*progs[f[1]]
@ -240,7 +240,7 @@ class TorrentDetail(BaseMode, component.Component):
tb += bd
return tb
def __fill_prio(self,fs):
def __fill_prio(self, fs):
for f in fs:
if f[3]: # dir, so fill in children and compute our prio
self.__fill_prio(f[3])
@ -251,30 +251,30 @@ class TorrentDetail(BaseMode, component.Component):
f[6] = s.pop()
def __update_columns(self):
self.column_widths = [-1,15,15,20]
req = sum(filter(lambda x:x >= 0,self.column_widths))
self.column_widths = [-1, 15, 15, 20]
req = sum(filter(lambda x:x >= 0, self.column_widths))
if (req > self.cols): # can't satisfy requests, just spread out evenly
cw = int(self.cols/len(self.column_names))
for i in range(0,len(self.column_widths)):
for i in range(0, len(self.column_widths)):
self.column_widths[i] = cw
else:
rem = self.cols - req
var_cols = len(filter(lambda x: x < 0,self.column_widths))
var_cols = len(filter(lambda x: x < 0, self.column_widths))
vw = int(rem/var_cols)
for i in range(0, len(self.column_widths)):
if (self.column_widths[i] < 0):
self.column_widths[i] = vw
self.column_string = "{!green,black,bold!}%s"%("".join(["%s%s"%(self.column_names[i]," "*(self.column_widths[i]-len(self.column_names[i]))) for i in range(0,len(self.column_names))]))
self.column_string = "{!green,black,bold!}%s"%("".join(["%s%s"%(self.column_names[i], " "*(self.column_widths[i]-len(self.column_names[i]))) for i in range(0, len(self.column_names))]))
def report_message(self,title,message):
self.messages.append((title,message))
def report_message(self, title, message):
self.messages.append((title, message))
def clear_marks(self):
self.marked = {}
def set_popup(self,pu):
def set_popup(self, pu):
self.popup = pu
self.refresh()
@ -304,7 +304,7 @@ class TorrentDetail(BaseMode, component.Component):
#self.__get_file_by_name(old_folder, self.file_list)[0] = new_folder.strip("/")
component.get("SessionProxy").get_torrent_status(self.torrentid, self._status_keys).addCallback(self.set_state)
def draw_files(self,files,depth,off,idx):
def draw_files(self, files, depth, off, idx):
color_selected = "blue"
color_partially_selected = "magenta"
@ -315,7 +315,7 @@ class TorrentDetail(BaseMode, component.Component):
# kick out if we're going to draw too low on the screen
if (off >= self.rows-1):
self.more_to_draw = True
return -1,-1
return -1, -1
self.file_limit = idx
@ -374,22 +374,22 @@ class TorrentDetail(BaseMode, component.Component):
else: # file
xchar = '-'
r = format_utils.format_row(["%s%s %s"%(" "*depth,xchar,fl[0]),
deluge.common.fsize(fl[2]),fl[5],
r = format_utils.format_row(["%s%s %s"%(" "*depth, xchar, fl[0]),
deluge.common.fsize(fl[2]), fl[5],
format_utils.format_priority(fl[6])],
self.column_widths)
self.add_string(off,"%s%s"%(color_string,r),trim=False)
self.add_string(off, "%s%s"%(color_string, r), trim=False)
off += 1
if fl[3] and fl[4]:
# recurse if we have children and are expanded
off,idx = self.draw_files(fl[3],depth+1,off,idx+1)
if off < 0: return (off,idx)
off, idx = self.draw_files(fl[3], depth+1, off, idx+1)
if off < 0: return (off, idx)
else:
idx += 1
return (off,idx)
return (off, idx)
def __get_file_list_length(self, file_list=None):
"""
@ -518,12 +518,12 @@ class TorrentDetail(BaseMode, component.Component):
def refresh(self,lines=None):
# show a message popup if there's anything queued
if self.popup == None and self.messages:
title,msg = self.messages.popleft()
self.popup = MessagePopup(self,title,msg)
title, msg = self.messages.popleft()
self.popup = MessagePopup(self, title, msg)
# Update the status bars
self.stdscr.erase()
self.add_string(0,self.statusbars.topbar)
self.add_string(0, self.statusbars.topbar)
#This will quite likely fail when switching modes
try:
@ -552,11 +552,11 @@ class TorrentDetail(BaseMode, component.Component):
self._listing_start = off
self._listing_space = self.rows - self._listing_start
self.add_string(off,self.column_string)
self.add_string(off, self.column_string)
if self.file_list:
off += 1
self.more_to_draw = False
self.draw_files(self.file_list,0,off,0)
self.draw_files(self.file_list, 0, off, 0)
if component.get("ConsoleUI").screen != self:
return
@ -589,8 +589,8 @@ class TorrentDetail(BaseMode, component.Component):
self.refresh()
def file_list_up(self, rows=1):
self.current_file_idx = max(0,self.current_file_idx-rows)
self.file_off = min(self.file_off,self.current_file_idx)
self.current_file_idx = max(0, self.current_file_idx-rows)
self.file_off = min(self.file_off, self.current_file_idx)
self.refresh()
def back_to_overview(self):
@ -608,18 +608,18 @@ class TorrentDetail(BaseMode, component.Component):
for f in files:
#Do not set priorities for the whole dir, just selected contents
if f[3]:
self.build_prio_list(f[3],ret_list,parent_prio,selected_prio)
self.build_prio_list(f[3], ret_list, parent_prio, selected_prio)
else: # file, need to add to list
if f[1] in self.marked or parent_prio >= 0:
# selected (or parent selected), use requested priority
ret_list.append((f[1],selected_prio))
ret_list.append((f[1], selected_prio))
else:
# not selected, just keep old priority
ret_list.append((f[1],f[6]))
ret_list.append((f[1], f[6]))
def do_priority(self, idx, data, was_empty):
plist = []
self.build_prio_list(self.file_list,plist,-1,data)
self.build_prio_list(self.file_list, plist, -1, data)
plist.sort()
priorities = [p[1] for p in plist]
log.debug("priorities: %s", priorities)
@ -634,14 +634,14 @@ class TorrentDetail(BaseMode, component.Component):
def show_priority_popup(self, was_empty):
func = lambda idx, data, we=was_empty: self.do_priority(idx, data, we)
if self.marked:
self.popup = SelectablePopup(self,"Set File Priority", func)
self.popup.add_line("_Do Not Download",data=deluge.common.FILE_PRIORITY["Do Not Download"], foreground="red")
self.popup.add_line("_Normal Priority",data=deluge.common.FILE_PRIORITY["Normal Priority"])
self.popup.add_line("_High Priority",data=deluge.common.FILE_PRIORITY["High Priority"], foreground="yellow")
self.popup.add_line("H_ighest Priority",data=deluge.common.FILE_PRIORITY["Highest Priority"], foreground="green")
self.popup = SelectablePopup(self, "Set File Priority", func)
self.popup.add_line("_Do Not Download", data=deluge.common.FILE_PRIORITY["Do Not Download"], foreground="red")
self.popup.add_line("_Normal Priority", data=deluge.common.FILE_PRIORITY["Normal Priority"])
self.popup.add_line("_High Priority", data=deluge.common.FILE_PRIORITY["High Priority"], foreground="yellow")
self.popup.add_line("H_ighest Priority", data=deluge.common.FILE_PRIORITY["Highest Priority"], foreground="green")
self.popup._selected = 1
def __mark_unmark(self,idx):
def __mark_unmark(self, idx):
"""
Selects or unselects file or a catalog(along with contained files)
"""
@ -838,7 +838,7 @@ class TorrentDetail(BaseMode, component.Component):
new_fname = "%s/%s/" % (old_fname.strip("/").rpartition("/")[0], result["new_foldername"])
self._do_rename_folder(tid, old_fname, new_fname)
popup = InputPopup(self,"Rename folder (Esc to cancel)",close_cb=do_rename)
popup = InputPopup(self, "Rename folder (Esc to cancel)", close_cb=do_rename)
popup.add_text("{!info!}Renaming folder:{!input!}")
popup.add_text(" * %s\n" % old_filename)
popup.add_text_input("Enter new folder name:", "new_foldername", old_filename.strip("/"))
@ -850,7 +850,7 @@ class TorrentDetail(BaseMode, component.Component):
fname = "%s/%s" % (self.full_names[idx].rpartition("/")[0], result["new_filename"])
self._do_rename_file(tid, idx, fname)
popup = InputPopup(self,"Rename file (Esc to cancel)",close_cb=do_rename)
popup = InputPopup(self, "Rename file (Esc to cancel)", close_cb=do_rename)
popup.add_text("{!info!}Renaming file:{!input!}")
popup.add_text(" * %s\n" % old_filename)
popup.add_text_input("Enter new filename:", "new_filename", old_filename)
@ -924,10 +924,10 @@ class TorrentDetail(BaseMode, component.Component):
elif chr(c) == 'c':
self.marked = {}
elif chr(c) == 'a':
torrent_actions_popup(self,[self.torrentid],details=False)
torrent_actions_popup(self, [self.torrentid], details=False)
return
elif chr(c) == 'o':
torrent_actions_popup(self,[self.torrentid],action=ACTION.TORRENT_OPTIONS)
torrent_actions_popup(self, [self.torrentid], action=ACTION.TORRENT_OPTIONS)
return
elif chr(c) == 'h':
self.popup = MessagePopup(self, "Help", HELP_STR, width_req=0.75)

View file

@ -145,7 +145,7 @@ class CreateTorrentDialog:
"""Adjusts the recommended piece based on the file/folder/path selected."""
size = self.files_treestore[0][2]
model = self.builder.get_object("combo_piece_size").get_model()
for index,value in enumerate(model):
for index, value in enumerate(model):
psize = self.parse_piece_size_text(value[0])
pieces = size / psize
if pieces < 2048 or (index + 1) == len(model):

View file

@ -585,16 +585,16 @@ def icon_name_to_host(icon):
return icon.rpartition('.')[0]
MIME_MAP = {
"image/gif" : "gif",
"image/jpeg" : "jpg",
"image/png" : "png",
"image/vnd.microsoft.icon" : "ico",
"image/x-icon" : "ico",
"gif" : "image/gif",
"jpg" : "image/jpeg",
"jpeg" : "image/jpeg",
"png" : "image/png",
"ico" : "image/vnd.microsoft.icon",
"image/gif": "gif",
"image/jpeg": "jpg",
"image/png": "png",
"image/vnd.microsoft.icon": "ico",
"image/x-icon": "ico",
"gif": "image/gif",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"png": "image/png",
"ico": "image/vnd.microsoft.icon",
}
def mimetype_to_extension(mimetype):