"""We show here how to extend a Style class to create a custom one and use it for a given element only."""

import pygame, math, thorpy as tp


screen = pygame.display.set_mode((1200, 700))
tp.init(screen, tp.theme_human) #bind screen to gui elements and set theme

#In this style, we will simply make a blinking red background
class MyStyle1(tp.styles.SimpleStyle):

    def __init__(self):
        self.nframes = 30
        self.frame_mod = 1

    def generate_images(self, text, arrow=False):
        """Here, we generate the frames of the blinking element.
        We simply generate the images as a 'standard' SimpleFrame,
        except we slightly adjust the color properties for each frame."""
        surfaces = []
        for i in range(self.nframes):
            self.bck_color = (200 + 55 * math.sin(i*math.pi/self.nframes),0,0)
            self.font_color = (255-self.bck_color[0],)*3
            surfaces += tp.styles.SimpleStyle.generate_images(self, text, arrow)
        return surfaces

#here we will go from a lower level to make polygonal frame for buttons
class MyStyle2(tp.styles.TextStyle):
    bck_color = (90,90,150)
    font_color = (0,0,0)
    margins = (16,16)

    def __init__(self):
        self.thickness = 1
        self.border_color = (0,0,0)
    def generate_images(self, text, arrow=False):
        bck_color = self.bck_color
        self.bck_color = (0,0,0,0)
        surface = tp.styles.TextStyle.generate_images(self, text, arrow)[0]
        self.bck_color = bck_color
        w,h = surface.get_size()
        mx, my = self.margins
        t = self.thickness
        points = (0, my), (mx,0), (w-t,0), (w-t,h-my), (w-mx, h-t), (0,h-t)
        pygame.draw.polygon(surface, self.bck_color[0:3], points)
        pygame.draw.polygon(surface, self.border_color, points, t)
        self.reblit_text(surface, text, arrow)
        return [surface]
    def copy(self):
        c =  super().copy()
        c.thickness = self.thickness
        c.border_color = self.border_color
        return c

style_normal = MyStyle1()
my_button1 = tp.Button("Hello, world.\nThis is a useless button.",
my_button1.set_style_attr("font_color", (0,255,0), "hover")
my_button1.set_style_attr("border_color", (0,255,0), "hover")

style_normal = MyStyle2()
my_button2 = tp.Button("Hello, world.\nThis is a useless button.",
my_button2.set_style_attr("font_color", (0,255,0), "hover")
my_button2.set_style_attr("border_color", (0,255,0), "hover")

def before_gui(): #add here the things to do each frame before blitting gui elements
tp.call_before_gui(before_gui) #tells thorpy to call before_gui() before drawing gui.

group = tp.Group([my_button1, my_button2], gap=50)

#For the sake of brevity, the main loop is replaced here by a shorter but blackbox-like method
player = group.get_updater().launch()