1515  ColorPickerPalette *  {.pure .} =  enum 
1616    HSV 
1717
18+   ColorComponent *  {.pure .} =  enum 
19+     H
20+     S
21+     V
22+ 
1823  ColorView *  =  ref  object  of  View 
1924    # # Color quad that reacts to outer world
2025    main: bool   # # Defines if view is main or from history
2126
2227  ColorPickerCircle *  =  ref  object  of  View 
2328    palette: ColorPickerPalette 
2429
25-   ColorPickerH *  =  ref  object  of  View 
26-     # # Hue tuning widget
27- 
28-   ColorPickerS *  =  ref  object  of  View 
29-     # # Saturation tuning widget
30- 
31-   ColorPickerV *  =  ref  object  of  View 
32-     # # Value tuning widget
30+   ColorPickerSlider *  =  ref  object  of  View 
31+     comp: ColorComponent 
3332
3433  ColorPickerView *  =  ref  object  of  Control 
3534    # # Complex Widget that allows to pick color using HSV palette
3938    circle:      ColorPickerCircle    # # Color picking circle
4039    chosenColorView: ColorView        # # Quad that shows current color
4140
42-     cpH: ColorPickerH           # # Hue tuning widget
43-     cpS: ColorPickerS           # # Saturation tuning widget
44-     cpV: ColorPickerV           # # Value tuning widget
45- 
4641    tfH: TextField              # # Hue numerical widget
4742    tfS: TextField              # # Saturation numerical widget
4843    tfV: TextField              # # Value numerical widget
@@ -104,7 +99,15 @@ proc rgbToHSV*(r: float, g: float, b: float): tuple[h: float, s: float, v: float
10499proc  hsvToRgb (color: tuple [h: float , s: float , v: float ]): Color  = 
105100  hsvToRgb (color.h, color.s, color.v)
106101
107- #  ColorPickerH
102+ proc  colorHasChanged (cpv: ColorPickerView ) = 
103+   # # Perform update of ColorPickerView components
104+   cpv.tfH.text =  formatFloat (cpv.currentColor.h, ffDecimal, 3 )
105+   cpv.tfS.text =  formatFloat (cpv.currentColor.s, ffDecimal, 3 )
106+   cpv.tfV.text =  formatFloat (cpv.currentColor.v, ffDecimal, 3 )
107+   cpv.chosenColorView.backgroundColor =  hsvToRGB (cpv.currentColor)
108+   cpv.setNeedsDisplay ()
109+ 
110+ #  ColorPickerSlider
108111
109112const  cpHComposition =  newComposition  """ 
110113  uniform float uChosenH; 
@@ -121,35 +124,6 @@ const cpHComposition = newComposition """
121124  } 
122125""" 
123126
124- method  draw (cph: ColorPickerH , r: Rect ) = 
125-   # # Drawing Hue picker
126-   let  c =  currentContext ()
127-   let  h =  cph.enclosingColorPickerView ().currentColor.h
128- 
129-   cpHComposition.draw  r:
130-     setUniform (" uChosenH" 
131- 
132- proc  colorHasChanged (cpv: ColorPickerView ) = 
133-   # # Perform update of ColorPickerView components
134-   cpv.tfH.text =  formatFloat (cpv.currentColor.h, ffDecimal, 3 )
135-   cpv.tfS.text =  formatFloat (cpv.currentColor.s, ffDecimal, 3 )
136-   cpv.tfV.text =  formatFloat (cpv.currentColor.v, ffDecimal, 3 )
137-   cpv.chosenColorView.backgroundColor =  hsvToRGB (cpv.currentColor)
138-   cpv.setNeedsDisplay ()
139- 
140- method  onTouchEv (cph: ColorPickerH , e: var  Event ): bool  {.gcsafe .}= 
141-   let  cpv =  cph.enclosingColorPickerView ()
142- 
143-   if  e.buttonState ==  bsUp or  true :
144-     var  h =  e.localPosition.x /  cph.frame.width
145-     h =  h.clamp (0.0 , 1.0 )
146-     cpv.currentColor.h =  h
147-     cpv.colorHasChanged ()
148-     cpv.sendAction (e)
149- 
150-   return  true 
151- 
152- #  ColorPickerS
153127const  cpSComposition =  newComposition  """ 
154128  uniform float uHcps; 
155129  uniform float uChosenS; 
@@ -166,28 +140,6 @@ const cpSComposition = newComposition """
166140  } 
167141""" 
168142
169- method  draw (cps: ColorPickerS , r: Rect ) = 
170-   # # Drawing Hue picker
171-   let  c =  currentContext ()
172-   let  cc =  cps.enclosingColorPickerView ().currentColor
173- 
174-   cpSComposition.draw  r:
175-     setUniform (" uHcps" 
176-     setUniform (" uChosenS" 
177- 
178- method  onTouchEv (cps: ColorPickerS , e: var  Event ): bool  = 
179-   let  cpv =  cps.enclosingColorPickerView ()
180- 
181-   if  e.buttonState ==  bsUp or  true :
182-     var  s =  e.localPosition.x /  cps.frame.width
183-     s =  s.clamp (0.0 , 1.0 )
184-     cpv.currentColor.s =  s
185-     cpv.colorHasChanged ()
186-     cpv.sendAction (e)
187- 
188-   return  true 
189- 
190- #  ColorPickerV
191143const  cpVComposition =  newComposition  """ 
192144  uniform float uHcpv; 
193145  uniform float uChosenV; 
@@ -204,22 +156,37 @@ const cpVComposition = newComposition """
204156  } 
205157""" 
206158
207- method  draw (cpv:  ColorPickerV , r: Rect ) = 
159+ method  draw (cps:  ColorPickerSlider , r: Rect ) = 
208160  # # Drawing Hue picker
209161  let  c =  currentContext ()
210-   let  cc =  cpv.enclosingColorPickerView ().currentColor
211- 
212-   cpVComposition.draw  r:
213-     setUniform (" uHcpv" 
214-     setUniform (" uChosenV" 
162+   let  cc =  cps.enclosingColorPickerView ().currentColor
215163
216- method  onTouchEv (cpva: ColorPickerV , e: var  Event ): bool  = 
217-   let  cpv =  cpva.enclosingColorPickerView ()
164+   case  cps.comp
165+   of  ColorComponent .H:
166+     cpHComposition.draw  r:
167+       setUniform (" uChosenH" 
168+   of  ColorComponent .S:
169+     cpSComposition.draw  r:
170+       setUniform (" uHcps" 
171+       setUniform (" uChosenS" 
172+   of  ColorComponent .V:
173+     cpVComposition.draw  r:
174+       setUniform (" uHcpv" 
175+       setUniform (" uChosenV" 
176+ 
177+ method  onTouchEv (cps: ColorPickerSlider , e: var  Event ): bool  = 
178+   let  cpv =  cps.enclosingColorPickerView ()
218179
219180  if  e.buttonState ==  bsUp or  true :
220-     var  v =  (e.localPosition.x /  cpva.frame.width).clamp (0.0 , 1.0 )
221-     v =  v.clamp (0.0 , 1.0 )
222-     cpv.currentColor.v =  v
181+     var  s =  e.localPosition.x /  cps.frame.width
182+     s =  s.clamp (0.0 , 1.0 )
183+     case  cps.comp
184+     of  ColorComponent .H:
185+       cpv.currentColor.h =  s
186+     of  ColorComponent .S:
187+       cpv.currentColor.s =  s
188+     of  ColorComponent .V:
189+       cpv.currentColor.v =  s
223190    cpv.colorHasChanged ()
224191    cpv.sendAction (e)
225192
@@ -345,11 +312,12 @@ method init*(cpv: ColorPickerView) =
345312      onAction:
346313        updateColorFromTextField (cpv, tFH, cpv.currentColor.h)
347314
348-     -  ColorPickerH   as  cpH :
315+     -  ColorPickerSlider :
349316      leading ==  prev.trailing +  margin
350317      trailing ==  circle.layout.vars.leading -  margin
351318      y ==  prev
352319      height ==  prev
320+       comp: ColorComponent .H
353321
354322    -  Label  as  labelS:
355323      leading ==  super +  margin
@@ -366,11 +334,12 @@ method init*(cpv: ColorPickerView) =
366334      onAction:
367335        updateColorFromTextField (cpv, tFS, cpv.currentColor.s)
368336
369-     -  ColorPickerS   as  cpS :
337+     -  ColorPickerSlider :
370338      leading ==  prev.trailing +  margin
371339      trailing ==  circle.layout.vars.leading -  margin
372340      y ==  prev
373341      height ==  prev
342+       comp: ColorComponent .S
374343
375344    -  Label  as  labelV:
376345      leading ==  super +  margin
@@ -387,11 +356,12 @@ method init*(cpv: ColorPickerView) =
387356      onAction:
388357        updateColorFromTextField (cpv, tFV, cpv.currentColor.v)
389358
390-     -  ColorPickerV   as  cpB :
359+     -  ColorPickerSlider :
391360      leading ==  prev.trailing +  margin
392361      trailing ==  circle.layout.vars.leading -  margin
393362      y ==  prev
394363      height ==  prev
364+       comp: ColorComponent .V
395365
396366    -  ColorView  as  selectedColorView:
397367      leading ==  super +  margin
@@ -402,11 +372,8 @@ method init*(cpv: ColorPickerView) =
402372  cpv.circle =  circle
403373  cpv.chosenColorView =  selectedColorView
404374  cpv.tfH =  tfH
405-   cpv.cpH =  cpH
406375  cpv.tfS =  tfS
407-   cpv.cpS =  cpS
408376  cpv.tfV =  tfV
409-   cpv.cpV =  cpB
410377  cpv.currentColor =  (0.5 , 0.5 , 0.5 )
411378  cpv.colorHasChanged ()
412379
0 commit comments