@@ -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
0 commit comments