summary refs log tree commit diff stats
path: root/ranger/wdisplay.py
blob: d09621493dd009b1f427843bfbf51eb0611244ea (plain) (blame)
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