Editor3.py 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. This file is part of LibreLight.
  5. LibreLight is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 2 of the License, or
  8. (at your option) any later version.
  9. LibreLight is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with LibreLight. If not, see <http://www.gnu.org/licenses/>.
  15. (c) 2012 micha.rathfelder@gmail.com
  16. """
  17. import random
  18. rnd_id = random.randint(1000,9000)
  19. try:
  20. xtitle = __file__
  21. except:
  22. xtitle = "__file__"
  23. if "/" in xtitle:
  24. xtitle = xtitle.split("/")[-1]
  25. import sys
  26. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  27. import json
  28. import time
  29. import sys
  30. import _thread as thread
  31. import traceback
  32. import tkinter
  33. import tkinter as tk
  34. from tkinter import font
  35. import lib.chat as chat
  36. import lib.motion as motion
  37. from collections import OrderedDict
  38. show_name = "GloryCamp2021"
  39. show_name = "GloryCamp2021"
  40. #show_name = "Dimmer"
  41. CUES = OrderedDict()
  42. groups = OrderedDict()
  43. class Modes():
  44. def __init__(self):
  45. self.modes = {}
  46. self.__cfg = {}
  47. self.__cd = None
  48. def val(self,mode,value=None):
  49. if value is not None:
  50. return self.set(mode,value)
  51. elif mode in self.modes:
  52. return self.modes[mode]
  53. def get(self,mode,value=None):
  54. return slef.val(mode,value)
  55. def __check(self,mode):
  56. if mode not in self.modes:
  57. self.modes[mode] = 0
  58. self.__cfg[mode] = 0
  59. def cfg(self,mode,data={}):
  60. self.__check(mode)
  61. if type(data) is dict:
  62. for k in data:
  63. v = data[k]
  64. if v not in self.__cfg:
  65. self.__cfg[k] = v
  66. return 1
  67. elif type(data) is str:
  68. if data in self.__cfg:
  69. return self.__cfg[data]
  70. def set(self,mode,value):
  71. self.__check(mode)
  72. if mode == "CLEAR":
  73. self.modes["STORE"] = 0
  74. self.callback("STORE")
  75. self.modes[mode] = value
  76. return value
  77. def callback(self,mode):
  78. if self.__cb is not None and mode in self.modes:
  79. value = self.modes[mode]
  80. self.__cb(mode=mode,value=value)
  81. modes = Modes()
  82. modes.modes["BLIND"] = 0
  83. modes.modes["STORE "] = 0
  84. modes.modes["FLASH"] = 0
  85. modes.modes["STONY_FX"] = 0
  86. modes.modes["SELECT"] = 0
  87. modes.modes["ACTIVATE"] = 0
  88. modes.modes["CFG_BTN"] = 0
  89. modes.modes["LABEL"] = 0
  90. POS = ["PAN","TILT","MOTION"]
  91. COLOR = ["RED","GREEN","BLUE","COLOR"]
  92. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  93. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  94. client = chat.tcp_sender()
  95. fade = 2 #2 #0.1 #1.13
  96. fade_on = 1
  97. fx_prm = {"SIZE":20,"SPEED":100,"OFFSET":50,"BASE":"-","START":0}
  98. def build_cmd(dmx,val,args=[fade],flash=0,xpfx="",attr=""):
  99. cmd=""
  100. if xpfx:
  101. pfx=xpfx
  102. elif flash:
  103. pfx ="df"
  104. else:
  105. pfx ="d"
  106. if type(val) is float or type(val) is int:
  107. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  108. else:
  109. cmd += ",{}{}:{}".format(pfx,dmx,val)
  110. if flash:
  111. cmd += ":0:0"#.format(val)
  112. else:
  113. for val in args:
  114. if type(val) is float or type(val) is int:
  115. cmd += ":{:0.4f}".format(val)
  116. else:
  117. cmd += ":{}".format(val)
  118. if attr:
  119. cmd += ":"+str(attr)
  120. return cmd
  121. def update_raw_dmx(data ,value=None,args=[fade],flash=0,pfx="d",fx=0):
  122. cmd = []
  123. if flash:
  124. pfx += "f"
  125. for row in data:
  126. if fx:
  127. if value is not None:
  128. # z.b. flush off
  129. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  130. else:
  131. xcmd = row["FX"]
  132. else:
  133. if row["VALUE"] is None:
  134. xcmd = ""
  135. else:
  136. if value is not None:
  137. if type(value) is float:
  138. xcmd = "{:0.4f}".format(value)
  139. else:
  140. xcmd = "{}".format(value)
  141. else:
  142. xcmd = "{:0.4f}".format(row["VALUE"])
  143. for arg in args:
  144. if type(arg) is float:
  145. xcmd += ":{}".format(arg)
  146. else:
  147. xcmd += ":{:0.4f}".format(arg)
  148. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  149. #xcmd += ":{}".format(row["ATTR"])
  150. cmd.append( xcmd)
  151. return cmd
  152. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  153. #global modes #BLIND
  154. #print("update_dmx",data)
  155. dmx = data["DMX"]
  156. dmx = (data["UNIVERS"]*512)+data["DMX"]
  157. val = None
  158. cmd=""
  159. try:
  160. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  161. #print( "VDIM")
  162. for attr in data["ATTRIBUT"]:
  163. dmx = (data["UNIVERS"]*512) + data["DMX"]
  164. dmx = data["DMX"]
  165. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  166. continue
  167. dmx += data["ATTRIBUT"][attr]["NR"]-1
  168. mode = ""
  169. if "MODE" in data["ATTRIBUT"][attr]:
  170. mode = data["ATTRIBUT"][attr]["MODE"]
  171. #print(attr)
  172. val = data["ATTRIBUT"][attr]["VALUE"]
  173. if data["ATTRIBUT"][attr]["MASTER"]:
  174. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  175. if val is not None:
  176. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  177. if value is not None:
  178. val = value
  179. if mode == "F": #FADE
  180. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  181. else:
  182. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  183. #print("cmd",cmd)
  184. elif data["ATTRIBUT"][attr]["NR"] > 0:
  185. dmx += data["ATTRIBUT"][attr]["NR"]-1
  186. val = data["ATTRIBUT"][attr]["VALUE"]
  187. mode = ""
  188. if "MODE" in data["ATTRIBUT"][attr]:
  189. mode = data["ATTRIBUT"][attr]["MODE"]
  190. if data["ATTRIBUT"][attr]["MASTER"]:
  191. #if "VDIM" in data["ATTRIBUT"]:
  192. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  193. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  194. if val is not None:
  195. #cmd += ",d{}:{}".format(dmx,int(val))
  196. if value is not None:
  197. val = value
  198. if mode == "F": #FADE
  199. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  200. else:
  201. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  202. #print("cmd",cmd)
  203. if modes.val("BLIND"):
  204. cmd=""
  205. return cmd
  206. except Exception as e:
  207. print("== cb EXCEPT",e)
  208. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  209. raise e
  210. class dummy_event():
  211. def __init__(self):
  212. self.num =0
  213. class Xevent():
  214. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  215. self.data=data
  216. self.attr = attr
  217. self.elem = elem
  218. self.mode = mode
  219. def encoder(self,fix,attr,data,elem,action=""):
  220. if action == "click":
  221. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  222. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  223. self.elem["bg"] = "grey"
  224. else:
  225. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  226. self.elem["bg"] = "yellow"
  227. return 1
  228. v2=data["ATTRIBUT"][attr]["VALUE"]
  229. change=0
  230. increment = 4.11
  231. if action == "+":
  232. v2+= increment
  233. v = "+{:0.4f}".format( increment ) #) #4.11"
  234. change=1
  235. elif action == "-":
  236. v2-= 4.11
  237. v = "-{:0.4f}".format( increment ) #) #4.11"
  238. change=1
  239. if v2 < 0:
  240. v2=0
  241. elif v2 > 256:
  242. v2=256
  243. if change:
  244. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  245. elem["bg"] = "yellow"
  246. #v2 = v
  247. #v = data["ATTRIBUT"][attr]["VALUE"]
  248. data["ATTRIBUT"][attr]["VALUE"] = v2
  249. elem["text"] = "{} {:0.2f}".format(attr,v2)
  250. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  251. cmd=update_dmx(attr=attr,data=data,args=[0])
  252. #data["ATTRIBUT"][attr]["VALUE"] = v2
  253. if cmd and not modes.val("BLIND"):
  254. client.send(cmd)
  255. def cb(self,event):
  256. #print("cb",self,event,data)
  257. print("cb",self.attr,self.mode,event)
  258. print(["type",event.type,"num",event.num])
  259. #print(dir(event.type))
  260. #print(dir(event),[str(event.type)])#.keys())
  261. try:
  262. #v = self.data["ATTRIBUT"][self.attr]
  263. #global modes
  264. #global STORE
  265. #global BLIND
  266. #global FLASH
  267. #global STONY_FX
  268. #global LABEL
  269. #global SELECT
  270. #global ACTIVATE
  271. #global CFG_BTN
  272. change = 0
  273. if self.mode == "COMMAND":
  274. if self.attr == "CLEAR":
  275. if event.num == 1:
  276. if modes.val("STORE"):
  277. self.data.val_commands["STORE"] = 0
  278. modes.val("STORE",0)# = 0
  279. self.data.elem_commands["STORE"]["bg"] = "grey"
  280. else:
  281. for fix in self.data.FIXTURES.fixtures:
  282. print( "clr",fix)
  283. data = self.data.FIXTURES.fixtures[fix]
  284. #print("elm",self.data.elem_attr[fix])
  285. for attr in data["ATTRIBUT"]:
  286. if attr.endswith("-FINE"):
  287. continue
  288. self.data.elem_attr[fix][attr]["bg"] = "grey"
  289. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  290. #print(data["ATTRIBUT"])
  291. print( "CB CLEAR" )
  292. if self.attr.startswith("SZ:"):#SIN":
  293. #global fx_prm
  294. k = "SIZE"
  295. if event.num == 1:
  296. pass
  297. elif event.num == 2:
  298. pass
  299. elif event.num == 4:
  300. if fx_prm[k] <= 0:
  301. fx_prm[k] = 1
  302. fx_prm[k] *=1.2
  303. elif event.num == 5:
  304. fx_prm[k] /=1.2
  305. #fx_prm[k] =int(fx_prm[k])
  306. if fx_prm[k] > 4000:
  307. fx_prm[k] = 4000
  308. if fx_prm[k] < 0:
  309. fx_prm[k] =0
  310. self.data.elem_fx_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  311. if self.attr.startswith("SP:"):#SIN":
  312. #global fx_prm
  313. k = "SPEED"
  314. if event.num == 1:
  315. pass
  316. elif event.num == 2:
  317. pass
  318. elif event.num == 4:
  319. if fx_prm[k] <= 0:
  320. fx_prm[k] = 1
  321. fx_prm[k] *=1.2
  322. elif event.num == 5:
  323. fx_prm[k] /=1.2
  324. #fx_prm[k] =int(fx_prm[k])
  325. if fx_prm[k] > 4000:
  326. fx_prm[k] = 4000
  327. if fx_prm[k] < 0:
  328. fx_prm[k] =0
  329. if fx_prm[k] < 0.1:
  330. self.data.elem_fx_commands[self.attr]["text"] = "SP:off".format(fx_prm[k])
  331. else:
  332. self.data.elem_fx_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  333. if self.attr.startswith("ST:"):#SIN":
  334. #global fx_prm
  335. k = "START"
  336. if event.num == 1:
  337. pass
  338. elif event.num == 2:
  339. pass
  340. elif event.num == 4:
  341. if fx_prm[k] <= 0:
  342. fx_prm[k] = 1
  343. fx_prm[k] *=1.2
  344. elif event.num == 5:
  345. fx_prm[k] /=1.2
  346. #fx_prm[k] =int(fx_prm[k])
  347. if fx_prm[k] > 4000:
  348. fx_prm[k] = 4000
  349. if fx_prm[k] < 0:
  350. fx_prm[k] =0
  351. self.data.elem_fx_commands[self.attr]["text"] = "ST:{:0.0f}".format(fx_prm[k])
  352. if self.attr.startswith("OF:"):#SIN":
  353. #global fx_prm
  354. k = "OFFSET"
  355. if event.num == 1:
  356. pass
  357. elif event.num == 2:
  358. pass
  359. elif event.num == 4:
  360. if fx_prm[k] <= 0:
  361. fx_prm[k] = 1
  362. fx_prm[k] *=1.2
  363. elif event.num == 5:
  364. fx_prm[k] /=1.2
  365. #fx_prm[k] =int(fx_prm[k])
  366. if fx_prm[k] > 1024:
  367. fx_prm[k] = 1024
  368. if fx_prm[k] < 0:
  369. fx_prm[k] =0
  370. self.data.elem_fx_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  371. if self.attr.startswith("BS:"):
  372. k = "BASE"
  373. if event.num == 1:
  374. fx_prm[k] = "0"
  375. elif event.num == 2:
  376. pass
  377. elif event.num == 4:
  378. fx_prm[k] = "+"
  379. elif event.num == 5:
  380. fx_prm[k] = "-"
  381. self.data.elem_fx_commands[self.attr]["text"] = "BS:{}".format(fx_prm[k])
  382. if self.attr.startswith("FX:"):#SIN":
  383. if event.num == 1:
  384. cmd = ""
  385. offset = 0
  386. offset_flag=0
  387. start = fx_prm["START"]
  388. base = fx_prm["BASE"]
  389. for fix in self.data.FIXTURES.fixtures:
  390. data = self.data.FIXTURES.fixtures[fix]
  391. #print( "ADD FX",fix)
  392. for attr in data["ATTRIBUT"]:
  393. if attr.endswith("-FINE"):
  394. continue
  395. fx=""
  396. if "SIN" in self.attr:
  397. fx = "sinus"
  398. elif "FD" in self.attr:
  399. fx = "fade"
  400. elif "ON2" in self.attr:
  401. fx = "on2"
  402. elif "ON" in self.attr:
  403. fx = "on"
  404. elif "BUM2" in self.attr:
  405. fx = "bump2"
  406. elif "BUM" in self.attr:
  407. fx = "bump"
  408. elif "COS" in self.attr:
  409. fx = "cosinus"
  410. if fx:
  411. if fx_prm["SPEED"] < 0.1:
  412. fx = "off"
  413. else:
  414. if "DIM" in self.attr:
  415. base=""
  416. if attr == "DIM":
  417. if fx_prm["SPEED"] < 0.1:
  418. fx = "off"
  419. else:
  420. fx = "fade"
  421. elif "TILT" in self.attr:
  422. base=""
  423. if attr == "PAN":
  424. fx = "off"
  425. if attr == "TILT":
  426. if fx_prm["SPEED"] < 0.1:
  427. fx = "off"
  428. else:
  429. fx = "sinus"
  430. elif "PAN" in self.attr:
  431. base=""
  432. if attr == "PAN":
  433. if fx_prm["SPEED"] < 0.1:
  434. fx = "off"
  435. else:
  436. fx = "cosinus"
  437. if attr == "TILT":
  438. fx = "off"
  439. elif "CIR" in self.attr:
  440. base=""
  441. if attr == "PAN":
  442. if fx_prm["SPEED"] < 0.1:
  443. fx = "off"
  444. else:
  445. fx = "cosinus"
  446. if attr == "TILT":
  447. if fx_prm["SPEED"] < 0.1:
  448. fx = "off"
  449. else:
  450. fx = "sinus"
  451. if fx:
  452. fx += ":{:0.0f}:{:0.0f}:{:0.0f}:{:0.0f}:{}:".format(fx_prm["SIZE"],fx_prm["SPEED"],start,offset,base)
  453. offset_flag=1
  454. if "FX" not in data["ATTRIBUT"][attr]:
  455. data["ATTRIBUT"][attr]["FX"] =""
  456. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  457. if data["ATTRIBUT"][attr]["ACTIVE"] and fx:
  458. print("++ADD FX",fix,attr,fx)
  459. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  460. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  461. if fx_prm["OFFSET"] > 0.5 and offset_flag:
  462. offset_flag=0
  463. offset += fx_prm["OFFSET"] # add offset on next fixture
  464. #print("offset",offset)
  465. if cmd and not modes.val("BLIND"):
  466. client.send(cmd)
  467. elif self.attr == "FX OFF":
  468. if event.num == 1:
  469. client.send("fx0:alloff:,fxf:alloff:")
  470. self.data.elem_fx_commands[self.attr]["bg"] = "magenta"
  471. for fix in self.data.FIXTURES.fixtures:
  472. data = self.data.FIXTURES.fixtures[fix]
  473. for attr in data["ATTRIBUT"]:
  474. data["ATTRIBUT"][attr]["FX"] = ""
  475. elif self.attr == "FLASH":
  476. if event.num == 1:
  477. if modes.val("FLASH"):
  478. modes.val("FLASH",0)# = 0
  479. self.data.elem_commands[self.attr]["bg"] = "grey"
  480. else:
  481. modes.val("FLASH",1)# = 1
  482. self.data.elem_commands[self.attr]["bg"] = "green"
  483. elif self.attr == "BLIND":
  484. if event.num == 1:
  485. if self.data.val_commands[self.attr]:
  486. self.data.val_commands[self.attr] = 0
  487. modes.val("BLIND",0)# = 0
  488. self.data.elem_commands[self.attr]["bg"] = "grey"
  489. else:
  490. self.data.val_commands[self.attr] = 1
  491. modes.val("BLIND",1)# = 1
  492. self.data.elem_commands[self.attr]["bg"] = "red"
  493. print("BLIND",self.data.val_commands)
  494. elif self.attr == "FADE":
  495. global fade
  496. global fade_on
  497. if fade < 0.01:
  498. fade = 0.01
  499. elif fade > 100.0:
  500. fade = 100
  501. if event.num == 4:
  502. fade *= 1.1
  503. elif event.num == 5:
  504. fade /= 1.1
  505. elif event.num == 1:
  506. if fade_on:
  507. fade_on = 0
  508. self.data.elem_commands[self.attr]["bg"] = "grey"
  509. else:
  510. fade_on = 1
  511. self.data.elem_commands[self.attr]["bg"] = "green"
  512. elif event.num == 2:
  513. if fade > 1 and fade < 4:
  514. fade = 4
  515. elif fade > 3 and fade < 6:
  516. fade = 6
  517. elif fade > 5 and fade < 7:
  518. fade = 8
  519. elif fade > 7 and fade < 9:
  520. fade = 10
  521. elif fade > 9:
  522. fade = 0.01
  523. elif fade < 1:
  524. fade = 1.1
  525. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  526. elif self.attr == "CFG-BTN":
  527. #global modes #CFG_BTN
  528. if event.num == 1:
  529. if modes.val("CFG_BTN"):
  530. modes.val("CFG_BTN",0)# = 0
  531. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  532. else:
  533. modes.val("CFG_BTN",1)# = 1
  534. self.data.elem_commands[self.attr]["bg"] = "red"
  535. elif self.attr == "ACTIVATE":
  536. #global modes# ACTIVATE
  537. if event.num == 1:
  538. if modes.val("ACTIVATE"):
  539. modes.val("ACTIVATE",0)# = 0
  540. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  541. else:
  542. modes.val("ACTIVATE",1)# = 1
  543. self.data.elem_commands[self.attr]["bg"] = "red"
  544. elif self.attr == "SELECT":
  545. #global modes# SELECT
  546. #global CFG_BTN
  547. if event.num == 1:
  548. if modes.val("SELECT"):
  549. modes.val("SELECT",0)# = 0
  550. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  551. else:
  552. modes.val("SELECT",1)# = 1
  553. self.data.elem_commands[self.attr]["bg"] = "red"
  554. elif self.attr == "LABEL":
  555. #global modes #LABEL
  556. #global CFG_BTN
  557. if event.num == 1:
  558. if modes.val("LABEL"):
  559. modes.val("LABEL", 0)
  560. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  561. else:
  562. modes.val("LABEL", 1)
  563. self.data.elem_commands[self.attr]["bg"] = "red"
  564. elif self.attr == "STONY_FX":
  565. if event.num == 1:
  566. if modes.val("STONY_FX"):
  567. modes.val("STONY_FX", 0)
  568. self.data.elem_fx_commands[self.attr]["bg"] = "grey"
  569. else:
  570. modes.val("STONY_FX", 1)
  571. self.data.elem_fx_commands[self.attr]["bg"] = "red"
  572. elif self.attr == "STORE":
  573. if event.num == 1:
  574. if self.data.val_commands[self.attr]:
  575. self.data.val_commands[self.attr] = 0
  576. modes.val("STORE",0)
  577. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  578. else:
  579. self.data.val_commands[self.attr] = 1
  580. modes.val("STORE", 1)
  581. self.data.elem_commands[self.attr]["bg"] = "red"
  582. print("BLIND",self.data.val_commands)
  583. elif self.attr == "BACKUP":
  584. self.data.PRESETS.backup_presets()
  585. self.data.FIXTURES.backup_patch()
  586. return 0
  587. elif self.mode == "ROOT":
  588. if event.keysym=="Escape":
  589. pass
  590. #STORE = 0
  591. #LABEL = 0
  592. elif self.mode == "INPUT":
  593. print("INP",self.data.entry.get())
  594. if event.keycode == 36:
  595. x=self.data.entry.get()
  596. client.send(x)
  597. #self.data.entry.clean()
  598. #self.data
  599. #chat.send("")
  600. elif self.mode == "INPUT2":
  601. print("INP2",self.data.entry2.get())
  602. if event.keycode == 36:
  603. x=self.data.entry2.get()
  604. client.send(x)
  605. #self.data.entry.clean()
  606. elif self.mode == "INPUT3":
  607. print("INP3",self.data.entry3.get())
  608. if event.keycode == 36:
  609. x=self.data.entry3.get()
  610. client.send(x)
  611. #self.data.entry.clean()
  612. #self.data
  613. #chat.send("")
  614. elif self.mode == "PRESET":
  615. nr = self.attr #int(self.attr.split(":")[1])-1
  616. #print( "RRR", [str(event.type) , event.type] )
  617. #print( "PRESET EVENT",event.num)
  618. if event.num == 1:
  619. if str(event.type) == '4': #4 ButtonPress
  620. #if str(event.type) == "ButtonRelease" or event.type == '5':
  621. if modes.val("STORE"):
  622. self.data.preset_store(nr)
  623. modes.val("STORE",0)
  624. elif modes.val("CFG_BTN"):
  625. import tkinter.simpledialog
  626. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
  627. if "CFG" not in self.data.PRESETS.val_presets[nr]:
  628. self.data.PRESETS.val_presets[nr]["CFG"] = OrderedDict()
  629. if "BUTTON" not in self.data.PRESETS.val_presets[nr]["CFG"]:
  630. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = ""
  631. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = txt
  632. sdata=self.data.PRESETS.val_presets[nr]
  633. BTN="go"
  634. if "CFG" in sdata:#["BUTTON"] = "GO"
  635. if "BUTTON" in sdata["CFG"]:
  636. BTN = sdata["CFG"]["BUTTON"]
  637. label = self.data.PRESETS.label_presets[nr] # = label
  638. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  639. self.data.elem_presets[nr]["text"] = txt
  640. modes.val("CFG_BTN",0)# = 0
  641. self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  642. elif modes.val("LABEL"):#else:
  643. label = "lalaal"
  644. import tkinter.simpledialog
  645. label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
  646. if label is not None:
  647. self.data.elem_presets[nr]["text"] = label
  648. self.data.PRESETS.label_presets[nr] = label
  649. sdata=self.data.PRESETS.val_presets[nr]
  650. BTN="go"
  651. if "CFG" in sdata:#["BUTTON"] = "GO"
  652. if "BUTTON" in sdata["CFG"]:
  653. BTN = sdata["CFG"]["BUTTON"]
  654. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  655. #txt = "Preset:"+str(nr)+":\n"+str(len(l))+":"+label
  656. self.data.elem_presets[nr]["text"] = txt
  657. modes.val("LABEL", 0)
  658. self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
  659. elif modes.val("ACTIVATE"):
  660. self.data.preset_select(nr)
  661. self.data.preset_go(nr,xfade=0,event=event)
  662. modes.val("ACTIVATE", 0)
  663. self.data.elem_commands["ACTIVATE"]["bg"] = "lightgrey"
  664. elif modes.val("SELECT"):
  665. self.data.preset_select(nr)
  666. else:
  667. self.data.preset_go(nr,event=event)
  668. else:
  669. self.data.preset_go(nr,event=event)
  670. if event.num == 3:
  671. if not modes.val("STORE"):
  672. self.data.preset_go(nr,xfade=0,event=event)
  673. return 0
  674. elif self.mode == "INPUT":
  675. return 0
  676. if self.mode == "ENCODER":
  677. #if self.attr == "VDIM":
  678. # self.attr = "DIM"
  679. for fix in self.data.FIXTURES.fixtures:
  680. data = self.data.FIXTURES.fixtures[fix]
  681. for attr in data["ATTRIBUT"]:
  682. if attr.endswith("-FINE"):
  683. continue
  684. elem = self.data.elem_attr[fix][attr]
  685. if self.attr != attr:
  686. continue
  687. if event.num == 1:
  688. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  689. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  690. elem["bg"] = "yellow"
  691. if "FX" in data["ATTRIBUT"][attr]:#["FX"]:# = 1
  692. if data["ATTRIBUT"][attr]["FX"]:# = 1
  693. elem["fg"] = "blue"
  694. else:
  695. elem["fg"] = "blue"
  696. elem["fg"] = "black"
  697. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  698. continue
  699. if event.num == 4:
  700. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  701. #if attr == "DIM":
  702. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  703. elif event.num == 5:
  704. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  705. #if attr == "DIM":
  706. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  707. return 0
  708. if event.num == 1:
  709. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  710. elif event.num == 4:
  711. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  712. elif event.num == 5:
  713. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  714. #finally:
  715. # pass
  716. except Exception as e:
  717. print("== cb EXCEPT",e)
  718. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  719. traceback.print_exc()
  720. #print(self.elem["text"],self.attr,self.data)
  721. def wheel(event,d=None):
  722. print("wheel",event,d)
  723. import copy
  724. class Element():
  725. def __init__(self):
  726. self.__data = {}
  727. def set(self,key,val):
  728. self.__data[key] = val
  729. class Base():
  730. def __init__(self):
  731. pass
  732. def _load(self,filename):
  733. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  734. print("load",xfname)
  735. f = open(xfname,"r")
  736. lines = f.readlines()
  737. f.close()
  738. data = OrderedDict()
  739. labels = OrderedDict()
  740. for line in lines:
  741. key,label,rdata = line.split("\t",2)
  742. key = int(key)
  743. #print(xfname,"load",key,label)
  744. #print(line)
  745. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  746. nrnull = 0
  747. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  748. for attr in jdata["ATTRIBUT"]:
  749. if "NR" in jdata["ATTRIBUT"][attr]:
  750. nr = jdata["ATTRIBUT"][attr]["NR"]
  751. if nr == 0:
  752. nrnull = 1
  753. break
  754. if nrnull:
  755. print("DMX NR IS NULL",attr,"CHANGE +1")
  756. for attr in jdata["ATTRIBUT"]:
  757. if "NR" in jdata["ATTRIBUT"][attr]:
  758. nr = jdata["ATTRIBUT"][attr]["NR"]
  759. if nr >= 0:
  760. jdata["ATTRIBUT"][attr]["NR"] +=1
  761. data[key] = jdata
  762. labels[key] = label
  763. return data,labels
  764. def _backup(self,filename,data,labels):
  765. #fixture
  766. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  767. print("backup",xfname)
  768. f = open(xfname,"w")
  769. for key in data:
  770. line = data[key]
  771. #print(line)
  772. label = "label"
  773. if key in labels:
  774. label = labels[key]
  775. if label == "Name-"+str(key):
  776. label = ""
  777. #print(xfname,"load",key,label,len(line))
  778. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  779. f.close()
  780. class Event():
  781. def __init__(self,name):
  782. self.name=name
  783. print("init",self)
  784. def event(self,event):
  785. print(self.name,event)
  786. class scroll():
  787. def __init__(self,canvas):
  788. self.canvas=canvas
  789. def config(self,event):
  790. canvas = self.canvas
  791. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  792. def ScrollFrame(root,width=50,height=100,bd=1):
  793. print("ScrollFrame init",width,height)
  794. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  795. #aframe.place(x=0,y=0)
  796. aframe.pack(side="left",fill="both",expand=1) #x=0,y=0)
  797. canvas=tk.Canvas(aframe,width=width-24,height=height)
  798. canvas["bg"] = "black" #"green"
  799. bframe=tk.Frame(canvas)#,width=width,height=height)
  800. bframe["bg"] = "blue"
  801. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  802. canvas.configure(yscrollcommand=scrollbar.set)
  803. scrollbar.pack(side="right",fill="y")
  804. canvas.pack(side="left",expand=1,fill="both")
  805. canvas.create_window((0,0),window=bframe,anchor='nw')
  806. bframe.bind("<Configure>",scroll(canvas).config)
  807. canvas.bind("<Button>",Event("XXX").event)
  808. canvas.bind("<Key>",Event("XXX").event)
  809. return bframe
  810. #frame = ScrollFrame(root)
  811. class GUIHandler():
  812. def __init__(self):
  813. pass
  814. def update(self,fix,attr,args={}):
  815. #print("GUIHandler",fix,attr,args)
  816. for i,k in enumerate(args):
  817. v = args[k]
  818. #print("GUI-H", i,k,v)
  819. class Fixtures(Base):
  820. def __init__(self):
  821. super().__init__()
  822. #self.load()
  823. self.fixtures = OrderedDict()
  824. self.gui = GUIHandler()
  825. def load_patch(self):
  826. filename="patch"
  827. d,l = self._load(filename)
  828. self.fixtures = OrderedDict()
  829. for i in l:
  830. sdata = d[i]
  831. for attr in sdata["ATTRIBUT"]:
  832. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  833. print("load",filename,sdata)
  834. #if "CFG" not in sdata:
  835. # sdata["CFG"] = OrderedDict()
  836. self.fixtures[str(i)] = sdata
  837. #self.PRESETS.label_presets = l
  838. def backup_patch(self):
  839. filename = "patch"
  840. data = self.fixtures
  841. labels = {}
  842. for k in data:
  843. labels[k] = k
  844. self._backup(filename,data,labels)
  845. def update_raw(self,rdata):
  846. #print("update_raw",rdata)
  847. cmd = []
  848. for i,d in enumerate(rdata):
  849. xcmd = {"DMX":""}
  850. #print("fix:",i,d)
  851. fix = d["FIX"]
  852. attr = d["ATTR"]
  853. v2 = d["VALUE"]
  854. v2_fx = d["FX"]
  855. if fix not in self.fixtures:
  856. continue
  857. sdata = self.fixtures[fix] #shortcat
  858. ATTR = sdata["ATTRIBUT"]
  859. sDMX = 0
  860. if sdata["DMX"] > 0:
  861. print( sdata)
  862. sDMX = (sdata["UNIVERS"]*512)+sdata["DMX"]
  863. #sDMX =sdata["DMX"]
  864. if attr not in ATTR:
  865. continue
  866. if ATTR[attr]["NR"] >= 0:
  867. DMX = sDMX+ATTR[attr]["NR"]-1
  868. xcmd["DMX"] = str(DMX)
  869. else:
  870. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  871. xcmd["VIRTUAL"] = {}
  872. for a in ATTR:
  873. if ATTR[a]["MASTER"]:
  874. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  875. #print( "VIRTUAL",xcmd)
  876. cmd.append(xcmd)
  877. v=ATTR[attr]["VALUE"]
  878. if v2 is not None:
  879. ATTR[attr]["VALUE"] = v2
  880. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  881. text = str(attr)+' '+str(round(v,2))
  882. self.gui.update(fix,attr,args={"text":text})
  883. return cmd
  884. class Presets(Base):
  885. def __init__(self):
  886. super().__init__()
  887. #self.load()
  888. def load_presets(self):
  889. filename="presets"
  890. d,l = self._load(filename)
  891. for i in d:
  892. sdata = d[i]
  893. if "CFG" not in sdata:
  894. sdata["CFG"] = OrderedDict()
  895. if "FADE" not in sdata["CFG"]:
  896. sdata["CFG"]["FADE"] = 4
  897. if "DELAY" not in sdata["CFG"]:
  898. sdata["CFG"]["DELAY"] = 0
  899. if "BUTTON" not in sdata["CFG"]:
  900. sdata["CFG"]["BUTTON"] = "GO"
  901. self.val_presets = d
  902. self.label_presets = l
  903. def backup_presets(self):
  904. filename = "presets"
  905. data = self.val_presets
  906. labels = self.label_presets
  907. self._backup(filename,data,labels)
  908. def get_cfg(self,nr):
  909. if nr not in self.val_presets:
  910. print(self,"error get_cfg no nr:",nr)
  911. return {}
  912. if "CFG" in self.val_presets[nr]:
  913. return self.val_presets[nr]["CFG"]
  914. def get_raw_map(self,nr):
  915. print("get_raw_map",nr)
  916. if nr not in self.val_presets:
  917. self.val_presets[nr] = OrderedDict()
  918. self.val_presets[nr]["VALUE"] = 0
  919. self.val_presets[nr]["FX"] = ""
  920. sdata = self.val_presets[nr]
  921. cmd = ""
  922. out = []
  923. dmx=-1
  924. for fix in sdata:
  925. if fix == "CFG":
  926. #print("CFG",nr,sdata[fix])
  927. continue
  928. for attr in sdata[fix]:
  929. x = {}
  930. #print("RAW",attr)
  931. x["FIX"] = fix
  932. x["ATTR"] = attr
  933. x["VALUE"] = sdata[fix][attr]["VALUE"]
  934. x["FX"] = sdata[fix][attr]["FX"]
  935. #x["DMX"] = sdata[fix][attr]["NR"]
  936. out.append(x)
  937. return out
  938. class GUI_grid():
  939. def __init__(self,root,data,title="tilte",width=800):
  940. self.data = data
  941. self.frame = tk.Frame(root,bg="black",width=width)
  942. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  943. r=0
  944. c=0
  945. i=1
  946. for row in data:
  947. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  948. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  949. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  950. c+=1
  951. if c % 8 == 0:
  952. r+=1
  953. c=0
  954. i+=1
  955. self.frame.pack()
  956. class BEvent():
  957. def __init__(self,data,cb):
  958. self._data = data
  959. self._cb = cb
  960. def cb(self,event):
  961. #print(self,event)
  962. self._cb(event,self._data)
  963. class GUI_menu():
  964. def __init__(self,root,data,title="tilte",width=800):
  965. global tk
  966. self.data = data
  967. self.frame = tk.Frame(root,bg="black",width=width)
  968. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  969. r=0
  970. c=0
  971. i=1
  972. self.b = tk.Label(self.frame,bg="blue", text="MAIN:MENU",width=13,height=1)
  973. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  974. r+=1
  975. for row in data:
  976. #print(i)
  977. #row = data[i]
  978. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=15,height=3)
  979. self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
  980. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  981. r+=1
  982. i+=1
  983. self.frame.pack()
  984. def callback(self,event,data={}):
  985. print(self,event,data)
  986. window_manager.top(data["text"])# = WindowManager()
  987. lf_nr = 0
  988. class GUIWindow():
  989. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  990. global lf_nr
  991. if master:
  992. self.tk = tkinter.Tk() #Toplevel()
  993. else:
  994. self.tk = tkinter.Toplevel()
  995. self.tk.title(""+str(title)+" "+str(rnd_id)+":"+str(lf_nr))
  996. lf_nr+=1
  997. #self.tk.geometry("270x600+0+65")
  998. geo ="{}x{}".format(width,height)
  999. if left is not None:
  1000. geo += "+{}".format(left)
  1001. if top is not None:
  1002. geo += "+{}".format(top)
  1003. self.tk.geometry(geo)
  1004. def title(self,title=None):
  1005. if title is None:
  1006. return self.tk.title()
  1007. else:
  1008. return self.tk.title(title)
  1009. def show(self):
  1010. pass
  1011. #self.frame.pack()
  1012. def mainloop(self):
  1013. self.tk.mainloop()
  1014. def callback(self,event,data={}):
  1015. print(self,event,data)
  1016. class WindowManager():
  1017. def __init__(self):
  1018. self.windows = {}
  1019. self.nr= 0
  1020. self.first=""
  1021. def new(self,w,name=""):
  1022. if not self.first:
  1023. if name:
  1024. self.first = name
  1025. else:
  1026. self.first = str(self.nr)
  1027. w.tk.attributes('-topmost',True)
  1028. if name:
  1029. self.windows[str(name)] = w
  1030. else:
  1031. self.windows[str(self.nr)] = w
  1032. self.nr+=1
  1033. #w.show()
  1034. def mainloop(self):
  1035. self.windows[self.first].mainloop()
  1036. def top(self,name):
  1037. name = str(name)
  1038. if name in self.windows:
  1039. self.windows[name].tk.attributes('-topmost',True)
  1040. self.windows[name].tk.attributes('-topmost',False)
  1041. else:
  1042. print(name,"not in self.windows",self.windows.keys())
  1043. window_manager = WindowManager()
  1044. w = GUIWindow("MAIN",master=1,width=135,height=500,left=0,top=65)
  1045. data = []
  1046. data.append({"text":"COMMAND"})
  1047. data.append({"text":"EXEC"})
  1048. data.append({"text":"DIMMER"})
  1049. data.append({"text":"FIXTURES"})
  1050. #data.append({"text":"PRESET"})
  1051. data.append({"text":"PATCH"})
  1052. data.append({"text":"ENCODER"})
  1053. f = GUI_menu(w.tk,data)
  1054. window_manager.new(w)
  1055. #w = GUIWindow("GRID",master=0,width=1000,height=200,left=232,top=65)
  1056. #data = []
  1057. #for i in range(10):
  1058. # data.append({"text":"P {:02}".format(i+1)})
  1059. #w = GUI_grid(w.tk,data)
  1060. #window_manager.new(w)
  1061. name = "COMMAND"
  1062. w = GUIWindow(name,master=0,width=800,height=100,left=100,top=610)
  1063. frame_cmd = w.tk
  1064. window_manager.new(w,name)
  1065. name="EXEC"
  1066. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1067. frame_exe = w.tk
  1068. window_manager.new(w,name)
  1069. name="DIMMER"
  1070. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1071. w1 = ScrollFrame(w.tk,width=800,height=400)
  1072. frame_dim = w1 # w.tk
  1073. window_manager.new(w,name)
  1074. name="FIXTURES"
  1075. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1076. w1 = ScrollFrame(w.tk,width=800,height=400)
  1077. frame_fix = w1 #w.tk
  1078. window_manager.new(w,name)
  1079. name="PATCH"
  1080. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1081. w1 = ScrollFrame(w.tk,width=800,height=400)
  1082. frame_patch = w1 #w.tk
  1083. window_manager.new(w,name)
  1084. name="FX"
  1085. w = GUIWindow(name,master=0,width=800,height=200,left=200,top=610)
  1086. frame_fx = w.tk
  1087. window_manager.new(w,name)
  1088. #Xroot = tk.Tk()
  1089. #Xroot["bg"] = "black" #white
  1090. #Xroot.title( xtitle+" "+str(rnd_id) )
  1091. #Xroot.geometry("1024x800+130+65")
  1092. name="ENCODER"
  1093. ww = GUIWindow(name,master=0,width=800,height=150,left=135,top=600)
  1094. Xroot = ww.tk
  1095. w = None
  1096. root = tk.Frame(Xroot,bg="black",width="10px")
  1097. root.pack(fill=tk.BOTH,expand=1, side=tk.LEFT)
  1098. root3 = tk.Frame(Xroot,bg="black",width="20px")
  1099. root3.pack(fill=tk.BOTH,expand=1, side=tk.LEFT)
  1100. root2 = tk.Frame(Xroot,bg="black",width="1px")
  1101. root2.pack(fill=tk.BOTH,expand=1, side=tk.LEFT)
  1102. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  1103. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1104. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1105. #default_font.configure(size=9)
  1106. Xroot.option_add("*Font", FontBold)
  1107. #w = frame_fix #GUIWindow("OLD",master=0,width=800,height=500,left=130,top=65)
  1108. window_manager.new(w,name)
  1109. class GUI(Base):
  1110. def __init__(self):
  1111. super().__init__()
  1112. self.load()
  1113. self.all_attr =["DIM","PAN","TILT"]
  1114. self.elem_attr = {}
  1115. self.fx_commands =["STONY_FX","FX OFF","\n"
  1116. ,"FX:CIR","FX:PAN","FX:TILT","FX:DIM","\n"
  1117. ,"SZ:","SP:","ST:","OF:","BS:-","\n"
  1118. , "FX:SIN","FX:COS","FX:BUM","FX:BUM2","FX:FD","FX:ON","FX:ON2" ]
  1119. self.commands =["BLIND","CLEAR","STORE","EDIT","MOVE","\n","CFG-BTN","LABEL"
  1120. ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE"
  1121. ]
  1122. self.elem_fx_commands = {}
  1123. self.val_fx_commands = {}
  1124. self.elem_commands = {}
  1125. self.val_commands = {}
  1126. self.elem_presets = {}
  1127. self.PRESETS = Presets()
  1128. self.PRESETS.load_presets()
  1129. self.FIXTURES = Fixtures()
  1130. self.FIXTURES.load_patch()
  1131. for i in range(8*8):
  1132. if i not in self.PRESETS.val_presets:
  1133. name = "Preset:"+str(i+1)+":\nXYZ"
  1134. #self.presets[i] = [i]
  1135. self.PRESETS.val_presets[i] = OrderedDict() # FIX
  1136. self.PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  1137. self.PRESETS.label_presets[i] = "-"
  1138. def load(self,fname=""):
  1139. pass
  1140. def exit(self):
  1141. print("__del__",self)
  1142. self.PRESETS.backup_presets()
  1143. print("********************************************************")
  1144. self.FIXTURES.backup_patch()
  1145. print("*********del",self,"***********************************************")
  1146. def refresh_gui(self):
  1147. for fix in self.FIXTURES.fixtures:
  1148. sdata = self.FIXTURES.fixtures[fix]
  1149. for attr in sdata["ATTRIBUT"]:
  1150. if "FINE" in attr:
  1151. continue
  1152. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  1153. if fix in self.elem_attr:
  1154. elem = self.elem_attr[fix][attr]
  1155. #print( attr,v2)
  1156. elem["text"] = "{} {:0.2f}".format(attr,v2)
  1157. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  1158. elem["bg"] = "yellow"
  1159. else:
  1160. elem["bg"] = "grey"
  1161. def preset_store(self,nr):
  1162. print("STORE PRESET")
  1163. self.val_commands["STORE"] = 0
  1164. global STORE
  1165. STORE = 0
  1166. self.elem_commands["STORE"]["bg"] = "lightgrey"
  1167. CFG = OrderedDict()
  1168. if "CFG" in self.PRESETS.val_presets[nr]: #["CFG"]
  1169. CFG = self.PRESETS.val_presets[nr]["CFG"]
  1170. sdata = {}
  1171. sdata["CFG"] = CFG # OrderedDict()
  1172. sdata["CFG"]["FADE"] = fade
  1173. sdata["CFG"]["DEALY"] = 0
  1174. #sdata["CFG"]["BUTTON"] = "GO"
  1175. for fix in self.FIXTURES.fixtures:
  1176. data = self.FIXTURES.fixtures[fix]
  1177. for attr in data["ATTRIBUT"]:
  1178. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1179. if fix not in sdata:
  1180. sdata[fix] = {}
  1181. if attr not in sdata[fix]:
  1182. sdata[fix][attr] = OrderedDict()
  1183. if not modes.val("STONY_FX"):
  1184. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  1185. #sdata[fix][attr]["FADE"] = fade
  1186. else:
  1187. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  1188. if "FX" not in data["ATTRIBUT"][attr]:
  1189. data["ATTRIBUT"][attr]["FX"] =""
  1190. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  1191. print("sdata",len(sdata))
  1192. self.PRESETS.val_presets[nr] = sdata
  1193. if len(sdata) > 1:
  1194. fx_color = 0
  1195. val_color = 0
  1196. for fix in sdata:
  1197. if fix == "CFG":
  1198. continue
  1199. #print( "$$$$",fix,sdata[fix])
  1200. for attr in sdata[fix]:
  1201. if "FX" in sdata[fix][attr]:
  1202. if sdata[fix][attr]["FX"]:
  1203. fx_color = 1
  1204. if "VALUE" in sdata[fix][attr]:
  1205. if sdata[fix][attr]["VALUE"] is not None:
  1206. val_color = 1
  1207. self.elem_presets[nr]["fg"] = "black"
  1208. if val_color:
  1209. self.elem_presets[nr]["bg"] = "yellow"
  1210. if fx_color:
  1211. self.elem_presets[nr]["fg"] = "blue"
  1212. else:
  1213. if fx_color:
  1214. self.elem_presets[nr]["bg"] = "cyan"
  1215. else:
  1216. self.elem_presets[nr]["fg"] = "black"
  1217. self.elem_presets[nr]["bg"] = "grey"
  1218. #self.elem_presets[nr].option_add("*Font", FontBold)
  1219. label = ""
  1220. if nr in self.PRESETS.label_presets:
  1221. #print(dir(self.data))
  1222. label = self.PRESETS.label_presets[nr]
  1223. BTN="go"
  1224. if "CFG" in sdata:#["BUTTON"] = "GO"
  1225. if "BUTTON" in sdata["CFG"]:
  1226. BTN = sdata["CFG"]["BUTTON"]
  1227. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1228. self.elem_presets[nr]["text"] = txt
  1229. #print("GO CFG ",self.PRESETS.val_presets)
  1230. def preset_select(self,nr):
  1231. print("SELECT PRESET")
  1232. sdata = self.PRESETS.val_presets[nr]
  1233. cmd = ""
  1234. for fix in sdata:
  1235. if fix == "CFG":
  1236. continue
  1237. for attr in sdata[fix]:
  1238. v2 = sdata[fix][attr]["VALUE"]
  1239. v2_fx = sdata[fix][attr]["FX"]
  1240. #print( self.data.elem_attr)
  1241. if fix in self.elem_attr:
  1242. elem = self.elem_attr[fix][attr]
  1243. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  1244. self.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1245. elem["bg"] = "yellow"
  1246. def preset_go(self,nr,xfade=fade,event=None):
  1247. print("GO PRESET FADE",nr)
  1248. rdata = self.PRESETS.get_raw_map(nr)
  1249. cfg = self.PRESETS.get_cfg(nr)
  1250. fcmd = self.FIXTURES.update_raw(rdata)
  1251. #virtcmd = self.data.FIXTURES.get_virtual(rdata)
  1252. xFLASH = 0
  1253. value=None
  1254. #xfade = fade
  1255. if modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL"): #FLASH
  1256. self.preset_select(nr)
  1257. return 0
  1258. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  1259. xFLASH = 1
  1260. xfade = 0
  1261. if event:
  1262. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1263. # 4 fix vor ThinkPad / Debian 11
  1264. if xFLASH:
  1265. value = "off"
  1266. vvcmd = update_raw_dmx( rdata ,value,[xfade] )
  1267. fxcmd = update_raw_dmx( rdata ,value,[xfade],fx=1)
  1268. cmd = []
  1269. for vcmd,d in [[vvcmd,"d"],[fxcmd,"fx"]]:
  1270. if xFLASH:
  1271. d+="f"
  1272. for i,v in enumerate(fcmd):
  1273. DMX = fcmd[i]["DMX"]
  1274. if DMX and vcmd[i]:
  1275. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1276. cmd.append( xcmd )
  1277. if "VIRTUAL" in fcmd[i]:
  1278. for a in fcmd[i]["VIRTUAL"]:
  1279. DMX = fcmd[i]["VIRTUAL"][a]
  1280. if DMX and vcmd[i]:
  1281. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1282. cmd.append( xcmd )
  1283. cmd = "".join(cmd)
  1284. print("cmd",cmd)
  1285. if cmd and not modes.val("BLIND"):
  1286. client.send(cmd )
  1287. self.refresh_gui()
  1288. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  1289. i=0
  1290. if frame is None:
  1291. frame = tk.Frame(root,bg="black")
  1292. frame.pack(fill=tk.X, side=tk.TOP)
  1293. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1294. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1295. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1296. #c+=1
  1297. #r+=1
  1298. if fix not in self.elem_attr:
  1299. self.elem_attr[fix] = {}
  1300. for attr in data["ATTRIBUT"]:
  1301. if attr not in self.all_attr:
  1302. self.all_attr.append(attr)
  1303. if attr not in self.elem_attr[fix]:
  1304. self.elem_attr[fix][attr] = []
  1305. if attr.endswith("-FINE"):
  1306. continue
  1307. v= data["ATTRIBUT"][attr]["VALUE"]
  1308. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  1309. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1310. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1311. c+=1
  1312. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  1313. self.elem_attr[fix][attr] = b
  1314. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1315. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1316. c+=1
  1317. if c >=12:
  1318. c=0
  1319. r+=1
  1320. return c,r
  1321. def draw_patch(self):
  1322. r=0
  1323. c=0
  1324. root = frame_dim
  1325. dim_frame = tk.Frame(root,bg="black")
  1326. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1327. root = frame_patch
  1328. fix_frame = tk.Frame(root,bg="black")
  1329. canvas = tk.Canvas(root)
  1330. def yview(event):
  1331. print("yevent",event)
  1332. print(dir(canvas))
  1333. #yview_moveto', 'yview_scroll'
  1334. yyy=20.1
  1335. fix_frame.yview_moveto(yyy)
  1336. #canvas.yview_moveto(yyy)
  1337. #yyy=20
  1338. #canvas.yview_scroll(yyy,"units")
  1339. #def sconfig(event):
  1340. # global canvas
  1341. # canvas.configure(scrollregion=canvas.bbox("all"),width=400,height=200)
  1342. #fix_frame.bind("<Configure>",sconfig)
  1343. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=canvas.yview)
  1344. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=yview)
  1345. #myscrollbar.pack(side="right",fill="y")
  1346. #canvas.create_window((0, 0), window=fix_frame, anchor="nw")
  1347. #canvas.pack(fill=tk.X, side=tk.TOP)
  1348. fix_frame = tk.Frame(root,bg="black")
  1349. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1350. #fix_frame = canvas
  1351. #fix_frame.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1352. #canvas.configure(yscrollcommand=myscrollbar.set)
  1353. i=0
  1354. c=0
  1355. r=0
  1356. for fix in self.FIXTURES.fixtures:
  1357. i+=1
  1358. data = self.FIXTURES.fixtures[fix]
  1359. print( fix ,data )
  1360. #if(len(data["ATTRIBUT"].keys()) <= 1):
  1361. # c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1362. #else:
  1363. if 1:
  1364. #self._draw_fix(fix,data,root=fix_frame)
  1365. frame = fix_frame
  1366. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1367. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1368. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1369. c+=1
  1370. #r+=1
  1371. if fix not in self.elem_attr:
  1372. self.elem_attr[fix] = {}
  1373. patch = ["DMX","UNIVERS"]
  1374. for k in patch:
  1375. v=data[k]
  1376. b = tk.Button(frame,bg="grey", text=str(k)+' '+str(v),width=8)
  1377. #self.elem_attr[fix][attr] = b
  1378. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1379. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1380. c+=1
  1381. if c >=8:
  1382. c=1
  1383. r+=1
  1384. for attr in data["ATTRIBUT"]:
  1385. if attr not in self.all_attr:
  1386. self.all_attr.append(attr)
  1387. if attr not in self.elem_attr[fix]:
  1388. self.elem_attr[fix][attr] = []
  1389. if attr.endswith("-FINE"):
  1390. continue
  1391. v= data["ATTRIBUT"][attr]["VALUE"]
  1392. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1393. self.elem_attr[fix][attr] = b
  1394. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1395. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1396. c+=1
  1397. if c >=8:
  1398. c=1
  1399. r+=1
  1400. c=0
  1401. r+=1
  1402. #fix_frame
  1403. #canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1404. def draw_fix(self):
  1405. r=0
  1406. c=0
  1407. root = frame_dim
  1408. dim_frame = tk.Frame(root,bg="black")
  1409. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1410. root = frame_fix
  1411. fix_frame = tk.Frame(root,bg="black")
  1412. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1413. i=0
  1414. c=0
  1415. r=0
  1416. for fix in self.FIXTURES.fixtures:
  1417. i+=1
  1418. data = self.FIXTURES.fixtures[fix]
  1419. print( fix ,data )
  1420. if(len(data["ATTRIBUT"].keys()) <= 1):
  1421. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1422. else:
  1423. #self._draw_fix(fix,data,root=fix_frame)
  1424. frame = fix_frame
  1425. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1426. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1427. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1428. c+=1
  1429. #r+=1
  1430. if fix not in self.elem_attr:
  1431. self.elem_attr[fix] = {}
  1432. for attr in data["ATTRIBUT"]:
  1433. if attr not in self.all_attr:
  1434. self.all_attr.append(attr)
  1435. if attr not in self.elem_attr[fix]:
  1436. self.elem_attr[fix][attr] = []
  1437. if attr.endswith("-FINE"):
  1438. continue
  1439. v= data["ATTRIBUT"][attr]["VALUE"]
  1440. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1441. self.elem_attr[fix][attr] = b
  1442. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1443. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1444. c+=1
  1445. if c >=8:
  1446. c=1
  1447. r+=1
  1448. c=0
  1449. r+=1
  1450. def draw_enc(self):
  1451. i=0
  1452. c=0
  1453. r=0
  1454. #frame = tk.Frame(root,bg="black")
  1455. #frame.pack(fill=tk.X, side=tk.TOP)
  1456. #b = tk.Label(frame,bg="black", text="--------------------------------- ---------------------------------------")
  1457. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1458. #r=0
  1459. frame = tk.Frame(root2,bg="black")
  1460. frame.pack( side=tk.TOP,expand=1,fill="both")
  1461. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1462. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1463. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1464. #r+=1
  1465. c+=1
  1466. for attr in self.all_attr:
  1467. if attr.endswith("-FINE"):
  1468. continue
  1469. v=0
  1470. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1471. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1472. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1473. c+=1
  1474. if c >=8:
  1475. c=0
  1476. r+=1
  1477. def draw_fx(self):
  1478. i=0
  1479. c=0
  1480. r=0
  1481. #frame = tk.Frame(root,bg="black")
  1482. #frame.pack(fill=tk.X, side=tk.TOP)
  1483. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1484. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1485. #r=0
  1486. #frame = tk.Frame(root2,bg="black")
  1487. frame = tk.Frame(frame_fx,bg="black")
  1488. frame.pack(fill=tk.X, side=tk.TOP)
  1489. b = tk.Button(frame,bg="lightblue", text="FX.",width=6)
  1490. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1491. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1492. #r+=1
  1493. c+=1
  1494. for comm in self.fx_commands:
  1495. if comm == "\n":
  1496. c=0
  1497. r+=1
  1498. continue
  1499. v=0
  1500. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1501. if comm not in self.elem_fx_commands:
  1502. self.elem_fx_commands[comm] = b
  1503. self.val_fx_commands[comm] = 0
  1504. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1505. if comm == "BLIND":
  1506. b["bg"] = "grey"
  1507. if comm == "CLEAR":
  1508. b["bg"] = "grey"
  1509. if comm == "STONY_FX":
  1510. b["bg"] = "grey"
  1511. if comm == "FADE":
  1512. b["bg"] = "green"
  1513. if comm == "FX OFF":
  1514. b["bg"] = "magenta"
  1515. if comm == "SZ:":
  1516. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1517. if comm == "SP:":
  1518. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1519. if comm == "ST:":
  1520. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1521. if comm == "OF:":
  1522. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1523. if comm == "BS:":
  1524. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1525. if comm:
  1526. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1527. c+=1
  1528. if c >=12:
  1529. c=0
  1530. r+=1
  1531. def draw_command(self):
  1532. i=0
  1533. c=0
  1534. r=0
  1535. #frame = tk.Frame(root,bg="black")
  1536. #frame.pack(fill=tk.X, side=tk.TOP)
  1537. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1538. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1539. #r=0
  1540. #frame = tk.Frame(root2,bg="black")
  1541. frame = tk.Frame(frame_cmd,bg="black")
  1542. frame.pack(fill=tk.X, side=tk.TOP)
  1543. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1544. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1545. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1546. #r+=1
  1547. c+=1
  1548. for comm in self.commands:
  1549. if comm == "\n":
  1550. c=0
  1551. r+=1
  1552. continue
  1553. v=0
  1554. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1555. if comm not in self.elem_commands:
  1556. self.elem_commands[comm] = b
  1557. self.val_commands[comm] = 0
  1558. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1559. if comm == "BLIND":
  1560. b["bg"] = "grey"
  1561. if comm == "CLEAR":
  1562. b["bg"] = "grey"
  1563. if comm == "STONY_FX":
  1564. b["bg"] = "grey"
  1565. if comm == "FADE":
  1566. b["bg"] = "green"
  1567. if comm == "FX OFF":
  1568. b["bg"] = "magenta"
  1569. if comm == "SZ:":
  1570. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1571. if comm == "SP:":
  1572. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1573. if comm == "ST:":
  1574. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1575. if comm == "OF:":
  1576. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1577. if comm == "BS:":
  1578. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1579. if comm:
  1580. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1581. c+=1
  1582. if c >=12:
  1583. c=0
  1584. r+=1
  1585. def draw_preset(self):
  1586. i=0
  1587. c=0
  1588. r=0
  1589. root = frame_exe
  1590. frame = tk.Frame(root,bg="black")
  1591. frame.pack(fill=tk.X, side=tk.TOP)
  1592. b = tk.Button(frame,bg="lightblue", text="EXEC")
  1593. #b.bind("<Button>",Xevent(elem=b).cb)
  1594. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1595. r+=1
  1596. for k in self.PRESETS.val_presets:
  1597. v=0
  1598. label = ""
  1599. if k in self.PRESETS.label_presets:
  1600. label = self.PRESETS.label_presets[k]
  1601. print([label])
  1602. sdata=self.PRESETS.val_presets[k]
  1603. BTN="go"
  1604. if "CFG" in sdata:#["BUTTON"] = "GO"
  1605. if "BUTTON" in sdata["CFG"]:
  1606. BTN = sdata["CFG"]["BUTTON"]
  1607. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1608. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1609. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1610. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1611. if k in self.PRESETS.val_presets and len(self.PRESETS.val_presets[k]) :
  1612. b["bg"] = "yellow"
  1613. sdata = self.PRESETS.val_presets[k]
  1614. if len(sdata) > 1:
  1615. fx_color = 0
  1616. val_color = 0
  1617. for fix in sdata:
  1618. if fix == "CFG":
  1619. continue
  1620. #print( "$$$$",fix,sdata[fix])
  1621. for attr in sdata[fix]:
  1622. if "FX" in sdata[fix][attr]:
  1623. if sdata[fix][attr]["FX"]:
  1624. fx_color = 1
  1625. if "VALUE" in sdata[fix][attr]:
  1626. if sdata[fix][attr]["VALUE"] is not None:
  1627. val_color = 1
  1628. b["fg"] = "black"
  1629. if val_color:
  1630. b["bg"] = "gold"
  1631. if fx_color:
  1632. b["fg"] = "blue"
  1633. else:
  1634. if fx_color:
  1635. b["bg"] = "cyan"
  1636. else:
  1637. b["bg"] = "grey"
  1638. if "SEL" in txt:
  1639. b["fg"] = "black"
  1640. b["bg"] = "blue"
  1641. elif "GO" in txt:
  1642. b["fg"] = "black"
  1643. elif "FL" in txt:
  1644. b["fg"] = "red"
  1645. if k not in self.elem_presets:
  1646. self.elem_presets[k] = b
  1647. #self.PRESETS.val_presets[preset] = 0
  1648. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1649. c+=1
  1650. if c >=8:
  1651. c=0
  1652. r+=1
  1653. def draw_input(self):
  1654. i=0
  1655. c=0
  1656. r=0
  1657. frame = tk.Frame(root2,bg="black")
  1658. frame.pack(fill=tk.X, side=tk.TOP)
  1659. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  1660. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1661. r=0
  1662. frame = tk.Frame(root2,bg="black")
  1663. frame.pack(fill=tk.X, side=tk.TOP)
  1664. b = tk.Label(frame, text="send:")
  1665. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1666. c+=1
  1667. b = tk.Entry(frame,bg="grey", text="",width=50)
  1668. self.entry = b
  1669. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1670. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1671. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1672. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1673. r+=1
  1674. b = tk.Entry(frame,bg="grey", text="",width=20)
  1675. self.entry2 = b
  1676. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1677. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1678. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1679. b.insert("end","d1:0:4")
  1680. r+=1
  1681. b = tk.Entry(frame,bg="grey", text="",width=20)
  1682. self.entry3 = b
  1683. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1684. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1685. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1686. b.insert("end","fx:alloff:::")
  1687. def render(self):
  1688. Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1689. self.draw_patch()
  1690. self.draw_fix()
  1691. #input()
  1692. self.draw_enc()
  1693. self.draw_command()
  1694. self.draw_fx()
  1695. self.draw_input()
  1696. self.draw_preset()
  1697. try:
  1698. master =GUI()
  1699. master.render()
  1700. #root.mainloop()
  1701. #tk.mainloop()
  1702. window_manager.mainloop()
  1703. finally:
  1704. master.exit()