FX3.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #!/usr/bin/python3
  2. import json
  3. import time
  4. import sys
  5. import os
  6. import tkinter as tk
  7. import traceback
  8. import _thread as thread
  9. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  10. gui=None
  11. INIT_OK = 1
  12. IS_GUI = 0
  13. import __main__ as MAIN
  14. import lib.meta as meta
  15. import tool.git as git
  16. CAPTION = "FX3"
  17. title = CAPTION
  18. title += git.get_all()
  19. from lib.cprint import cprint
  20. import lib.libtk as libtk
  21. import lib.libtk2 as libtk2
  22. import lib.zchat as chat
  23. import lib.mytklib as mytklib
  24. import lib.tkevent as tkevent
  25. #import tkgui.draw as draw
  26. import tool.movewin as movewin
  27. movewin.check_is_started("FX3","/opt/LibreLight/Xdesk/tkgui/FX3.py")
  28. def _add_space(frame,r,c):
  29. b = tk.Canvas(frame,bg="black", height=2,bd=0,width=6,highlightthickness=0) #,bd="black")
  30. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  31. r+=1
  32. c=0
  33. return r,c
  34. def _draw_fx3(frame,c,r,gui,mode="FX"):
  35. ct = MAIN.meta.fx3 #moves
  36. prm = MAIN.meta.fx3_prm
  37. for comm in ct.labels:
  38. if comm == "\n\n":
  39. b = tk.Label(frame,bg="black", text="-",font=space_font)
  40. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  41. c=0
  42. r+=1
  43. continue
  44. if comm == "\n":
  45. c=0
  46. r+=1
  47. continue
  48. v=0
  49. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=1)
  50. ct.elem[comm] = b
  51. ct.val[comm] = 0
  52. def XXX(event=None,**data):
  53. print("XXX",event,data)
  54. #b.bind("<Button>",XXX) #tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  55. #print(":",[comm])
  56. b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  57. if comm == "xREC-FX":
  58. b["bg"] = "grey"
  59. elif comm == "xFX OFF":
  60. b["bg"] = "magenta"
  61. elif comm[:3] == "xFX:" or comm[:3] == "x2D:":
  62. b["text"] = comm
  63. b["bg"] = "#ffbf00"
  64. if comm == "PLAY":
  65. b["bg"] = "orange"
  66. b.config(activebackground="#dd0")
  67. if comm in MAIN.meta.fx3_grid:
  68. fx_func = MAIN.meta.fx3_grid[comm]
  69. fx_func.data["wrap"] = 1
  70. #fx_func.inc()
  71. v=fx_func.val()
  72. print("3>",[comm,fx_func,v])
  73. b["text"] = v
  74. if comm.startswith("TYPE:"):
  75. b["bg"] = "orange"
  76. b.config(activebackground="#dd0")
  77. for a in ["SPEED:","SIZE:","START:","OFFSET:"]:
  78. if comm.startswith(a):
  79. b["bg"] = "lightgreen"
  80. b.config(activebackground="#0d0")
  81. if comm:
  82. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  83. c+=1
  84. if c >=6:
  85. c=0
  86. r+=1
  87. c=0
  88. r+=1
  89. return c,r
  90. def _draw_fx(frame,c,r,gui,mode="FX"):
  91. ct = None
  92. prm = None
  93. if mode=="FX-MAIN":
  94. ct = MAIN.meta.fx_main
  95. prm = MAIN.meta.fx_prm_main
  96. for comm in ct.labels:
  97. if comm == "\n\n":
  98. b = tk.Label(frame,bg="black", text="-",font=space_font)
  99. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  100. c=0
  101. r+=1
  102. continue
  103. if comm == "\n":
  104. c=0
  105. r+=1
  106. continue
  107. v=0
  108. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  109. ct.elem[comm] = b
  110. ct.val[comm] = 0
  111. b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  112. if comm == "REC-FX":
  113. b["bg"] = "grey"
  114. elif comm == "FX OFF":
  115. b["bg"] = "magenta"
  116. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  117. c+=1
  118. if c >=6:
  119. c=0
  120. r+=1
  121. c=0
  122. r+=1
  123. return c,r
  124. def draw_fx3(gui,xframe):
  125. frame_fx=xframe
  126. i=0
  127. c=0
  128. r=0
  129. frame = tk.Frame(frame_fx,bg="black")
  130. frame.pack(fill=tk.X, side=tk.TOP)
  131. # ------------------------------
  132. b = tk.Button(frame,bg="lightblue", text="FX3",width=6)
  133. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  134. c+=1
  135. _add_space(frame,r,c)
  136. c,r = _draw_fx(frame,c,r,gui,mode="FX-MAIN")
  137. r,c=_add_space(frame,r,c)
  138. c,r = _draw_fx3(frame,c,r,gui,mode="FX-3")
  139. _global_short_key = 1
  140. root = None
  141. cmd_client = chat.Client(port=30003)
  142. try:
  143. import memcache
  144. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  145. #data = mc.get("MODES")
  146. except:
  147. mc = None
  148. class MANAGER_X(): # DUMMY
  149. def __init__(self,*arg,**args):
  150. print(self,"__init__",arg,args)
  151. def send(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  152. if _global_key_lock:
  153. return
  154. print(self,"MASTER",nr,arg,args)
  155. btn_nr = nr
  156. v = args["val"]
  157. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  158. msg=json.dumps([{"event":"XXX","YYY":1,"VAL":12}]).encode("utf-8")
  159. cprint("SEND MASTER._GO:",msg,color="green")
  160. cmd_client.send(msg)
  161. import lib.manager as manager
  162. master = manager.MANAGER() #{}
  163. class Modes(): # DUMMY
  164. def __init__(self,*arg,**args):
  165. print("Modes.__init__",arg,args)
  166. self.modes = {}
  167. def val(self,*arg,**args):
  168. #print("Modes.val",arg,args)
  169. pass
  170. class Gui(): # DUMMY
  171. def __init__(self):
  172. self.elem_exec = []
  173. self.elem_meta = [None]*512
  174. self.old_btn_nr = -1
  175. self.METAS = []
  176. for i in range(512):
  177. self.METAS.append({})
  178. def _load_meta(self,nr):
  179. data = {}
  180. try:
  181. data = mc.get("EXEC-META-"+str(nr))
  182. data = json.loads(data)
  183. except Exception as e:
  184. print(" ER1R mc...",e)
  185. return data
  186. def _refresh_data(self,*arg,**args):
  187. start = time.time()
  188. METAS = []
  189. for i in range(512):
  190. nr = i #+1
  191. METAS.append( self._load_meta(nr) )
  192. self.METAS = METAS
  193. for nr,b in enumerate( self.elem_exec): #[nr]
  194. self._refresh_data_single(nr,b,METAS)
  195. print(__file__.split("/")[-1], "_refresh_data:",int((time.time()-start)*10)/10 )
  196. def _refresh_data_single(self,nr,b,METAS=None):
  197. start = time.time()
  198. no_meta = 0
  199. if not METAS:
  200. no_meta = 1
  201. try:
  202. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  203. data = json.loads(data)
  204. self.METAS[nr] = data #.append(data)
  205. #print(time.time())
  206. print(" _REFRESH_EXEC_SINGLE",nr,b,data["LABEL"])
  207. except Exception as e:
  208. print(" ER1R mc...",e)
  209. METAS = self.METAS
  210. #manager = MANAGER()
  211. #master = MANAGER()
  212. modes = Modes()
  213. gui = Gui()
  214. root = tk.Tk()
  215. root.maxsize(600,800)
  216. win_title="FX3"
  217. store = movewin.load_all_sdl(win_title)
  218. print(store)
  219. W=380
  220. H=550
  221. POS=[800,200]
  222. if store:
  223. W = store[-4]
  224. H = store[-3]
  225. POS=[store[-2],store[-1]]
  226. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  227. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  228. defaultFont = tk.font.nametofont("TkDefaultFont")
  229. defaultFont.configure(family="FreeSans", size=10, weight="bold")
  230. # MAIN MENUE
  231. try:
  232. ico_path = "/opt/LibreLight/Xdesk/icon/"
  233. root.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  234. except Exception as e:
  235. print(" Exception GUIWindowContainer.__init__",e)
  236. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  237. draw_fx3(gui,xframe)
  238. root.title(title)
  239. root.bind("<Button>",libtk2.tk_event)#
  240. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  241. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  242. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  243. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  244. _global_key_lock = 0
  245. def focus_in(event=None):
  246. _global_short_key = 0 # protect key-press-repeat
  247. cmd = "xset -display :0.0 r off"
  248. print("FOCUS_IN1", cmd)
  249. os.system(cmd)
  250. time.sleep(0.3)
  251. print("FOCUS_IN2", cmd)
  252. os.system(cmd)
  253. _global_short_key = 1 # protect key-press-repeat
  254. time.sleep(0.3)
  255. _global_key_lock = 0
  256. def focus_out(event=None):
  257. _global_key_lock = 1
  258. _global_short_key = 0
  259. cmd="xset -display :0.0 r rate 240 20"
  260. print("FOCUS_OUT", cmd)
  261. #os.system(cmd) # DISABLED
  262. root.bind("<FocusIn>", focus_in)
  263. root.bind("<FocusOut>", focus_out)
  264. def _refr_loop():
  265. time.sleep(3)
  266. while 1:
  267. try:
  268. gui._refresh_data()
  269. time.sleep(3)
  270. except Exception as e:
  271. print(" ER5R refr_loop()...",e)
  272. time.sleep(3)
  273. time.sleep(0.1)
  274. def _refr_loop2():
  275. time.sleep(3)
  276. while 1:
  277. try:
  278. global root,title
  279. data = mc.get("MODES")
  280. title2 = title +" "+str(data)
  281. data = json.loads(data)
  282. #print("MODES",data)
  283. modes.modes = data
  284. if root:
  285. root.title(title2)
  286. if "S-KEY" in data:
  287. _global_short_key = 0
  288. if data["S-KEY"]:
  289. _global_short_key = 1
  290. for k in data:
  291. #print("title",k)
  292. for kk in ["RESTART","PRO","EASY","EXIT"]:
  293. if kk in str(k):
  294. print("RESTART !!! EXIT !!")
  295. time.sleep(0.1)
  296. root.quit()
  297. #sys.exit()
  298. fx3_line = {}
  299. for comm,v in MAIN.meta.fx3_grid.items():
  300. #print(":",comm,v.val())
  301. if comm.startswith("ATTR:"):
  302. fx3_line[comm] = 1
  303. MAIN.meta.fx3_grid["GRP:1"].val("RGB")
  304. print([0,MAIN.meta.fx3_grid["GRP:1"].data])
  305. print("_ _ "*22)
  306. MAIN.meta.fx3_grid["ATTR:1"].val("PAN")
  307. MAIN.meta.fx3_grid["TYPE:1"].val("COS")
  308. print([1,MAIN.meta.fx3_grid["ATTR:1"].data]) #.val()])
  309. except Exception as e:
  310. print(" ER7R mc...",e)
  311. time.sleep(3)
  312. time.sleep(0.1)
  313. thread.start_new_thread(_refr_loop,())
  314. thread.start_new_thread(_refr_loop2,())
  315. root.mainloop()