Преглед на файлове

refactory: Xevent to tk_event

micha преди 11 месеца
родител
ревизия
d4be4f4e0d
променени са 9 файла, в които са добавени 1027 реда и са изтрити 951 реда
  1. 12 860
      _LibreLightDesk.py
  2. 2 2
      lib/jsbc.py
  3. 123 14
      lib/libtk.py
  4. 18 9
      lib/libwin.py
  5. 1 1
      lib/mytklib.py
  6. 791 0
      lib/tkevent.py
  7. 27 27
      tkgui/GUI.py
  8. 3 3
      tkgui/dialog.py
  9. 50 35
      tkgui/draw.py

Файловите разлики са ограничени, защото са твърде много
+ 12 - 860
_LibreLightDesk.py


+ 2 - 2
lib/jsbc.py

@@ -36,8 +36,8 @@ def JSCB(x,sock=None):
                         VAL=msg["VAL"]
                     if "ATTR" in msg:
                         ATTR=msg["ATTR"]
-                    print("  Xevent",FIX,VAL,ATTR)
-                    #cb = Xevent(fix=FIX,elem=None,attr=ATTR,mode="ENCODER",data=[]) #data)
+                    print("  MAIN.tk_event",FIX,VAL,ATTR)
+                    #cb = MAIN.tk_event(fix=FIX,elem=None,attr=ATTR,mode="ENCODER",data=[]) #data)
                     #MAIN.FIXTURES.encoder(str(FIX),ATTR,xval="click",xfade=0,xdelay=0)#,blind=0)
                     MAIN.FIXTURES.encoder(str(FIX),ATTR,xval=VAL,xfade=0,xdelay=0)#,blind=0)
 

+ 123 - 14
lib/libtk.py

@@ -2,15 +2,124 @@
 
 import os
 import time
+import sys
+sys.path.insert(0,"/opt/LibreLight/Xdesk/")
 
 import tkinter
 tk = tkinter
 
 import __main__ as MAIN
-from lib.cprint import *
 
+from lib.cprint import cprint
 import lib.libwin as libwin
-
+import lib.baselib as baselib
+
+import json
+
+
+_config = []
+try: 
+    h = os.environ["HOME"]
+    lines = [{}]
+    try: 
+        f = open(h +"/LibreLight/config.json")
+        lines = f.readlines()
+
+    except FileNotFoundError as e: #Exception as e:
+        f = open(h +"/LibreLight/config.json","w")
+        f.write('{"POS_TOP":0}\n{"POS_LEFT":0}')
+        f.close()
+        cprint("Exception:",e)
+
+    cprint("config read")
+    for line in lines:
+        line=line.strip()
+        print("   config:",line)
+        row = json.loads(line) 
+        _config.append(row)
+
+except Exception as e:
+    cprint("Exception:",e)
+
+
+
+_POS_LEFT = 0
+_POS_TOP  = 15
+try: 
+    for row in _config:
+        #print("   config:",row)
+        if "POS_LEFT" in row:
+           _POS_LEFT = int(row["POS_LEFT"]) 
+        if "POS_TOP" in row:
+           _POS_TOP = int(row["POS_TOP"]) 
+except Exception as e:
+    cprint("Exception:",e)
+
+
+def frame_of_show_list(frame,cb=None):
+    c=0
+    r=0
+    base = baselib.Base()
+    for i in ["name","stamp"]: #,"create"]:
+        b = tk.Label(frame,bg="grey",text=i)
+        b.grid(row=r, column=c, sticky=tk.W+tk.E)
+        c+=1
+    r+=1
+    blist = baselib.list_shows()
+    for i in range(10):
+        blist.append(["",""])
+
+    if cb is None: 
+        cb = DummyCallback #("load_show_list.cb")
+
+    for i in blist:
+        #print(i)
+        c=0
+        for j in i:
+            bg="lightgrey"
+            dbg="lightgrey"
+            if i[1] > time.strftime("%Y-%m-%d %X",  time.localtime(time.time()-3600*4)):
+                dbg = "lightgreen"
+            elif i[1] > time.strftime("%Y-%m-%d %X",  time.localtime(time.time()-3600*24*7)):
+                dbg = "green"
+
+
+            if c > 0:
+                b = tk.Button(frame,text=j,anchor="w",bg=dbg,relief="sunken")
+                b.config(activebackground=dbg)
+                b.grid(row=r, column=c, sticky=tk.W+tk.E)
+            else:
+                if base.show_name == i[0]:
+                    bg="green"
+                _cb = cb(j)
+                b = tk.Button(frame,text=j,anchor="w",height=1,bg=bg,command=_cb.cb)
+
+                if base.show_name == i[0]:
+                    b.config(activebackground=bg)
+                b.grid(row=r, column=c, sticky=tk.W+tk.E)
+            c+=1
+        r+=1
+
+
+class BLINKI():
+    def __init__(self,e):
+        self.e = e
+    def blink(self):
+        e = self.e
+        e.config(bg='green')
+        duration = 150
+        for i in range(8):
+            d = i * duration
+            if i % 2 == 0:
+                e.after(d, lambda: e.config(bg='white')) # after 1000ms
+                e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
+            else:
+                e.after(d, lambda: e.config(bg='orange')) # after 1000ms
+                e.after(d, lambda: e.config(activebackground='orange')) # after 1000ms
+        i+=1
+        duration = 150
+        e.after(d, lambda: e.config(bg='white')) # after 1000ms
+        e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
 
 class on_focus():
     def __init__(self,name,mode):
@@ -60,7 +169,7 @@ class Window():
 
         if self.args["master"]: 
             self.tk = tkinter.Tk()
-            self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
+            self.tk.protocol("WM_DELETE_WINDOW", self.close)
             self.tk.withdraw() # do not draw
             self.tk.resizable(self.args["resize"],self.args["resize"])
             self.tk.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
@@ -80,7 +189,7 @@ class Window():
             self.tk = tkinter.Toplevel()
             self.tk.iconify()
             #self.tk.withdraw() # do not draw
-            self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
+            self.tk.protocol("WM_DELETE_WINDOW", self.close)
             self.tk.resizable(self.args["resize"],self.args["resize"])
             
             try:
@@ -118,7 +227,7 @@ class Window():
             if self.args["top"] is not None:
                 geo += "+{}".format(self.args["top"])
 
-        #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
+        #self._event_clear = MAIN.tk_event(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
         self.tk.geometry(geo)
         self.show()
 
@@ -126,10 +235,10 @@ class Window():
         if MAIN.INIT_OK:
             tkinter.Tk.update_idletasks(MAIN.gui_menu_gui.tk)
 
-    def close_app_win(self,event=None):
-        cprint("close_app_win",event,self.args["title"],color="red")
-        cprint("  ",self.title)
-        cprint("  ",self.args)
+    def close(self,event=None):
+        cprint("Window.close",self.args["title"],color="red")
+        #cprint("  ",self.title)
+        #cprint("  ",self.args)
 
         if self.args["title"] == "MAIN":
             MAIN.save_show()
@@ -137,7 +246,7 @@ class Window():
         try:
             self.tk.destroy()
         except Exception as e:
