chatapp.exe 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. #!/usr/bin/python
  2. from gui import *
  3. def create_layer(name):
  4. win_id = api.lookup_node_id("/window")
  5. node_id = api.add_node(name, SceneNodeType.RENDER_LAYER)
  6. prop = Property(
  7. "is_visible", PropertyType.BOOL, PropertySubType.NULL,
  8. None,
  9. "Is Visible", "Visibility of this layer",
  10. False, False, 1, None, None, []
  11. )
  12. api.add_property(node_id, prop)
  13. prop = Property(
  14. "rect", PropertyType.UINT32, PropertySubType.PIXEL,
  15. None,
  16. "Rectangle", "The position and size within the layer",
  17. False, True, 4, None, None, []
  18. )
  19. api.add_property(node_id, prop)
  20. api.link_node(node_id, win_id)
  21. return node_id
  22. def create_mesh(name, layer_id):
  23. node_id = api.add_node(name, SceneNodeType.RENDER_MESH)
  24. prop = Property(
  25. "data", PropertyType.BUFFER, PropertySubType.NULL,
  26. None,
  27. "Mesh Data", "The face and vertex data for the mesh",
  28. False, False, 2, None, None, []
  29. )
  30. api.add_property(node_id, prop)
  31. prop = Property(
  32. "rect", PropertyType.FLOAT32, PropertySubType.PIXEL,
  33. None,
  34. "Rectangle", "The position and size within the layer",
  35. False, True, 4, None, None, []
  36. )
  37. api.add_property(node_id, prop)
  38. prop = Property(
  39. "z_index", PropertyType.UINT32, PropertySubType.NULL,
  40. None,
  41. "Z-index", "Z-index: values greater than zero are deferred draws",
  42. False, False, 1, None, None, []
  43. )
  44. api.add_property(node_id, prop)
  45. #prop = Property(
  46. # "is_visible", PropertyType.UINT32, PropertySubType.NULL,
  47. # None,
  48. # "Is Visible", "Visibility of this object",
  49. # False, False, 1, None, None, []
  50. #)
  51. #api.add_property(node_id, prop)
  52. api.link_node(node_id, layer_id)
  53. return node_id
  54. def create_text(name, layer_id):
  55. node_id = api.add_node(name, SceneNodeType.RENDER_TEXT)
  56. prop = Property(
  57. "rect", PropertyType.FLOAT32, PropertySubType.PIXEL,
  58. None,
  59. "Rectangle", "The position and size within the layer",
  60. False, True, 4, None, None, []
  61. )
  62. api.add_property(node_id, prop)
  63. prop = Property(
  64. "baseline", PropertyType.FLOAT32, PropertySubType.PIXEL,
  65. None,
  66. "Baseline", "Y offset of baseline inside rect",
  67. False, True, 1, None, None, []
  68. )
  69. api.add_property(node_id, prop)
  70. prop = Property(
  71. "font_size", PropertyType.FLOAT32, PropertySubType.PIXEL,
  72. None,
  73. "Font Size", "Font Size",
  74. False, True, 1, 0.0, None, []
  75. )
  76. api.add_property(node_id, prop)
  77. prop = Property(
  78. "text", PropertyType.STR, PropertySubType.NULL,
  79. None,
  80. "Text", "Text",
  81. False, False, 1, None, None, []
  82. )
  83. api.add_property(node_id, prop)
  84. prop = Property(
  85. "color", PropertyType.FLOAT32, PropertySubType.COLOR,
  86. None,
  87. "Color", "Color of the text",
  88. False, False, 4, 0, 1, []
  89. )
  90. api.add_property(node_id, prop)
  91. prop = Property(
  92. "z_index", PropertyType.UINT32, PropertySubType.NULL,
  93. None,
  94. "Z-index", "Z-index: values greater than zero are deferred draws",
  95. False, False, 1, None, None, []
  96. )
  97. api.add_property(node_id, prop)
  98. prop = Property(
  99. "debug", PropertyType.BOOL, PropertySubType.NULL,
  100. None,
  101. "Debug", "Draw debug outlines",
  102. False, False, 1, None, None, []
  103. )
  104. api.add_property(node_id, prop)
  105. api.link_node(node_id, layer_id)
  106. return node_id
  107. def create_editbox(name, layer_id):
  108. node_id = api.add_node("editz", SceneNodeType.EDIT_BOX)
  109. prop = Property(
  110. "is_active", PropertyType.BOOL, PropertySubType.NULL,
  111. None,
  112. "Is Active", "Whether the editbox is active",
  113. False, True, 1, None, None, []
  114. )
  115. api.add_property(node_id, prop)
  116. prop = Property(
  117. "rect", PropertyType.FLOAT32, PropertySubType.PIXEL,
  118. None,
  119. "Rectangle", "The position and size within the layer",
  120. False, True, 4, None, None, []
  121. )
  122. api.add_property(node_id, prop)
  123. prop = Property(
  124. "baseline", PropertyType.FLOAT32, PropertySubType.PIXEL,
  125. None,
  126. "Baseline", "Y offset of baseline inside rect",
  127. False, True, 1, None, None, []
  128. )
  129. api.add_property(node_id, prop)
  130. prop = Property(
  131. "scroll", PropertyType.FLOAT32, PropertySubType.NULL,
  132. None,
  133. "Scroll", "Current scroll",
  134. False, False, 1, None, None, []
  135. )
  136. api.add_property(node_id, prop)
  137. prop = Property(
  138. "cursor_pos", PropertyType.UINT32, PropertySubType.NULL,
  139. None,
  140. "Cursor Position", "Cursor position within the text",
  141. False, False, 1, None, None, []
  142. )
  143. api.add_property(node_id, prop)
  144. prop = Property(
  145. "font_size", PropertyType.FLOAT32, PropertySubType.PIXEL,
  146. None,
  147. "Font Size", "Font Size",
  148. False, True, 1, 0.0, None, []
  149. )
  150. api.add_property(node_id, prop)
  151. prop = Property(
  152. "text", PropertyType.STR, PropertySubType.NULL,
  153. None,
  154. "Text", "Text",
  155. False, False, 1, None, None, []
  156. )
  157. api.add_property(node_id, prop)
  158. prop = Property(
  159. "text_color", PropertyType.FLOAT32, PropertySubType.COLOR,
  160. None,
  161. "Text Color", "Color of the text",
  162. False, False, 4, 0, 1, []
  163. )
  164. api.add_property(node_id, prop)
  165. prop = Property(
  166. "cursor_color", PropertyType.FLOAT32, PropertySubType.COLOR,
  167. None,
  168. "Cursor Color", "Color of the cursor",
  169. False, False, 4, 0, 1, []
  170. )
  171. api.add_property(node_id, prop)
  172. prop = Property(
  173. "hi_bg_color", PropertyType.FLOAT32, PropertySubType.COLOR,
  174. None,
  175. "Highlight Bg Color", "Background color for highlighted text",
  176. False, False, 4, 0, 1, []
  177. )
  178. api.add_property(node_id, prop)
  179. prop = Property(
  180. "selected", PropertyType.UINT32, PropertySubType.NULL,
  181. None,
  182. "Selected", "Selected range",
  183. True, False, 2, 0, None, []
  184. )
  185. api.add_property(node_id, prop)
  186. prop = Property(
  187. "z_index", PropertyType.UINT32, PropertySubType.NULL,
  188. None,
  189. "Z-index", "Z-index: values greater than zero are deferred draws",
  190. False, False, 1, None, None, []
  191. )
  192. api.add_property(node_id, prop)
  193. prop = Property(
  194. "debug", PropertyType.BOOL, PropertySubType.NULL,
  195. None,
  196. "Debug", "Draw debug outlines",
  197. False, False, 1, None, None, []
  198. )
  199. api.add_property(node_id, prop)
  200. #win_id = api.lookup_node_id("/window")
  201. #arg_data = bytearray()
  202. #serial.write_u32(arg_data, node_id)
  203. #api.call_method(win_id, "create_edit_box", arg_data)
  204. #api.link_node(node_id, layer_id)
  205. return node_id
  206. def create_chatview(name, layer_id):
  207. node_id = api.add_node(name, SceneNodeType.CHAT_VIEW)
  208. prop = Property(
  209. "rect", PropertyType.FLOAT32, PropertySubType.PIXEL,
  210. None,
  211. "Rectangle", "The position and size within the layer",
  212. False, True, 4, None, None, []
  213. )
  214. api.add_property(node_id, prop)
  215. prop = Property(
  216. "debug", PropertyType.BOOL, PropertySubType.NULL,
  217. None,
  218. "Debug", "Draw debug outlines",
  219. False, False, 1, None, None, []
  220. )
  221. api.add_property(node_id, prop)
  222. prop = Property(
  223. "z_index", PropertyType.UINT32, PropertySubType.NULL,
  224. None,
  225. "Z-index", "Z-index: values greater than zero are deferred draws",
  226. False, False, 1, None, None, []
  227. )
  228. api.add_property(node_id, prop)
  229. win_id = api.lookup_node_id("/window")
  230. arg_data = bytearray()
  231. serial.write_u32(arg_data, node_id)
  232. api.call_method(win_id, "create_chat_view", arg_data)
  233. api.link_node(node_id, layer_id)
  234. return node_id
  235. class Buffer:
  236. def __init__(self):
  237. self.verts = bytearray()
  238. self.faces = bytearray()
  239. self.verts_len = 0
  240. def draw_box(self, rect=(0, 0, 1, 1), r=0, g=0, b=0):
  241. x, y, w, h = rect
  242. vert1 = vertex(x, y, r, g, b, 1, 0, 0)
  243. vert2 = vertex(x + w, y, r, g, b, 1, 1, 0)
  244. vert3 = vertex(x, y + h, r, g, b, 1, 0, 1)
  245. vert4 = vertex(x + w, y + h, r, g, b, 1, 1, 1)
  246. verts = vert1 + vert2 + vert3 + vert4
  247. k = self.verts_len
  248. faces = face(k, k + 2, k + 1) + face(k + 1, k + 2, k + 3)
  249. self.verts_len += 4
  250. self.verts += verts
  251. self.faces += faces
  252. def draw_outline(self, rect=(0, 0, 1, 1), r=0, g=0, b=0, pad=1, layer_dim=(0, 0)):
  253. layer_w, layer_h = layer_dim
  254. pad_x, pad_y = 1/layer_w, 1/layer_h
  255. x, y, w, h = rect
  256. # left side
  257. self.draw_box((x, y, pad_x, h), r, g, b)
  258. # top side
  259. self.draw_box((x, y, w, pad_y), r, g, b)
  260. # right side
  261. rhs = x + w
  262. self.draw_box((rhs - pad_x, y, pad_x, h), r, g, b)
  263. # bottom side
  264. bhs = y + h
  265. self.draw_box((x, bhs - pad_y, w, pad_y), r, g, b)
  266. def main():
  267. layer_id = create_layer("view")
  268. api.set_property_u32(layer_id, "rect", 0, 0)
  269. api.set_property_u32(layer_id, "rect", 1, 0)
  270. code = [["as_u32", ["load", "sw"]]]
  271. api.set_property_expr(layer_id, "rect", 2, code)
  272. code = [["as_u32", ["load", "sh"]]]
  273. api.set_property_expr(layer_id, "rect", 3, code)
  274. # Make the black background
  275. # Maybe we should use a RenderPass for this instead
  276. node_id = create_mesh("bg", layer_id)
  277. api.set_property_f32(node_id, "rect", 0, 0)
  278. api.set_property_f32(node_id, "rect", 1, 0)
  279. code = [["load", "lw"]]
  280. api.set_property_expr(node_id, "rect", 2, code)
  281. code = [["load", "lh"]]
  282. api.set_property_expr(node_id, "rect", 3, code)
  283. buff = Buffer()
  284. buff.draw_box(r=0.05, g=0.05, b=0.05)
  285. api.set_property_buf(node_id, "data", 0, buff.verts)
  286. api.set_property_buf(node_id, "data", 1, buff.faces)
  287. # Make the chatedit bg
  288. node_id = create_mesh("chateditbg", layer_id)
  289. api.set_property_f32(node_id, "rect", 0, 100)
  290. code = [["-", ["load", "lh"], ["f32", 50]]]
  291. api.set_property_expr(node_id, "rect", 1, code)
  292. code = [["-", ["load", "lw"], ["f32", 100]]]
  293. api.set_property_expr(node_id, "rect", 2, code)
  294. api.set_property_f32(node_id, "rect", 3, 50)
  295. buff = Buffer()
  296. buff.draw_box(r=0.0, g=0.13, b=0.08)
  297. buff.draw_outline(r=0.22, g=0.22, b=0.22, pad=1, layer_dim=(1000, 50))
  298. api.set_property_buf(node_id, "data", 0, buff.verts)
  299. api.set_property_buf(node_id, "data", 1, buff.faces)
  300. # Make the nicktext border
  301. node_id = create_mesh("nickbg", layer_id)
  302. api.set_property_f32(node_id, "rect", 0, 0)
  303. code = [["-", ["load", "lh"], ["f32", 50]]]
  304. api.set_property_expr(node_id, "rect", 1, code)
  305. api.set_property_f32(node_id, "rect", 2, 100)
  306. api.set_property_f32(node_id, "rect", 3, 50)
  307. buff = Buffer()
  308. buff.draw_outline(r=0.0, g=0.13, b=0.08, pad=1, layer_dim=(100, 50))
  309. api.set_property_buf(node_id, "data", 0, buff.verts)
  310. api.set_property_buf(node_id, "data", 1, buff.faces)
  311. # The nickname
  312. node_id = create_text("nick", layer_id)
  313. api.set_property_f32(node_id, "rect", 0, 20)
  314. code = [["-", ["load", "lh"], ["f32", 50]]]
  315. api.set_property_expr(node_id, "rect", 1, code)
  316. api.set_property_f32(node_id, "rect", 2, 100)
  317. api.set_property_f32(node_id, "rect", 3, 50)
  318. api.set_property_f32(node_id, "baseline", 0, 30)
  319. api.set_property_f32(node_id, "font_size", 0, 20)
  320. api.set_property_str(node_id, "text", 0, "anon1")
  321. api.set_property_f32(node_id, "color", 0, 0)
  322. api.set_property_f32(node_id, "color", 1, 1)
  323. api.set_property_f32(node_id, "color", 2, 0)
  324. api.set_property_f32(node_id, "color", 3, 1)
  325. api.set_property_u32(node_id, "z_index", 0, 1)
  326. # Make the text edit
  327. node_id = create_editbox("editz", layer_id)
  328. api.set_property_bool(node_id, "is_active", 0, True)
  329. api.set_property_f32(node_id, "rect", 0, 100)
  330. code = [["-", ["load", "lh"], ["f32", 50]]]
  331. api.set_property_expr(node_id, "rect", 1, code)
  332. code = [["-", ["load", "lw"], ["f32", 100]]]
  333. api.set_property_expr(node_id, "rect", 2, code)
  334. api.set_property_f32(node_id, "rect", 3, 50)
  335. api.set_property_f32(node_id, "baseline", 0, 30)
  336. api.set_property_f32(node_id, "font_size", 0, 20)
  337. api.set_property_str(node_id, "text", 0, "hello king!😁🍆jelly 🍆1234")
  338. api.set_property_f32(node_id, "text_color", 0, 1)
  339. api.set_property_f32(node_id, "text_color", 1, 1)
  340. api.set_property_f32(node_id, "text_color", 2, 1)
  341. api.set_property_f32(node_id, "text_color", 3, 1)
  342. api.set_property_f32(node_id, "cursor_color", 0, 1)
  343. api.set_property_f32(node_id, "cursor_color", 1, 0.5)
  344. api.set_property_f32(node_id, "cursor_color", 2, 0.5)
  345. api.set_property_f32(node_id, "cursor_color", 3, 1)
  346. api.set_property_f32(node_id, "hi_bg_color", 0, 1)
  347. api.set_property_f32(node_id, "hi_bg_color", 1, 1)
  348. api.set_property_f32(node_id, "hi_bg_color", 2, 1)
  349. api.set_property_f32(node_id, "hi_bg_color", 3, 0.5)
  350. api.set_property_null(node_id, "selected", 0)
  351. api.set_property_null(node_id, "selected", 1)
  352. api.set_property_u32(node_id, "z_index", 0, 1)
  353. api.set_property_bool(node_id, "debug", 0, False)
  354. win_id = api.lookup_node_id("/window")
  355. arg_data = bytearray()
  356. serial.write_u32(arg_data, node_id)
  357. api.call_method(win_id, "create_edit_box", arg_data)
  358. api.link_node(node_id, layer_id)
  359. # Add the chatview
  360. node_id = create_chatview("chatty", layer_id)
  361. api.set_property_f32(node_id, "rect", 0, 0)
  362. api.set_property_f32(node_id, "rect", 1, 0)
  363. code = [["load", "lw"]]
  364. api.set_property_expr(node_id, "rect", 2, code)
  365. code = [["-", ["load", "lh"], ["f32", 50]]]
  366. api.set_property_expr(node_id, "rect", 3, code)
  367. #api.set_property_bool(node_id, "debug", 0, True)
  368. api.set_property_u32(node_id, "z_index", 0, 1)
  369. api.set_property_bool(layer_id, "is_visible", 0, True)
  370. main()
  371. print_tree()