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
|
import ranger.widget
from ranger.debug import log
import curses
class WDisplay(ranger.widget.Widget):
def __init__(self, win, level):
ranger.widget.Widget.__init__(self,win)
self.level = level
self.main_display = False
self.display_infostring = False
self.scroll_begin = 0
def feed_env(self, env):
self.target = env.at_level(self.level)
self.show_hidden = env.opt['show_hidden']
self.scroll_offset = env.opt['scroll_offset']
def draw(self):
from ranger.file import File
from ranger.directory import Directory
if self.target is None:
pass
elif type(self.target) == File:
self.draw_file()
elif type(self.target) == Directory:
self.draw_directory()
else:
self.win.addnstr(self.y, self.x, "unknown type.", self.wid)
def draw_file(self):
if not self.target.accessible:
self.win.addnstr(self.y, self.x, "not accessible", self.wid)
return
self.win.addnstr(self.y, self.x, "this is a file.", self.wid)
def draw_directory(self):
self.target.show_hidden = self.show_hidden
self.target.load_content_if_outdated()
main_display = self.main_display
if not self.target.accessible:
self.win.addnstr(self.y, self.x, "not accessible", self.wid)
return
self.set_scroll_begin()
for line in range(self.hei):
i = line + self.scroll_begin
# last file reached?
try: drawed = self.target[i]
except IndexError: break
invert = i == self.target.pointed_index
if invert:
self.win.attrset(curses.A_REVERSE)
if self.main_display:
self.win.addnstr(
self.y + line,
self.x + 1,
' ' + drawed.basename + ' ',
self.wid - 2)
else:
self.win.addnstr(
self.y + line,
self.x,
drawed.basename,
self.wid)
if self.display_infostring and drawed.infostring:
info = drawed.infostring
x = self.x + self.wid - 1 - len(info)
if x > self.x:
self.win.addstr(self.y + line, x, str(info) + ' ')
if invert:
self.win.attrset(curses.A_NORMAL)
def get_scroll_begin(self):
offset = self.scroll_offset
dirsize = len(self.target)
winsize = self.hei
halfwinsize = winsize // 2
index = self.target.pointed_index or 0
original = self.target.scroll_begin
projected = index - original
upper_limit = winsize - 1 - offset
lower_limit = offset
if dirsize < winsize:
return 0
if halfwinsize < offset:
return min( dirsize - winsize, max( 0, index - halfwinsize ))
if projected < upper_limit and projected > lower_limit:
return original
if projected > upper_limit:
return min( dirsize - winsize,
original + (projected - upper_limit))
if projected < upper_limit:
return max( 0,
original - (lower_limit - projected))
return original
def set_scroll_begin(self):
self.scroll_begin = self.get_scroll_begin()
self.target.scroll_begin = self.scroll_begin
|