tooltip.nim 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # author: Ethosa
  2. import
  3. ../thirdparty/opengl,
  4. ../core/vector2,
  5. ../core/font,
  6. ../core/enums,
  7. ../core/color,
  8. ../core/anchor,
  9. ../nodes/node,
  10. ../nodes/canvas,
  11. ../graphics/drawable,
  12. ../window,
  13. control
  14. type
  15. ToolTipObj* = object of ControlObj
  16. text*: StyleText
  17. ToolTipRef* = ref ToolTipObj
  18. const TOOLTIP_SPACE: float = 32f
  19. proc ToolTip*(name: string = "ToolTip",
  20. tooltip: string = "Tooltip"): ToolTipRef =
  21. nodepattern(ToolTipRef)
  22. controlpattern()
  23. result.text = stext(tooltip)
  24. result.background.setColor(Color("#444"))
  25. result.background.setBorderColor(Color("#555"))
  26. result.background.setBorderWidth(0.5)
  27. result.background.setCornerRadius(4)
  28. result.background.setCornerDetail(4)
  29. result.background.enableShadow(true)
  30. result.background.setShadowOffset(Vector2(0, 5))
  31. result.mousemode = MOUSEMODE_IGNORE
  32. result.hide()
  33. method postdraw*(self: ToolTipRef, w, h: GLfloat) =
  34. {.warning[LockLevel]: off.}
  35. procCall self.ControlRef.draw(w, h)
  36. let
  37. x = -w/2 + self.global_position.x
  38. y = h/2 - self.global_position.y
  39. self.text.renderTo(Vector2(x, y), self.rect_size, Anchor(0, 0, 0, 0))
  40. method showAt*(self: ToolTipRef, x, y: float) {.base.} =
  41. self.moveTo(x, y)
  42. self.rect_min_size = self.text.getTextSize()
  43. self.resize(self.rect_size.x, self.rect_size.y, true)
  44. self.show()
  45. method showAtMouse*(self: ToolTipRef) {.base.} =
  46. ## Shows ToolTip at mouse position.
  47. ##
  48. ## See also `showAt method <#showAt.e,ToolTipRef,float,float>`_
  49. let
  50. pos = self.getGlobalMousePosition()
  51. textsize = self.text.getTextSize()
  52. windowsize = getWindowSize()
  53. self.moveTo(pos)
  54. if pos.x + TOOLTIP_SPACE + textsize.x > windowsize.x:
  55. self.move(-TOOLTIP_SPACE - textsize.x, 0)
  56. if pos.y - TOOLTIP_SPACE - textsize.y < 0:
  57. self.move(0, TOOLTIP_SPACE)
  58. else:
  59. self.move(0, -TOOLTIP_SPACE)
  60. self.rect_min_size = self.text.getTextSize()
  61. self.resize(self.rect_size.x, self.rect_size.y, true)
  62. self.show()