summary refs log tree commit diff stats
path: root/scripts
diff options
context:
space:
mode:
authorhut <hut@lepus.uberspace.de>2014-12-04 00:36:16 +0100
committerhut <hut@lepus.uberspace.de>2014-12-04 00:36:16 +0100
commit987d618504ead0a099160c14855d8181500f3463 (patch)
tree53a9f91b530e42882f035933d03607c58fe29199 /scripts
parent8c987ebc72928fef34ca14e16b7d1d538610fbd4 (diff)
downloadranger-987d618504ead0a099160c14855d8181500f3463.tar.gz
config/commands.py: in :paper, properly fill in the console lines
Diffstat (limited to 'scripts')
0 files changed, 0 insertions, 0 deletions
ame the previous revision' href='/akspecs/ranger/blame/ranger/gui/displayable.py?h=v1.9.3&id=4c05e43d11430fbfd8a5d86ae0070e24775251b1'>^
49ae0dd1 ^



1159f9ec ^
d88232a3 ^

c1033553 ^



d88232a3 ^




49ae0dd1 ^

b4b0eb24 ^

49ae0dd1 ^
1159f9ec ^

49ae0dd1 ^
1159f9ec ^

49ae0dd1 ^



d88232a3 ^















b4b0eb24 ^


d88232a3 ^


b4b0eb24 ^

d88232a3 ^







b4b0eb24 ^

d88232a3 ^



b4b0eb24 ^

d88232a3 ^
d621586e ^
06aefcf5 ^








d621586e ^

d88232a3 ^

d621586e ^
b4b0eb24 ^

d88232a3 ^



b4b0eb24 ^

d88232a3 ^








a923ead7 ^




d88232a3 ^
1159f9ec ^


c1033553 ^


d88232a3 ^








c1033553 ^
2061a46e ^
c1033553 ^
b19e53f9 ^






c1033553 ^

2061a46e ^
c1033553 ^

d88232a3 ^





1159f9ec ^







d88232a3 ^


d621586e ^
d88232a3 ^

d621586e ^




d88232a3 ^



d621586e ^
d88232a3 ^

























49ae0dd1 ^
d88232a3 ^


1159f9ec ^
d88232a3 ^
49ae0dd1 ^





d88232a3 ^

1159f9ec ^

49ae0dd1 ^
d88232a3 ^




d88232a3 ^












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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
                                                                           
                      






                                                                     
                                                                  
                                            






                                                



                            
                                                            

                                   



                                                                 




                                 

                                                 

                                                                                      
                    

                                             
                            

                                                       



                                                















                                                                           


                                                                              


                                                       

                              







                                                                                 

                              



                                                                         

                              
                    
 








                                       

                                                              

                       
                                                                                  

                                           



                                                                  

                              








                                                      




                                              
 


                                                                                        


                                                                                      








                                                                                    
                    
                                                 
                       






                                                                              

                                       
                             

                          





                                        







                                                                  


                                               
                       

                                                                




                                                                        



                                                  
                                                                        

























                                                                          
 


                                                                
                                                            
                                   





                                                            

                            

                                           
 




                                                                












                                                                  
from ranger.shared import FileManagerAware, EnvironmentAware, SettingsAware
from ranger import log