-            cprint("close_app_win exc",e,color="red")
+            cprint("Window.close err",e,color="red")
 
     def title(self,title=None):
         if title is None:
@@ -180,7 +289,7 @@ class Window():
                     MAIN.save_show()
 
                     e = MAIN.master.setup_elem["SAVE\nSHOW"]
-                    b = MAIN.BLINKI(e)
+                    b = BLINKI(e)
                     b.blink()
                 if str(event.keysym) == "c":
                     if MAIN.save_show():
@@ -255,9 +364,9 @@ class Window():
                     cprint(e)
                 e =  MAIN.master.setup_elem["SAVE\nSHOW"]
                 cprint(e)
-                b = MAIN.BLINKI(e)
+                b = BLINKI(e)
                 b.blink()
-                #e = Xevent(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
+                #e = MAIN.tk_event(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
                 #e.cb(event=event)
             elif "End" == event.keysym:
                 MAIN.FIXTURES.fx_off("all")
@@ -272,7 +381,7 @@ class Window():
  
 
 class PopupList():
-    def __init__(self,name="<NAME>",master=0,width=400,height=450,exit=1,left=MAIN._POS_LEFT+400,top=MAIN._POS_TOP+100,cb=None,bg="black"):
+    def __init__(self,name="<NAME>",master=0,width=400,height=450,exit=1,left=_POS_LEFT+400,top=_POS_TOP+100,cb=None,bg="black"):
         self.name = name
         self.frame = None
         self.bg=bg

+ 18 - 9
lib/libwin.py

@@ -38,21 +38,29 @@ def save_window_position(save_as=""):
             if "tk" not in dir(win):
                 continue
 
-            geo = win.tk.geometry()
-            data = [1,k,geo]
-            if k not in  window_list_buffer:
-                cprint("  -- new:win:pos",k.ljust(15," "),data)
-            elif window_list_buffer[k][2] != geo:
-                cprint("  -- update:win:pos",k.ljust(15," "),data)
+            data = [0,k,'']
+            if win.tk.winfo_exists():
+                data[2] = win.tk.geometry()
+                data[0] = 1
+                if k not in  window_list_buffer:
+                    cprint("  -- new:win:pos",k.ljust(15," "),data) #,color="yellow")
+                elif window_list_buffer[k][2] != data[2] and data[2]: #geo
+                    cprint("  -- update:win:pos",k.ljust(15," "),data) #,color="yellow")
+                else:
+                    cprint("  -- ok:win:pos",k.ljust(15," "),data )#,color="green")
+            else:
+                if k in window_list_buffer:
+                    data = window_list_buffer[k]
+                    data[0] = 0
+                cprint("  -- close:win:pos",0,k.ljust(15," "),data,color="red")
+
             window_list_buffer[k] = data
 
             if k in ["PATCH","FIXTURES","DIMMER","FIXTURE-EDITOR","CONFIG"]:
-                window_list_buffer[k][0] = 0   
+                window_list_buffer[k][0] = 0  # overwrite, default is closed. 
 
         except Exception as e:
             cprint("  -1 Exception:",[k,e],color="red")
-            cprint("  --- ",[win],color="red")
-            error += 1
 
     lines = ""
     for k,data in window_list_buffer.items():
@@ -102,6 +110,7 @@ def get_window_position(_filter="",win=None):
     #cprint("get_window_position",[_filter])
     if _filter in window_list_buffer:
         show,k,geo  = window_list_buffer[_filter]
+        cprint("   get_window_position",[show,k,geo],color="yellow")
         if win:
             win.tk.geometry(geo)
     return show,k,geo

+ 1 - 1
lib/mytklib.py

@@ -144,7 +144,7 @@ class MiniButton:
     def config(self,**args):
         self._configure(**args)
     def bind(self,etype="<Button>",cb=None):
-        #bb.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
+        #bb.bind("<ButtonRelease>",MAIN.tk_event(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
         if cb:
             self.bb.bind(etype,cb)
     def grid(self,row=0, column=0, sticky=""):

+ 791 - 0
lib/tkevent.py

