fix.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. #from pyray import *
  2. import pyray
  3. import sys
  4. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  5. CAPTION = 'RAY-FIX-LIST'
  6. import tool.movewin as movewin
  7. import pathlib
  8. _file_path=pathlib.Path(__file__)
  9. print("file:",_file_path)
  10. movewin.check_is_started(CAPTION,_file_path)
  11. win_title =CAPTION.strip().split()[-1]
  12. store = movewin.load_all_sdl(win_title)
  13. print(store)
  14. POS=[10,10]
  15. W=760
  16. H=450
  17. if store:
  18. POS[0] += 5 #frame kompensation
  19. POS[1] += 29 #frame kompensation
  20. POS=[store[-2],store[-1]]
  21. pyray.set_config_flags(pyray.FLAG_WINDOW_RESIZABLE)
  22. pyray.init_window(W, H, CAPTION) #"RAY-DMX")#,10,10,10,10)
  23. pyray.set_window_min_size(200,200)
  24. pyray.set_window_max_size(1000,1000)
  25. win_con = movewin.Control()
  26. win_con.title = win_title
  27. win_con.winfo()
  28. if POS:
  29. win_con.move(POS[0],POS[1])
  30. print(POS,win_con.title)
  31. #exit()
  32. import sys
  33. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  34. import tool.tk_elm as tk_elm
  35. #import tool.sdl_elm as sdl_elm
  36. img = "/opt/LibreLight/Xdesk/icon/scribble.png"
  37. IMG = pyray.load_image(img)
  38. print(pyray.set_window_icon(IMG))
  39. import time
  40. import memcache
  41. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  42. #x=mc.get(k)
  43. old_x = -10
  44. old_y = -10
  45. start = time.time()
  46. frame_count = 0
  47. fps_count = 0
  48. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  49. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  50. k=200
  51. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  52. font_l_10 = pyray.load_font_ex(a, 10, None, 0);
  53. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  54. font10 = pyray.load_font_ex(a, 10, None, 0);
  55. font12 = pyray.load_font_ex(a, 12, None, 0);
  56. font14 = pyray.load_font_ex(a, 14, None, 0);
  57. font16 = pyray.load_font_ex(a, 16, None, 0);
  58. font20 = pyray.load_font_ex(a, 20, None, 0);
  59. font22 = pyray.load_font_ex(a, 22, None, 0);
  60. font24 = pyray.load_font_ex(a, 24, None, 0);
  61. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  62. font_l_22 = pyray.load_font_ex(a, 22, None, 0);
  63. a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  64. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  65. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  66. font25 = pyray.load_font_ex(a, 25, None, 0);
  67. pyray.TextureFilter(3)
  68. class EVENT():
  69. def __init__(self):
  70. self.dict = {}
  71. self.type = 0
  72. self.button=10
  73. self.buttons=[0,0,0,0]
  74. xevent=EVENT()
  75. class BUTTON():
  76. def __init__(self,master=None,txt="<BUTTON>",pos=[10,10,20,90]):
  77. #self.btn = tk_elm.Button(None,pos=[390,12,20,90])
  78. self.btn = tk_elm.Button(master,pos=pos)
  79. self.btn.btn1.color = [127,127,127,255]
  80. #self.btn.btn1.type = "toggle"
  81. #self.btn.btn2.type = "toggle"
  82. #self.btn.btn3.type = "toggle"
  83. #btn.btn1.color_on = [155,155,155,255]
  84. #btn.btn2.color = [155,55,155,255]
  85. #btn.btn2.color_on = [155,155,155,255]
  86. self.btn.btn3.color = [55,155,155,255]
  87. self.btn.btn3.color_on = [55,255,255,255]
  88. self.btn.btn2.color_on = [55,255,255,255]
  89. self.font = font14
  90. self.val = 0
  91. self.btn.btn1.name=txt
  92. #x=btn.btn1.name
  93. def __repr__(self):
  94. return "<BUTTON {} {} {}>".format(id(self),str(self.btn.pos),self.btn.btn1.name)
  95. def draw(self,event=None):
  96. pos=self.btn.pos
  97. c=[122,122,122,122] #btn.btn2.get_color()
  98. pyray.draw_rectangle(pos[1],pos[0],pos[3],pos[2],c)
  99. c=self.btn.btn1.get_color()
  100. pyray.draw_rectangle(pos[1]+2,pos[0]+2,pos[3]-4,pos[2]-4,c)
  101. c=self.btn.btn4.color # color bar
  102. pyray.draw_rectangle(pos[1]+2,pos[0]+2,1+int(110*self.val/255),3,c)
  103. c=self.btn.btn3.get_color()
  104. #pyray.draw_rectangle(pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2,c)
  105. pyray.draw_rectangle_lines_ex([pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2],1,c)
  106. x=self.btn.btn1.name
  107. font_size = self.font.baseSize
  108. pyray.draw_text_ex(self.font,str(x), [pos[1]+4,pos[0]+4], font_size, 0, [0,0,0,255])#pyray.YELLOW)#[0,255,0,255]) #pyray.YELLOW)
  109. def event(self,x,y,mouse):
  110. try:
  111. buttons = [0,0,0]
  112. button = 0
  113. PRESS=5 #1025
  114. RELEASE=6 #1026
  115. _type=0
  116. for i in range(3):#2,0,-1):
  117. #print(i,mouse)
  118. if mouse[i] == "press":
  119. _type=PRESS
  120. if mouse[i] == "release":
  121. _type=RELEASE
  122. if mouse[i]:
  123. buttons[i] = 1
  124. button = i+1
  125. xevent.dict={"pos":[y,x],"button":button,"buttons":buttons,"type":_type}
  126. #print(xevent.dict)
  127. pos=self.btn.pos
  128. if check_area(pos,[y,x]):
  129. #print("POS:",x,y,mouse,xevent.type)
  130. for i,v in enumerate(mouse):
  131. if i==0:
  132. #if v == "release": # or v == "click":
  133. if v == "click": #"press" or v == "click": # or v == "release":
  134. self.btn.btn1.type = "toggle"
  135. self.btn.btn1.press()
  136. #xevent.type=5
  137. #xevent.dict["button"] = 1
  138. #self.btn.btn1.val.set(0)
  139. #xevent.dict["buttons"] = mouse
  140. #print(xevent.dict,xevent.type,xevent.button)
  141. self.btn.event(xevent)
  142. except Exception as e:
  143. import traceback
  144. print(traceback.format_exc())
  145. raise e
  146. mouse_box_on = 0
  147. mouse_box_on_pos = [0,0]
  148. def draw_mouse_box(window,pos1,mouse=[None,None,None],color=[128,128,128],text=1):
  149. global mouse_box_on_pos
  150. global mouse_box_on
  151. if mouse[0]=="click":#"press":
  152. if mouse_box_on == 0:
  153. pos2 = pos1[:]
  154. mouse_box_on_pos = pos2
  155. mouse_box_on = 1
  156. else:
  157. mouse_box_on = 0
  158. if mouse[0]=="press":
  159. pos2 = mouse_box_on_pos[:]
  160. w=pos1[0]-pos2[0]
  161. h=pos1[1]-pos2[1]
  162. pos = pos2[:]
  163. #print(pos1,pos2,h,w)
  164. wd=1
  165. hd=1
  166. if w < 0:
  167. pos[0] = pos1[0]
  168. w*=-1
  169. wd=-1
  170. if h < 0:
  171. pos[1] = pos1[1]
  172. h*=-1
  173. hd=-1
  174. if w > 10 or h > 10:
  175. c=[255,255,255,255]
  176. pyray.draw_rectangle_lines_ex([pos[0],pos[1],w,h],1,c)
  177. font_size = font_l_10.baseSize
  178. pyray.draw_text_ex(font_l_10,str(pos1[0])+" "+str(pos1[1]), [pos1[0],pos1[1]-10], font_size, 0, pyray.WHITE)
  179. pyray.draw_text_ex(font_l_10,str(pos2[0])+" "+str(pos2[1]), [pos2[0]+5,pos2[1]+10], font_size, 0, pyray.WHITE)
  180. pyray.draw_text_ex(font_l_10,str(w), [pos2[0]+5+w/2*wd,pos2[1]], font_size, 0, pyray.WHITE)
  181. pyray.draw_text_ex(font_l_10,str(h), [pos2[0]+5,pos2[1]+h/2*hd], font_size, 0, pyray.WHITE)
  182. return pos1,pos2
  183. mouse_old=[None,None,None]
  184. def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
  185. if event_v < v1+1:
  186. return 0
  187. if event_v > v2-1:
  188. return 0
  189. return 1
  190. def check_area(pos,event_pos):
  191. v2 = pos[0]+pos[2]
  192. x = check_area_v(pos[0],v2,event_pos[0])
  193. v2 = pos[1]+pos[3]
  194. y = check_area_v(pos[1],v2,event_pos[1])
  195. if x and y:
  196. return 1
  197. _load_fix_DATA = {}
  198. _load_fix_host_list = {}
  199. _load_fix_last = time.time()
  200. _load_fix_keys = 0
  201. _load_fix_init = 0
  202. _load_fix_keys = []
  203. def load_fix():
  204. global _load_fix_DATA
  205. global _load_fix_host_list
  206. global _load_fix_keys
  207. global _load_fix_init
  208. global _load_fix_last
  209. if not _load_fix_init:
  210. pass
  211. elif _load_fix_last+1 > time.time():
  212. return _load_fix_keys.copy(), _load_fix_host_list.copy()
  213. print("load_fix update")
  214. _load_fix_last = time.time()
  215. _load_fix_init = 1
  216. DATA=mc.get("fix")#cmd)
  217. keys = []
  218. host_list = {}
  219. if not DATA:
  220. DATA = {}
  221. print("mc.get ist NONE")
  222. #continue
  223. for k in DATA:
  224. keys.append(k)
  225. host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  226. keys.sort()
  227. _load_fix_keys = keys
  228. _load_fix_host_list = host_list
  229. return _load_fix_keys.copy(), _load_fix_host_list.copy()
  230. def check_buttons(buttons,host_list):
  231. _x=20
  232. _y=30
  233. H = 22
  234. W = 100
  235. W2 = W+20
  236. _last_v = {}
  237. for i,k in enumerate(host_list): #.items():
  238. _x=20
  239. key = str(i)
  240. if key not in buttons: # insert
  241. v=host_list[k]
  242. _last_v = v
  243. txt="ID:"+str(v["ID"])
  244. btn=BUTTON(None,txt,[_y,_x,H,60])
  245. btn.btn.btn1.color_on = [255,255,0,255]
  246. buttons[key+".ID"] = btn
  247. #print("ADD",key,btn)
  248. _x+=60+2
  249. txt=v["NAME"]
  250. btn=BUTTON(None,txt,[_y,_x,H,W])
  251. btn.btn.btn1.color_on = [255,255,0,255]
  252. buttons[key] = btn
  253. #print("ADD",key,btn)
  254. _x+=W+2
  255. key = str(i)+":rgb"
  256. txt = ""
  257. btn=BUTTON(None,txt,[_y,_x,H,20])
  258. btn.btn.btn1.color = [0,0,0,255]
  259. btn.btn.btn1.color_on = [255,255,0,255]
  260. buttons[key] = btn
  261. _x+=20+2
  262. if "ATTRIBUT" in v:
  263. #print(txt)
  264. ATTR = v["ATTRIBUT"]
  265. if 1:
  266. ay2=_y
  267. ax2=_x
  268. for kk,vv in v["ATTRIBUT"].items():
  269. if "-FINE" in kk or kk.startswith("_"):
  270. continue
  271. key = str(i)+":" +kk
  272. VAL = vv["VALUE"]
  273. #print("-",kk,vv)
  274. txt = kk+" "+str(VAL)
  275. btn=BUTTON(None,txt,[ay2,ax2,H,W2])
  276. btn.btn.btn1.color_on = [255,255,0,255]
  277. #self.btn4.increment = 4.4
  278. #self.btn4.type = "fader"
  279. #self.btn4.nr_on = [4]
  280. #self.btn4.nr_off = [5]
  281. RGB = [255,255,255,255]
  282. if kk == "RED":
  283. RGB = [255,0,0,255]
  284. elif kk == "GREEN":
  285. RGB = [0,255,0,255]
  286. elif kk == "BLUE":
  287. RGB = [0,0,255,255]
  288. btn.btn.btn4.color = RGB
  289. #btn.btn.btn4.val._max = 100
  290. btn.val = 100
  291. #btn.btn.btn4.val.set(50)
  292. buttons[key] = btn
  293. add=1
  294. ax2+=W2+3
  295. _y+=23
  296. for i,k in enumerate(host_list): #.items():
  297. key = str(i)
  298. v=host_list[k]
  299. txt=v["NAME"]
  300. btn = buttons[key]
  301. btn1 = buttons[key+".ID"]
  302. if v["ATTRIBUT"]["_ACTIVE"]["ACTIVE"]:
  303. btn.btn.btn1.val.set(1)
  304. btn1.btn.btn1.val.set(1)
  305. else:
  306. btn.btn.btn1.val.set(0)
  307. btn1.btn.btn1.val.set(0)
  308. if key in buttons: # insert
  309. #print(v)
  310. txt="ID:"+str(v["ID"])
  311. btn = buttons[key+".ID"]
  312. key = str(i)+":rgb"
  313. txt = ""
  314. btn = buttons[key]
  315. if "ATTRIBUT" in v:
  316. ATTR = v["ATTRIBUT"]
  317. for kk,vv in v["ATTRIBUT"].items():
  318. if "-FINE" in kk or kk.startswith("_"):
  319. continue
  320. key = str(i)+":" +kk
  321. VAL = vv["VALUE"]
  322. txt = kk+" "+str(VAL)
  323. btn = buttons[key]
  324. btn.val = VAL
  325. if kk in ["RED","GREEN","BLUE"]:
  326. _key = str(i)+":rgb"
  327. if kk == "RED":
  328. buttons[_key].btn.btn1.color[0] = VAL
  329. if kk == "GREEN":
  330. buttons[_key].btn.btn1.color[1] = VAL
  331. if kk == "BLUE":
  332. buttons[_key].btn.btn1.color[2] = VAL
  333. btn.btn.btn1.name = txt
  334. if vv["ACTIVE"]:
  335. btn.btn.btn1.val.set(1)
  336. else:
  337. btn.btn.btn1.val.set(0)
  338. if _last_v:
  339. print("init.button.ok",_last_v)
  340. def draw_buttons(buttons):
  341. mh = pyray.get_screen_height()
  342. for k,btn in buttons.items():
  343. btn.event(old_x,old_y,mouse_old)
  344. #print(btn)
  345. pos = btn.btn.pos
  346. if pos[0] > (mh-40):
  347. continue
  348. btn.draw()
  349. buttons={} #[]
  350. cur = None
  351. history = []
  352. KEY_BUF={}
  353. FIRST_RUN = 1
  354. add=0
  355. core_tick_t = time.time()
  356. while not pyray.window_should_close():
  357. pyray.begin_drawing()
  358. pyray.clear_background(pyray.BLACK)
  359. pyray.Color(255,0,0,0)
  360. pyray.rl_enable_smooth_lines()
  361. font_size = font12.baseSize
  362. try:
  363. mw = pyray.get_screen_width()
  364. mh = pyray.get_screen_height()
  365. keys,host_list = load_fix()
  366. GREY = [122,122,122,255]
  367. k=keys[0]
  368. if cur is None:
  369. cur = k #k[3] #"xx123" # k
  370. check_buttons(buttons,host_list)
  371. pyray.draw_text_ex(font_l_22,"FIXTURE LIST",[20,2], 22, 0, pyray.GRAY)
  372. pyray.draw_text_ex(font12,"ACTIVE:{:0.1f} {:0.1f}".format(0,0),[220,5], 12, 0, pyray.YELLOW)
  373. pyray.draw_text_ex(font12,"ENCODER:{:0.2f}".format(5),[315,5], 12, 0, pyray.YELLOW)
  374. pyray.draw_text_ex(font12,"FPS:{}".format(fps_count) ,[420,5], 12, 0, pyray.BLUE)
  375. pyray.draw_text_ex(font12,"BTN:{}".format(len(buttons)) ,[460,5], 12, 0, pyray.BLUE)
  376. pyray.draw_text_ex(font12,"FIX:{}".format(len(host_list)),[520,5], 12, 0, pyray.BLUE)
  377. wheel = pyray.get_mouse_wheel_move()
  378. if wheel:
  379. print(wheel)
  380. m=pyray.get_mouse_position()
  381. #print(m)
  382. if m.x != old_x or m.y != old_y:
  383. old_x = m.x
  384. old_y = m.y
  385. mouse=[None,None,None]
  386. mouse_change=0
  387. for i in range(3):
  388. ev = ""
  389. if pyray.is_mouse_button_released(i):
  390. ev = "release"
  391. if pyray.is_mouse_button_pressed(i):
  392. ev = "click" #"press"
  393. if ev and ev != mouse[i]:
  394. mouse[i] = ev
  395. mouse_change=1
  396. if mouse_change:
  397. print("MOUSE:",mouse,old_x,old_y) #=[None,None,None]
  398. for i in range(1,12+1):
  399. _KEY = "KEY_F{}".format(i)
  400. x = pyray.KeyboardKey[_KEY]
  401. #k_val=pyray.is_key_pressed(x)
  402. k_val=pyray.is_key_down(x)
  403. if _KEY not in KEY_BUF:
  404. KEY_BUF[_KEY] = k_val
  405. if KEY_BUF[_KEY] != k_val:
  406. print("KEY_CHANGE",_KEY,k_val)
  407. KEY_BUF[_KEY] = k_val
  408. x=pyray.get_key_pressed()
  409. if x:
  410. print("key",x)
  411. x=pyray.is_key_pressed(pyray.KEY_F1)
  412. if x:
  413. print("key",x)
  414. if mouse != mouse_old and mouse != [None,None,None]:
  415. #print(mouse)
  416. mouse_old = mouse[:]
  417. key="scroll-bar"
  418. if key not in buttons:
  419. txt=""
  420. btn=BUTTON(None,txt,[30,mw-35,mh-75,30])
  421. #btn.btn.btn1.color_on = [255,255,0,255]
  422. buttons[key] = btn
  423. btn.btn.btn4.val.set(btn.btn.btn4.val._max*0.4)
  424. txt="HELP"
  425. key="HELP"
  426. btn=BUTTON(None,txt,[4,160,16,40])
  427. btn.font = font10
  428. buttons[key] = btn
  429. draw_buttons(buttons)
  430. pyray.draw_text_ex(font12,"X:{}".format(int(m.x)),[590,5], 12, 0, pyray.VIOLET)
  431. pyray.draw_text_ex(font12,"Y:{}".format(int(m.y)),[620,5], 12, 0, pyray.VIOLET)
  432. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  433. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  434. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  435. pyray.end_drawing()
  436. # frame tick speed, CPU LOAD. ------
  437. delta = 1/5
  438. if delta > (time.time()-core_tick_t):
  439. delta -= (time.time()-core_tick_t)
  440. #print(delta)
  441. time.sleep(delta)
  442. core_tick_t = time.time()
  443. # --------------------------------
  444. for i,v in enumerate(mouse_old):
  445. if v == "release":
  446. mouse_old[i] = None
  447. if v == "click":
  448. mouse_old[i] = "press"
  449. #print(mouse_old)
  450. frame_count += 1
  451. if time.time()-start > 1:
  452. start = time.time()
  453. fps_count = frame_count
  454. frame_count = 0
  455. #pyray.set_window_size(POS[0],POS[1])
  456. #POS[0]+=1
  457. if pyray.is_window_resized():
  458. print( "RESIZE WINDOW OK")
  459. #for i in dir(pyray):
  460. # if "height" in i.lower():
  461. # print(i)
  462. w = pyray.get_screen_width()
  463. h = pyray.get_screen_height()
  464. print(h,w)
  465. #print(pyray.FLAG_WINDOW_RESIZABLE )
  466. #print("E",pyray.is_window_focused() )
  467. FIRST_RUN = 0
  468. except KeyboardInterrupt as e:
  469. raise e
  470. except Exception as e:# KeyInterupt
  471. print("err",e)
  472. import traceback
  473. print(traceback.format_exc())
  474. time.sleep(1)
  475. pyray.close_window()