Browse Source

refactor Slider node

Ethosa 3 years ago
parent
commit
9305c5c4ce

+ 4 - 6
README.md

@@ -72,11 +72,10 @@ This section contains links to documentation for all nodes.
 |[Polygon2][]    |                     |[Scroll][]            |                    |                    |                    |
 |[AudioStream][] |                     |[ProgressBar][]       |                    |                    |                    |
 |[Animation][]   |                     |[Slider][]            |                    |                    |                    |
-|[Vector3][]     |                     |[VSlider][]           |                    |                    |                    |
-|[SceneBuilder][]|                     |[Popup][]             |                    |                    |                    |
-|[StyleSheet][]  |                     |[TextureButton][]     |                    |                    |                    |
-|[TileSet][]     |                     |[TextureProgressBar][]|                    |                    |                    |
-|                |                     |[Counter][]           |                    |                    |                    |
+|[Vector3][]     |                     |[Popup][]             |                    |                    |                    |
+|[SceneBuilder][]|                     |[TextureButton][]     |                    |                    |                    |
+|[StyleSheet][]  |                     |[TextureProgressBar][]|                    |                    |                    |
+|[TileSet][]     |                     |[Counter][]           |                    |                    |                    |
 |                |                     |[Switch][]            |                    |                    |                    |
 |                |                     |[SubWindow][]         |                    |                    |                    |
 |                |                     |[CheckBox][]          |                    |                    |                    |
