Explorar el Código

add `@` macro.

SakiKawasaki hace 5 años
padre
commit
edf61e8044

+ 79 - 0
src/nodesnim/nodes/node.nim

@@ -300,3 +300,82 @@ method delete*(self: NodePtr) {.base.} =
   ## Deletes current node.
   if self.parent != nil:
     self.parent.removeChild(self)
+
+
+# --- Macros --- #
+import
+  macros
+
+macro `@`*(node: NodePtr, event_name, code: untyped): untyped =
+  ## It provides a convenient wrapper for the event handler.
+  ##
+  ## Arguments:
+  ## - `node` is an any node pointer.
+  ## - `event_name` is an event name, e.g.: process.
+  ## - `code` is the proc code.
+  runnableExamples:
+    var
+      node = Node("Simple node")
+
+    node@ready:
+      echo "node is ready!"
+
+    node@input(event):
+      if event.isInputEventMouseButton():
+        echo event
+  var ename: string
+  # Gets event name.
+  if event_name.kind == nnkIdent:
+    ename = $event_name
+  elif event_name.kind == nnkCall:
+    ename = $event_name[0]
+
+  case ename
+  of "process", "ready", "enter", "exit", "focus", "unfocus":
+    result = quote do:
+      `node`.`event_name` =
+        proc(): void =
+          `code`
+
+  of "on_click", "mouse_exit", "mouse_enter", "click", "release", "press":
+    var
+      name = event_name[0]
+      x = event_name[1]
+      y = event_name[2]
+
+    result = quote do:
+      `node`.`name` =
+        proc(`x`, `y`: float) =
+          `code`
+
+  of "input":
+    var
+      name = event_name[0]
+      arg = event_name[1]
+
+    result = quote do:
+      `node`.`name` =
+        proc(`arg`: InputEvent) =
+          `code`
+
+  of "on_toggle":
+    var
+      name = event_name[0]
+      arg = event_name[1]
+
+    result = quote do:
+      `node`.`name` =
+        proc(`arg`: bool) =
+          `code`
+
+  of "on_changed":
+    var
+      name = event_name[0]
+      arg = event_name[1]
+
+    result = quote do:
+      `node`.`name` =
+        proc(`arg`: uint) =
+          `code`
+  else:
+    discard

+ 1 - 1
src/nodesnim/nodescontrol/button.nim

@@ -44,7 +44,7 @@ proc Button*(name: string = "Button"): ButtonPtr =
   var variable: ButtonObj
   nodepattern(ButtonObj)
   controlpattern()
-  variable.rect_size.x = 40
+  variable.rect_size.x = 160
   variable.rect_size.y = 40
   variable.text = ""
   variable.font = GLUT_BITMAP_HELVETICA_12

+ 7 - 0
src/nodesnim/nodescontrol/color_rect.nim

@@ -58,3 +58,10 @@ method duplicate*(self: ColorRectPtr): ColorRectPtr {.base.} =
   var obj = self[]
   rects.add(obj)
   return addr rects[^1]
+
+method setColor*(self: ColorRectPtr, color: ColorRef) {.base.} =
+  ## Changes ColorRect color.
+  ##
+  ## Arguments:
+  ## - `color` is a new color.
+  self.color = color

+ 1 - 0
tests/README.md

@@ -34,3 +34,4 @@
 32. [Use CollisionShape2D node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test32.nim)
 33. [Use KinematicBody2D node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test33.nim)
 34. [Use Switch node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test34.nim)
+35. [Event handlers with macros.](https://github.com/Ethosa/nodesnim/blob/master/tests/test35.nim)

+ 28 - 0
tests/test35.nim

@@ -0,0 +1,28 @@
+# --- Test 35. Event handlers with macros. --- #
+import nodesnim
+
+
+Window("test35")
+
+var
+  main = Scene("Main")
+  node = Button()
+
+node.setText("Hello")
+node.setAnchor(0.5, 0.5, 0.5, 0.5)
+
+
+node@ready:
+  echo "hello!"
+
+node@input(event):
+  if event.isInputEventMouseButton() and event.pressed:
+    echo "clicked"
+
+node@on_click(x, y):
+  node.setText("clicked in " & $x & "," & $y & ".")
+
+
+main.addChild(node)
+addMainScene(main)
+windowLaunch()