EXEC-BTN.py 15 KB

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