Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/shell/WindowManager.py
blob: 2ae1cba4c5fc6f94644e7e73352a578d24705dd7 (plain)
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
import pygtk
pygtk.require('2.0')
import gtk
import gobject

class WindowManager:
	__managers_list = []

	CENTER = 0
	LEFT = 1
	RIGHT = 2
	BOTTOM = 3
	
	ABSOLUTE = 0
	SCREEN_RELATIVE = 1
	
	VISIBLE = 0
	SLIDED_IN = 1
	HIDDEN = 2

	def __init__(self, window):
		self._window = window
		self._visibility = WindowManager.HIDDEN

		WindowManager.__managers_list.append(self)
		
		window.connect("key-press-event", self.__key_press_event_cb)
		window.connect("focus-in-event", self.__focus_in_event_cb)
		window.connect_after("focus-out-event", self.__focus_out_event_cb)

	def has_focus(self):
		return self._window.has_toplevel_focus()

	def _update_visibility(self):
		show_slided_in = False
	
		for manager in WindowManager.__managers_list:
			if manager.has_focus():
					show_slided_in = True
					
		if manager._visibility is WindowManager.VISIBLE:
			manager._window.show()
		elif manager._visibility is WindowManager.HIDDEN:
			manager._window.hide()
		elif manager._visibility is WindowManager.SLIDED_IN:
			if show_slided_in:
				manager._window.show()
			else:
				manager._window.hide()

	def __focus_change_idle(self):
		self._update_visibility()
		return False

	def __focus_in_event_cb(self, window, event):
		gobject.idle_add(self.__focus_change_idle)
				
	def __focus_out_event_cb(self, window, event):
		gobject.idle_add(self.__focus_change_idle)
		
	def __key_press_event_cb(self, window, event):
		manager = None

		if event.keyval == gtk.keysyms.Left and \
		   event.state & gtk.gdk.CONTROL_MASK:
			for wm in WindowManager.__managers_list:
				if wm._position == WindowManager.LEFT:
					manager = wm

		if manager and manager._window.get_property('visible'):
			manager.slide_window_out()
		elif manager:
			manager.slide_window_in()
	
	def set_width(self, width, width_type):
		self._width = width
		self._width_type = width_type
				
	def set_height(self, height, height_type):
		self._height = height
		self._height_type = height_type
	
	def set_position(self, position):
		self._position = position

	def _update_size_and_position(self):
		screen_width = self._window.get_screen().get_width()
		screen_height = self._window.get_screen().get_height()
		
		if self._width_type is WindowManager.ABSOLUTE:
			width = self._width			
		elif self._width_type is WindowManager.SCREEN_RELATIVE:
			width = int(screen_width * self._width)

		if self._height_type is WindowManager.ABSOLUTE:
			height = self._height			
		elif self._height_type is WindowManager.SCREEN_RELATIVE:
			height = int(screen_height * self._height)
			
		if self._position is WindowManager.CENTER:
			x = int((screen_width - width) / 2)
			y = int((screen_height - height) / 2)
		elif self._position is WindowManager.LEFT:
			x = 0
			y = int((screen_height - height) / 2)
			
		self._window.move(x, y)
		self._window.resize(width, height)

	def slide_window_in(self):
		self._visibility = WindowManager.SLIDED_IN
		self._update_visibility()
	
	def slide_window_out(self):
		self._visibility = WindowManager.HIDDEN
		self._update_visibility()
	
	def show(self):
		self._visibility = WindowManager.VISIBLE
	
	def manage(self):
		self._update_size_and_position()
		self._update_visibility()