-
Notifications
You must be signed in to change notification settings - Fork 0
/
GUI.py
111 lines (77 loc) · 2.94 KB
/
GUI.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
import pygame
import pygame_gui
from EventHandler import EventHandler
from abc import ABC, abstractmethod
class GUI:
pass
class State(ABC):
class Quit(Exception):
pass
userInterface: GUI
@abstractmethod
def run(self):
pass
class GUI:
currentWindow: State
def __init__(self):
pass
def changeWindow(self, state: State):
self.state = state
class SimpleMenuState:
options: list
userInterface: GUI
def __init__(self, userInterface: GUI):
self.userInterface = userInterface
self.optionNames = []
self.states = []
self.size = (200, 200)
self._buttonSize = (40, 10)
self.color = '#000000'
def addOption(self, optionName: str, nextState: State):
self.optionNames.append(optionName)
self.states.append(nextState)
def setSize(self, size):
self.size = size
def setColor(self, color):
self.color = color
def setButtonsDimension(self, buttonSize: tuple):
self._buttonSize = buttonSize
def _initMenu(self):
self._windowSurface = pygame.display.set_mode(self.size)
self._background = pygame.Surface(self.size)
self._background.fill(pygame.Color(self.color))
self._manager = pygame_gui.UIManager(self.size)
self._clock = pygame.time.Clock()
self._buttons = []
self._eventHandler = EventHandler()
x, y = self.size
for index, buttonName in enumerate(self.optionNames):
self._buttons += [
pygame_gui.elements.UIButton(relative_rect=pygame.Rect((x//2 - self._buttonSize[0]//2, (y*index+y//2)//len(self.optionNames)- self._buttonSize[1]//2), self._buttonSize),
text=buttonName,
manager=self._manager)]
for button, state in zip(self._buttons, self.states):
self._eventHandler.addEvent(button, self.userInterface.changeWindow, (state, ))
def _updateMenu(self):
stop = False
time_delta = self._clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
raise State.Quit()
if event.type == pygame.USEREVENT:
if event.user_type == pygame_gui.UI_BUTTON_PRESSED:
self._eventHandler.postEvent(event.ui_element)
stop = True
self._manager.process_events(event)
self._manager.update(time_delta)
return stop
def _render(self):
self._windowSurface.blit(self._background, (0, 0))
self._manager.draw_ui(self._windowSurface)
pygame.display.update()
def run(self):
self._initMenu()
stop = False
while not stop:
stop = self._updateMenu()
self._render()