EXEC-BTN.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. import json
  2. import time
  3. import sys
  4. import tkinter as tk
  5. from tkinter import font
  6. import traceback
  7. import _thread as thread
  8. import dialog
  9. DIALOG = dialog.Dialog()
  10. gui=None
  11. GLOBAL_old_btn_nr = -1
  12. def Dcb(exec_nr): #DAILOG CONFIG CALLBACK
  13. def _Dcb(*args):
  14. print("Dcb:",args)
  15. msg=json.dumps([{"event":"EXEC-CFG","EXEC":exec_nr,"VALUE":255,"DATA":args[0]}]).encode("utf-8")
  16. cprint("SEND DIALOG.cb",msg,color="green")
  17. cmd_client.send(msg)
  18. def _X_refresh():
  19. global GLOBAL_old_btn_nr
  20. if 1:#REFRESH:
  21. btn_nr = exec_nr
  22. time.sleep(1.2)
  23. print()
  24. print("CFG CB REFRESH !?",btn_nr)
  25. nr = btn_nr-1
  26. b = gui.elem_exec[nr]
  27. gui._refresh_exec_single(nr,b) #,METAS):
  28. time.sleep(0.2)
  29. nr2= GLOBAL_old_btn_nr
  30. if nr2 >= 0 and nr2 != nr:
  31. gui._refresh_exec_single(nr2,b) #,METAS):
  32. print("CFG CB2 REFRESH ",nr,nr2)
  33. if 1:
  34. GLOBAL_old_btn_nr = nr
  35. thread.start_new_thread(_X_refresh,())
  36. return _Dcb
  37. def Dcb_label(exec_nr): #DAILOG CONFIG CALLBACK
  38. def _Dcb(*args):
  39. print("Dcb_label:",args)
  40. if "Value" in args[0]:
  41. DATA = {"Label":args[0]["Value"]}
  42. #msg=json.dumps([{"event":"LABEL","EXEC":exec_nr,"VALUE":255,"DATA":args[0]}]).encode("utf-8")
  43. msg=json.dumps([{"event":"EXEC-LABEL","EXEC":exec_nr,"VALUE":255,"DATA":DATA}]).encode("utf-8")
  44. cprint("SEND DIALOG.cb",msg,color="green")
  45. cmd_client.send(msg)
  46. msg=json.dumps([{"event":"LABEL","EXEC":exec_nr,"VALUE":255,"DATA":{}}]).encode("utf-8")
  47. cmd_client.send(msg)
  48. def _X_refresh():
  49. global GLOBAL_old_btn_nr
  50. if 1:#REFRESH:
  51. btn_nr = exec_nr
  52. time.sleep(1.2)
  53. print()
  54. print("CFG CB REFRESH !?",btn_nr)
  55. nr = btn_nr-1
  56. b = gui.elem_exec[nr]
  57. gui._refresh_exec_single(nr,b) #,METAS):
  58. time.sleep(0.2)
  59. nr2= GLOBAL_old_btn_nr
  60. if nr2 >= 0 and nr2 != nr:
  61. gui._refresh_exec_single(nr2,b) #,METAS):
  62. print("CFG CB2 REFRESH ",nr,nr2)
  63. if 1:
  64. GLOBAL_old_btn_nr = nr
  65. thread.start_new_thread(_X_refresh,())
  66. return _Dcb
  67. DIALOG._cb = Dcb(-3)
  68. #d = dialog.Dialog()
  69. #d.ask_exec_config(str(nr+1),button=button,label=label,cfg=cfg)
  70. import __main__ as MAIN
  71. _file_path = "/opt/LibreLight/Xdesk/"
  72. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  73. import tool.git as git
  74. #CAPTION += git.get_all()
  75. CAPTION = "EXEC-BTN"
  76. title = CAPTION
  77. title += git.get_all()
  78. INIT_OK = 1
  79. IS_GUI = 0
  80. from lib.cprint import cprint
  81. import lib.libtk as libtk
  82. import lib.libtk2 as libtk2
  83. import lib.zchat as chat
  84. import lib.mytklib as mytklib
  85. import lib.tkevent as tkevent
  86. #import tkgui.draw as draw
  87. def draw_exec(gui,xframe,EXEC):
  88. i=0
  89. c=0
  90. r=0
  91. root = xframe
  92. frame = tk.Frame(root,bg="black")
  93. frame.pack(fill=tk.X, side=tk.TOP)
  94. gui.elem_exec = {}
  95. i=0
  96. for k in EXEC.val_exec:
  97. if i%(10*8)==0 or i ==0:
  98. c=0
  99. b = tk.Canvas(frame,bg="black", height=4,bd=0,width=6,highlightthickness=0) #,bd="black")
  100. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  101. r+=1
  102. c=0
  103. b = tk.Button(frame,bg="lightblue", text="EXEC " )
  104. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  105. c+=1
  106. b = tk.Button(frame,bg="lightblue", text="BANK " + str(int(i/(8*8))+1) )
  107. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  108. c+=1
  109. b = tk.Button(frame,bg="lightblue", text="NAME" )
  110. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  111. c+=7
  112. if i == 0:
  113. b = tk.Button(frame,bg="darkgrey", text="HELP",command=libtk.online_help("librelight:20-exec")) #"0&do=index"))
  114. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  115. r+=1
  116. c=0
  117. i+=1
  118. v=0
  119. label = ""
  120. sdata=EXEC.val_exec[k]
  121. BTN="go"
  122. if "CFG" in sdata:#["BUTTON"] = "GO"
  123. if "BUTTON" in sdata["CFG"]:
  124. BTN = sdata["CFG"]["BUTTON"]
  125. txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  126. b = mytklib.ExecButton(frame,text=txt)
  127. b.bind("<Button>", tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="EXEC").cb)
  128. b.bind("<ButtonRelease>",tkevent.tk_event(fix=0,elem=b,attr=k,data=gui,mode="EXEC").cb)
  129. if k not in gui.elem_exec:
  130. gui.elem_exec[k] = b
  131. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  132. b.config(text="xx"+str(i))
  133. c+=1
  134. if c >=10:
  135. c=0
  136. r+=1
  137. time.sleep(0.1)
  138. gui._refresh_exec()
  139. print("##################################")
  140. import tool.movewin as movewin
  141. #movewin.check_is_started(CAPTION,_file_path)
  142. movewin.check_is_started("EXEC-BTN","/opt/LibreLight/Xdesk/tkgui/EXEC-BTN.py")
  143. _global_short_key = 1
  144. root = None
  145. cmd_client = chat.Client(port=30003)
  146. try:
  147. import memcache
  148. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  149. except:
  150. mc = None
  151. class Refresher(): # DUMMY
  152. def __init__(self,*arg,**args):
  153. print(self,"__init__",arg,args)
  154. def reset(*arg,**args):
  155. print(self,"reset",arg,args)
  156. class Command():
  157. def __init__(self):
  158. self.elem = {}
  159. class MASTER(): # DUMMY
  160. def __init__(self,*arg,**args):
  161. print(self,"__init__",arg,args)
  162. #self.refresh_fix = Refresher()
  163. self.commands = Command()
  164. def refresh_fix(self,*arg,**args):# = Refresher()
  165. print(self,"refresh_fix",arg,args)
  166. def exec_go(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  167. if _global_key_lock:
  168. return
  169. #def exec_go(nr,xfade=None,val=0):
  170. print(self,"MASTER",nr,arg,args)
  171. btn_nr = nr
  172. v = args["val"]
  173. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  174. cprint("SEND MASTER.EXEC_GO:",msg,color="green")
  175. cmd_client.send(msg)
  176. def refresh_fix(*arg,**args): # DUMMY
  177. print("refresh_fix",arg,args)
  178. class Refresher_fix(): # DUMMY
  179. def __init__(self,*arg,**args):
  180. print(self,"init",arg,args)
  181. def reset(self,*arg,**args):
  182. print(self,"reset",arg,args)
  183. refresher_fix = Refresher_fix()
  184. class Modes(): # DUMMY
  185. def __init__(self,*arg,**args):
  186. print("Modes.__init__",arg,args)
  187. self.modes = {}
  188. def val(self,*arg,**args):
  189. #print("Modes.val",arg,args)
  190. pass
  191. master = MASTER() #{}
  192. modes = Modes()
  193. import tkinter as tk
  194. class Exec(): # DUMMY
  195. def __init__(self):
  196. self.val_exec = {}
  197. for i in range(512):
  198. k=i #"ABC-{}".format(i+1)
  199. self.val_exec[k] = {"NAME":"XX"}
  200. EXEC = Exec()
  201. class Gui(): # DUMMY
  202. def __init__(self):
  203. self.elem_exec = []
  204. self.elem_meta = [None]*512
  205. self.old_btn_nr = -1
  206. self.METAS = []
  207. for i in range(512):
  208. self.METAS.append({})
  209. def _refresh_exec(self,*arg,**args):
  210. #print("EXEC_Gui._refresh_exec",arg,args)
  211. nr = 14-1
  212. METAS = []
  213. for i in range(512):
  214. nr = i #+1
  215. try:
  216. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  217. data = json.loads(data)
  218. METAS.append(data)
  219. except Exception as e:
  220. print(" ER1R mc...",e)
  221. self.METAS = METAS
  222. for nr,b in enumerate( self.elem_exec): #[nr]
  223. self._refresh_exec_single(nr,b,METAS)
  224. #time.sleep(0.001)
  225. def _refresh_exec_single(self,nr,b,METAS=None):
  226. if not METAS:
  227. try:
  228. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  229. data = json.loads(data)
  230. self.METAS[nr] = data #.append(data)
  231. print(time.time())
  232. print(" _REFRESH_EXEC_SINGLE",nr,b,data)
  233. except Exception as e:
  234. print(" ER1R mc...",e)
  235. METAS = self.METAS
  236. _bg = "grey"
  237. _ba = "grey"
  238. _bg = "grey"
  239. _fg = "#555" #darkgrey"
  240. _text = "0 N/V 0\n N/V"
  241. txt = "None/nNone"
  242. txt1 = "None/nNone"
  243. out = {} # default
  244. out["fx"] = ""
  245. out["bg"] = _bg # "grey"
  246. out["ba"] = _ba #"grey"
  247. out["fg"] = _fg
  248. out["text"] = _text #"? "+str(nr+1)
  249. META = {'LABEL': 'ERR', 'CFG': {}}
  250. META["CFG"] = {'FADE': 3.0, 'DEALY': 0, 'DELAY': 4.0, 'BUTTON': 'ON', 'HTP-MASTER': 100
  251. ,'SIZE-MASTER': 100, 'SPEED-MASTER': 100, 'OFFSET-MASTER': 100, 'OUT-FADE': 10.0
  252. ,'FIX-COUNT':0 ,'HAVE-FX':0,'HAVE-VAL':0
  253. }
  254. try:
  255. META = METAS[nr]
  256. label = "{} {} {}\n{}".format(nr+1,META["CFG"]["BUTTON"],META["CFG"]["FIX-COUNT"],META["LABEL"])
  257. out["text"] = str(label)
  258. except Exception as e:
  259. print(" ER4R",e,nr)
  260. time.sleep(0.001)
  261. try:
  262. txt1 = META["CFG"]["BUTTON"]
  263. except:
  264. pass
  265. if META["CFG"]["FIX-COUNT"]:
  266. _fg = "black"
  267. if META["CFG"]["HAVE-VAL"]:
  268. _fg = "black"
  269. _bg = "yellow"
  270. _ba = "#ffaa55"
  271. if "SEL" in txt1:
  272. #_bg = "blue"
  273. #_fg = "blue"
  274. _bg = "gold"
  275. _bg = "#77f"
  276. elif "ON" in txt1:
  277. _bg = "gold"
  278. _fg = "#040"
  279. _fg = "black"
  280. elif "GO" in txt1:
  281. _bg = "gold"
  282. _fg = "#555"
  283. _fg = "black"
  284. elif "FL" in txt1:
  285. _bg = "gold"
  286. out["fx"] = ""
  287. if META["CFG"]["HAVE-FX"] >= 1:
  288. out["fx"] = META["CFG"]["HAVE-FX"] # show FX on EXEC-BTN
  289. if META["CFG"]["HAVE-FX"] >= 1 and META["CFG"]["HAVE-VAL"] == 0:
  290. _bg = "cyan"
  291. if "FL" in txt1:
  292. _fg = "#00e"
  293. out["fg"] = _fg #= "#00e"
  294. out["bg"] = _bg #= "#00e"
  295. cfg = out
  296. self.elem_meta[nr] = META
  297. b = self.elem_exec[nr]
  298. b.configure(fg=cfg["fg"],bg=cfg["bg"],activebackground=cfg["ba"],text=cfg["text"],fx=cfg["fx"])
  299. def exec_go(self,*arg,**args):
  300. print("Gui.exec_go",arg,args)
  301. btn_nr = arg[0]
  302. v=args["val"]
  303. if "CFG-BTN" in modes.modes:
  304. button = self.elem_exec[btn_nr]
  305. label = str(btn_nr) #self.elem_meta[nr] = META
  306. if v:
  307. META = self.elem_meta[btn_nr]
  308. print("META",META)
  309. cfg = META["CFG"]
  310. label = META["LABEL"]
  311. button = cfg["BUTTON"]
  312. DIALOG._cb = Dcb(btn_nr+1)
  313. DIALOG.ask_exec_config(str(btn_nr+1),button=button,label=label,cfg=cfg)
  314. #print("INFO",master.commands.elem)
  315. return #STOP
  316. if "LABEL" in modes.modes:
  317. button = self.elem_exec[btn_nr]
  318. label = str(btn_nr) #self.elem_meta[nr] = META
  319. if v:
  320. META = self.elem_meta[btn_nr]
  321. print("META",META)
  322. cfg = META["CFG"]
  323. label = META["LABEL"]
  324. button = cfg["BUTTON"]
  325. DIALOG._cb = Dcb_label(btn_nr+1)
  326. #DIALOG.ask_exec_config(str(btn_nr+1),button=button,label=label,cfg=cfg)
  327. DIALOG.askstring("LABEL","LABEL EXE:"+str(btn_nr+1),initialvalue=label)
  328. #print("INFO",master.commands.elem)
  329. return #STOP
  330. PREFIX = ""
  331. REFRESH = 0
  332. for k in ["REC","EDIT","COPY","MOVE","DEL","REC-FX"]:#,"SELECT","FLASH","GO","EDIT"]:
  333. if k in modes.modes:
  334. PREFIX = str(k) #+"-"
  335. for k in ["REC","COPY","MOVE","DEL","REC-FX"]:
  336. if k in modes.modes:
  337. REFRESH = 1
  338. print(" ",[arg,args])
  339. edata={}
  340. if "event" in args:
  341. edata = libtk2.serialize_event(args["event"])
  342. print(" ",edata)
  343. num = -1
  344. MOUSE = ""
  345. out={"event": "EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}
  346. if "num" in edata:
  347. num = edata["num"]
  348. if num == 1:
  349. out["MOUSE"]="LEFT"
  350. if num == 3:
  351. out["MOUSE"]="RIGHT"
  352. msg=json.dumps([out]).encode("utf-8")
  353. if not _global_key_lock:
  354. cmd_client.send(msg)
  355. cprint("SEND GUI.EXEC_GO",msg,color="green")
  356. def _X_refresh():
  357. #if 1:#REFRESH:
  358. time.sleep(0.2)
  359. print()
  360. print("REC REFRESH !?",PREFIX)
  361. nr = btn_nr
  362. b = self.elem_exec[nr]
  363. refresh_both = 0
  364. if self.old_btn_nr >= 0 and self.old_btn_nr != nr:
  365. self.old_btn_nr = nr
  366. refresh_both = 1
  367. time.sleep(0.4)
  368. self._refresh_exec_single(nr,b) #,METAS):
  369. time.sleep(0.4)
  370. if refresh_both:
  371. self._refresh_exec_single(self.old_btn_nr,b) #,METAS):
  372. time.sleep(2.)
  373. self._refresh_exec_single(nr,b) #,METAS):
  374. if refresh_both:
  375. self._refresh_exec_single(self.old_btn_nr,b) #,METAS):
  376. thread.start_new_thread(_X_refresh,())
  377. gui = Gui()
  378. import lib.libwin as libwin
  379. name="EXEC"
  380. pos_list = libwin.read_window_position()
  381. geo = libwin.split_window_position(pos_list,name)
  382. args = {"title":name,"master":0,"width":600,"height":113,"left":30+5,"top":30+5+400*2+10}
  383. if geo:
  384. args.update(geo)
  385. root = tk.Tk()
  386. win_title="EXEC-BTN"
  387. store = movewin.load_all_sdl(win_title)
  388. print(store)
  389. W=850
  390. H=460
  391. POS=[10,10]
  392. if store:
  393. W = store[-4]
  394. H = store[-3]
  395. POS=[store[-2],store[-1]]
  396. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  397. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  398. defaultFont = tk.font.nametofont("TkDefaultFont")
  399. defaultFont.configure(family="FreeSans",
  400. size=10,
  401. weight="bold")
  402. # MAIN MENUE
  403. try:
  404. ico_path = "/opt/LibreLight/Xdesk/icon/"
  405. root.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  406. except Exception as e:
  407. print(" Exception GUIWindowContainer.__init__",e)
  408. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  409. draw_exec(gui,xframe,EXEC)
  410. root.title(title) #"TK-EXEC")
  411. root.bind("<Button>",libtk2.tk_event)#
  412. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  413. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  414. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  415. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  416. import os
  417. _global_key_lock = 0
  418. def focus_in(event=None):
  419. _global_short_key = 0 # protect key-press-repeat
  420. cmd = "xset -display :0.0 r off"
  421. print("FOCUS_IN1", cmd)
  422. os.system(cmd)
  423. time.sleep(0.3)
  424. print("FOCUS_IN2", cmd)
  425. os.system(cmd)
  426. _global_short_key = 1 # protect key-press-repeat
  427. time.sleep(0.3)
  428. _global_key_lock = 0
  429. def focus_out(event=None):
  430. _global_key_lock = 1
  431. _global_short_key = 0
  432. cmd="xset -display :0.0 r rate 240 20"
  433. print("FOCUS_OUT", cmd)
  434. #os.system(cmd) # DISABLED
  435. root.bind("<FocusIn>", focus_in)
  436. root.bind("<FocusOut>", focus_out)
  437. def _refr_loop():
  438. time.sleep(3)
  439. while 1:
  440. gui._refresh_exec()
  441. time.sleep(10)
  442. thread.start_new_thread(_refr_loop,())
  443. def _refr_loop2():
  444. time.sleep(3)
  445. while 1:
  446. try:
  447. global root,title
  448. data = mc.get("MODES")
  449. title2 = title +" "+str(data)
  450. data = json.loads(data)
  451. #print("MODES",data)
  452. modes.modes = data
  453. if "S-KEY" in data:
  454. _global_short_key = 0
  455. if data["S-KEY"]:
  456. _global_short_key = 1
  457. if root:
  458. root.title(title2)
  459. except Exception as e:
  460. print(" ER7R mc...",e)
  461. time.sleep(3)
  462. time.sleep(0.1)
  463. thread.start_new_thread(_refr_loop2,())
  464. root.mainloop()