@@ -165,7 +164,6 @@ Use the [`Nim compiler user guide`](https://nim-lang.org/docs/nimc.html#dynlibov
 [Scroll]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/scroll.html
 [ProgressBar]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/progress_bar.html
 [Slider]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/slider.html
-[VSlider]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/vslider.html
 [Popup]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/popup.html
 [TextureButton]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/texture_button.html
 [TextureProgressBar]:https://ethosa.github.io/nodesnim/nodesnim/nodescontrol/texture_progress_bar.html

+ 1 - 2
src/nodesnim/nodescontrol.nim

@@ -18,11 +18,10 @@ import
   nodescontrol/counter,
   nodescontrol/switch,
   nodescontrol/subwindow,
-  nodescontrol/vslider,
   nodescontrol/checkbox
 
 export
   control, color_rect, texture_rect, label, button,
   box, hbox, vbox, grid_box, edittext, scroll, progress_bar,
   slider, popup, texture_button, texture_progress_bar,
-  counter, switch, subwindow, vslider, checkbox
+  counter, switch, subwindow, checkbox

+ 26 - 6
src/nodesnim/nodescontrol/slider.nim

@@ -16,7 +16,11 @@ import
 
 
 type
+  SliderType*{.pure, size: sizeof(int8).} = enum
+    SLIDER_HORIZONTAL,
+    SLIDER_VERTICAL
   SliderObj* = object of ControlRef
+    slider_type*: SliderType
     max_value*, value*: uint
     progress_color*: ColorRef
     thumb*: DrawableRef
@@ -34,6 +38,7 @@ proc Slider*(name: string = "Slider"): SliderRef =
     var sc = Slider("Slider")
   nodepattern(SliderRef)
   controlpattern()
+  result.slider_type = SLIDER_HORIZONTAL
   result.thumb = Drawable()
   result.background.setColor(Color(1f, 1f, 1f))
   result.thumb.setColor(Color(0.7, 0.7, 0.7))
@@ -56,12 +61,22 @@ method draw*(self: SliderRef, w, h: GLfloat) =
   self.background.draw(x, y, self.rect_size.x, 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)
+  case self.slider_type
+  of SLIDER_HORIZONTAL:
+    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
-  self.thumb.draw(x + progress, y, 10, self.rect_size.y)
+    # Thumb
+    self.thumb.draw(x + progress, y, 10, self.rect_size.y)
+
+  of SLIDER_VERTICAL:
+    let progress = self.rect_size.y * (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 - self.rect_size.y + progress, x + self.rect_size.x, y - self.rect_size.y)
+
+    # Thumb
+    self.thumb.draw(x, progress-10, self.rect_size.x, 10)
 
   # Press
   if self.pressed:
@@ -96,7 +111,12 @@ method handle*(self: SliderRef, event: InputEvent, mouse_on: var NodeRef) =
 
   if self.focused and self.pressed:
     let
-      value = normalize(1f - ((self.global_position.x + self.rect_size.x - event.x) / self.rect_size.x), 0, 1)
+      value =
+        case self.slider_type
+        of SLIDER_HORIZONTAL:
+          normalize(1f - ((self.global_position.x + self.rect_size.x - event.x) / self.rect_size.x), 0, 1)
+        of SLIDER_VERTICAL:
+          normalize(((self.global_position.y + self.rect_size.y - event.y) / self.rect_size.y), 0, 1)
       progress_value = (value * self.max_value.float).uint
     if progress_value != self.value:
       self.on_changed(self, progress_value)

+ 0 - 103
src/nodesnim/nodescontrol/vslider.nim

@@ -1,103 +0,0 @@
-# author: Ethosa
-## It provides a primitive vertical slider.
-import
-  ../thirdparty/opengl,
-
-  ../core/vector2,
-  ../core/rect2,
-  ../core/anchor,
-  ../core/input,
-  ../core/color,
-  ../core/enums,
-
-  ../nodes/node,
-  ../graphics/drawable,
-  control
-
-
-type
-  VSliderObj* = object of ControlRef
-    max_value*, value*: uint
-    progress_color*: ColorRef
-    thumb*: DrawableRef
-
-    on_changed*: proc(self: VSliderRef, new_value: uint): void
-  VSliderRef* = ref VSliderObj
-
-
-proc VSlider*(name: string = "VSlider"): VSliderRef =
-  ## Creates a new VSlider.
-  ##
-  ## Arguments:
-  ## - `name` is a node name.
-  runnableExamples:
-    var slider = VSlider("VSlider")
-  nodepattern(VSliderRef)
-  controlpattern()
-  result.thumb = Drawable()
-  result.background.setColor(Color(1f, 1f, 1f))
-  result.thumb.setColor(Color(0.7, 0.7, 0.7))
-  result.rect_size.x = 40
-  result.rect_size.y = 120
-  result.progress_color = Color(0.5, 0.5, 0.5)
-  result.max_value = 100
-  result.value = 0
-  result.on_changed = proc(self: VSliderRef, v: uint) = discard
-  result.kind = VSLIDER_NODE
-
-
-method draw*(self: VSliderRef, w, h: GLfloat) =
-  ## This uses in the `window.nim`.
-  let
-    x = -w/2 + self.global_position.x
-    y = h/2 - self.global_position.y
-
-  # Background
-  self.background.draw(x, y, self.rect_size.x, self.rect_size.y)
-
-  # Progress
-  let progress = self.rect_size.y * (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 - self.rect_size.y + progress, x + self.rect_size.x, y - self.rect_size.y)
-
-  # Thumb
-  self.thumb.draw(x, progress, self.rect_size.x, 10)
-
-  # Press
-  if self.pressed:
-    self.on_press(self, last_event.x, last_event.y)
-
-method duplicate*(self: VSliderRef): VSliderRef {.base.} =
-  ## Duplicates VSlider object and create a new VSlider.
-  self.deepCopy()
-
-method setMaxValue*(self: VSliderRef, value: uint) {.base.} =
-  ## Changes max value, if it not less than progress.
-  if value > self.value:
-    self.max_value = value
-  else:
-    self.max_value = self.value
-
-method setProgress*(self: VSliderRef, value: uint) {.base.} =
-  ## Changes progress, if it not more than max value.
-  if value > self.max_value:
-    self.value = self.max_value
-  else:
-    self.value = value
-
-method setProgressColor*(self: VSliderRef, color: ColorRef) {.base.} =
-  ## Changes progress color.
-  ## For change background color use `setBackgroundColor` method.
-  self.progress_color = color
-
-method handle*(self: VSliderRef, event: InputEvent, mouse_on: var NodeRef) =
-  ## handles user input. This uses in the `window.nim`.
-  procCall self.ControlRef.handle(event, mouse_on)
-
-  if self.focused and self.pressed:
-    let
-      value = normalize(((self.global_position.y + self.rect_size.y - event.y) / self.rect_size.y), 0, 1)
-      progress_value = (value * self.max_value.float).uint
-    if progress_value != self.value:
-      self.on_changed(self, progress_value)
-    self.setProgress(progress_value)

+ 4 - 2
tests/test20.nim

@@ -8,17 +8,19 @@ var
   main = Scene("Main")
 
   slider = Slider()
-  vslider = VSlider()
+  vslider = Slider()
 
 main.addChild(slider)
 main.addChild(vslider)
 vslider.move(64, 64)
 vslider.setMaxValue(4)
+vslider.slider_type = SLIDER_VERTICAL
 slider.resize(256, 32)
+vslider.resize(32, 128)
 slider.setMaxValue(1000)
 
 vslider.on_changed =
-  proc(self: VSliderRef, v: uint) =
+  proc(self: SliderRef, v: uint) =
     if v > 2:
       vslider.setProgressColor(Color(0xccaaffff'u32))
     else: