Browse Source

add Slider node.

Ethosa 4 years ago
parent
commit
d59c9fd8ee
6 changed files with 140 additions and 2 deletions
  1. 1 0
      README.md
  2. 3 2
      src/nodesnim.nim
  3. 22 0
      src/nodesnim/nodescontrol/box.nim
  4. 94 0
      src/nodesnim/nodescontrol/slider.nim
  5. 1 0
      tests/README.md
  6. 19 0
      tests/test22.nim

+ 1 - 0
README.md

@@ -51,6 +51,7 @@
    -  [GridBox](https://ethosa.github.io/nodesnim/grid_box.html)
    -  [Scroll](https://ethosa.github.io/nodesnim/scroll.html)
    -  [ProgressBar](https://ethosa.github.io/nodesnim/progress_bar.html)
+   -  [Slider](https://ethosa.github.io/nodesnim/slider.html)
 
 </details>
 

+ 3 - 2
src/nodesnim.nim

@@ -32,7 +32,8 @@ import
   nodesnim/nodescontrol/rich_label,
   nodesnim/nodescontrol/rich_edit_text,
   nodesnim/nodescontrol/scroll,
-  nodesnim/nodescontrol/progress_bar
+  nodesnim/nodescontrol/progress_bar,
+  nodesnim/nodescontrol/slider
 
 export
   opengl, glut,
@@ -40,4 +41,4 @@ export
   vector2, rect2, enums, anchor, color, exceptions, input, image, color_text,
   node, scene, canvas,
   control, color_rect, texture_rect, label, button, box, hbox, vbox, grid_box, edittext,
-  rich_label, rich_edit_text, scroll, progress_bar
+  rich_label, rich_edit_text, scroll, progress_bar, slider

+ 22 - 0
src/nodesnim/nodescontrol/box.nim

@@ -19,6 +19,15 @@ type
 
 
 proc Box*(name: string, variable: var BoxObj): BoxPtr =
+  ## Creates a new Box pointer.
+  ##
+  ## Arguments:
+  ## - `name` is a node name.
+  ## - `variable` is a BoxObj variable.
+  runnableExamples:
+    var
+      box_obj: BoxObj
+      box = Box("My box", box_obj)
   nodepattern(BoxObj)
   controlpattern()
   variable.rect_size.x = 40
@@ -26,10 +35,19 @@ proc Box*(name: string, variable: var BoxObj): BoxPtr =
   variable.child_anchor = Anchor(0.5, 0.5, 0.5, 0.5)
 
 proc Box*(obj: var BoxObj): BoxPtr {.inline.} =
+  ## Creates a new Box pointer with default name "Box"
+  ##
+  ## Arguments:
+  ## - `obj` is a BoxObj variable.
+  runnableExamples:
+    var
+      box_obj: BoxObj
+      box = Box(box_obj)
   Box("Box", obj)
 
 
 method getChildSize*(self: BoxPtr): Vector2Ref {.base.} =
+  ## Returns Vector2 of the minimal size of the box pointer.
   var
     x = 0f
     y = 0f
@@ -65,6 +83,10 @@ method draw*(self: BoxPtr, w, h: GLfloat) =
   procCall self.ControlPtr.draw(w, h)
 
 method dublicate*(self: BoxPtr, obj: var BoxObj): BoxPtr {.base.} =
+  ## Dublicates Box pointer.
+  ##
+  ## Arguments:
+  ## - `obj` is BoxObj variable.
   obj = self[]
   obj.addr
 

+ 94 - 0
src/nodesnim/nodescontrol/slider.nim

@@ -0,0 +1,94 @@
+# author: Ethosa
+import
+  ../thirdparty/opengl,
+
+  ../core/vector2,
+  ../core/rect2,
+  ../core/anchor,
+  ../core/input,
+  ../core/color,
+
+  ../nodes/node,
+  control
+
+
+type
+  SliderObj* = object of ControlPtr
+    max_value*, value*: uint
+    progress_color*: ColorRef
+    thumb_color*: ColorRef
+  SliderPtr* = ptr SliderObj
+
+
+proc Slider*(name: string, variable: var SliderObj): SliderPtr =
+  nodepattern(SliderObj)
+  controlpattern()
+  variable.background_color = Color(1f, 1f, 1f)
+  variable.rect_size.x = 120
+  variable.rect_size.y = 40
+  variable.progress_color = Color(0.5, 0.5, 0.5)
+  variable.thumb_color = Color(0.7, 0.7, 0.7)
+  variable.max_value = 100
+  variable.value = 0
+
+proc Slider*(obj: var SliderObj): SliderPtr {.inline.} =
+  Slider("Slider", obj)
+
+
+method draw*(self: SliderPtr, w, h: GLfloat) =
+  self.calcGlobalPosition()
+  let
+    x = -w/2 + self.global_position.x
+    y = h/2 - self.global_position.y
+
+  # Background
+  glColor4f(self.background_color.r, self.background_color.g, self.background_color.b, self.background_color.a)
+  glRectf(x, y, x + self.rect_size.x, y - self.rect_size.y)
+
+  # Progress
+  let progress = self.rect_size.x * (self.value.float / self.max_value.float)
+  glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+  glRectf(x, y, x + progress, y - self.rect_size.y)
+
+  # Thumb
+  glColor4f(self.thumb_color.r, self.thumb_color.g, self.thumb_color.b, self.thumb_color.a)
+  glRectf(x + progress - 10, y, x + progress + 10, y - self.rect_size.y)
+
+  # Press
+  if self.pressed:
+    self.press(last_event.x, last_event.y)
+
+method dublicate*(self: SliderPtr, obj: var SliderObj): SliderPtr {.base.} =
+  obj = self[]
+  obj.addr
+
+method setMaxValue*(self: SliderPtr, value: uint) {.base.} =
+  if value > self.value:
+    self.max_value = value
+  else:
+    self.max_value = self.value
+
+method setProgress*(self: SliderPtr, value: uint) {.base.} =
+  if value > self.max_value:
+    self.value = self.max_value
+  else:
+    self.value = value
+
+method setProgressColor*(self: SliderPtr, color: ColorRef) {.base.} =
+  ## Changes progress color.
+  ## For change background color use `setBackgroundColor` method.
+  self.progress_color = color
+
+method handle*(self: SliderPtr, event: InputEvent, mouse_on: var NodePtr) =
+  procCall self.ControlPtr.handle(event, mouse_on)
+  
+  let
+    mouse_in = Rect2(
+      self.global_position,
+      Vector2(self.rect_size.x, self.rect_size.y)
+    ).hasPoint(event.x, event.y)
+  if self.pressed:
+    let
+      value = normalize(1f - ((self.global_position.x + self.rect_size.x - event.x) / self.rect_size.x), 0, 1)
+      progress_value = (value * self.max_value.float).uint32
+    self.setProgress(progress_value)

+ 1 - 0
tests/README.md

@@ -21,3 +21,4 @@
 19. [Use RichEditText node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test19.nim)
 20. [Use Scroll node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test20.nim)
 21. [Use ProgressBar node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test21.nim)
+22. [Use Slider node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test22.nim)

+ 19 - 0
tests/test22.nim

@@ -0,0 +1,19 @@
+# --- Test 22. Use Slider node. --- #
+import nodesnim
+
+
+Window("hello world")
+
+var
+  mainobj: SceneObj
+  main = Scene("Main", mainobj)
+
+  sliderobj: SliderObj
+  slider = Slider(sliderobj)
+
+main.addChild(slider)
+
+
+addScene(main)
+setMainScene("Main")
+windowLaunch()