140 lines
3.6 KiB
Python
140 lines
3.6 KiB
Python
|
#!/usr/bin/python3
|
||
|
|
||
|
import pygame
|
||
|
from wobbl_tools import pg
|
||
|
|
||
|
|
||
|
class GUI:
|
||
|
def __init__(self, app):
|
||
|
self.app = app
|
||
|
|
||
|
self.buttons = {}
|
||
|
|
||
|
self.example_menu = ExampleMenu(self)
|
||
|
self.multiline_text_example = MultilineTextExample(self)
|
||
|
|
||
|
self.current_page = "example_menu"
|
||
|
|
||
|
self.pages = self.get_list_of_pages()
|
||
|
|
||
|
def draw(self):
|
||
|
page = getattr(self, self.current_page)
|
||
|
page.draw()
|
||
|
|
||
|
def update(self):
|
||
|
for page_name in self.pages:
|
||
|
page = getattr(self, page_name)
|
||
|
page.update()
|
||
|
|
||
|
def get_list_of_pages(self):
|
||
|
pages = []
|
||
|
|
||
|
for name, page in self.__dict__.items():
|
||
|
if issubclass(type(page), Page):
|
||
|
pages.append(name)
|
||
|
|
||
|
return pages
|
||
|
|
||
|
def reload(self):
|
||
|
for page_name in self.pages:
|
||
|
page = getattr(self, page_name)
|
||
|
page.load()
|
||
|
|
||
|
|
||
|
class Page:
|
||
|
def __init__(self, gui):
|
||
|
self.gui = gui
|
||
|
self.app = gui.app
|
||
|
|
||
|
self.surface = pygame.Surface(self.app.screen.get_size(), flags=pygame.SRCALPHA)
|
||
|
|
||
|
self.load()
|
||
|
self.update()
|
||
|
|
||
|
def draw(self):
|
||
|
self.app.screen.blit(self.surface, (0, 0))
|
||
|
|
||
|
def update(self):
|
||
|
pass
|
||
|
|
||
|
def load(self):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class ExampleMenu(Page):
|
||
|
def load(self):
|
||
|
button_texts = ["Multiline Text"]
|
||
|
|
||
|
buttons = []
|
||
|
|
||
|
for button_text in button_texts:
|
||
|
name_lower = button_text.lower().replace(" ", "_")
|
||
|
|
||
|
setattr(self, name_lower + "_button", len(buttons))
|
||
|
|
||
|
buttons.append(pg.TextButton(button_text, (0, 0), change_page, (self, name_lower + "_example")))
|
||
|
|
||
|
start_pos = (10, 10)
|
||
|
spacing = 10
|
||
|
|
||
|
x, y = start_pos
|
||
|
|
||
|
i = 0
|
||
|
|
||
|
for button in buttons:
|
||
|
if x + button.surface.get_width() > self.app.screen.get_width():
|
||
|
x = start_pos[0]
|
||
|
y += button.surface.get_height() + spacing
|
||
|
|
||
|
button.position = (x, y)
|
||
|
|
||
|
else:
|
||
|
button.position = (x, y)
|
||
|
|
||
|
w, h = button.size
|
||
|
|
||
|
button.rect = pygame.Rect((x, y), (w, h))
|
||
|
button.button = pg.Button(button.rect, button.function, button.args, key=button.key)
|
||
|
|
||
|
buttons[i] = button
|
||
|
|
||
|
x += button.surface.get_width() + spacing
|
||
|
|
||
|
i += 1
|
||
|
|
||
|
self.gui.buttons["example_menu"] = buttons
|
||
|
|
||
|
def update(self):
|
||
|
self.surface.fill((20, 20, 20))
|
||
|
|
||
|
for button in self.gui.buttons["example_menu"]:
|
||
|
button.draw(self.surface)
|
||
|
|
||
|
|
||
|
class MultilineTextExample(Page):
|
||
|
def load(self):
|
||
|
self.heading = self.app.big_font.render("Multiline Text", True, pg.white)
|
||
|
|
||
|
self.text = pg.MultilineText(
|
||
|
"If you want to create multiple lines of text in pygame, " +
|
||
|
"you have to create multiple text objects and blit them one another.\n" +
|
||
|
'The class "MultilineText()" does this automatically. ' +
|
||
|
'You can make new lines by adding "\\n" to the string. ' +
|
||
|
"It can also automatically create newlines if the line is longer than a given length.\n" +
|
||
|
"You can resize this window and the text will automatically fit on the window.",
|
||
|
max_width=self.app.screen.get_width()
|
||
|
)
|
||
|
|
||
|
def update(self):
|
||
|
self.surface = pygame.transform.scale(self.surface, self.app.screen.get_size())
|
||
|
self.surface.fill((20, 20, 20))
|
||
|
|
||
|
self.load()
|
||
|
|
||
|
self.surface.blit(self.heading, (self.app.screen.get_width() / 2 - self.heading.get_width() / 2, 10))
|
||
|
self.surface.blit(self.text.surface, (10, 50))
|
||
|
|
||
|
|
||
|
def change_page(self, page):
|
||
|
self.gui.current_page = page
|