@@ -0,0 +1,791 @@
+#!/usr/bin/python3
+
+import sys
+import time
+
+import traceback
+
+from lib.cprint import cprint
+import __main__ as MAIN
+
+import lib.baselib as baselib
+import lib.fxlib as fxlib
+import lib.libtk as libtk
+import tkgui.dialog as dialoglib
+
+dialog = dialoglib.Dialog()
+
+class tk_event():
+    """ global input event Handeler for short cut's ... etc
+    """
+    def __init__(self,fix,elem,attr=None,data=None,mode=None):
+        self.fix = fix
+        self.data=data
+        self.attr = attr
+        self.elem = elem
+        self.mode = mode
+
+    def setup(self,event):       
+        cprint("tk_event.SETUP",[self.mode,self.attr],color="red")
+        if self.mode != "SETUP":
+            return 0
+
+        if self.attr == "SAVE\nSHOW":
+            self.elem["bg"] = "orange"
+            self.elem["text"] = "SAVING..."
+            self.elem["bg"] = "red"
+            self.elem.config(activebackground="orange")
+
+            MAIN.modes.val(self.attr,1)
+
+            MAIN.save_show()
+
+            self.elem["bg"] = "lightgrey"
+            self.elem.config(activebackground="lightgrey")
+            b = libtk.BLINKI(self.elem)
+            b.blink()
+            self.elem["text"] = "SAVE\nSHOW"
+
+        elif self.attr == "LOAD\nSHOW":
+            name = "LOAD-SHOW"
+            line1 = "PATH: " + baselib.current_show_path()
+            line2 = "DATE: " + time.strftime("%Y-%m-%d %X",  time.localtime(time.time()))
+
+            class cb():
+                def __init__(self,name=""):
+                    self.name=name
+                    cprint("   LOAD-SHOW.init",name)
+                def cb(self,event=None,**args):
+                    cprint("   LOAD-SHOW.cdb",self.name,event,args)
+                    if self.name != "<exit>":
+                        cprint("-----------------------:")
+                        MAIN.LOAD_SHOW_AND_RESTART(self.name).cb()
+
+            pw = libtk.PopupList(name,cb=cb)
+            print(line1,line2)
+            frame = pw.sframe(line1=line1,line2=line2)
+            r = libtk.frame_of_show_list(frame,cb=cb)
+
+        elif self.attr == "NEW\nSHOW":
+
+            def _cb(data):
+                if not data:
+                    cprint("err443",self,"_cb",data)
+                    return None
+                fname = data["Value"]
+                fpath = baselib.generate_show_path(fname)
+                cprint("SAVE NEW SHOW",fpath,fname)
+
+                if MAIN.save_show_as(fname,new=1):
+                    MAIN.LOAD_SHOW_AND_RESTART(fname).cb() 
+
+            dialog._cb = _cb
+            dialog.askstring("CREATE NEW SHOW","CREATE NEW SHOW:")
+
+        elif self.attr == "SAVE\nSHOW AS":
+
+            #def _cb(fname):
+            def _cb(data):
+                if not data:
+                    cprint("err443",self,"_cb",data)
+                    return None
+                fname = data["Value"]
+
+                if MAIN.save_show_as(fname):
+                    MAIN.LOAD_SHOW_AND_RESTART(fname).cb() 
+
+
+            dialog._cb = _cb
+            dialog.askstring("SAVE SHOW AS","SAVE SHOW AS:")
+
+        elif self.attr == "SAVE &\nRESTART":
+            self.elem["bg"] = "orange"
+            self.elem["text"] = "SAVING..."
+            self.elem["bg"] = "red"
+            self.elem.config(activebackground="orange")
+            MAIN.modes.val(self.attr,1)
+
+            MAIN.save_show()
+
+            self.elem["text"] = "RESTARTING..."
+            self.elem["bg"] = "lightgrey"
+            self.elem.config(activebackground="lightgrey")
+            MAIN.LOAD_SHOW_AND_RESTART("").cb(force=1)
+
+        elif self.attr == "DRAW\nGUI":
+            old_text = self.elem["text"]
+            window_manager.top("PATCH")
+            gui_patch.draw(MAIN.FIXTURES)
+            gui_fix.draw(MAIN.FIXTURES)
+            window_manager.top("MAIN.FIXTURES")
+            MAIN.master._refresh_exec()
+            self.elem["text"] = old_text  
+
+        elif self.attr == "PRO\nMODE":
+            MAIN.save_show()
+            import lib.restart as restart
+            restart.pro()
+
+        elif self.attr == "EASY\nMODE":
+            MAIN.save_show()
+            import lib.restart as restart
+            restart.easy()
+        else:
+            if IS_GUI:
+                msg="{}\nnot implemented".format(self.attr.replace("\n"," "))
+                r=tkinter.messagebox.showwarning(message=msg,parent=None)
+        return 1
+
+    def live(self,event):       
+        if self.mode != "LIVE":
+            return 0
+                
+        if "FADE" in self.attr or "DELAY" in self.attr:
+           
+            if self.attr == "FADE":
+                ct = FADE
+            if self.attr == "DELAY":
+                ct = DELAY
+            if "PAN/TILT\nFADE" in self.attr:
+                ct = FADE_move
+
+            value = ct.val()
+            #print("EVENT CHANGE ",[self.attr])
+            cprint("EVENT CHANGE:",self.mode,value,self.attr)
+            if value < 0:
+                value = 1
+            if event.num == 4:
+                value += 0.1 
+            elif event.num == 5:
+                value -= 0.1
+            elif event.num == 1:
+                if ct._is():
+                    ct.off()# = 0
+                    self.data.commands.elem[self.attr]["bg"] = "grey"
+                    self.elem.config(activebackground="grey")
+                else:
+                    ct.on()# = 1
+                    self.data.commands.elem[self.attr]["bg"] = "green"
+                    self.elem.config(activebackground="lightgreen")
+            elif event.num == 2:
+                value += 1
+
+            if value > 10:
+                value = 1
+            value = round(value,1)
+            value = ct.val(value)
+
+            if self.attr == "FADE":
+                self.data.commands.elem[self.attr]["text"] = "FADE:\n{:0.2f}".format(value)
+            if self.attr == "DELAY":
+                self.data.commands.elem[self.attr]["text"] = "DELAY:\n{:0.3f}".format(value)
+            if "PAN/TILT\nFADE" in self.attr:
+                self.data.commands.elem[self.attr]["text"] = "PAN/TILT\nFADE:{:0.2f}".format(value)
+
+
+
+    def command(self,event):       
+        if self.mode != "COMMAND":
+            return 0
+
+        if self.attr == "CLEAR":
+            if event.num == 1:
+                ok = MAIN.FIXTURES.clear()
+                if ok:
+                    MAIN.master._refresh_fix()
+                MAIN.modes.val(self.attr,0)
+
+        elif self.attr == "SAVE":
+            MAIN.modes.val(self.attr,1)
+            MAIN.save_show()
+            #PRESETS.backup_presets()
+            #MAIN.FIXTURES.backup_patch()
+            #time.sleep(1)
+            MAIN.modes.val(self.attr,0)
+
+        elif self.attr == "S-KEY":
+            global _global_short_key
+            if _global_short_key:
+                _global_short_key = 0
+                MAIN.master.commands.elem["S-KEY"]["bg"] = "red"
+                MAIN.master.commands.elem["S-KEY"]["activebackground"] = "red"
+            else:
+                _global_short_key = 1
+                MAIN.master.commands.elem["S-KEY"]["bg"] = "green"
+                MAIN.master.commands.elem["S-KEY"]["activebackground"] = "green"
+            cprint("s-key",_global_short_key)
+
+        else:
+            if event.num == 1:
+                cprint("ELSE",self.attr)
+                MAIN.modes.val(self.attr,1)
+
+        return 0
+
+
+    def encoder(self,event):
+        global _shift_key
+        cprint("tk_event","ENC",self.fix,self.attr,self.mode)
+        cprint("SHIFT_KEY",_shift_key,"??????????")
+
+        if self.mode == "ENCODER":
+            if self._encoder(event):
+                MAIN.master.refresh_fix() # delayed
+                MAIN.refresher_fix.reset() # = Refresher()
+
+        if self.mode == "ENCODER2":
+            if self._encoder(event):
+                MAIN.master.refresh_fix() # delayed
+                MAIN.refresher_fix.reset() # = Refresher()
+
+        if self.mode == "INVERT":
+            cprint("INVERT",event)
+            if self._encoder(event):
+                MAIN.master.refresh_fix() # delayed
+                MAIN.refresher_fix.reset() # = Refresher()
+
+    def _encoder(self,event):
+        global _shift_key
+
+        cprint("-- tk_event","_ENC",self.fix,self.attr,self.mode)
+        cprint("-- SHIFT_KEY",_shift_key,"??????????")
+        val=""
+        if event.num == 1:
+            val ="click"
+        elif event.num == 4:
+            val ="++"
+            if _shift_key:
+                val = "+"
+        elif event.num == 5:
+            val ="--"
+            if _shift_key:
+                val = "-"
+        #print("SHIFT",val,_shift_key)
+        if val:
+            MAIN.FIXTURES.encoder(fix=self.fix,attr=self.attr,xval=val)
+            return 1       
+
+
+            
+    def cb(self,event):
+        cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
+        cprint(["type",event.type,"num",event.num])
+
+        global INIT_OK
+        INIT_OK = 1
+        try:
+            change = 0
+            if "keysym" in dir(event):
+                if "Escape" == event.keysym:
+                    ok = MAIN.FIXTURES.clear()
+                    MAIN.master._refresh_fix()
+                    cprint()
+                    return 0
+
+            if self.mode == "SETUP":
+                self.setup(event)
+            elif self.mode == "COMMAND":
+                self.command(event)
+            elif self.mode == "LIVE":
+                self.live(event)
+            elif self.mode == "ENCODER":
+                self.encoder(event)
+                MAIN.master.refresh_fix()
+
+            elif self.mode == "ENCODER2":
+                self.encoder(event)
+            elif self.mode == "INVERT":
+                self.encoder(event)
+            elif self.mode == "FX":
+                cprint("tk_event CALLING FX WRONG EVENT OBJECT !!",color="red")
+            elif self.mode == "ROOT":
+                if event.keysym=="Escape":
+                    pass
+
+            elif self.mode == "INPUT":
+                cprint("INP",self.data.entry.get())
+                if event.keycode == 36:
+                    x=self.data.entry.get()
+                    #client.send(x)
+
+            elif self.mode == "INPUT2":
+                cprint("INP2",self.data.entry2.get())
+                if event.keycode == 36:
+                    x=self.data.entry2.get()
+                    #client.send(x)
+
+            elif self.mode == "INPUT3":
+                cprint("INP3",self.data.entry3.get())
+                if event.keycode == 36:
+                    x=self.data.entry3.get()
+                    #client.send(x)
+
+            elif self.mode == "PRESET":
+                nr = self.attr #int(self.attr.split(":")[1])-1
+
+                if event.num == 3: # right click for testing
+                    if str(event.type) == '4': #4 ButtonPress
+                        if MAIN.modes.val("CFG-BTN"):
+                            MAIN.master.btn_cfg(nr,testing=1)
+
+                if event.num == 1:
+                    if str(event.type) == '4': #4 ButtonPress
+                        if MAIN.modes.val("REC"):
+                            self.data.preset_rec(nr)
+                            MAIN.modes.val("REC",0)
+                            time.sleep(0.05)
+                            MAIN.master._refresh_exec(nr=nr)
+                        elif MAIN.modes.val("DEL"):
+                            ok=PRESETS.delete(nr)
+                            if ok:
+                                MAIN.modes.val("DEL",0)
+                                #MAIN.master.refresh_exec()
+                                MAIN.master._refresh_exec(nr=nr)
+                        elif MAIN.modes.val("COPY"):
+                            ok=PRESETS.copy(nr)
+                            if ok:
+                                MAIN.modes.val("COPY",0)
+                                MAIN.master._refresh_exec(nr=nr)
+                        elif MAIN.modes.val("MOVE"):
+                            ok,cnr,bnr=PRESETS.move(nr)
+                            if ok:
+                                #MAIN.modes.val("MOVE",0) # keep MOVE on
+                                MAIN.master._refresh_exec(nr=nr)
+                                MAIN.master._refresh_exec(nr=bnr)
+                        elif MAIN.modes.val("CFG-BTN"):
+                            MAIN.master.btn_cfg(nr)
+                            #MAIN.master._refresh_exec(nr=nr)
+                        elif MAIN.modes.val("LABEL"):#else:
+                            MAIN.master.label(nr)
+                            #MAIN.master._refresh_exec(nr=nr)
+
+                        elif MAIN.modes.val("EDIT"):
+                            MAIN.FIXTURES.clear()
+                            self.data.preset_select(nr)
+                            self.data.preset_go(nr,xfade=0,event=event,val=255,button="go")
+                            MAIN.modes.val("EDIT", 0)
+                            MAIN.master.refresh_fix()
+                            MAIN.refresher_fix.reset() # = Refresher()
+
+                        elif MAIN.modes.val("SELECT"):
+                            self.data.preset_select(nr)
+                        else:
+                            self.data.preset_go(nr,event=event,val=255)
+                    else:
+                        self.data.preset_go(nr,xfade=0,event=event,val=0)
+                        #cprint(" == "*10)
+                        MAIN.master.refresh_fix()
+                        MAIN.refresher_fix.reset() # = Refresher()
+
+                        
+                if event.num == 3:
+                    if not MAIN.modes.val("REC"):
+                        if str(event.type) == '4': #4 ButtonPress
+                            self.data.preset_go(nr,xfade=0,ptfade=0,event=event,val=255)
+                        else:
+                            self.data.preset_go(nr,xfade=0,ptfade=0,event=event,val=0)
+                        
+                cprint()
+                return 0
+            elif self.mode == "INPUT":
+                cprint()
+                return 0
+
+        except Exception as e:
+            cprint("== cb EXCEPT",e,color="red")
+            cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
+            cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
+        cprint()
+        return 1 
+
+class tk_event_fx():
+    """ global input event Handeler for short cut's ... etc
+    """
+    def __init__(self,fix,elem,attr=None,data=None,mode=None):
+        self.fix = fix
+        self.data = data
+        self.attr = attr
+        self.elem = elem
+        self.mode = mode
+
+    def fx(self,event):
+        cprint("Xevent.fx",self.attr,self.fix,event)
+        fx2 = {}
+
+        if self.attr == "FX:RED":
+            if event.num == 4:
+                cprint("FX:COLOR CHANGE",MAIN.fx_prm,color="red")
+                txt = "FX:RED" 
+                MAIN.fx_prm["MODE"] += 1
+                if MAIN.fx_prm["MODE"] >= len(MAIN.fx_modes):
+                    MAIN.fx_prm["MODE"]=0
+                txt = "FX:\n"+MAIN.fx_modes[MAIN.fx_prm["MODE"]]
+
+                MAIN.master.fx_color.elem["FX:RED"]["text"] = txt
+            elif event.num == 5:
+                cprint("FX:COLOR CHANGE",MAIN.fx_prm,color="red")
+                txt = "FX:RED" 
+                MAIN.fx_prm["MODE"] -= 1
+                if MAIN.fx_prm["MODE"] < 0:
+                    MAIN.fx_prm["MODE"]= len(MAIN.fx_modes)-1
+                txt = "FX:\n"+MAIN.fx_modes[MAIN.fx_prm["MODE"]]
+                MAIN.master.fx_color.elem["FX:RED"]["text"] = txt
+
+        if self.attr.startswith("2D"):
+            if event.num == 4:
+                cprint("2D-X: CHANGE",MAIN.fx_prm,color="red")
+                txt = "2D-X:" 
+                MAIN.fx_prm["2D:MODE"] += 1
+                if MAIN.fx_prm["2D:MODE"] >= len(fx_x_modes):
+                    MAIN.fx_prm["2D:MODE"]=0
+                txt = "2D:MODE\n"+fx_x_modes[MAIN.fx_prm["2D:MODE"]]
+
+                MAIN.master.fx.elem["2D:MODE"]["text"] = txt
+            elif event.num == 5:
+                cprint("2D-X: CHANGE",MAIN.fx_prm,color="red")
+                txt = "2D-X:" 
+                MAIN.fx_prm["2D:MODE"] -= 1
+                if MAIN.fx_prm["2D:MODE"] < 0:
+                    MAIN.fx_prm["2D:MODE"]= len(fx_x_modes)-1
+                txt = "2D:MODE\n"+fx_x_modes[MAIN.fx_prm["2D:MODE"]]
+                MAIN.master.fx.elem["2D:MODE"]["text"] = txt
+
+        elif event.num == 1:
+            xfixtures = []
+            fix_active =MAIN.FIXTURES.get_active() 
+            for fix in fix_active:
+                if fix == "CFG":
+                    continue
+                xfixtures.append(fix)
+
+            if not xfixtures:
+                cprint("470 fx() ... init no fixture selected",color="red")
+                return 0
+            
+            
+            xfixtures   = MAIN.process_matrix(xfixtures)
+            wing_buffer = fxlib.process_wings(xfixtures,MAIN.fx_prm)
+            fxlib.process_effect(
+                        wing_buffer,MAIN.fx_prm,MAIN.fx_prm_move,MAIN.modes,
+                        MAIN.jclient_send,MAIN.master,
+                        MAIN.FIXTURES,fx_name=self.attr
+                        )
+
+
+
+
+    def command(self,event,mode=""):       
+        cprint("fx_command",self.mode)
+        if self.mode == "FX":
+            prm = MAIN.fx_prm
+            ct = self.data.fx 
+        if self.mode == "FX-MOVE":
+            prm = MAIN.fx_prm_move
+            ct = self.data.fx_moves 
+
+        if 1:
+            if self.attr.startswith("SIZE:"):#SIN":
+                #global MAIN.fx_prm
+                k = "SIZE"
+                if event.num == 1:
+                    _stats = [0,30,100,255]
+                    if prm[k] in _stats:
+                        idx = _stats.index(prm[k])+1
+                        if idx > len(_stats)-1: #rotate
+                            idx = 0
+                        prm[k] = _stats[idx]
+                    else:
+                        prm[k] = _stats[1]
+                elif event.num == 3:
+                    prm[k] =100
+                elif event.num == 4:
+                    if prm[k] <= 0:
+                        prm[k] = 1
+                    prm[k] +=5
+                elif event.num == 5:
+                    prm[k] -=5
+                #prm[k] =int(prm[k])
+                
+                if prm[k] > 4000:
+                    prm[k] = 4000
+                if prm[k] < 0:
+                    prm[k] =0
+                if prm[k] == 6: #bug
+                    prm[k] =5
+                ct.elem[self.attr]["text"] = "SIZE:\n{:0.0f}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("SPEED:"):#SIN":
+                #global prm
+                k = "SPEED"
+                if event.num == 1:
+                    _stats = [0,5,25,30,100,255]
+                    if prm[k] in _stats:
+                        idx = _stats.index(prm[k])+1
+                        if idx > len(_stats)-1: #rotate
+                            idx = 0
+                        prm[k] = _stats[idx]
+                    else:
+                        prm[k] = 0
+                elif event.num == 3:
+                    prm[k] = 10
+                elif event.num == 4:
+                    if prm[k] <= 0:
+                        prm[k] = 0.06
+                    elif prm[k] < 5:
+                        prm[k] *=1.2
+                    else:
+                       prm[k] +=5 #1.1
+                elif event.num == 5:
+                    if prm[k] <= 5:
+                        prm[k] *=0.8
+                    else:
+                        prm[k] -= 5 #1.1
+                #prm[k] =int(prm[k])
+                
+                if prm[k] > 4000:
+                    prm[k] = 4000
+                if prm[k] < 0.05:
+                    prm[k] =0
+                if prm[k] > 5 and prm[k] < 10: #bug
+                    prm[k] =5
+
+                if prm[k] < 0:
+                    ct.elem[self.attr]["text"] = "SPEED:\noff".format(prm[k])
+                else:
+                    ct.elem[self.attr]["text"] = "SPEED:\n{:0.02f}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("START:"):#SIN":
+                #global prm
+                k = "START"
+                if event.num == 1:
+                    pass
+                elif event.num == 2:
+                    pass
+                elif event.num == 4:
+                    if prm[k] <= 0:
+                        prm[k] = 1
+                    prm[k] += 5 #1.1
+                elif event.num == 5:
+                    prm[k] -= 5 #1.1
+                #prm[k] =int(prm[k])
+                
+                if prm[k] > 4000:
+                    prm[k] = 4000
+                if prm[k] < 5:
+                    prm[k] =0
+                if prm[k] == 6: #bug
+                    prm[k] =5
+
+                ct.elem[self.attr]["text"] = "START:\n{:0.0f}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("WIDTH:"):#SIN":
+                #global prm
+                k = "WIDTH"
+                if event.num == 1:
+                    _stats = [0,25,50,75,10]
+                    if prm[k] in _stats:
+                        idx = _stats.index(prm[k])+1
+                        if idx > len(_stats)-1: #rotate
+                            idx = 0
+                        prm[k] = _stats[idx]
+                    else:
+                        prm[k] = 25
+                elif event.num == 2:
+                    prm[k] = 50
+                elif event.num == 3:
+                    prm[k] = 100
+                elif event.num == 4:
+                    if prm[k] <= 0:
+                        prm[k] = 1
+                    elif prm[k] == 50:
+                        prm[k] = 100
+                    elif prm[k] == 5:
+                        prm[k] = 25
+                    elif prm[k] == 25:
+                        prm[k] = 50
+                    else:
+                        prm[k] += 5 #*=1.1
+                elif event.num == 5:
+                    if prm[k] == 10:
+                        prm[k] = 5
+                    elif prm[k] == 25:
+                        prm[k] = 10
+                    elif prm[k] == 50:
+                        prm[k] = 25
+                    elif prm[k] == 100:
+                        prm[k] = 50
+                    #else:
+                    #    prm[k] -=5 #/=1.1
+                    
+                #prm[k] =int(prm[k])
+                
+                if prm[k] < 0:
+                    prm[k] = 0
+                if prm[k] > 100:
+                    prm[k] = 100
+                if prm[k] == 6: #bug
+                    prm[k] =5
+                if prm[k] > 25 and prm[k] < 50: #bug
+                    prm[k] =50
+                if prm[k] > 50 and prm[k] < 75: #bug
+                    prm[k] =75
+                if prm[k] > 75 and prm[k] < 100: #bug
+                    prm[k] =100
+
+                ct.elem[self.attr]["text"] = "WIDTH:\n{:0.0f}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("DIR:"):#SIN":
+                #global prm
+                k = "DIR"
+                if event.num == 1:
+                    prm[k] = 1
+                elif event.num == 3:
+                    prm[k] = -1
+                elif event.num == 4:
+                    prm[k] = 1
+                elif event.num == 5:
+                    prm[k] =-1
+                txt = prm[k] 
+                ct.elem[self.attr]["text"] = "DIR:\n{}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("SHUFFLE:"):#SIN":
+                #global prm
+                k = "SHUFFLE"
+                if event.num == 1:
+                    prm[k] = 0
+                elif event.num == 3:
+                    prm[k] = 1
+                elif event.num == 4:
+                    prm[k] = 1
+                elif event.num == 5:
+                    prm[k] =0
+                if prm[k] == 6: #bug ?
+                    prm[k] =5
+                ct.elem[self.attr]["text"] = k+":\n{}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("INVERT:"):#SIN":
+                #global prm
+                k = "INVERT"
+                if event.num == 1:
+                    prm[k] = 0
+                elif event.num == 3:
+                    prm[k] = 1
+                elif event.num == 4:
+                    prm[k] = 1
+                elif event.num == 5:
+                    prm[k] =0
+                if prm[k] == 6: #bug ?
+                    prm[k] =5
+                ct.elem[self.attr]["text"] = k+":\n{}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("2D-X:"):#SIN":
+                #global prm
+                k = "2D-X"
+                if event.num == 1:
+                    prm[k] = 1
+                elif event.num == 3:
+                    prm[k] = 2
+                elif event.num == 4:
+                    prm[k] += 1
+                elif event.num == 5:
+                    prm[k] -=1
+                if prm[k] > 100:
+                    prm[k] = 100
+                if prm[k] < 1:
+                    prm[k] =1
+                    
+                txt = prm[k] 
+                ct.elem[self.attr]["text"] = "2D-X:\n{}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("WING:"):#SIN":
+                #global prm
+                k = "WING"
+                if event.num == 1:
+                    prm[k] = 1
+                elif event.num == 3:
+                    prm[k] = 2
+                elif event.num == 4:
+                    prm[k] += 1
+                elif event.num == 5:
+                    prm[k] -=1
+                if prm[k] > 100:
+                    prm[k] = 100
+                if prm[k] < 1:
+                    prm[k] =1
+                    
+                txt = prm[k] 
+                ct.elem[self.attr]["text"] = "WING:\n{}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("OFFSET:"):#SIN":
+                #global prm
+                k = "OFFSET"
+                if event.num == 1:
+                    prm[k] = 50
+                elif event.num == 2:
+                    prm[k] *= 2
+                elif event.num == 3:
+                    prm[k] = 100
+                elif event.num == 4:
+                    if prm[k] <= 0:
+                        prm[k] = 1
+                    prm[k] +=5 #*=1.1
+                elif event.num == 5:
+                    prm[k] -=5 #/=1.1
+                #prm[k] =int(prm[k])
+                
+                #if prm[k] > 512:
+                #    prm[k] = 512
+                if prm[k] < 5:
+                    prm[k] =0
+                if prm[k] == 6: #bug
+                    prm[k] =5
+
+                ct.elem[self.attr]["text"] = "OFFSET:\n{:0.0f}".format(prm[k])
+                cprint(prm)
+            elif self.attr.startswith("BASE:"):
+                k = "BASE"
+                if event.num == 1:
+                    prm[k] = "-"
+                elif event.num == 3:
+                    prm[k] = "0"
+                elif event.num == 4:
+                    prm[k] = "+"
+                elif event.num == 5:
+                    prm[k] = "0"
+                ct.elem[self.attr]["text"] = "BASE:\n{}".format(prm[k])
+            elif self.attr.startswith("2D:"):#SIN":
+                self.fx(event)
+            elif self.attr.startswith("FX:"):#SIN":
+                self.fx(event)
+
+            elif self.attr == "FX OFF":
+                if event.num == 1:
+                    MAIN.FIXTURES.fx_off("all")
+                    MAIN.CONSOLE.fx_off("all")
+                    MAIN.CONSOLE.flash_off("all")
+                    MAIN.master._refresh_fix()
+                    return 0
+
+                #if event.num == 1:
+            elif self.attr == "REC-FX":
+                cprint("ELSE",self.attr)
+                MAIN.modes.val(self.attr,1)
+
+            return 0
+            
+    def cb(self,event):
+        cprint("EVENT_fx cb",self.attr,self.mode,event,color='yellow')
+        cprint(["type",event.type,"num",event.num])
+        try:
+            change = 0
+
+            if self.mode.startswith("FX"):
+                self.command(event)
+                return 0
+
+        except Exception as e:
+            cprint("== cb EXCEPT",e,color="red")
+            cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
+            cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
+        return 1 
+

