@@ -32,15 +32,21 @@ class ColorItem: NSObject
3232 @objc public dynamic var color : NSColor = NSColor . black
3333 @objc public dynamic var variant : NSColor ?
3434
35- @objc public dynamic var red : CGFloat = 0.0
36- @objc public dynamic var green : CGFloat = 0.0
37- @objc public dynamic var blue : CGFloat = 0.0
38- @objc public dynamic var alpha : CGFloat = 1.0
35+ @objc public dynamic var red : CGFloat = 0.0
36+ @objc public dynamic var green : CGFloat = 0.0
37+ @objc public dynamic var blue : CGFloat = 0.0
38+ @objc public dynamic var hue : CGFloat = 0.0
39+ @objc public dynamic var saturation : CGFloat = 0.0
40+ @objc public dynamic var lightness : CGFloat = 0.0
41+ @objc public dynamic var alpha : CGFloat = 1.0
3942
40- @objc public dynamic var red2 : CGFloat = 0.0
41- @objc public dynamic var green2 : CGFloat = 0.0
42- @objc public dynamic var blue2 : CGFloat = 0.0
43- @objc public dynamic var alpha2 : CGFloat = 1.0
43+ @objc public dynamic var red2 : CGFloat = 0.0
44+ @objc public dynamic var green2 : CGFloat = 0.0
45+ @objc public dynamic var blue2 : CGFloat = 0.0
46+ @objc public dynamic var hue2 : CGFloat = 0.0
47+ @objc public dynamic var saturation2 : CGFloat = 0.0
48+ @objc public dynamic var lightness2 : CGFloat = 0.0
49+ @objc public dynamic var alpha2 : CGFloat = 1.0
4450
4551 private var observations : [ NSKeyValueObservation ] = [ ]
4652 private var updating = false
@@ -53,19 +59,25 @@ class ColorItem: NSObject
5359
5460 private func observe( )
5561 {
56- let o1 = self . observe ( \. red ) { ( o, c ) in self . updateColorFromRGB ( ) }
57- let o2 = self . observe ( \. green ) { ( o, c ) in self . updateColorFromRGB ( ) }
58- let o3 = self . observe ( \. blue ) { ( o, c ) in self . updateColorFromRGB ( ) }
59- let o4 = self . observe ( \. alpha ) { ( o, c ) in self . updateColorFromRGB ( ) }
60- let o5 = self . observe ( \. color ) { ( o, c ) in self . updateColorFromColor ( ) }
61-
62- let o6 = self . observe ( \. red2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
63- let o7 = self . observe ( \. green2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
64- let o8 = self . observe ( \. blue2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
65- let o9 = self . observe ( \. alpha2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
66- let o10 = self . observe ( \. variant ) { ( o, c ) in self . updateVariantFromColor ( ) }
67-
68- self . observations. append ( contentsOf: [ o1, o2, o3, o4, o5, o6, o7, o8, o9, o10 ] )
62+ let o1 = self . observe ( \. red ) { ( o, c ) in self . updateColorFromRGB ( ) }
63+ let o2 = self . observe ( \. green ) { ( o, c ) in self . updateColorFromRGB ( ) }
64+ let o3 = self . observe ( \. blue ) { ( o, c ) in self . updateColorFromRGB ( ) }
65+ let o4 = self . observe ( \. hue ) { ( o, c ) in self . updateColorFromHSL ( ) }
66+ let o5 = self . observe ( \. saturation ) { ( o, c ) in self . updateColorFromHSL ( ) }
67+ let o6 = self . observe ( \. lightness ) { ( o, c ) in self . updateColorFromHSL ( ) }
68+ let o7 = self . observe ( \. alpha ) { ( o, c ) in self . updateColorFromRGB ( ) }
69+ let o8 = self . observe ( \. color ) { ( o, c ) in self . updateColorFromColor ( updateHSL: true ) }
70+
71+ let o9 = self . observe ( \. red2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
72+ let o10 = self . observe ( \. green2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
73+ let o11 = self . observe ( \. blue2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
74+ let o12 = self . observe ( \. hue2 ) { ( o, c ) in self . updateVariantFromHSL ( ) }
75+ let o13 = self . observe ( \. saturation2 ) { ( o, c ) in self . updateVariantFromHSL ( ) }
76+ let o14 = self . observe ( \. lightness2 ) { ( o, c ) in self . updateVariantFromHSL ( ) }
77+ let o15 = self . observe ( \. alpha2 ) { ( o, c ) in self . updateVariantFromRGB ( ) }
78+ let o16 = self . observe ( \. variant ) { ( o, c ) in self . updateVariantFromColor ( updateHSL: true ) }
79+
80+ self . observations. append ( contentsOf: [ o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16 ] )
6981 }
7082
7183 private func updateColorFromRGB( )
@@ -78,9 +90,25 @@ class ColorItem: NSObject
7890 self . updating = true
7991 self . color = NSColor ( srgbRed: self . red, green: self . green, blue: self . blue, alpha: self . alpha )
8092 self . updating = false
93+
94+ self . updateColorFromColor ( updateHSL: true )
8195 }
8296
83- private func updateColorFromColor( )
97+ private func updateColorFromHSL( )
98+ {
99+ if ( self . updating )
100+ {
101+ return
102+ }
103+
104+ self . updating = true
105+ self . color = NSColor ( hue: self . hue, saturation: self . saturation, lightness: self . lightness, alpha: self . alpha )
106+ self . updating = false
107+
108+ self . updateColorFromColor ( updateHSL: false )
109+ }
110+
111+ private func updateColorFromColor( updateHSL: Bool )
84112 {
85113 if ( self . updating )
86114 {
@@ -94,29 +122,51 @@ class ColorItem: NSObject
94122 var r : CGFloat = 0.0
95123 var g : CGFloat = 0.0
96124 var b : CGFloat = 0.0
125+ var h : CGFloat = 0.0
126+ var s : CGFloat = 0.0
127+ var l : CGFloat = 0.0
97128 var a : CGFloat = 0.0
98129
99130 self . color. getRed ( & r, green: & g, blue: & b, alpha: & a )
131+ self . color. getHue ( & h, saturation: & s, lightness: & l, alpha: nil )
132+
133+ self . red = r
134+ self . green = g
135+ self . blue = b
136+ self . alpha = a
100137
101- self . red = r
102- self . green = g
103- self . blue = b
104- self . alpha = a
138+ if updateHSL
139+ {
140+ self . hue = h
141+ self . saturation = s
142+ self . lightness = l
143+ }
105144 } ,
106145 {
107146 ( e ) in
108147
109148 var r : CGFloat = 0.0
110149 var g : CGFloat = 0.0
111150 var b : CGFloat = 0.0
151+ var h : CGFloat = 0.0
152+ var s : CGFloat = 0.0
153+ var l : CGFloat = 0.0
112154 var a : CGFloat = 0.0
113155
114156 self . color. usingColorSpace ( NSColorSpace . sRGB ) ? . getRed ( & r, green: & g, blue: & b, alpha: & a )
157+ self . color. usingColorSpace ( NSColorSpace . sRGB ) ? . getHue ( & h, saturation: & s, lightness: & l, alpha: nil )
115158
116- self . red = r
117- self . green = g
118- self . blue = b
119- self . alpha = a
159+ self . red = r
160+ self . green = g
161+ self . blue = b
162+ self . alpha = a
163+
164+ if updateHSL
165+ {
166+ self . hue = h
167+ self . saturation = s
168+ self . lightness = l
169+ }
120170 }
121171 )
122172
@@ -133,9 +183,25 @@ class ColorItem: NSObject
133183 self . updating = true
134184 self . variant = NSColor ( srgbRed: self . red2, green: self . green2, blue: self . blue2, alpha: self . alpha2 )
135185 self . updating = false
186+
187+ self . updateVariantFromColor ( updateHSL: true )
136188 }
137189
138- private func updateVariantFromColor( )
190+ private func updateVariantFromHSL( )
191+ {
192+ if ( self . updating )
193+ {
194+ return
195+ }
196+
197+ self . updating = true
198+ self . variant = NSColor ( hue: self . hue2, saturation: self . saturation2, lightness: self . lightness2, alpha: self . alpha2 )
199+ self . updating = false
200+
201+ self . updateVariantFromColor ( updateHSL: false )
202+ }
203+
204+ private func updateVariantFromColor( updateHSL: Bool )
139205 {
140206 if ( self . updating )
141207 {
@@ -149,29 +215,51 @@ class ColorItem: NSObject
149215 var r : CGFloat = 0.0
150216 var g : CGFloat = 0.0
151217 var b : CGFloat = 0.0
218+ var h : CGFloat = 0.0
219+ var s : CGFloat = 0.0
220+ var l : CGFloat = 0.0
152221 var a : CGFloat = 0.0
153222
154223 self . variant? . getRed ( & r, green: & g, blue: & b, alpha: & a )
224+ self . variant? . getHue ( & h, saturation: & s, lightness: & l, alpha: nil )
225+
226+ self . red2 = r
227+ self . green2 = g
228+ self . blue2 = b
229+ self . alpha2 = a
155230
156- self . red2 = r
157- self . green2 = g
158- self . blue2 = b
159- self . alpha2 = a
231+ if updateHSL
232+ {
233+ self . hue2 = h
234+ self . saturation2 = s
235+ self . lightness2 = l
236+ }
160237 } ,
161238 {
162239 ( e ) in
163240
164241 var r : CGFloat = 0.0
165242 var g : CGFloat = 0.0
166243 var b : CGFloat = 0.0
244+ var h : CGFloat = 0.0
245+ var s : CGFloat = 0.0
246+ var l : CGFloat = 0.0
167247 var a : CGFloat = 0.0
168248
169249 self . variant? . usingColorSpace ( NSColorSpace . sRGB ) ? . getRed ( & r, green: & g, blue: & b, alpha: & a )
250+ self . variant? . usingColorSpace ( NSColorSpace . sRGB ) ? . getHue ( & h, saturation: & s, lightness: & l, alpha: nil )
251+
252+ self . red2 = r
253+ self . green2 = g
254+ self . blue2 = b
255+ self . alpha2 = a
170256
171- self . red2 = r
172- self . green2 = g
173- self . blue2 = b
174- self . alpha2 = a
257+ if updateHSL
258+ {
259+ self . hue2 = h
260+ self . saturation2 = s
261+ self . lightness2 = l
262+ }
175263 }
176264 )
177265
0 commit comments