Skip to content

Commit 71f4d4c

Browse files
committed
Simplified colorpicker code
1 parent d9157b3 commit 71f4d4c

File tree

1 file changed

+48
-81
lines changed

1 file changed

+48
-81
lines changed

nimx/color_picker.nim

Lines changed: 48 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,20 @@ type
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
@@ -39,10 +38,6 @@ type
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
10499
proc 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

109112
const 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", h)
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
153127
const 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", cc.h)
176-
setUniform("uChosenS", cc.s)
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
191143
const 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", cc.h)
214-
setUniform("uChosenV", cc.v)
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", cc.h)
168+
of ColorComponent.S:
169+
cpSComposition.draw r:
170+
setUniform("uHcps", cc.h)
171+
setUniform("uChosenS", cc.s)
172+
of ColorComponent.V:
173+
cpVComposition.draw r:
174+
setUniform("uHcpv", cc.h)
175+
setUniform("uChosenV", cc.v)
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

Comments
 (0)