import math
import random
import time
import os

START = time.time()
_START = time.time()

from optparse import OptionParser
...
parser = OptionParser()
parser.add_option("-m", "--mode", dest="mode",
                  help="pixel mode") #, metavar="FILE")

parser.add_option("-X", "--XX", dest="XX", #default=1,
                  help="x-split") #, metavar="FILE")

parser.add_option("-x", "--xx", dest="xsplit", #default=1,
                  help="x-split") #, metavar="FILE")
parser.add_option("-y", "--yy", dest="ysplit",#default=1,
                  help="y-split") #, metavar="FILE")

parser.add_option("-s", "--start-univ", dest="start_univ",#default=1,
                  help="set start-univers default=2") #, metavar="FILE")

parser.add_option("-g", "--gobo-ch", dest="gobo_ch",#default=1,
                  help="gobo ch univ on 1") #, metavar="FILE")

#parser.add_option("-f", "--file", dest="filename",
#                  help="write report to FILE", metavar="FILE")
#parser.add_option("-q", "--quiet",
#                  action="store_false", dest="verbose", default=True,
#                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()


# ===== GUI =========
import pygame
import pygame.gfxdraw
import pygame.font

os.environ['SDL_VIDEO_WINDOW_POS'] = '%i,%i' % (200,164)
os.environ['SDL_VIDEO_CENTERED'] = '0'

pg = pygame
pygame.init()
pygame.mixer.quit()


f = pygame.font.get_fonts()
for i in f:
    if "mono" in i.lower():
        print(i)
    

font0 = pygame.font.SysFont("FreeSans",10)
font = pygame.font.SysFont("freemonobold",22)
font10 = pygame.font.SysFont("freemonobold",10)
font12 = pygame.font.SysFont("freemonobold",12)
font15 = pygame.font.SysFont("freemonobold",15)
#font = pygame.font.SysFont(None,30)

fr = font.render("hallo" ,1, (200,0,255))

class Layout():
    def __init__(self,master):
        self.master = master
    def pack(self,**args):
        pass
    def grid(self,**args):
        pass
    def bind(self,**args):
        pass

class Button():
    def __init__(self,window,pos):
        self.window = window
        self.event_pos = [0,0]
        self.w = 20
        self.h = 10
        self.pos = pos
        self.bd = [0,255,0]

        self.rgb = (0xaa,0xaa,0xaa,127)
        self.__layout = Layout(self)
        self.pack = self.__layout.pack
        self.grid = self.__layout.grid
        self.bind = self.__layout.bind
        
        self.motion = 0

    def draw(self):
        #pos = [160,100,70,60]
        #rgb = (0xdd,0xdd,0xdd,0)
        #rgb = (0xaa,0xaa,0xaa,0)
        pos = self.pos
        rgb = self.rgb
        window.set_alpha(128)  
        pygame.draw.rect(self.window,rgb,pos)

        fr = font0.render("GOBO-123" ,1, (0,0,0))
        #fr = font.render("You win!", True, BLACK)
        #text_rect = fr.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2))
        self.window.blit(fr,(pos[0]+4,pos[1]+4))


        self._check_event()
        self._draw_bd(delta=-1)
        self._draw_bd(delta=-2,highlight=1,color=self.bd)

    def _check_event(self):
        self.bd = [0,255,0]
        self.motion = 0
        if self.event_pos[0] < self.pos[0]+1: 
            return #continue
        if self.event_pos[0] > self.pos[0]+self.pos[2]-1: 
            return #continue
        
        if self.event_pos[1] < self.pos[1]+1: 
            return #continue
        if self.event_pos[1] > self.pos[1]+self.pos[3]-1: 
            return #continue

        #print(">>",self.event_pos)
        self.bd = [255,0,0]
        self.motion = 1

    def _draw_bd(self,delta=0,highlight=0,color=[0,0,0]):
        pos = self.pos
        d = delta
        xpos = ( 
                (pos[0]-d        ,pos[1]-d),
                (pos[0]+pos[2]+d-1 ,pos[1]-d),
                (pos[0]+pos[2]+d-1 ,pos[1]+pos[3]+d-1),
                (pos[0]-d        ,pos[1]+pos[3]+d-1)
                )
        i_old = None
        ypos = []
        for i in xpos:
            if i_old:
                ypos.append( (i_old,i)   )
            i_old = i

        ypos.append( (i_old,xpos[0])   )

        for i in ypos:
            #print("ypos",i)
            pygame.draw.aaline(window,color,i[0],i[1],1)

    def event(self,event=None):
        #print(self.pos)
        if "pos" in event.dict:
            self.event_pos = event.pos
            self._check_event()

        if self.motion:
            #print(self,"Motion.event",event)

            if "button" in event.dict:
                print("-",self,"Button.event",event)