class Displayable(EnvironmentAware, FileManagerAware, SettingsAware):
	focused = False
	visible = True
	win = None
	colorscheme = None

	def __init__(self, win, env=None, fm=None, settings=None):
		from ranger.gui.ui import UI
		if env is not None:
			self.env = env
		if fm is not None:
			self.fm = fm
		if settings is not None:
			self.settings = settings

		self.x = 0
		self.y = 0
		self.wid = 0
		self.hei = 0
		self.colorscheme = self.settings.colorscheme

		if win is not None:
			if isinstance(self, UI):
				self.win = win
			else:
				self.win = win.derwin(1, 1, 0, 0)

	def __nonzero__(self):
		"""Always True"""
		return True

	def __contains__(self, item):
		"""Is item inside the boundaries?
		item can be an iterable like [y, x] or an object with x and y methods.
		"""
		try:
			y, x = item.y, item.x
		except AttributeError:
			try:
				y, x = item
			except (ValueError, TypeError):
				return False
		
		return self.contains_point(y, x)

	def color(self, keylist = None, *keys):
		"""Change the colors from now on."""
		keys = combine(keylist, keys)
		self.win.attrset(self.colorscheme.get_attr(*keys))

	def color_at(self, y, x, wid, keylist = None, *keys):
		"""Change the colors at the specified position"""
		keys = combine(keylist, keys)
		self.win.chgat(y, x, wid, self.colorscheme.get_attr(*keys))
	
	def color_reset(self):
		"""Change the colors to the default colors"""
		Displayable.color(self, 'reset')

	def draw(self):
		"""Draw the object. Called on every main iteration.
		Containers should call draw() on their contained objects here.
		Override this!
		"""

	def destroy(self):
		"""Called when the object is destroyed.
		Override this!
		"""

	def contains_point(self, y, x):
		"""Test if the point lies within the boundaries of this object"""
		return (x >= self.x and x < self.x + self.wid) and \
				(y >= self.y and y < self.y + self.hei)

	def click(self, event):
		"""Called when a mouse key is pressed and self.focused is True.
		Override this!
		"""
		pass

	def press(self, key):
		"""Called when a key is pressed and self.focused is True.
		Override this!
		"""
		pass

	def activate(self, boolean):
		boolean = bool(boolean)
		self.visible = boolean
		self.focused = boolean
	
	def show(self, boolean):
		boolean = bool(boolean)
		self.visible = boolean

	def poke(self):
		"""Called before drawing, even if invisible"""
	
	def draw(self):
		"""Draw displayable.  Called on every main iteration if the object
		is visible.  Override this!
		"""
		pass

	def finalize(self):
		"""Called after every displayable is done drawing.
		Override this!
		"""
		pass

	def resize(self, y, x, hei=None, wid=None):
		"""Resize the widget"""
		try:
			maxy, maxx = self.env.termsize
		except TypeError:
			pass
		else:
			if hei is None:
				hei = maxy - y

			if wid is None:
				wid = maxx - x

			if x < 0 or y < 0:
				raise OutOfBoundsException("Starting point below zero!")

			if wid < 1 or hei < 1:
				raise OutOfBoundsException("WID and HEI must be >=1!")

			if x + wid > maxx and y + hei > maxy:
				raise OutOfBoundsException("X and Y out of bounds!")

			if x + wid > maxx:
				raise OutOfBoundsException("X out of bounds!")

			if y + hei > maxy:
				raise OutOfBoundsException("Y out of bounds!")

		try:
			self.win.resize(hei, wid)
		except:
			# Not enough space for resizing...
			try:
				self.win.mvderwin(0, 0)
				self.win.resize(hei, wid)
			except:
				raise OutOfBoundsException("Resizing Failed!")

		self.win.mvderwin(y, x)
		self.absx = x
		self.absy = y
		self.x = 0
		self.y = 0
		self.wid = wid
		self.hei = hei


class DisplayableContainer(Displayable):
	container = None
	def __init__(self, win, env=None, fm=None, settings=None):
		if env is not None:
			self.env = env
		if fm is not None:
			self.fm = fm
		if settings is not None:
			self.settings = settings

		Displayable.__init__(self, win)
		self.container = []

	def poke(self):
		"""Recursively called on objects in container"""
		for displayable in self.container:
			displayable.poke()

	def draw(self):
		"""Recursively called on visible objects in container"""
		for displayable in self.container:
			if displayable.visible:
				displayable.draw()

	def finalize(self):
		"""Recursively called on visible objects in container"""
		for displayable in self.container:
			if displayable.visible:
				displayable.finalize()
	
	def get_focused_obj(self):
		"""Finds a focused displayable object in the container."""
		for displayable in self.container:
			if displayable.focused:
				return displayable
			try:
				obj = displayable.get_focused_obj()
			except AttributeError:
				pass
			else:
				if obj is not None:
					return obj
		return None

	def press(self, key):
		"""Recursively called on objects in container"""
		focused_obj = self.get_focused_obj()

		if focused_obj:
			focused_obj.press(key)
			return True
		return False

	def click(self, event):
		"""Recursively called on objects in container"""
		focused_obj = self.get_focused_obj()
		if focused_obj and focused_obj.click(event):
			return True

		for displayable in self.container:
			if event in displayable:
				if displayable.click(event):
					return True

		return False

	def add_obj(self, *objs):
		self.container.extend(objs)

	def destroy(self):
		"""Recursively called on objects in container"""
		for displayable in self.container:
			displayable.destroy()

class OutOfBoundsException(Exception):
	pass

def combine(seq, tup):
	"""Add seq and tup. Ensures that the result is a tuple."""
	try:
		if isinstance(seq, str): raise TypeError
		return tuple(tuple(seq) + tup)
	except TypeError:
		try:
			return tuple((seq, ) + tup)
		except:
			return ()