progress_bar.nim 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # author: Ethosa
  2. import
  3. ../thirdparty/opengl,
  4. ../core/vector2,
  5. ../core/rect2,
  6. ../core/anchor,
  7. ../core/input,
  8. ../core/color,
  9. ../nodes/node,
  10. control
  11. type
  12. ProgressBarObj* = object of ControlPtr
  13. max_value*, value*: uint
  14. progress_color*: ColorRef
  15. ProgressBarPtr* = ptr ProgressBarObj
  16. proc ProgressBar*(name: string, variable: var ProgressBarObj): ProgressBarPtr =
  17. nodepattern(ProgressBarObj)
  18. controlpattern()
  19. variable.background_color = Color(1f, 1f, 1f)
  20. variable.rect_size.x = 120
  21. variable.rect_size.y = 40
  22. variable.progress_color = Color(0.5, 0.5, 0.5)
  23. variable.max_value = 100
  24. variable.value = 0
  25. proc ProgressBar*(obj: var ProgressBarObj): ProgressBarPtr {.inline.} =
  26. ProgressBar("ProgressBar", obj)
  27. method draw*(self: ProgressBarPtr, w, h: GLfloat) =
  28. self.calcGlobalPosition()
  29. let
  30. x = -w/2 + self.global_position.x
  31. y = h/2 - self.global_position.y
  32. # Background
  33. glColor4f(self.background_color.r, self.background_color.g, self.background_color.b, self.background_color.a)
  34. glRectf(x, y, x + self.rect_size.x, y - self.rect_size.y)
  35. # Progress
  36. let progress = self.rect_size.x * (self.value.float / self.max_value.float)
  37. glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
  38. glRectf(x, y, x + progress, y - self.rect_size.y)
  39. # Press
  40. if self.pressed:
  41. self.press(last_event.x, last_event.y)
  42. method dublicate*(self: ProgressBarPtr, obj: var ProgressBarObj): ProgressBarPtr {.base.} =
  43. obj = self[]
  44. obj.addr
  45. method setMaxValue*(self: ProgressBarPtr, value: uint) {.base.} =
  46. if value > self.value:
  47. self.max_value = value
  48. else:
  49. self.max_value = self.value
  50. method setProgress*(self: ProgressBarPtr, value: uint) {.base.} =
  51. if value > self.max_value:
  52. self.value = self.max_value
  53. else:
  54. self.value = value
  55. method setProgressColor*(self: ProgressBarPtr, color: ColorRef) {.base.} =
  56. ## Changes progress color.
  57. ## For change background color use `setBackgroundColor` method.
  58. self.progress_color = color