-
Notifications
You must be signed in to change notification settings - Fork 0
/
ui.py
138 lines (107 loc) · 3.76 KB
/
ui.py
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
import pygame
class Widget:
CONTAINER = {}
def __init__(self, hidden):
self.is_hidden = hidden
self.obj_name = 'UNNAMED'
def hide(self):
self.is_hidden = True
def show(self):
self.is_hidden = False
def add_to_draw_queue(self, obj_name):
self.obj_name = obj_name
Widget.CONTAINER[obj_name] = self
def remove_from_draw_queue(self):
Widget.CONTAINER.pop(self.obj_name)
def draw(self, screen):
pass
class Text(Widget):
def __init__(self, font_name, font_size, text, color, pos):
super().__init__(False)
self.font = pygame.font.Font(font_name, font_size)
self.color = color
self.rendered = self.font.render(text, True, self.color)
self.rect = self.rendered.get_rect()
self.rect.left, self.rect.top = pos
def set_text(self, text):
self.rendered = self.font.render(text, True, self.color)
self.rect = self.rendered.get_rect()
def get_wh(self):
return self.rect.width, self.rect.height
def move(self, pos):
self.rect.left, self.rect.top = pos
def draw(self, screen):
if self.is_hidden:
return
screen.blit(self.rendered, self.rect)
class Button(Widget):
def __init__(self, text: Text, color, rect=None, image=None, image_pos=None):
super().__init__(False)
self.text = text
self.color = color
if rect is None:
self.is_image = True
self.image = image
self.pos = image_pos
else:
self.is_image = False
self.rect = rect
self.text.move(
(self.get_pos()[0] + self.get_wh()[0] // 2 - self.text.get_wh()[0] // 2,
self.get_pos()[1] + self.get_wh()[1] // 2 - self.text.get_wh()[1] // 2)
)
def get_wh(self):
if self.is_image:
return self.image.get_rect().width, self.image.get_rect().height
else:
return self.rect.width, self.rect.height
def get_pos(self):
if self.is_image:
return self.image.get_rect().left, self.image.get_rect().top
else:
return self.rect.left, self.rect.top
def move(self, pos):
if self.image:
self.image.get_rect().left, self.image.get_rect().top = pos
else:
self.rect.left, self.rect.top = pos
def get_collide_rect(self):
if self.is_image:
return self.image.get_rect()
return self.rect
def draw(self, screen):
if self.is_hidden:
return
if self.is_image:
screen.blit(self.image, self.pos)
else:
pygame.draw.rect(screen, self.color, self.rect)
self.text.draw(screen)
class TextBox(Widget):
def __init__(self, text: Text, color, center_pos_x, center_pos_y, margin_x=20, margin_y=10):
super().__init__(False)
self.text = text
self.color = color
self.rect = pygame.Rect(
center_pos_x - self.text.get_wh()[0] // 2 - margin_x,
center_pos_y - self.text.get_wh()[1] // 2 - margin_y,
self.text.get_wh()[0] + margin_x * 2,
self.text.get_wh()[1] + margin_y * 2
)
self.text.move(
(center_pos_x - self.text.get_wh()[0] // 2,
center_pos_y - self.text.get_wh()[1] // 2)
)
def get_wh(self):
return self.rect.width, self.rect.height
def get_pos(self):
return self.rect.left, self.rect.top
def move(self, pos):
self.rect.left, self.rect.top = pos
def get_collide_rect(self):
return self.rect
def draw(self, screen):
if self.is_hidden:
return
pygame.draw.rect(screen, self.color, self.rect)
self.text.draw(screen)