label.nim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # author: Ethosa
  2. ## It provides primitive text rendering.
  3. import
  4. strutils,
  5. ../thirdparty/opengl,
  6. ../thirdparty/opengl/glut,
  7. ../core/vector2,
  8. ../core/rect2,
  9. ../core/anchor,
  10. ../core/input,
  11. ../core/enums,
  12. ../core/color,
  13. ../nodes/node,
  14. control
  15. type
  16. LabelObj* = object of ControlPtr
  17. font*: pointer ## Glut font data.
  18. spacing*: float ## Font spacing.
  19. size*: float ## Font size.
  20. text*: string ## Label text.
  21. color*: ColorRef ## Text color.
  22. text_align*: AnchorRef ## Text align.
  23. LabelPtr* = ptr LabelObj
  24. proc Label*(name: string, variable: var LabelObj): LabelPtr =
  25. ## Creates a new Label pointer.
  26. ##
  27. ## Arguments:
  28. ## - `name` is a node name.
  29. ## - `variable` is a LabelObj variable.
  30. runnableExamples:
  31. var
  32. textobj: LabelObj
  33. text = Label("Label", textobj)
  34. nodepattern(LabelObj)
  35. controlpattern()
  36. variable.rect_size.x = 40
  37. variable.rect_size.y = 40
  38. variable.text = ""
  39. variable.font = GLUT_BITMAP_HELVETICA_12
  40. variable.size = 12
  41. variable.spacing = 2
  42. variable.text_align = Anchor(0, 0, 0, 0)
  43. variable.color = Color(1f, 1f, 1f)
  44. variable.kind = LABEL_NODE
  45. proc Label*(obj: var LabelObj): LabelPtr {.inline.} =
  46. ## Creates a new Labelpointer with default node name "Label".
  47. ##
  48. ## Arguments:
  49. ## - `variable` is a LabelObj variable.
  50. runnableExamples:
  51. var
  52. textobj: LabelObj
  53. text = Label(textobj)
  54. Label("Label", obj)
  55. method draw*(self: LabelPtr, w, h: GLfloat) =
  56. ## This uses in the `window.nim`.
  57. let
  58. x = -w/2 + self.global_position.x
  59. y = h/2 - self.global_position.y
  60. glColor4f(self.background_color.r, self.background_color.g, self.background_color.b, self.background_color.a)
  61. glRectf(x, y, x+self.rect_size.x, y-self.rect_size.y)
  62. glColor4f(self.color.r, self.color.g, self.color.b, self.color.a)
  63. var th = 0f
  64. for line in self.text.splitLines(): # get text height
  65. th += self.spacing + self.size
  66. if th != 0:
  67. th -= self.spacing
  68. var ty = y - self.rect_size.y*self.text_align.y1 + th*self.text_align.y2 - self.size
  69. for line in self.text.splitLines():
  70. var tw = self.font.glutBitmapLength(line).float
  71. # Draw text:
  72. var tx = x + self.rect_size.x*self.text_align.x1 - tw * self.text_align.x2
  73. for c in line:
  74. let
  75. cw = self.font.glutBitmapWidth(c.int).float
  76. right =
  77. if self.text_align.x2 > 0.9 and self.text_align.x1 > 0.9:
  78. 1f
  79. else:
  80. 0f
  81. bottom =
  82. if self.text_align.y2 > 0.9 and self.text_align.y1 > 0.9:
  83. 1f
  84. else:
  85. 0f
  86. if tx >= x and tx < x + self.rect_size.x+right and ty <= y and ty > y - self.rect_size.y+bottom:
  87. glRasterPos2f(tx, ty) # set char position
  88. self.font.glutBitmapCharacter(c.int) # render char
  89. tx += cw
  90. ty -= self.spacing + self.size
  91. # Press
  92. if self.pressed:
  93. self.on_press(self, last_event.x, last_event.y)
  94. method duplicate*(self: LabelPtr, obj: var LabelObj): LabelPtr {.base.} =
  95. ## Duplicates Label object and create a new Label pointer.
  96. obj = self[]
  97. obj.addr
  98. method setTextAlign*(self: LabelPtr, align: AnchorRef) {.base.} =
  99. ## Changes text alignment.
  100. self.text_align = align
  101. method setTextAlign*(self: LabelPtr, x1, y1, x2, y2: float) {.base.} =
  102. ## Changes text alignment.
  103. self.text_align = Anchor(x1, y1, x2, y2)
  104. method setText*(self: LabelPtr, value: string) {.base.} =
  105. ## Changes Label text.
  106. self.text = value