summaryrefslogtreecommitdiffstats
path: root/deluge/ui/console/modes/torrentlist/filtersidebar.py
blob: 49e26ed8953ed969024a643af6c982448c870b95 (plain)
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()