sdl_elm.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. #!/usr/bin/python3
  2. import pygame
  3. import pygame.gfxdraw
  4. import pygame.font
  5. from lib.xcolor import *
  6. font0 = pygame.font.SysFont("freesans",10)
  7. font0b = pygame.font.SysFont("freesansbold",10)
  8. font = pygame.font.SysFont("freemonobold",22)
  9. font10 = pygame.font.SysFont("freemonobold",10)
  10. font12 = pygame.font.SysFont("freemonobold",12)
  11. font15 = pygame.font.SysFont("freemonobold",15)
  12. font22 = pygame.font.SysFont("FreeSans",22)
  13. #font = pygame.font.SysFont(None,30)
  14. class VALUE():
  15. def __init__(self,v=0,_min=0,_max=255):
  16. self._val = v
  17. self._max = _max
  18. self._min = _min
  19. def _check(self):
  20. if self._val > self._max:
  21. self._val = self._max
  22. if self._val < self._min:
  23. self._val = self._min
  24. def get(self):
  25. self._check()
  26. return self._val
  27. def set(self,val):
  28. if val <= self._max and val >= self._min:
  29. self._val = val
  30. def inc(self,v):
  31. self._val += v
  32. self._check()
  33. class ELEM_KILLGROUP():
  34. def __init__(self):
  35. self.data = []
  36. def insert(self,elm):
  37. if elm not in self.data:
  38. self.data.append(elm)
  39. return 1
  40. return 0
  41. def clean(self,elm):
  42. v = elm.val
  43. for i in self.data:
  44. i.clear()
  45. #elm.set(v)
  46. return v
  47. class ELEM_BUF():
  48. def __init__(self,kill=None,name="ELEM_BUF"):
  49. self.val = VALUE() #0
  50. self.increment = 10
  51. self.name = name
  52. self.nr_on = [0]
  53. self.nr_off = [0]
  54. self.color = [0,255,0]
  55. self.color_on = [255,255,0]
  56. self.type="flash" #"toggle" #"flash",fade
  57. self.killgroup = kill
  58. def get(self):
  59. return self.val.get()
  60. def get_color(self):
  61. if self.val.get():
  62. return self.color_on
  63. return self.color
  64. def clean(self):
  65. self.val.set(0)
  66. def press(self):
  67. print([self.name,self.type,self.val.get()])
  68. if self.type == "fader":
  69. self.inc(self.increment)
  70. return
  71. if self.type == "toggle":
  72. if self.val.get():
  73. self.val.set(0)
  74. else:
  75. self.val.set(1)
  76. if self.type == "flash":
  77. self.val.set(1)
  78. def release(self):
  79. if self.type == "fader":
  80. self.inc(-self.increment)
  81. return
  82. if self.type == "flash":
  83. self.val.set(0)
  84. def inc(self,v):
  85. self.val.inc(v)
  86. class Layout():
  87. def __init__(self,master):
  88. self.master = master
  89. def pack(self,**args):
  90. pass
  91. def grid(self,**args):
  92. pass
  93. def bind(self,**args):
  94. pass
  95. def get_font_hight(font):
  96. fr = font.render("test_font_hight" ,1, (0,0,0))
  97. r = fr.get_rect()
  98. h = r[3]
  99. return h
  100. def draw_bd(pos=[0,0,10,10],delta=0):
  101. d = delta
  102. xpos = (
  103. (pos[0]-d ,pos[1]-d),
  104. (pos[0]+pos[2]+d-1 ,pos[1]-d),
  105. (pos[0]+pos[2]+d-1 ,pos[1]+pos[3]+d-1),
  106. (pos[0]-d ,pos[1]+pos[3]+d-1)
  107. )
  108. i_old = None
  109. ypos = []
  110. for i in xpos:
  111. if i_old:
  112. ypos.append( (i_old,i) )
  113. i_old = i
  114. ypos.append( (i_old,xpos[0]) )
  115. return ypos
  116. def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
  117. if event_v < v1+1:
  118. return 0
  119. if event_v > v2-1:
  120. return 0
  121. return 1
  122. def check_area(pos,event_pos):
  123. v2 = pos[0]+pos[2]
  124. x = check_area_v(pos[0],v2,event_pos[0])
  125. v2 = pos[1]+pos[3]
  126. y = check_area_v(pos[1],v2,event_pos[1])
  127. if x and y:
  128. return 1
  129. def check_area2(R1,R2): #pos,mouse_box
  130. btn_box = R1[:] #btn_box
  131. r2 = R2[:] #mouse_box
  132. w=btn_box[2]
  133. h=btn_box[3]
  134. p1 = [btn_box[0],btn_box[1]]
  135. p4 = [btn_box[0]+w,btn_box[1]+h]
  136. if r2[0] > r2[2]:
  137. r2[0],r2[2] = r2[2],r2[0]
  138. if r2[1] > r2[3]:
  139. r2[1],r2[3] = r2[3],r2[1]
  140. x=0
  141. if r2[2] > p1[0] and r2[0] < p4[0]:
  142. x+=1
  143. y=0
  144. if r2[3] > p1[1] and r2[1] < p4[1]:
  145. y+=1
  146. if x and y:#> 4:
  147. print("btn",R1,"mouse",R2)
  148. print("btn",btn_box,"mouse",r2)
  149. print("area2",x,y)
  150. return 1
  151. class Button():
  152. def __init__(self,window,pos):
  153. self.window = window
  154. self.event_pos = [0,0]
  155. self.font0 = pygame.font.SysFont("freesans-bold",16)
  156. self.w = 20
  157. self.h = 10
  158. self.pos = pos
  159. self.fader = 1
  160. self.btn1 = ELEM_BUF()
  161. self.btn1.name = "BUTTON BUF"
  162. self.btn1.nr_on = [1,3]
  163. self.btn1.nr_off = [1,3]
  164. self.btn1.color = LIGHTGRAY
  165. self.btn1.color_on = RED
  166. self.btn2 = ELEM_BUF() # sel elem
  167. self.btn2.name = "SELECT BUF"
  168. self.btn2.nr_on = [2]
  169. self.btn2.nr_off = [0]
  170. self.btn2.color = GRAY
  171. self.btn2.color_on = YELLOW
  172. self.btn2.type = "toggle"
  173. self.btn3 = ELEM_BUF()
  174. self.btn3.name = "MOUSE FOCUS"
  175. self.btn3.color = GRAY
  176. self.btn3.color_on = WHITHE
  177. self.btn4 = ELEM_BUF()
  178. self.btn4.name = "MOUSE ECODER"
  179. self.btn4.increment = 4.4
  180. self.btn4.type = "fader"
  181. self.btn4.nr_on = [4]
  182. self.btn4.nr_off = [5]
  183. self.btn4.color = GRAY
  184. self.btn4.color_on = WHITHE
  185. self.btns = []
  186. self.btns.append(self.btn1)
  187. self.btns.append(self.btn2)
  188. self.btns.append(self.btn3)
  189. self.btns.append(self.btn4)
  190. self.__layout = Layout(self)
  191. self.pack = self.__layout.pack
  192. self.grid = self.__layout.grid
  193. self.bind = self.__layout.bind
  194. self.text = "line1\nline2"
  195. self.type = "toggle" # flash, kill
  196. self.text2 = []
  197. def check(self):
  198. if 10:#dbg:
  199. self.text2 = []
  200. #self.text2.append(self.val)
  201. b = []
  202. for btn in self.btns:
  203. b.append(btn.get())
  204. self.text2.append(b)
  205. self.text2.append(self.btn1.type)
  206. self._check_event()
  207. self._check_min_hight()
  208. def draw(self,text="GOBO1"):
  209. self.check()
  210. self.window.set_alpha(128)
  211. self._draw_bg()
  212. self._draw_fader()
  213. self._draw_font(text="")
  214. rgb = self.btn2.get_color()
  215. self._draw_bd(color=rgb)
  216. self._draw_bd(delta=-1)
  217. rgb = self.btn3.get_color()
  218. self._draw_bd(delta=-2,color=rgb)
  219. def get_rect(self):
  220. self.check()
  221. return self.pos[:]
  222. def _check_min_hight(self):
  223. c = 1+ self.text.count("\n") #+1
  224. c += len(self.text2)
  225. fh = get_font_hight(self.font0)
  226. h = (fh+1)*c +6#8 #+8
  227. if self.pos[3] < h:
  228. self.pos[3] = h #ah+20
  229. def _draw_bg(self):
  230. pos = self.pos
  231. rgb = self.btn1.get_color()
  232. pygame.draw.rect(self.window,rgb,pos)
  233. def _draw_fader(self):
  234. rgb = [0,200,0]
  235. pos2 = self.pos[:]
  236. v = self.btn4.val.get() #self.val.get()
  237. fh = get_font_hight(self.font0)
  238. if self.fader:
  239. pos2[1] += 2 #fh+2
  240. pos2[3] = 4 #fh+2
  241. if v > 0:
  242. pos2[2] = int(pos2[2]* v/255)
  243. else:
  244. pos2[2] = 4
  245. pygame.draw.rect(self.window,rgb,pos2)
  246. def _draw_font(self,text=""):
  247. pos = self.pos
  248. a = pos[0]+4
  249. r = pos[1]+4
  250. v = "{:4.02f}".format(self.btn4.val.get())
  251. lines = self.text.split("\n")
  252. lines.extend(self.text2)
  253. for i in lines:
  254. i = str(i)
  255. if "<val>" in i:
  256. i = i.replace("<val>",v)
  257. fr = self.font0.render(i ,1, (0,0,0))
  258. fr_r=fr.get_rect()
  259. p2 = [pos[0]+4,r,fr_r[2],fr_r[3]]
  260. if 0:# dbg # bg highlight
  261. pygame.draw.rect(self.window,[0,0,255],p2)
  262. self.window.blit(fr,(a,r))
  263. r+=fr_r[3]+1
  264. def _set_mouse_focus(self,state):
  265. if state:
  266. self.btn3.press() # mouse focus on
  267. else:
  268. self.btn3.release()
  269. def _check_event(self):
  270. pass
  271. def _draw_bd(self,delta=0,color=BLACK):
  272. l_pos = draw_bd(pos=self.pos,delta=delta)
  273. for i in l_pos:
  274. pygame.draw.aaline(self.window,color,i[0],i[1],1)
  275. def event(self,event=None):
  276. if "pos" in event.dict:
  277. self.event_pos = event.pos
  278. self._check_event()
  279. self._set_mouse_focus(0)
  280. if check_area(self.pos,self.event_pos):
  281. self._set_mouse_focus(1)
  282. if "button" in event.dict:
  283. mode = ""
  284. if event.type == 5:
  285. mode = "press"
  286. if event.type == 6:
  287. mode = "release"
  288. e = [event.button,mode]
  289. print("e",e)
  290. for btn in self.btns:
  291. if e[0] in btn.nr_on and e[1] == "press":
  292. btn.press()
  293. if e[0] in btn.nr_off and e[1] == "release":
  294. btn.release()
  295. def draw_mouse_box(window,pos1,pos2,color=[128,128,128],text=1):
  296. color = [200,0,0,127]
  297. if text:
  298. fr = font15.render("A" ,1, (200,200,200))
  299. window.blit(fr,pos1)
  300. fr = font15.render("B" ,1, (200,200,200))
  301. window.blit(fr,[pos2[0]-10,pos2[1]-10])
  302. # h unten
  303. _pos1 = [pos1[0],pos2[1]]
  304. _pos2 = [pos2[0],pos2[1]]
  305. pygame.draw.aaline(window,color,_pos1,_pos2,1)
  306. color = [255,255,0,127]
  307. # h rechts
  308. _pos1 = [pos2[0],pos1[1]]
  309. _pos2 = [pos2[0],pos2[1]]
  310. pygame.draw.aaline(window,color,_pos1,_pos2,1)
  311. color = [0,200,0,127]
  312. # h links
  313. _pos1 = [pos1[0],pos1[1]]
  314. _pos2 = [pos1[0],pos2[1]]
  315. pygame.draw.aaline(window,color,_pos1,_pos2,1)
  316. color = [0,0,200,127]
  317. # h oben
  318. _pos1 = [pos1[0],pos1[1]]
  319. _pos2 = [pos2[0],pos1[1]]
  320. pygame.draw.aaline(window,color,_pos1,_pos2,1)