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
111
112
113
114
115
116
117
118
|
# Copyright (C) 2009, 2010 Roman Zimbelmann <romanz@lavabit.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
The TaskView allows you to modify what the loader is doing.
"""
import curses
from collections import deque
from . import Widget
from ranger.ext.accumulator import Accumulator
from ranger.container import CommandList
class TaskView(Widget, Accumulator):
old_lst = None
def __init__(self, win):
Widget.__init__(self, win)
Accumulator.__init__(self)
self.scroll_begin = 0
self.commandlist = CommandList()
self.fm.keys.initialize_taskview_commands(self.commandlist)
def draw(self):
base_clr = deque()
base_clr.append('in_taskview')
lst = self.get_list()
if self.old_lst != lst:
self.old_lst = lst
self.need_redraw = True
if self.need_redraw:
self.win.erase()
if not self.pointer_is_synced():
self.sync_index()
if self.hei <= 0:
return
self.addstr(0, 0, "Task View")
self.color_at(0, 0, self.wid, base_clr, 'title')
if lst:
for i in range(self.hei - 1):
i += self.scroll_begin
try:
obj = lst[i]
except IndexError:
break
y = i + 1
clr = deque(base_clr)
if self.pointer == i:
clr.append('selected')
descr = obj.get_description()
self.addstr(y, 0, descr, self.wid)
self.color_at(y, 0, self.wid, clr)
else:
if self.hei > 1:
self.addstr(1, 0, "No task in the queue.")
self.color_at(1, 0, self.wid, base_clr, 'error')
self.color_reset()
def finalize(self):
y = self.y + 1 + self.pointer - self.scroll_begin
self.fm.ui.win.move(y, self.x)
def task_remove(self, i=None):
if i is None:
i = self.pointer
self.fm.loader.remove(index=i)
def task_move(self, absolute, i=None):
if i is None:
i = self.pointer
self.fm.loader.move(_from=i, to=absolute)
def press(self, key):
try:
tup = self.env.keybuffer.tuple_without_numbers()
if tup:
cmd = self.commandlist[tup]
else:
return
except KeyError:
self.env.key_clear()
else:
if hasattr(cmd, 'execute'):
try:
cmd.execute_wrap(self)
except Exception as error:
self.fm.notify(error)
self.env.key_clear()
def get_list(self):
return self.fm.loader.queue
|