1
2 """
3 Task management.
4 """
5 import functools
6 import Util
10
11
12 KILLED = 0
13 RUNNING = 1
14 PAUSED = 2
15
16 -class Task(object):
17
19 super(Task, self).__init__(*a, **k)
20 self._state = RUNNING
21 self._next = []
22 self._task_manager = None
23
26
29
32
34 self._next.append(task)
35 return task
36
41
43 if self._state != KILLED:
44 self._state = PAUSED
45 return self
46
48 if self._state != KILLED:
49 self._state = RUNNING
50 return self
51
56
58 self.do_restart()
59 self._state = RUNNING
60 if self._task_manager and self._task_manager.find(self) == None:
61 manager = self._task_manager
62 self._task_manager = None
63 manager.add(self)
64 return self
65
67 self._state = KILLED
68 if self._task_manager:
69 for task in self._next:
70 self._task_manager.add(task)
71
72 return self
73
74 @property
77
78 @property
80 return self._state == PAUSED
81
82 @property
84 return self._state == KILLED
85
86 @property
89
90 @property
92 return self._task_manager
93
95 if self._task_manager and manager:
96 raise TaskError('Already attached to: ' + str(self._task_manager))
97 self._task_manager = manager
98
101
104
105 - def __init__(self, wrapped_task = None, *a, **k):
108
112
116
119
122
123 - def __init__(self, func = None, equivalent = None, *a, **k):
124 raise func != None or AssertionError
125 super(FuncTask, self).__init__(*a, **k)
126 self._func = func
127 self._equivalent = equivalent
128
131
134
142
144 return self == other or self._func == other or self._equivalent == other
145
146 func = property(_get_func, _set_func)
147
150
153
154 - def __init__(self, generator = None, equivalent = None, *a, **k):
160
164
167
180
182 return self == other or self._orig == other or self._equivalent == other
183
184 generator = property(_get_generator, _set_generator)
185
188 auto_kill = True
189 auto_remove = True
190 loop = False
191
192 - def __init__(self, tasks = [], auto_kill = None, auto_remove = None, loop = None, *a, **k):
203
210
224
225 - def add(self, task):
232
236
237 - def find(self, task):
239
244
245 @property
248
268
288
304
332
335
336 - def __init__(self, tasks = [], *a, **k):
342
344 try:
345 self._current = self._iter.next()
346 except StopIteration:
347 self.kill()
348
355
362
365 if not isinstance(task, Task):
366 if not callable(task):
367 raise TaskError('You can add either tasks or callables. ' + str(task))
368 task = FuncTask(func=task)
369 return task
370
373 equiv = [None]
374
375 @functools.wraps(orig)
376 def wrapper():
377 return GeneratorTask(orig, equiv[0])
378
379 equiv[0] = wrapper
380 return wrapper
381
385
389
390
391 -def loop(*tasks):
393
394
395 wait = WaitTask
396 fade = FadeTask
397 delay = DelayTask
400 return fade((lambda x: f(1.0 - x)), *a, **k)
401
402
403 -def linear(f, min, max, *a, **k):
404 return fade((lambda x: f(Util.linear(min, max, x))), *a, **k)
405
406
407 try:
408 import math
409
410 - def sinusoid(f, min = 0.0, max = 1.0, *a, **k):
411 return fade((lambda x: f(min + (max - min) * math.sin(x * math.pi / 2.0))), *a, **k)
412
413
414 except ImportError as err:
415 pass
416
417 -def run(func, *a, **k):
418 return FuncTask(lambda t: None if func(*a, **k) else None)
419
425