1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# -*- coding: utf-8 -*-
#
# Copyright (C) 2016 bendikro <bro.devel+deluge@gmail.com>
#
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
from __future__ import unicode_literals
import curses
import logging
from deluge.component import Component
from deluge.decorators import overrides
from deluge.ui.client import client
from deluge.ui.console.utils import curses_util as util
from deluge.ui.console.widgets import BaseInputPane
from deluge.ui.console.widgets.sidebar import Sidebar
log = logging.getLogger(__name__)
class FilterSidebar(Sidebar, Component):
"""The sidebar in the main torrentview
Shows the different states of the torrents and allows to filter the
torrents based on state.
"""
def __init__(self, torrentlist, config):
self.config = config
height = curses.LINES - 2
width = self.config['torrentview']['sidebar_width']
Sidebar.__init__(
self, torrentlist, width, height, title=' Filter ', border_off_north=1,
allow_resize=True,
)
Component.__init__(self, 'FilterSidebar')
self.checked_index = 0
kwargs = {'checked_char': '*', 'unchecked_char': '-', 'checkbox_format': ' %s ', 'col': 0}
self.add_checked_input('All', 'All', checked=True, **kwargs)
self.add_checked_input('Active', 'Active', **kwargs)
self.add_checked_input('Downloading', 'Downloading', color='green,black', **kwargs)
self.add_checked_input('Seeding', 'Seeding', color='cyan,black', **kwargs)
self.add_checked_input('Paused', 'Paused', **kwargs)
self.add_checked_input('Error', 'Error', color='red,black', **kwargs)
self.add_checked_input('Checking', 'Checking', color='blue,black', **kwargs)
self.add_checked_input('Queued', 'Queued', **kwargs)
self.add_checked_input('Allocating', 'Allocating', color='yellow,black', **kwargs)
self.add_checked_input('Moving', 'Moving', color='green,black', **kwargs)
@overrides(Component)
def update(self):
if not self.hidden() and client.connected():
d = client.core.get_filter_tree(True, []).addCallback(self._cb_update_filter_tree)
def on_filter_tree_updated(changed):
if changed:
self.refresh()
d.addCallback(on_filter_tree_updated)
def _cb_update_filter_tree(self, filter_items):
"""Callback function on client.core.get_filter_tree"""
states = filter_items['state']
largest_count = 0
largest_state_width = 0
for state in states:
largest_state_width = max(len(state[0]), largest_state_width)
largest_count = max(int(state[1]), largest_count)
border_and_spacing = 6 # Account for border + whitespace
filter_state_width = largest_state_width
filter_count_width = self.width - filter_state_width - border_and_spacing
changed = False
for state in states:
field = self.get_input(state[0])
if field:
txt = ('%%-%ds%%%ds' % (filter_state_width, filter_count_width) % (state[0], state[1]))
if field.set_message(txt):
changed = True
return changed
@overrides(BaseInputPane)
def immediate_action_cb(self, state_changed=True):
if state_changed:
self.parent.torrentview.set_torrent_filter(self.inputs[self.active_input].name)
@overrides(Sidebar)
def handle_read(self, c):
if c == util.KEY_SPACE:
if self.checked_index != self.active_input:
self.inputs[self.checked_index].set_value(False)
Sidebar.handle_read(self, c)
self.checked_index = self.active_input
return util.ReadState.READ
else:
return Sidebar.handle_read(self, c)
@overrides(Sidebar)
def on_resize(self, width):
sidebar_width = self.config['torrentview']['sidebar_width']
if sidebar_width != width:
self.config['torrentview']['sidebar_width'] = width
self.config.save()
self.resize_window(self.height, width)
self.parent.toggle_sidebar()
self.refresh()
|