/lib/

title='Blame the previous revision' href='/akspecs/ranger/blame/ranger/gui/ui.py?h=v1.0.1&id=923844b32aa8253d78c4aea005eee1b4df67fa6d'>^
ae943ecb ^
d88232a3 ^

0c0b9489 ^
871c502d ^
d88232a3 ^

e657119b ^
fa704bab ^
1159f9ec ^
cc952d63 ^
75013dc7 ^
cc952d63 ^
1159f9ec ^




0c0b9489 ^




cc952d63 ^
5822dff7 ^
d88232a3 ^
3ea48208 ^
3ea48208 ^
d88232a3 ^
e6dfc442 ^
ae943ecb ^
fa704bab ^
ae943ecb ^
cc952d63 ^
3ea48208 ^
f027adc0 ^
3ea48208 ^
419e4aa5 ^

d88232a3 ^
e657119b ^
ae943ecb ^
e657119b ^


4c05e43d ^
e657119b ^



ae943ecb ^
f8e96a97 ^


d88232a3 ^
f8e96a97 ^
4c05e43d ^

75013dc7 ^

728fb838 ^






fa704bab ^
fa704bab ^




79355449 ^


fa704bab ^
79355449 ^
fa704bab ^

4c05e43d ^




d88232a3 ^

ae943ecb ^

f1352f40 ^
ae943ecb ^

75013dc7 ^


728fb838 ^
b4cb1f7d ^
d494f019 ^
d88232a3 ^

a396b3a0 ^



9506fb8e ^
ae943ecb ^
d88232a3 ^

9506fb8e ^

5645f266 ^





9506fb8e ^



a396b3a0 ^



70aec44f ^

9506fb8e ^
b0f0027f ^
d88232a3 ^
5822dff7 ^
b0f0027f ^

d88232a3 ^


b4b0eb24 ^

e85d44ae ^
d88232a3 ^
e85d44ae ^





d88232a3 ^
42fd3690 ^
d88232a3 ^


42fd3690 ^
d88232a3 ^


b4b0eb24 ^

d88232a3 ^



42fd3690 ^
d88232a3 ^
7d9ae552 ^
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
             
              
 

                                             
                                        
 

                               
                                                                          
                         
                                                                
                         
                                                                          
 




                                      




                                                                                
                                           
 
                                                         
 
                             
                                                                                        
                                   
                                  
                                      
 
                               
                               
                                    
                                  

                                           
 
                                                
                                       


                                                                      
                                                                           



                                                                               
 


                                             
                                  
 

                                     

                                        






                                   
                                         




                                                


                                                                             
                             
                                                   

                                                    




                                                             

                                         

                                                             
                                     

                              


                                                                
 
                                                       
 

                                       



                                         
                                        
 

                                                         

                    





                                                                        



                                            



                                                   

                                              
 
                               
                                                                     
                                      

                                 


                                                     

                              
        
                         





                                        
                                                                              
                                


                                    
                                       


                                            

                                                         



                                                                              
                                   
                                               
                                  




                                                                               
import curses
import _curses

from .displayable import DisplayableContainer
from .mouse_event import MouseEvent
from ranger.container import CommandList

class UI(DisplayableContainer):
	is_set_up = False
	mousemask = curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION
	load_mode = False
	def __init__(self, commandlist=None, env=None, fm=None):
		import os
		os.environ['ESCDELAY'] = '25'   # don't know a cleaner way

		if env is not None:
			self.env = env
		if fm is not None:
			self.fm = fm

		if commandlist is None:
			self.commandlist = CommandList()
			self.settings.keys.initialize_commands(self.commandlist)
		else:
			self.commandlist = commandlist
		self.win = curses.initscr()

		DisplayableContainer.__init__(self, None)

	def initialize(self):
		"""initialize curses, then call setup (at the first time) and resize."""
		self.win.leaveok(0)
		self.win.keypad(1)
		self.load_mode = False

		curses.cbreak()
		curses.noecho()
		curses.halfdelay(20)
		curses.curs_set(0)
		curses.start_color()
		curses.use_default_colors()

		curses.mousemask(self.mousemask)
		curses.mouseinterval(0)
		
		## this line solves this problem:
		## If an action, following a mouse click, includes the
		## suspension and re-initializion of the ui (e.g. running a
		## file by clicking on its preview) and the next key is another
		## mouse click, the bstate of this mouse event will be invalid.
		## (atm, invalid bstates are recognized as scroll-down)
		curses.ungetmouse(0,0,0,0,0)

		if not self.is_set_up:
			self.is_set_up = True
			self.setup()
		self.update_size()

	def suspend(self):
		"""Turn off curses"""
		# from ranger import log
		# log("suspending ui!")
		self.win.keypad(0)
		curses.nocbreak()
		curses.echo()
		curses.curs_set(1)
		curses.mousemask(0)
		curses.endwin()

	def set_load_mode(self, boolean):
		boolean = bool(boolean)
		if boolean != self.load_mode:
			self.load_mode = boolean

			if boolean:
				# don't wait for key presses in the load mode
				curses.cbreak()
				self.win.nodelay(1)
			else:
				self.win.nodelay(0)
				curses.halfdelay(20)

	def destroy(self):
		"""Destroy all widgets and turn off curses"""
		DisplayableContainer.destroy(self)
		self.suspend()

	def handle_mouse(self):
		"""Handles mouse input"""
		try:
			event = MouseEvent(curses.getmouse())
		except _curses.error:
			return

		# from ranger import log
		# log('{0:0>28b} ({0})'.format(event.bstate))
		# log('y: {0}  x: {1}'.format(event.y, event.x))

		DisplayableContainer.click(self, event)

	def handle_key(self, key):
		"""Handles key input"""

		if hasattr(self, 'hint'):
			self.hint()

		self.env.key_append(key)

		if DisplayableContainer.press(self, key):
			return

		try:
			tup = self.env.keybuffer.tuple_without_numbers()

			if tup:
				cmd = self.commandlist[tup]
			else:
				return
		except KeyError:
			self.env.key_clear()
			return

		if hasattr(cmd, 'text'):
			if hasattr(self, 'hint'):
				self.hint(cmd.text)
		elif hasattr(cmd, 'execute'):
			cmd.execute_wrap(self)
			self.env.key_clear()

	def get_next_key(self):
		"""Waits for key input and returns the pressed key"""
		key = self.win.getch()
		curses.flushinp()
		return key

	def setup(self):
		"""Called after an initialize() call.
		Override this!
		"""
	
	def redraw(self):
		"""Redraw all widgets"""
		self.poke()
		self.draw()
		self.finalize()

	def redraw_window(self):
		"""Redraw the window. This only calls self.win.redrawwin()."""
		self.win.erase()
		self.win.redrawwin()
		self.win.refresh()
		self.win.redrawwin()
		self.need_redraw = True

	def update_size(self):
		"""Update self.env.termsize.
		Extend this method to resize all widgets!
		"""
		self.env.termsize = self.win.getmaxyx()

	def draw(self):
		"""Erase the window, then draw all objects in the container"""
		self.win.touchwin()
		DisplayableContainer.draw(self)
		self.win.refresh()

	def finalize(self):
		"""Finalize every object in container and refresh the window"""
		DisplayableContainer.finalize(self)
		self.win.refresh()