#!/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