Skip to content

Commit 7bd8dab

Browse files
committed
Open/Save
1 parent e7d3308 commit 7bd8dab

File tree

5 files changed

+168
-20
lines changed

5 files changed

+168
-20
lines changed

ColorSet.xcodeproj/project.pbxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@
146146
0543AE6120DC33BC00284E99 = {
147147
CreatedOnToolsVersion = 9.4.1;
148148
LastSwiftMigration = 1000;
149+
SystemCapabilities = {
150+
com.apple.Sandbox = {
151+
enabled = 1;
152+
};
153+
};
149154
};
150155
};
151156
};

ColorSet/Classes/ApplicationDelegate.swift

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ class ApplicationDelegate: NSResponder, NSApplicationDelegate
3232
private var aboutWindowController: NSWindowController?
3333

3434
func applicationDidFinishLaunching( _ notification: Notification )
35-
{
36-
self.newDocument( nil )
37-
}
35+
{}
3836

3937
func applicationWillTerminate( _ notification: Notification )
4038
{}
@@ -60,4 +58,55 @@ class ApplicationDelegate: NSResponder, NSApplicationDelegate
6058

6159
self.aboutWindowController?.window?.makeKeyAndOrderFront( sender )
6260
}
61+
62+
@IBAction public func openDocument( _ sender: Any? )
63+
{
64+
let panel = NSOpenPanel()
65+
66+
panel.canChooseDirectories = false
67+
panel.canChooseFiles = true
68+
panel.canCreateDirectories = false
69+
panel.allowsMultipleSelection = false
70+
panel.allowedFileTypes = [ "colorset" ]
71+
72+
let r = panel.runModal()
73+
74+
if( r != .OK )
75+
{
76+
return
77+
}
78+
79+
guard let url = panel.url else
80+
{
81+
return
82+
}
83+
84+
do
85+
{
86+
let data = try Data( contentsOf: url )
87+
88+
guard let colors = NSKeyedUnarchiver.unarchiveObject( with: data ) as? [ ColorItem ] else
89+
{
90+
let alert = NSAlert()
91+
alert.messageText = "Load error"
92+
alert.informativeText = "Invalid data format"
93+
94+
alert.runModal()
95+
96+
return
97+
}
98+
99+
let controller = MainWindowController( colors: colors )
100+
controller.url = url
101+
102+
controller.window?.center()
103+
controller.window?.makeKeyAndOrderFront( sender )
104+
105+
self.controllers.append( controller )
106+
}
107+
catch let error as NSError
108+
{
109+
NSAlert( error: error ).runModal()
110+
}
111+
}
63112
}

ColorSet/Classes/ColorItem.swift

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,16 @@ class ColorItem: NSObject, NSCoding
4343
@objc public dynamic var alpha2: CGFloat = 1.0
4444

4545
private var observations: [ NSKeyValueObservation ] = []
46+
private var updating = false
4647

4748
override init()
4849
{
4950
super.init()
50-
51+
self.observe()
52+
}
53+
54+
private func observe()
55+
{
5156
let o1 = self.observe( \.red ) { ( o, c ) in self.updateColorFromRGB() }
5257
let o2 = self.observe( \.green ) { ( o, c ) in self.updateColorFromRGB() }
5358
let o3 = self.observe( \.blue ) { ( o, c ) in self.updateColorFromRGB() }
@@ -63,8 +68,6 @@ class ColorItem: NSObject, NSCoding
6368
self.observations.append( contentsOf: [ o1, o2, o3, o4, o5, o6, o7, o8, o9, o10 ] )
6469
}
6570

66-
private var updating = false
67-
6871
private func updateColorFromRGB()
6972
{
7073
if( self.updating )
@@ -180,15 +183,15 @@ class ColorItem: NSObject, NSCoding
180183
coder.encode( self.name, forKey: "n" )
181184
coder.encode( self.hasVariant, forKey: "v" )
182185

183-
coder.encode( self.red, forKey: "r1" )
184-
coder.encode( self.green, forKey: "g1" )
185-
coder.encode( self.blue, forKey: "b1" )
186-
coder.encode( self.alpha, forKey: "a1" )
186+
coder.encode( Double( self.red ), forKey: "r1" )
187+
coder.encode( Double( self.green ), forKey: "g1" )
188+
coder.encode( Double( self.blue ), forKey: "b1" )
189+
coder.encode( Double( self.alpha ), forKey: "a1" )
187190

188-
coder.encode( self.red2, forKey: "r2" )
189-
coder.encode( self.green2, forKey: "g2" )
190-
coder.encode( self.blue2, forKey: "b2" )
191-
coder.encode( self.alpha2, forKey: "a2" )
191+
coder.encode( Double( self.red2 ), forKey: "r2" )
192+
coder.encode( Double( self.green2 ), forKey: "g2" )
193+
coder.encode( Double( self.blue2 ), forKey: "b2" )
194+
coder.encode( Double( self.alpha2 ), forKey: "a2" )
192195
}
193196

