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
|
from .rounded_rect import *
from .action import *
import time
import sys
import pygame
class Key:
row_positions = {
'first': 0,
'second': 50,
'third': 100,
'fourth': 150,
'fifth': 200,
'sixth': 250,
}
default_outer_color = (120, 120, 120)
lighter_outer_color = (200, 200, 200)
default_inner_color = (255, 255, 255)
mapped_inner_color = ( 0, 255, 0)
mapped_unready_inner_color = (255, 165, 0)
def __init__(self, mapping, draw_lock, key_name, key_sym, top, left, width = 48, height = 48, disabled = False):
self.draw_lock = draw_lock
self.mapping = mapping
self.key_name = key_name
self.key_sym = key_sym
if isinstance(top, str):
self.top = self.row_positions[top]
else:
self.top = top
self.left = left
self.width = width
self.height = height
self.bottom = self.top + self.height
self.right = self.left + self.width
self.rect = (self.left, self.top, self.right, self.bottom)
self.position = (self.left, self.top)
if disabled:
self.outer_color = self.lighter_outer_color
self.linewidth = 1
else:
self.outer_color = self.default_outer_color
self.linewidth = 3
self.inner_color = self.default_inner_color
self.actions = []
def square(self, all_actions_ready):
if self.has_actions():
if all_actions_ready:
self.inner_color = self.mapped_inner_color
else:
self.inner_color = self.mapped_unready_inner_color
return RoundedRect((0, 0, self.width, self.height),
self.outer_color, self.inner_color, self.linewidth)
def collidepoint(self, position):
return self.surface.get_rect().collidepoint(
position[0] - self.position[0],
position[1] - self.position[1]
)
def draw(self, background_surface):
self.draw_lock.acquire()
all_actions_ready = self.all_actions_ready()
self.surface = self.square(all_actions_ready).surface()
if getattr(sys, 'frozen', False):
police = pygame.font.Font(sys._MEIPASS + "/Ubuntu-Regular.ttf", 14)
else:
police = pygame.font.Font("Ubuntu-Regular.ttf", 14)
text = police.render(self.key_sym, True, (0,0,0))
self.surface.blit(text, (5,5))
background_surface.blit(self.surface, self.position)
self.draw_lock.release()
return not all_actions_ready
def poll_redraw(self, background):
while True:
time.sleep(1)
if self.all_actions_ready():
self.draw(background)
self.mapping.blit()
break
def has_actions(self):
return len(self.actions) > 0
def all_actions_ready(self):
return all(action.ready() for action in self.actions)
def add_action(self, action_name, **arguments):
self.actions.append(Action(action_name, self, **arguments))
def do_actions(self):
print("running actions for {}".format(self.key_sym))
start_time = time.time()
self.mapping.start_running(self, start_time)
for action in self.actions:
if self.mapping.keep_running(self, start_time):
action.run()
self.mapping.finished_running(self, start_time)
def list_actions(self, surface):
# FIXME: Todo
print("bouh", self.key_sym)
surface.fill((255, 0, 0))
|