SakiKawasaki před 4 roky
rodič
revize
a42ce6ddfc

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

@@ -19,6 +19,8 @@ type
     max_value*, value*: uint
     progress_color*: ColorRef
     thumb_color*: ColorRef
+
+    on_changed*: proc(new_value: uint): void
   SliderPtr* = ptr SliderObj
 
 
@@ -41,6 +43,7 @@ proc Slider*(name: string, variable: var SliderObj): SliderPtr =
   variable.thumb_color = Color(0.7, 0.7, 0.7)
   variable.max_value = 100
   variable.value = 0
+  variable.on_changed = proc(v: uint) = discard
   variable.kind = SLIDER_NODE
 
 proc Slider*(obj: var SliderObj): SliderPtr {.inline.} =
@@ -107,8 +110,10 @@ method handle*(self: SliderPtr, event: InputEvent, mouse_on: var NodePtr) =
   ## Handles user input. This uses in the `window.nim`.
   procCall self.ControlPtr.handle(event, mouse_on)
 
-  if self.pressed:
+  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)
       progress_value = (value * self.max_value.float).uint32
+    if progress_value != self.value:
+      self.on_changed(progress_value)
     self.setProgress(progress_value)

+ 6 - 1
src/nodesnim/nodescontrol/vslider.nim

@@ -19,6 +19,8 @@ type
     max_value*, value*: uint
     progress_color*: ColorRef
     thumb_color*: ColorRef
+
+    on_changed*: proc(new_value: uint): void
   VSliderPtr* = ptr VSliderObj
 
 
@@ -41,6 +43,7 @@ proc VSlider*(name: string, variable: var VSliderObj): VSliderPtr =
   variable.thumb_color = Color(0.7, 0.7, 0.7)
   variable.max_value = 100
   variable.value = 0
+  variable.on_changed = proc(v: uint) = discard
   variable.kind = VSLIDER_NODE
 
 proc VSlider*(obj: var VSliderObj): VSliderPtr {.inline.} =
@@ -107,8 +110,10 @@ method handle*(self: VSliderPtr, event: InputEvent, mouse_on: var NodePtr) =
   ## handles user input. This uses in the `window.nim`.
   procCall self.ControlPtr.handle(event, mouse_on)
 
-  if self.pressed:
+  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).uint32
+    if progress_value != self.value:
+      self.on_changed(progress_value)
     self.setProgress(progress_value)

+ 15 - 0
tests/test22.nim

@@ -18,6 +18,21 @@ main.addChild(slider)
 main.addChild(vslider)
 vslider.move(64, 64)
 vslider.setMaxValue(4)
+slider.resize(256, 32)
+slider.setMaxValue(1000)
+
+vslider.on_changed =
+  proc(v: uint) =
+    if v > 2:
+      vslider.setProgressColor(Color(0xccaaffff'u32))
+    else:
+      vslider.setProgressColor(Color(0xffaaccff'u32))
+
+slider.on_changed =
+  proc(v: uint) =
+    slider.setProgressColor(Color(
+      1f - v.float / slider.max_value.float, v.float / slider.max_value.float, 0
+    ))
 
 
 addScene(main)