+ 27 - 27
tkgui/GUI.py

@@ -144,11 +144,11 @@ class _TableFrame():
             c=0
             r=0
             b = tk.Button(xframe,bg="lightblue", text="ID",width=6,anchor="e")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             b = tk.Button(xframe,bg="lightblue", text="NAME",width=14,anchor="w")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             b = tk.Button(xframe,bg="#ddd", text="TYPE",width=3)
@@ -317,25 +317,25 @@ def draw_sub_dim(gui,fix,data,c=0,r=0,frame=None):
         v= data["ATTRIBUT"][attr]["VALUE"]
         b = tk.Button(frame,bg="lightblue", text=""+str(fix),width=3,anchor="w")
         b.config(padx=1)
-        b.bind("<Button>",MAIN.Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
+        b.bind("<Button>",tkevent.tk_event(fix=fix,mode="D-SELECT",elem=b).cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E)
         c+=1
         b = tk.Button(frame,bg="lightblue", text=data["NAME"],width=10,anchor="w")
         b.config(padx=1)
-        b.bind("<Button>",MAIN.Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
+        b.bind("<Button>",tkevent.tk_event(fix=fix,mode="D-SELECT",elem=b).cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E)
         c+=1
         b = tk.Button(frame,bg="grey", text="S",width=2,anchor="c")
         b.config(padx=1)
         myTip = Hovertip(b,'SELECT')
-        b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b,attr="_ACTIVE",mode="ENCODER",data=data).cb)
+        b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b,attr="_ACTIVE",mode="ENCODER",data=data).cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E)
         gui.elem_attr[fix]["S"] = b
         c+=1
         b = tk.Button(frame,bg="grey", text=str(round(v,2)),width=10,anchor="w")
         b.config(padx=1)
         gui.elem_attr[fix][attr] = b