main_size=(600,500)
window = pygame.display.set_mode(main_size,pg.RESIZABLE,32)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom

pg.display.set_caption('NEXTGEN GUI')

class Gevent():
    def __init__(self):
        self.drag = 0
        self.pos1 = [0,0]
        self.pos2 = [0,0]
        self.event_pos = [0,0]
        self.gain = 0

    def draw(self,delta=0,highlight=0,color=[0,255,0]):
        if self.pos1 == [0,0]:
            return
        if self.pos2 == [0,0]:
            return

        pos1 = [self.pos1[0],self.pos1[1]]
        pos2 = [self.pos2[0],self.pos2[1]]
        #pygame.draw.aaline(window,color,pos1,pos2,1)
 

        color = [200,0,0,127]


        # h unten
        pos1 = [self.pos1[0],self.pos2[1]]
        pos2 = [self.pos2[0],self.pos2[1]]
        pygame.draw.aaline(window,color,pos1,pos2,1)

        color = [200,200,0,127]
        # h rechts
        pos1 = [self.pos2[0],self.pos1[1]]
        pos2 = [self.pos2[0],self.pos2[1]]
        pygame.draw.aaline(window,color,pos1,pos2,1)


        color = [0,200,0,127]
        # h links
        pos1 = [self.pos1[0],self.pos1[1]]
        pos2 = [self.pos1[0],self.pos2[1]]
        pygame.draw.aaline(window,color,pos1,pos2,1)


        # h oben
        pos1 = [self.pos1[0],self.pos1[1]]
        pos2 = [self.pos2[0],self.pos1[1]]
        pygame.draw.aaline(window,color,pos1,pos2,1)


    def event(self,event):
        print("GLOBAL",self,self.event_pos,event)

        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit(0)
        elif event.type == pygame.VIDEORESIZE:
            scrsize = event.size
            width   = event.w
            hight   = event.h
            screen = pygame.display.set_mode(scrsize,pg.RESIZABLE)
            changed = True



        if "pos" in event.dict:
            self.event_pos = event.pos
            #self._check_event()

        if "button" in event.dict:
            self.pos1 = self.event_pos

        if "buttons" in event.dict:
            if event.buttons[0] == 1:
                self.pos2 = self.event_pos
                self.drag = 1
            else:
                self.pos1 = [0,0]
                self.pos2 = [0,0]
                self.drag = 0

        if "gain" in event.dict:
            self.gain = event.gain
global_event = Gevent()


def main():
    START = time.time()
    running = 1
    frame   = 0
    fps = 0

    b0 = Button(window,pos=[80,80,50,40])
    b1 = Button(window,pos=[100,100,60,40])
    b2 = Button(window,pos=[200,200,60,40])
    b2a = Button(window,pos=[260,200,60,40])
    b3 = Button(window,pos=[1500,800,60,40])
    while running:
        pygame.display.flip()
        #event()
        pos = [160,10,70,60]
        rgb = (0xdd,0xdd,0xdd,0)
        rgb = (0xaa,0xaa,0xaa,0)
        
        window.fill((0,0,0))
        fr = font15.render("{}".format(pos[1]) ,1, (200,200,200))
        window.blit(fr,(10,pos[1] ))
        fr = font15.render("{}".format(fps) ,1, (200,200,200))
        window.blit(fr,(30,pos[1] ))

        fr = font15.render("{}".format(frame) ,1, (200,200,200))
        window.blit(fr,(60,pos[1] ))

        fr = font15.render("{:03}".format(int((START+1-time.time())*100)) ,1, (200,200,200))
        window.blit(fr,(80,pos[1] ))
        #print(window,rgb,pos)
        #pygame.draw.rect(window,rgb,pos)
        #pygame.draw.rect(window,(255,0,0),(15,15,20,10))

        for event in pygame.event.get(): 
            global_event.event(event)
            b0.event(event)
            b1.event(event)
            b2.event(event)
            b2a.event(event)
            b3.event(event)
        
        c = (200,200,200)
        if global_event.gain:
            c = (0,255,0)
        fr = font15.render("{:03}/{:03}".format(global_event.event_pos[0],global_event.event_pos[1]) ,1, c)
        window.blit(fr,(120,pos[1] ))

        b0.draw()
        b1.draw()
        b2.draw()
        b2a.draw()
        b3.draw()

        global_event.draw()

        
        pygame.display.flip()
        pg.time.wait(30)
        pg.time.wait(30)

        frame += 1
        if START+1 < time.time():
            fps = frame
            frame = 0
            START = time.time()


if __name__ == "__main__":
    main()