-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevents.py
More file actions
149 lines (119 loc) · 4.25 KB
/
Copy pathevents.py
File metadata and controls
149 lines (119 loc) · 4.25 KB
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
import pygame
import thread, threading
class Event(object):
def __init__(self, handler, obj, evaluation):
self.eval = lambda : evaluation(obj)
self._owner = obj
self._handler = handler
def __call__(self):
self._handler()
class EventManager(object):
def OnSet(self, y):
with self.OnLock:
self._on = y
def OnGet(self):
with self.OnLock:
on = self._on
return on
def OnDel(self):
with self.OnLock:
del self._on
on = property(OnGet, OnSet, OnDel, 'Thread safe status property')
def __init__(self, event_list=[]):
self.OnLock = threading.Lock()
self._events = event_list
self._on = True
def run(self):
while self.on:
for i in range(self._events.__len__()):
if self._events[i].eval() == True:
self._events[i]()
print 'Manager is now off'
def Off(self):
self.on = False
thread.exit()
def AddEvent(self, handler, obj, evaluation):
new_event = Event(handler, obj, evaluation)
self._events.append(new_event)
return new_event
def RemoveHookHandler(self, event):
self._events.remove(event)
return
def append(self, item):
if isinstance(item, Event):
self._events.append(item)
def remove(self, item):
if isinstance(item, Event):
self._events.remove(item)
class LockedList(object):
def __enter__(self):
self.Lock.acquire()
return self._list
def __exit__(self, exc_type, exc_val, exc_traceback):
self.Lock.release()
def __init__(self):
self.Lock = threading.Lock()
self._list = []
def __getitem__(self, i):
with self.Lock:
return self.__dict__['_list'][i]
def __len__(self):
with self.Lock:
return self.__dict__['_list'].__len__()
def append(self, x):
with self.Lock:
self.__dict__['_list'].append(x)
def remove(self, x):
with self.Lock:
if x is not None:
if x in self.__dict__['_list']:
self.__dict__['_list'].remove(x)
class GuiManager(EventManager):
def __init__(self, tree_max=3):
self.OnLock = threading.Lock()
self._tree_max = tree_max
self._widgets = LockedList()
self._on = True
for counter in range(tree_max):
self._widgets.append([])
if True:
pass
def run(self):
while self.on:
event = pygame.event.wait()
if event.type is pygame.MOUSEBUTTONUP:
x = event.pos[0]
y = event.pos[1]
with self._widgets as Widgets:
for tree in Widgets:
for widget in tree:
if widget.active and (pygame.MOUSEBUTTONUP in widget.eventTypes) and widget.Within(x, y):
widget.OnClick()
continue
print '({0},{1})\n'.format(str(x), str(y))
elif event.type is pygame.KEYUP:
with self._widgets as Widgets:
for tree in Widgets:
for widget in tree:
if widget.active and ( pygame.KEYUP in widget.eventTypes):
widget.OnKey(event.key, pygame.key.get_mods())
if event.key <= 122:
print str(event.key) + ', ' + str(bin(pygame.key.get_mods())) + '\n'
def append(self, list=None, item=None, tree=0):
if list is not None:
if tree <= self._tree_max:
with self._widgets as Widgets:
for widget in list:
Widgets[tree].append(item)
elif item is not None:
self._widgets[tree].append(item)
def remove(self, widget, tree=0):
try:
with self.OnLock:
self._widgets[tree].remove(widget)
except ValueError:
return False
except IndexError:
return False
else:
return True