-        b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
+        b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E)
         c+=1
         if c >=12:
@@ -439,18 +439,18 @@ class GUI_FIX():
             frame = fix_frame
         
             b = tk.Button(frame,bg="lightblue", text="ID:"+str(fix),width=6,anchor="w")
-            b.bind("<Button>",MAIN.Xevent(fix=fix,mode="SELECT",elem=b).cb)
+            b.bind("<Button>",tkevent.tk_event(fix=fix,mode="SELECT",elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             b = tk.Button(frame,bg="#55f", text=data["NAME"],width=10,anchor="w")
-            b.bind("<Button>",MAIN.Xevent(fix=fix,attr="ALL",mode="ENCODER",elem=b).cb)
+            b.bind("<Button>",tkevent.tk_event(fix=fix,attr="ALL",mode="ENCODER",elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
 
             b = tk.Button(frame,bg="grey", text="S",width=2,anchor="c")
             b.config(padx=1)
             myTip = Hovertip(b,'SELECT')
-            b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b,attr="_ACTIVE",mode="ENCODER",data=data).cb)
+            b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b,attr="_ACTIVE",mode="ENCODER",data=data).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             gui.elem_attr[fix]["S"] = b
             c+=1
@@ -487,7 +487,7 @@ class GUI_FIX():
                 else:
                     b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=12, anchor="w")
                 gui.elem_attr[fix][attr] = b
