Skip to content

Commit f07bb46

Browse files
committed
Added support for HSL color values.
1 parent 205e1f8 commit f07bb46

File tree

9 files changed

+1321
-463
lines changed

9 files changed

+1321
-463
lines changed

ColorSet.xcodeproj/project.pbxproj

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,12 @@
2727
057DC44E22B1492200BA6727 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 057DC44D22B1492200BA6727 /* Test.swift */; };
2828
057DC45022B1492200BA6727 /* ColorSetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05CD4ABA20ED7CD100DBDE99 /* ColorSetKit.framework */; };
2929
057DC45822B14CC300BA6727 /* Colors.colorset in Resources */ = {isa = PBXBuildFile; fileRef = 057DC45722B14CC300BA6727 /* Colors.colorset */; };
30+
059F8C79233CDB3300C9B83F /* HColorComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059F8C77233CDB3300C9B83F /* HColorComponent.swift */; };
31+
059F8C7A233CDB3300C9B83F /* SLColorComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059F8C78233CDB3300C9B83F /* SLColorComponent.swift */; };
32+
059F8C7C233CDD5600C9B83F /* NSColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059F8C7B233CDD5500C9B83F /* NSColor.swift */; };
3033
05CD4AC120ED7CD100DBDE99 /* ColorSetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05CD4ABA20ED7CD100DBDE99 /* ColorSetKit.framework */; };
3134
05CD4AC220ED7CD100DBDE99 /* ColorSetKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 05CD4ABA20ED7CD100DBDE99 /* ColorSetKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
32-
05D11EC120E1359C00A621B5 /* ColorComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D11EC020E1359C00A621B5 /* ColorComponent.swift */; };
35+
05D11EC120E1359C00A621B5 /* RGBColorComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D11EC020E1359C00A621B5 /* RGBColorComponent.swift */; };
3336
05D11EC720E13B9400A621B5 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 05D11EC620E13B9400A621B5 /* Icon.icns */; };
3437
05D11ECA20E13DFF00A621B5 /* ColorSet.AboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05D11EC820E13DFF00A621B5 /* ColorSet.AboutWindowController.xib */; };
3538
05D11ECC20E13E0900A621B5 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D11ECB20E13E0800A621B5 /* AboutWindowController.swift */; };
@@ -155,10 +158,13 @@
155158
057DC44D22B1492200BA6727 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = "<group>"; };
156159
057DC44F22B1492200BA6727 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
157160
057DC45722B14CC300BA6727 /* Colors.colorset */ = {isa = PBXFileReference; lastKnownFileType = file; path = Colors.colorset; sourceTree = "<group>"; };
161+
059F8C77233CDB3300C9B83F /* HColorComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HColorComponent.swift; sourceTree = "<group>"; };
162+
059F8C78233CDB3300C9B83F /* SLColorComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SLColorComponent.swift; sourceTree = "<group>"; };
163+
059F8C7B233CDD5500C9B83F /* NSColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSColor.swift; sourceTree = "<group>"; };
158164
05CD4AB220ED7B2200DBDE99 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
159165
05CD4ABA20ED7CD100DBDE99 /* ColorSetKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ColorSetKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
160166
05CD4AC620ED7CE000DBDE99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
161-
05D11EC020E1359C00A621B5 /* ColorComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorComponent.swift; sourceTree = "<group>"; };
167+
05D11EC020E1359C00A621B5 /* RGBColorComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RGBColorComponent.swift; sourceTree = "<group>"; };
162168
05D11EC620E13B9400A621B5 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = "<group>"; };
163169
05D11EC920E13DFF00A621B5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ColorSet.AboutWindowController.xib; sourceTree = "<group>"; };
164170
05D11ECB20E13E0800A621B5 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = "<group>"; };
@@ -376,7 +382,9 @@
376382
0543AE7420DC33DF00284E99 /* ApplicationDelegate.swift */,
377383
0530C41E20E10FEA00F5B259 /* ArrayIsEmpty.swift */,
378384
0530C42020E1112C00F5B259 /* ArrayIsNotEmpty.swift */,
379-
05D11EC020E1359C00A621B5 /* ColorComponent.swift */,
385+
05D11EC020E1359C00A621B5 /* RGBColorComponent.swift */,
386+
059F8C77233CDB3300C9B83F /* HColorComponent.swift */,
387+
059F8C78233CDB3300C9B83F /* SLColorComponent.swift */,
380388
0543AE8120DC382A00284E99 /* ColorItem.swift */,
381389
0530C42420E1305B00F5B259 /* ColorSet-Bridging-Header.h */,
382390
0543AE9D20E0FFD000284E99 /* ColorView.swift */,
@@ -385,6 +393,7 @@
385393
0564590120E4DDFD001EA86F /* HexColor.swift */,
386394
0543AE7C20DC345200284E99 /* MainWindowController.swift */,
387395
0530C42220E1213500F5B259 /* NSView.swift */,
396+
059F8C7B233CDD5500C9B83F /* NSColor.swift */,
388397
);
389398
path = Classes;
390399
sourceTree = "<group>";
@@ -606,14 +615,17 @@
606615
isa = PBXSourcesBuildPhase;
607616
buildActionMask = 2147483647;
608617
files = (
618+
059F8C7A233CDB3300C9B83F /* SLColorComponent.swift in Sources */,
609619
0530C42320E1213500F5B259 /* NSView.swift in Sources */,
610620
05D11ECC20E13E0900A621B5 /* AboutWindowController.swift in Sources */,
611621
0564590220E4DDFD001EA86F /* HexColor.swift in Sources */,
622+
059F8C7C233CDD5600C9B83F /* NSColor.swift in Sources */,
612623
0543AE9E20E0FFD000284E99 /* ColorView.swift in Sources */,
613624
0543AE8220DC382A00284E99 /* ColorItem.swift in Sources */,
614625
0530C41F20E10FEA00F5B259 /* ArrayIsEmpty.swift in Sources */,
626+
059F8C79233CDB3300C9B83F /* HColorComponent.swift in Sources */,
615627
0530C42120E1112C00F5B259 /* ArrayIsNotEmpty.swift in Sources */,
616-
05D11EC120E1359C00A621B5 /* ColorComponent.swift in Sources */,
628+
05D11EC120E1359C00A621B5 /* RGBColorComponent.swift in Sources */,
617629
0530C42720E1305B00F5B259 /* Exception.m in Sources */,
618630
0543AE7D20DC345200284E99 /* MainWindowController.swift in Sources */,
619631
0543AE7920DC33DF00284E99 /* ApplicationDelegate.swift in Sources */,

ColorSet/Classes/ColorItem.swift

Lines changed: 127 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*******************************************************************************
2+
* The MIT License (MIT)
3+
*
4+
* Copyright (c) 2018 Jean-David Gadina - www.imazing.com
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
******************************************************************************/
24+
25+
import Cocoa
26+
27+
@objc class HColorComponent: ValueTransformer
28+
{
29+
@objc public override static func allowsReverseTransformation() -> Bool
30+
{
31+
return true
32+
}
33+
34+
@objc public override static func transformedValueClass() -> Swift.AnyClass
35+
{
36+
return NSNumber.self
37+
}
38+
39+
@objc public override func transformedValue( _ value: Any? ) -> Any?
40+
{
41+
guard let n = value as? NSNumber else
42+
{
43+
return NSNumber( value: 0 )
44+
}
45+
46+
return NSNumber( value: 360 * n.doubleValue )
47+
}
48+
49+
override func reverseTransformedValue( _ value: Any? ) -> Any?
50+
{
51+
guard let n = value as? NSNumber else
52+
{
53+
return NSNumber( value: 0 )
54+
}
55+
56+
return NSNumber( value: n.doubleValue / 360 )
57+
}
58+
}

ColorSet/Classes/MainWindowController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class MainWindowController: NSWindowController, NSTableViewDelegate, NSTableView
196196

197197
do
198198
{
199-
try set.write( to: url )
199+
try set.writeTo( url: url )
200200
}
201201
catch let error as NSError
202202
{

0 commit comments

Comments
 (0)