194197
required init?( coder: NSCoder )
@@ -209,6 +212,8 @@ class ColorItem: NSObject, NSCoding
209212
self.alpha2 = CGFloat( coder.decodeDouble( forKey: "a2" ) )
210213

211214
super.init()
212-
215+
self.observe()
216+
self.updateColorFromRGB()
217+
self.updateVariantFromRGB()
213218
}
214219
}

ColorSet/Classes/MainWindowController.swift

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,18 @@ class MainWindowController: NSWindowController, NSTableViewDelegate, NSTableView
2828
{
2929
@objc private dynamic var selectedColor: ColorItem?
3030
@objc private dynamic var hasVariant = false
31+
public var url: URL?
32+
public private( set ) var colors: [ ColorItem ] = []
3133
private var observations: [ NSKeyValueObservation ] = []
3234
@IBOutlet private var arrayController: NSArrayController?
3335

36+
convenience init( colors: [ ColorItem ] )
37+
{
38+
self.init()
39+
40+
self.colors = colors
41+
}
42+
3443
override var windowNibName: NSNib.Name?
3544
{
3645
return NSNib.Name( NSStringFromClass( type( of: self ) ) )
@@ -53,6 +62,11 @@ class MainWindowController: NSWindowController, NSTableViewDelegate, NSTableView
5362
return
5463
}
5564

65+
for color in self.colors
66+
{
67+
controller.addObject( color )
68+
}
69+
5670
colorView.bind( NSBindingName( "color" ), to: self, withKeyPath: "selectedColor.color", options: nil )
5771
variantView.bind( NSBindingName( "color" ), to: self, withKeyPath: "selectedColor.variant", options: nil )
5872

@@ -96,6 +110,78 @@ class MainWindowController: NSWindowController, NSTableViewDelegate, NSTableView
96110
self.observations.append( contentsOf: [ o1, o2 ] )
97111
}
98112

113+
@IBAction public func saveDocument( _ sender: Any? )
114+
{
115+
guard let url = self.url else
116+
{
117+
self.saveDocumentAs( sender )
118+
119+
return
120+
}
121+
122+
self.save( to: url )
123+
}
124+
125+
@IBAction public func saveDocumentAs( _ sender: Any? )
126+
{
127+
guard let window = self.window else
128+
{
129+
return
130+
}
131+
132+
let panel = NSSavePanel()
133+
134+
panel.allowedFileTypes = [ "colorset" ]
135+
panel.canCreateDirectories = true
136+
137+
panel.beginSheetModal( for: window )
138+
{
139+
( r ) in
140+
141+
if( r != .OK )
142+
{
143+
return
144+
}
145+
146+
guard let url = panel.url else
147+
{
148+
return
149+
}
150+
151+
self.save( to: url )
152+
153+
self.url = url
154+
}
155+
}
156+
157+
public func save( to url: URL )
158+
{
159+
guard let colors = self.arrayController?.arrangedObjects as? [ ColorItem ] else
160+
{
161+
return
162+
}
163+
164+
let data = NSKeyedArchiver.archivedData( withRootObject: colors )
165+
166+
do
167+
{
168+
try data.write( to: url )
169+
}
170+
catch let error as NSError
171+
{
172+
let alert = NSAlert( error: error )
173+
174+
guard let window = self.window else
175+
{
176+
alert.runModal()
177+
178+
return
179+
}
180+
181+
alert.beginSheetModal( for: window, completionHandler: nil )
182+
}
183+
}
184+
99185
@IBAction public func newColor( _ sender: Any? )
100186
{
101187
var i = 0
@@ -144,7 +230,10 @@ class MainWindowController: NSWindowController, NSTableViewDelegate, NSTableView
144230

145231
func tableView( _ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int )
146232
{
147-
tableView.editColumn( 0, row: row, with: nil, select: true )
233+
if( self.window?.isVisible ?? false )
234+
{
235+
tableView.editColumn( 0, row: row, with: nil, select: true )
236+
}
148237
}
149238

150239
func control( _ control: NSControl, textShouldBeginEditing fieldEditor: NSText ) -> Bool

ColorSet/ColorSet.entitlements

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
44
<dict>
5-
<key>com.apple.security.app-sandbox</key>
6-
<true/>
7-
<key>com.apple.security.files.user-selected.read-only</key>
8-
<true/>
5+
<key>com.apple.security.app-sandbox</key>
6+
<true/>
7+
<key>com.apple.security.files.user-selected.read-write</key>
8+
<true/>
99
</dict>
1010
</plist>

0 commit comments

Comments
 (0)