-                b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
+                b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
                 b.grid(row=r, column=c, sticky=tk.W+tk.E,ipadx=0,ipady=0,padx=0,pady=0)
                 c+=1
                 if c >=8:
@@ -604,11 +604,11 @@ class GUI_PATCH():
         r=0
         def head(i,c,r,xframe=None):
             b = tk.Button(xframe,bg="grey", text="Z:{} ID".format(z+1),width=6,anchor="e")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             b = tk.Button(xframe,bg="grey", text="NAME",width=14,anchor="w")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             rgb  = "#aaa"
@@ -674,14 +674,14 @@ class GUI_PATCH():
             data = FIXTURES.fixtures[fix]
                             
             b = tk.Button(xframe,bg="lightblue", text=""+str(fix),width=6,anchor="e")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
 
             command = _SET_PATCH("NAME",data["NAME"],fix,data)
             b = tk.Button(xframe,bg="grey", text=data["NAME"],width=14,anchor="w",command=command.attr)
             command.set_button(b)
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             LABEL = ""
@@ -704,16 +704,16 @@ class GUI_PATCH():
 
                     
             b = tk.Button(xframe,bg="#aaa", text=LABEL,width=8,anchor="w")
-            #b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             b["activebackground"] = "#aaa"
             c+=1
             b = tk.Button(xframe,bg="#ddd", text="EDIT",width=3)
