Add torrent status info to torrent props
torrent props is now a window instead of inwin
This commit is contained in:
parent
cab124ca29
commit
e02a0186a0
10
TODO
10
TODO
|
@ -8,14 +8,14 @@ Torrent-handle controls/options:
|
|||
☐ Torrent properties
|
||||
./epour/gui/TorrentProps.py
|
||||
☐ save_path() move_storage()
|
||||
☐ super_seeding() (status.super_seeding)
|
||||
✔ super_seeding() (status.super_seeding) @done (09:49 08.07.2014)
|
||||
?
|
||||
☐ set_upload_limit() set_download_limit() upload_limit() download_limit()
|
||||
☐ set_sequential_download() (status.sequential_download)
|
||||
✔ set_sequential_download() (status.sequential_download) @done (09:49 08.07.2014)
|
||||
?
|
||||
☐ set_upload_mode() (status.upload_mode)
|
||||
✔ set_upload_mode() (status.upload_mode) @done (09:49 08.07.2014)
|
||||
?
|
||||
☐ set_share_mode() (status.share_mode)
|
||||
✔ set_share_mode() (status.share_mode) @done (09:49 08.07.2014)
|
||||
?
|
||||
☐ apply_ip_filter() (status.ip_filter_applies)
|
||||
☐ set_tracker_login()
|
||||
|
@ -33,7 +33,7 @@ Torrent-handle controls/options:
|
|||
☐ set_ssl_certificate()
|
||||
Torrent status info:
|
||||
http://libtorrent.org/reference-Core.html#torrent_status
|
||||
☐ Torrent properties
|
||||
✔ Torrent properties @done (09:49 08.07.2014)
|
||||
./epour/gui/TorrentProps.py
|
||||
Add Torrent-dialog:
|
||||
✔ Use dicts to hold torrent info between sessions. @done (15:57 30.06.2014)
|
||||
|
|
|
@ -23,6 +23,7 @@ import cgi
|
|||
import sys
|
||||
import os
|
||||
import pipes
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
log = logging.getLogger("epour")
|
||||
|
||||
|
@ -33,7 +34,6 @@ from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL
|
|||
from efl.elementary.genlist import Genlist, GenlistItemClass, \
|
||||
ELM_GENLIST_ITEM_NONE, ELM_GENLIST_ITEM_TREE, ELM_GENLIST_ITEM_FIELD_TEXT
|
||||
from efl.elementary.window import StandardWindow
|
||||
from efl.elementary.innerwindow import InnerWindow
|
||||
from efl.elementary.button import Button
|
||||
from efl.elementary.box import Box
|
||||
from efl.elementary.check import Check
|
||||
|
@ -43,6 +43,11 @@ from efl.elementary.frame import Frame
|
|||
from efl.elementary.object import ELM_SEL_FORMAT_TEXT, \
|
||||
ELM_SEL_TYPE_CLIPBOARD
|
||||
from efl.elementary.table import Table
|
||||
from efl.elementary.progressbar import Progressbar
|
||||
from efl.elementary.configuration import Configuration
|
||||
elm_conf = Configuration()
|
||||
SCALE = elm_conf.scale
|
||||
from efl.elementary.scroller import Scroller
|
||||
|
||||
from intrepr import intrepr
|
||||
from Widgets import Information
|
||||
|
@ -52,6 +57,7 @@ EXPAND_HORIZ = EVAS_HINT_EXPAND, 0.0
|
|||
FILL_BOTH = EVAS_HINT_FILL, EVAS_HINT_FILL
|
||||
FILL_HORIZ = EVAS_HINT_FILL, 0.5
|
||||
ALIGN_LEFT = 0.0, 0.5
|
||||
ALIGN_RIGHT = 1.0, 0.5
|
||||
|
||||
|
||||
from collections import defaultdict
|
||||
|
@ -105,48 +111,60 @@ def attach(branch, file_entry, n, trunk):
|
|||
attach(others, file_entry, n, trunk[node])
|
||||
|
||||
|
||||
class TorrentProps(InnerWindow):
|
||||
def __init__(self, parent, h):
|
||||
class TorrentProps(StandardWindow):
|
||||
|
||||
def __init__(self, h):
|
||||
if not h.is_valid():
|
||||
Information(parent.win, "Invalid torrent handle.")
|
||||
Information(self, "Invalid torrent handle.")
|
||||
return
|
||||
|
||||
InnerWindow.__init__(self, parent)
|
||||
StandardWindow.__init__(
|
||||
self, "epour", "Epour - %s" % (h.name()),
|
||||
size=(SCALE * 480, SCALE * 320),
|
||||
autodel=True
|
||||
)
|
||||
|
||||
box = Box(self)
|
||||
box.size_hint_align = FILL_BOTH
|
||||
box.size_hint_weight = EXPAND_BOTH
|
||||
scroller = Scroller(self)
|
||||
self.resize_object_add(scroller)
|
||||
|
||||
tname = Label(self)
|
||||
tname.size_hint_align = FILL_HORIZ
|
||||
tname.line_wrap = ELM_WRAP_CHAR
|
||||
tname.ellipsis = True
|
||||
box = Box(self, size_hint_weight=EXPAND_BOTH)
|
||||
|
||||
scroller.content = box
|
||||
|
||||
tname = Label(
|
||||
self, size_hint_align=FILL_HORIZ, line_wrap=ELM_WRAP_CHAR,
|
||||
ellipsis=True, scale=2.0
|
||||
)
|
||||
tname.text = "{}".format(cgi.escape(h.name()))
|
||||
tname.scale = 2.0
|
||||
tname.show()
|
||||
box.pack_end(tname)
|
||||
|
||||
if h.has_metadata():
|
||||
ti = TorrentInfo(self, h, size_hint_align=FILL_HORIZ)
|
||||
box.pack_end(ti)
|
||||
f = Frame(self, text="Torrent info", size_hint_align=FILL_HORIZ)
|
||||
ti = TorrentInfo(f, h, size_hint_align=FILL_HORIZ)
|
||||
f.content = ti
|
||||
box.pack_end(f)
|
||||
ti.show()
|
||||
f.show()
|
||||
|
||||
f = Frame(self, text="Torrent status", size_hint_align=FILL_HORIZ)
|
||||
ts = TorrentStatus(f, h, size_hint_align=FILL_HORIZ)
|
||||
f.content = ts
|
||||
box.pack_end(f)
|
||||
ts.show()
|
||||
f.show()
|
||||
|
||||
magnet_uri = lt.make_magnet_uri(h)
|
||||
|
||||
f = Frame(self)
|
||||
f.size_hint_align = FILL_HORIZ
|
||||
f.text = "Magnet URI"
|
||||
me_box = Box(f)
|
||||
me_box.horizontal = True
|
||||
me = Entry(me_box)
|
||||
me.size_hint_align = FILL_HORIZ
|
||||
me.size_hint_weight = EXPAND_HORIZ
|
||||
me.editable = False
|
||||
me.entry = magnet_uri
|
||||
f = Frame(self, size_hint_align=FILL_HORIZ, text="Magnet URI")
|
||||
me_box = Box(f, horizontal=True)
|
||||
me = Entry(
|
||||
me_box, size_hint_align=FILL_HORIZ, size_hint_weight=EXPAND_HORIZ,
|
||||
editable=False, entry=magnet_uri, line_wrap=ELM_WRAP_CHAR
|
||||
)
|
||||
me_box.pack_end(me)
|
||||
me.show()
|
||||
me_btn = Button(me_box)
|
||||
me_btn.text = "Copy"
|
||||
me_btn = Button(me_box, text="Copy")
|
||||
me_btn.callback_clicked_add(
|
||||
lambda x: me.top_widget.cnp_selection_set(
|
||||
ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, me.text
|
||||
|
@ -159,16 +177,13 @@ class TorrentProps(InnerWindow):
|
|||
f.show()
|
||||
box.pack_end(f)
|
||||
|
||||
xbtn = Button(box)
|
||||
xbtn.text_set("Close")
|
||||
xbtn = Button(box, text="Close")
|
||||
xbtn.callback_clicked_add(lambda x: self.delete())
|
||||
box.pack_end(xbtn)
|
||||
xbtn.show()
|
||||
|
||||
box.show()
|
||||
|
||||
self.content = box
|
||||
self.activate()
|
||||
scroller.show()
|
||||
|
||||
|
||||
class TorrentFiles(StandardWindow):
|
||||
|
@ -177,9 +192,9 @@ class TorrentFiles(StandardWindow):
|
|||
self,
|
||||
"epour",
|
||||
"Epour - Files for torrent: %s" % (h.name()),
|
||||
size=(600, 400)
|
||||
size=(SCALE * 480, SCALE * 320),
|
||||
autodel=True
|
||||
)
|
||||
self.callback_delete_request_add(lambda x: self.delete())
|
||||
|
||||
box = Box(self, size_hint_weight=EXPAND_BOTH)
|
||||
self.resize_object_add(box)
|
||||
|
@ -328,19 +343,13 @@ class TorrentFiles(StandardWindow):
|
|||
os.startfile(path)
|
||||
|
||||
|
||||
class TorrentInfo(Frame):
|
||||
class TorrentInfo(Box):
|
||||
def __init__(self, parent, h, *args, **kwargs):
|
||||
Frame.__init__(self, parent, *args, **kwargs)
|
||||
|
||||
self.text = "Torrent info"
|
||||
Box.__init__(self, parent, *args, **kwargs)
|
||||
|
||||
info = h.get_torrent_info()
|
||||
|
||||
box = Box(self, size_hint_weight=EXPAND_HORIZ)
|
||||
self.content = box
|
||||
box.show()
|
||||
|
||||
table = Table(box, homogeneous=True, size_hint_align=FILL_HORIZ)
|
||||
table = Table(self, homogeneous=True, size_hint_align=FILL_HORIZ)
|
||||
|
||||
i = 0
|
||||
for func in info.comment, info.creation_date, info.creator:
|
||||
|
@ -371,14 +380,153 @@ class TorrentInfo(Frame):
|
|||
tpriv.disabled = True
|
||||
tpriv.state = info.priv()
|
||||
|
||||
fl_btn = Button(box, size_hint_align=ALIGN_LEFT)
|
||||
fl_btn = Button(self, size_hint_align=ALIGN_LEFT)
|
||||
fl_btn.text = "Files ->"
|
||||
fl_btn.callback_clicked_add(lambda x: TorrentFiles(h))
|
||||
|
||||
box.pack_end(table)
|
||||
box.pack_end(tpriv)
|
||||
box.pack_end(fl_btn)
|
||||
self.pack_end(table)
|
||||
self.pack_end(tpriv)
|
||||
self.pack_end(fl_btn)
|
||||
|
||||
table.show()
|
||||
tpriv.show()
|
||||
fl_btn.show()
|
||||
|
||||
|
||||
class TorrentStatus(Table):
|
||||
|
||||
state_str = (
|
||||
'Queued', 'Checking', 'Downloading metadata', 'Downloading',
|
||||
'Finished', 'Seeding', 'Allocating', 'Checking resume data'
|
||||
)
|
||||
|
||||
ignored_keys = (
|
||||
"progress_ppm", "distributed_copies", "states", "auto_managed"
|
||||
)
|
||||
|
||||
byte_values = (
|
||||
"all_time_download", "all_time_upload", "block_size", "total_done",
|
||||
"total_wanted", "total_wanted_done", "total_failed_bytes",
|
||||
"total_payload_download", "total_payload_upload", "total_download",
|
||||
"total_upload", "total_redundant_bytes"
|
||||
)
|
||||
|
||||
byte_transfer_values = (
|
||||
"download_rate", "download_payload_rate", "upload_rate",
|
||||
"upload_payload_rate"
|
||||
)
|
||||
|
||||
check_enabled = (
|
||||
"super_seeding"
|
||||
)
|
||||
|
||||
check_enabled_prefixed = (
|
||||
"sequential_download", "upload_mode", "share_mode"
|
||||
)
|
||||
|
||||
timedelta_values = (
|
||||
"active_time", "seeding_time", "time_since_download",
|
||||
"time_since_upload", "finished_time"
|
||||
)
|
||||
|
||||
datetime_values = (
|
||||
"added_time", "last_seen_complete", "completed_time"
|
||||
)
|
||||
|
||||
def __init__(self, parent, h, *args, **kwargs):
|
||||
Table.__init__(self, parent, *args, **kwargs)
|
||||
|
||||
s = h.status()
|
||||
|
||||
self.widgets = []
|
||||
|
||||
for i, k in enumerate(dir(s)):
|
||||
if k.startswith("__") or k in self.ignored_keys:
|
||||
continue
|
||||
try:
|
||||
v = getattr(s, k)
|
||||
except Exception as e:
|
||||
log.debug(e)
|
||||
continue
|
||||
|
||||
v = self.convert_value(k, v)
|
||||
|
||||
w = None
|
||||
|
||||
if k == "state":
|
||||
pass
|
||||
elif isinstance(v, lt.torrent_status.states):
|
||||
continue
|
||||
elif isinstance(v, list):
|
||||
continue # TODO
|
||||
elif k == "progress":
|
||||
w = Progressbar(self)
|
||||
w.size_hint_align = FILL_HORIZ
|
||||
elif isinstance(v, bool):
|
||||
w = Check(self)
|
||||
w.size_hint_align = ALIGN_RIGHT
|
||||
if k in self.check_enabled:
|
||||
setter = getattr(h, k)
|
||||
w.callback_changed_add(lambda x: setter(x.state))
|
||||
elif k in self.check_enabled_prefixed:
|
||||
setter = getattr(h, "set_" + k)
|
||||
w.callback_changed_add(lambda x: setter(x.state))
|
||||
else:
|
||||
w.disabled = True
|
||||
if not w:
|
||||
try:
|
||||
w = Label(self)
|
||||
w.size_hint_align = ALIGN_RIGHT
|
||||
except Exception as e:
|
||||
log.debug(e)
|
||||
continue
|
||||
|
||||
w.data["key"] = k
|
||||
self.populate(w, v)
|
||||
self.widgets.append(w)
|
||||
|
||||
l = Label(self)
|
||||
l.size_hint_align = ALIGN_LEFT
|
||||
l.text = str(k).replace("_", " ").capitalize()
|
||||
self.pack(l, 0, i, 1, 1)
|
||||
l.show()
|
||||
|
||||
self.pack(w, 1, i, 1, 1)
|
||||
w.show()
|
||||
|
||||
def update():
|
||||
s = h.status()
|
||||
for w in self.widgets:
|
||||
key = w.data["key"]
|
||||
v = self.convert_value(key, getattr(s, key))
|
||||
self.populate(w, v)
|
||||
|
||||
ecore.Timer(5.0, update)
|
||||
|
||||
@staticmethod
|
||||
def populate(w, v):
|
||||
if isinstance(w, Label):
|
||||
w.text = str(v)
|
||||
elif isinstance(w, Check):
|
||||
w.state = v
|
||||
elif isinstance(w, Progressbar):
|
||||
w.value = v
|
||||
|
||||
def convert_value(self, k, v):
|
||||
if k == "state":
|
||||
v = str(v).replace("_", " ").capitalize()
|
||||
elif k in self.datetime_values:
|
||||
v = datetime.fromtimestamp(v)
|
||||
elif k in self.timedelta_values:
|
||||
v = timedelta(seconds=v)
|
||||
elif isinstance(v, list):
|
||||
pass
|
||||
elif isinstance(v, lt.storage_mode_t):
|
||||
v = str(v).replace("_", " ").capitalize()
|
||||
elif isinstance(v, (int, long, basestring)):
|
||||
if k in self.byte_values:
|
||||
v = intrepr(v)
|
||||
if k in self.byte_transfer_values:
|
||||
v = intrepr(v) + "/s"
|
||||
|
||||
return v
|
||||
|
|
|
@ -383,10 +383,10 @@ class SessionStatus(Table):
|
|||
|
||||
class TorrentClass(GenlistItemClass):
|
||||
|
||||
state_str = [
|
||||
state_str = (
|
||||
'Queued', 'Checking', 'Downloading metadata', 'Downloading',
|
||||
'Finished', 'Seeding', 'Allocating', 'Checking resume data'
|
||||
]
|
||||
)
|
||||
|
||||
log = logging.getLogger("epour.gui.torrent_list")
|
||||
|
||||
|
@ -569,7 +569,7 @@ class ItemMenu(Menu):
|
|||
|
||||
def torrent_props_cb(self, menu, item, h):
|
||||
from TorrentProps import TorrentProps
|
||||
TorrentProps(self.top_widget, h)
|
||||
TorrentProps(h).show()
|
||||
|
||||
|
||||
class TorrentTooltip(Table):
|
||||
|
|
Loading…
Reference in New Issue