-            b.bind("<Button>",MAIN.Xevent(fix=fix,mode="SELECT",elem=b).cb)
+            b.bind("<Button>",tkevent.tk_event(fix=fix,mode="SELECT",elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             b = tk.Button(xframe,bg="#ddd", text="[ ][x]",width=1)
-            b.bind("<Button>",MAIN.Xevent(fix=fix,mode="SELECT",elem=b).cb)
+            b.bind("<Button>",tkevent.tk_event(fix=fix,mode="SELECT",elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             #r+=1
@@ -1331,7 +1331,7 @@ class GUI_FixtureEditor():
         line3="CHOOS to EDIT >> DEMO MODUS"
 
         cb = None #LOAD_FIXTURE(self,"USER").cb 
-        self.pw = libtk.PopupList(name,width=600,cb=cb,left=MAIN._POS_LEFT+620,bg="#333")
+        self.pw = libtk.PopupList(name,width=600,cb=cb,left=libtk._POS_LEFT+620,bg="#333")
         frame = self.pw.sframe(line1=line1,line2=line2) #,line3=line3)
 
 
@@ -1570,7 +1570,7 @@ class GUI_grid():
         for row in data:
 
             self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
-            #self.b.bind("<Button>",MAIN.Xevent(fix=fix,elem=b).cb)
+            #self.b.bind("<Button>",tkevent.tk_event(fix=fix,elem=b).cb)
             self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
             c+=1
             if c % 8 == 0:
@@ -1860,8 +1860,8 @@ class EXEC_FADER():
             #b = self.b
             #k = ""
             #gui = MAIN.master
-            #self.b.bind("<Button>",MAIN.Xevent(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
-            #self.b.bind("<ButtonRelease>",MAIN.Xevent(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
+            #self.b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
+            #self.b.bind("<ButtonRelease>",tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
             self.attr=self.b
             self.b.pack(fill=tk.BOTH, side=tk.TOP)
             self.elem.append(self.b)
@@ -2190,7 +2190,7 @@ class GUI_menu():
             else:
                 self.b = tk.Button(self.frame,bg="lightgrey", text=row["text"],width=8,height=h)
 
-            self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
+            self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.on_top).cb)
             self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
             row["elem"] = self.b
             self.elem[row["text"]] = row
@@ -2204,11 +2204,10 @@ class GUI_menu():
         print(self,"--- start_bg_loop ----- xxxx")
         thread.start_new_thread(mytklib.tk_btn_bg_loop,(self.TITLE,))
 
-    def callback(self,event,data={}):
-        #print("callback543",self,event,data)
-        print("callback543",self,event) #,data)
-        import __main__ as m
-        m.window_manager.top(data["text"])
+    def on_top(self,event,data={}):
+        print("menue.on_top",data)
+        MAIN.window_manager.top(data["text"])
+
     def update(self,button,text):
         #print(self,button,text)
         for k in self.elem:
@@ -2216,6 +2215,7 @@ class GUI_menu():
             #print(self,k,v)
             if button == k:
                 v["elem"]["text"] = k+"\n"+text
+
     def config(self,button,attr,value):
         #print("config",self,button,attr,value)
         for k in self.elem:

+ 3 - 3
tkgui/dialog.py

@@ -8,7 +8,7 @@ tk = tkinter
 from idlelib.tooltip import Hovertip
 
 import __main__ as MAIN
-from lib.cprint import *
+from lib.cprint import cprint
 
 
 class InputEventBlocker():
@@ -535,7 +535,7 @@ class Dialog():
 
         self.b = tk.Button(self.f,bg="lightgrey", text="OK",width=10,command=self.ok)
         self.b.config(padx=1)
-        #self.b.bind("<Button>",Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
+        #self.b.bind("<Button>",tkevent.tk_event(fix=fix,mode="D-SELECT",elem=b).cb)
         self.b.pack(side="left")
 
         self.fxx = tk.Frame(self.f,width=20) #, highlightbackground = "lightgrey", highlightthickness = 1, bd=0)
@@ -627,7 +627,7 @@ class Dialog():
 
         self.b = tk.Button(self.f,bg="lightgrey", text="OK",width=10,command=self.ok)
         self.b.config(padx=1)
-        #self.b.bind("<Button>",Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
+        #self.b.bind("<Button>",tkevent.tk_event(fix=fix,mode="D-SELECT",elem=b).cb)
         self.b.pack(side="left")
 
         self.b = tk.Button(self.f,bg="lightgrey", text="Cancel",width=10,command=self.close)

+ 50 - 35
tkgui/draw.py

@@ -1,11 +1,26 @@
 
+import time
+import sys
 
 import tkinter as tk
 import traceback
+import _thread as thread
+
+import __main__ as MAIN
 
-from __main__ import *
 import lib.mytklib as mytklib
+import lib.libtk as tklib
+import lib.tkevent as tkevent
+
+from lib.cprint import cprint
+
+if MAIN.IS_GUI:
+    import tkinter
+    import tkinter as tk
+    from tkinter import font
 
+    import tkinter.simpledialog
+    from idlelib.tooltip import Hovertip
 
 
 
@@ -49,23 +64,23 @@ def draw_command(gui,xframe,data):
         if comm == "FX OFF":
             b["bg"] = "magenta"
         if comm == "SIZE:":
-            b["text"] = "SIZE:{:0.0f}".format(fx_prm["SIZE"])
+            b["text"] = "SIZE:{:0.0f}".format(MAIN.fx_prm["SIZE"])
         if comm == "SPEED:":
-            b["text"] = "SPEED:{:0.0f}".format(fx_prm["SPEED"])
+            b["text"] = "SPEED:{:0.0f}".format(MAIN.fx_prm["SPEED"])
         if comm == "DELAY":
-            b["text"] = "FADE:\n{:0.02f}".format(DELAY.val())
+            b["text"] = "FADE:\n{:0.02f}".format(MAIN.DELAY.val())
         if comm == "FADE":
-            b["text"] = "FADE:\n{:0.02f}".format(FADE.val())
+            b["text"] = "FADE:\n{:0.02f}".format(MAIN.FADE.val())
         if comm == "START:":
-            b["text"] = "START:{:0.0f}".format(fx_prm["START"])
+            b["text"] = "START:{:0.0f}".format(MAIN.fx_prm["START"])
         if comm == "OFFSET:":
-            b["text"] = "OFFSET:{:0.0f}".format(fx_prm["OFFSET"])
+            b["text"] = "OFFSET:{:0.0f}".format(MAIN.fx_prm["OFFSET"])
         if comm == "FX-X:":
-            b["text"] = "FX-X:{}".format(fx_prm["FX-X"])
+            b["text"] = "FX-X:{}".format(MAIN.fx_prm["FX-X"])
         if comm == "BASE:":
-            b["text"] = "BASE:{}".format(fx_prm["BASE"])
+            b["text"] = "BASE:{}".format(MAIN.fx_prm["BASE"])
 
-        b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=gui,mode="COMMAND").cb)
+        b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr=comm,data=gui,mode="COMMAND").cb)
         if comm:
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
         c+=1
@@ -121,8 +136,8 @@ def draw_preset(gui,xframe,PRESETS):
 
         b = mytklib.ExecButton(frame,text=txt)
 
-        b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
-        b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
+        b.bind("<Button>",       tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
+        b.bind("<ButtonRelease>",tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="PRESET").cb)
         
         if k not in gui.elem_presets:
             gui.elem_presets[k] = b
@@ -159,25 +174,25 @@ def draw_input(gui,root2):
     
     b = tk.Entry(frame,bg="grey", text="",width=50)
     gui.entry = b
-    b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT").cb)
-    b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT").cb)
+    b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT").cb)
+    b.bind("<Key>"   ,tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT").cb)
     b.grid(row=r, column=c, sticky=tk.W+tk.E)
     b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
     r+=1
     
     b = tk.Entry(frame,bg="grey", text="",width=20)
     gui.entry2 = b
-    b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT2").cb)
-    b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT2").cb)
+    b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT2").cb)
+    b.bind("<Key>"   ,tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT2").cb)
     b.grid(row=r, column=c, sticky=tk.W+tk.E)
     b.insert("end","d1:0:4")
     r+=1
 
     b = tk.Entry(frame,bg="grey", text="",width=20)
     gui.entry3 = b
-    b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
-    #b.bind("<B1-Motion>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
-    b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
+    b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
+    #b.bind("<B1-Motion>",tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
+    b.bind("<Key>"   ,tkevent.tk_event(fix=0,elem=b,attr="INPUT",data=gui,mode="INPUT3").cb)
     b.grid(row=r, column=c, sticky=tk.W+tk.E)
     b.insert("end","fx:alloff:::")
 
@@ -205,7 +220,7 @@ def draw_colorpicker(gui,xframe,data):
             try:
                 print("e.state",event.state)
             except:pass
-            set_fade = FADE.val() #fade
+            set_fade = MAIN.FADE.val() #fade
 
             event_ok = 0
             event_num = 0
@@ -236,8 +251,8 @@ def draw_colorpicker(gui,xframe,data):
                 set_fade=0
 
                 if event_num == 1: 
-                    if FADE._is():
-                        set_fade=FADE.val() #fade
+                    if MAIN.FADE._is():
+                        set_fade=MAIN.FADE.val() #fade
                     cr = color[0]
                     cg = color[1]
                     cb = color[2]
@@ -448,7 +463,7 @@ def draw_enc(gui,xframe,data=[]):
         b = tk.Button(frame,bg="#6e6e6e", text=str(attr)+'',width=7)#, anchor="w")
         if attr == "DIM":
             b = tk.Button(frame,bg="#ff7f00", text=str(attr)+'',width=7)#, anchor="w")
-        b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=gui,mode="ENCODER2").cb)
+        b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr=attr,data=gui,mode="ENCODER2").cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E ,ipadx=0,ipady=0,padx=0,pady=0)#,expand=True)
         c+=1
         if c >=8:
@@ -457,26 +472,26 @@ def draw_enc(gui,xframe,data=[]):
 
     b = tk.Button(frame,bg="#bfff00", text="INV-ATTR",width=6)
     myTip = Hovertip(b,'INVERT ATTRIBUT SELECTION')
-    b.bind("<Button>",Xevent(fix="SEL",elem=b,attr="INV-ATTR",data=gui,mode="INVERT").cb)
+    b.bind("<Button>",tkevent.tk_event(fix="SEL",elem=b,attr="INV-ATTR",data=gui,mode="INVERT").cb)
     b.grid(row=r, column=c, sticky=tk.W+tk.E)
     c+=1
 
 def _draw_fx(frame,c,r,gui,mode="FX"):
     if mode=="FX-MAIN":
         ct  = gui.fx_main
-        prm = fx_prm_main
+        prm = MAIN.fx_prm_main
     elif mode=="FX-MOVE":
         ct  = gui.fx_moves
-        prm = fx_prm_move
+        prm = MAIN.fx_prm_move
     elif mode=="FX":
         ct  = gui.fx
-        prm = fx_prm
+        prm = MAIN.fx_prm
     elif mode=="FX-GENERIC":
         ct  = gui.fx_generic
-        prm = fx_prm #_generic
+        prm = MAIN.fx_prm #_generic
     elif mode=="FX-COLOR":
         ct  = gui.fx_color
-        prm = fx_color #_generic
+        prm = MAIN.fx_color #_generic
     else:
         ct = Elem_Container()
         ct.commands =["err"]
@@ -502,7 +517,7 @@ def _draw_fx(frame,c,r,gui,mode="FX"):
             #comm = comm.replace("\n","")
             ct.elem[comm] = b
             ct.val[comm] = 0
-        b.bind("<Button>",Xevent_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
+        b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
         if comm == "REC-FX":
             b["bg"] = "grey"
         elif comm == "FX OFF":
@@ -649,7 +664,7 @@ def draw_setup(gui,xframe,data):
             #gui.setup_elem.val[comm] = 0
 
         if ok:
-            b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=gui,mode="SETUP").cb)
+            b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr=comm,data=gui,mode="SETUP").cb)
 
         if comm == "BASE:":
             b["text"] = "BASE:{}".format(prm["BASE"])
@@ -694,14 +709,14 @@ def draw_live(gui,xframe,data):
         if comm not in gui.commands.elem:
             gui.commands.elem[comm] = b
             gui.commands.val[comm] = 0
-        b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=gui,mode="LIVE").cb)
+        b.bind("<Button>",tkevent.tk_event(fix=0,elem=b,attr=comm,data=gui,mode="LIVE").cb)
 
         if "FADE" == comm:
-            b["text"] = "FADE:\n{:0.2}".format(FADE.val())
+            b["text"] = "FADE:\n{:0.2}".format(MAIN.FADE.val())
         if "DELAY" == comm:
-            b["text"] = "DELAY:\n{:0.2}".format(DELAY.val())
+            b["text"] = "DELAY:\n{:0.2}".format(MAIN.DELAY.val())
         if "PAN/TILT\nFADE" == comm:
-            b["text"] = "PAN/TILT\nFADE:{:0.2}".format(FADE_move.val())
+            b["text"] = "PAN/TILT\nFADE:{:0.2}".format(MAIN.FADE_move.val())
 
         if "FADE" in comm:
             b["bg"] = "green"

Някои файлове не бяха показани, защото твърде много файлове са промени