From 7abb2f68a0f62a8ca33a1cde336b2a354fd6df90 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 13 Jun 2021 16:29:16 -0400 Subject: [PATCH] use string instead of url for bitbanger slots. --- Ample/Base.lproj/MediaView.xib | 51 ++++++++++++-- Ample/MediaViewController.m | 124 +++++++++++++++++++++------------ 2 files changed, 126 insertions(+), 49 deletions(-) diff --git a/Ample/Base.lproj/MediaView.xib b/Ample/Base.lproj/MediaView.xib index 2667ee2..9b301a0 100644 --- a/Ample/Base.lproj/MediaView.xib +++ b/Ample/Base.lproj/MediaView.xib @@ -91,11 +91,7 @@ - - - NSIsNotNil - - + @@ -105,6 +101,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + socket.address:port or /path/to/file + + + + + + + + + + diff --git a/Ample/MediaViewController.m b/Ample/MediaViewController.m index c14fcc8..2d70cb7 100644 --- a/Ample/MediaViewController.m +++ b/Ample/MediaViewController.m @@ -9,11 +9,25 @@ #import "MediaViewController.h" #import "TableCellView.h" +enum { + kIndexFloppy525 = 0, + kIndexFloppy35, + kIndexHardDrive, + kIndexCDROM, + kIndexCassette, + kIndexDiskImage, + kIndexBitBanger, +}; + +#define CATEGORY_COUNT 7 +#define SIZEOF(x) (sizeof(x) / sizeof(x[0])) + @protocol MediaNode -(BOOL)isGroupItem; -(BOOL)isExpandable; -(NSInteger) count; +-(NSInteger)category; -(NSString *)viewIdentifier; -(void)prepareView: (NSTableCellView *)view; @@ -28,6 +42,7 @@ @property NSMutableArray *children; // URLs? @property NSString *title; @property NSInteger index; +@property NSInteger category; -(NSInteger)count; -(id)objectAtIndex:(NSInteger)index; @@ -36,9 +51,13 @@ @interface MediaItem : NSObject +@property NSString *string; @property NSURL *url; @property BOOL valid; @property NSInteger index; +@property NSInteger category; + +@property (readonly) BOOL occupied; -(NSInteger)count; -(id)objectAtIndex:(NSInteger)index; @@ -102,6 +121,7 @@ for (unsigned i = count; i < newCount; ++i) { MediaItem *item = [MediaItem new]; [item setIndex: i]; + [item setCategory: _category]; [_children addObject: item]; } @@ -113,7 +133,7 @@ for (unsigned i = newCount; i < count; ++i) { MediaItem *item = [_children lastObject]; - if ([item url]) break; + if ([item occupied]) break; [_children removeLastObject]; } @@ -129,7 +149,7 @@ for (NSInteger i = _validCount; i < count; ++i) { MediaItem *item = [_children lastObject]; - if ([item url]) break; + if ([item occupied]) break; [_children removeLastObject]; [set addIndex: [_children count]]; @@ -182,10 +202,34 @@ -(instancetype)initWithURL: (NSURL *)url { - [self setUrl: url]; + _url = url; return self; } +-(instancetype)initWithString: (NSString *)string { + _string = string; + return self; +} + +-(NSString *)argument { + if (_string) + return _string; + + // todo -- have setURL also update _string? + if (_url) + return [NSString stringWithCString: [_url fileSystemRepresentation] encoding: NSUTF8StringEncoding]; + + return nil; +} + ++(NSSet *)keyPathsForValuesAffectingOccupied { + return [NSSet setWithObjects: @"url", @"string", nil]; +} + +-(BOOL)occupied { + return _url || _string; +} + -(NSInteger) count { return 0; } @@ -203,6 +247,7 @@ } -(NSString *)viewIdentifier { + if (_category == kIndexBitBanger) return @"BBItemView"; return @"ItemView"; } @@ -221,8 +266,7 @@ @end -#define CATEGORY_COUNT 7 -#define SIZEOF(x) (sizeof(x) / sizeof(x[0])) + @interface MediaViewController () { @@ -237,15 +281,6 @@ @implementation MediaViewController -enum { - kIndexFloppy525 = 0, - kIndexFloppy35, - kIndexHardDrive, - kIndexCDROM, - kIndexCassette, - kIndexDiskImage, - kIndexBitBanger, -}; -(void)awakeFromNib { @@ -263,6 +298,9 @@ enum { _data[kIndexDiskImage] = [MediaCategory categoryWithTitle: @"Hard Disk Images"]; // Mac Nubus psuedo image device _data[kIndexBitBanger] = [MediaCategory categoryWithTitle: @"Serial Bit Banger"]; // null_modem + for (unsigned i = 0; i < CATEGORY_COUNT; ++i) + [_data[i] setCategory: i]; + _root = @[]; } @@ -287,12 +325,12 @@ enum { counts[j]++; MediaItem *item = [cat objectAtIndex: i]; - NSURL *url = [item url]; - if (!url) continue; - [args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], counts[j]]]; - NSString *s = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding]; - - [args addObject: s]; + NSString *arg = [item argument]; + + if (arg) { + [args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], counts[j]]]; + [args addObject: arg]; + } } if (j == 0) counts[1] = counts[0]; // 3.5/5.25 } @@ -360,9 +398,9 @@ x = media.name; cat = _data[index]; delta |= [cat setItemCount: x] for (NSInteger i = 0; i < count; ++i) { MediaItem *item = [cat objectAtIndex: i]; - NSURL *url = [item url]; - if (!url) continue; + if (![item occupied]) continue; [item setUrl: nil]; + [item setString: nil]; delta = YES; } if ([cat pruneChildrenWithOutlineView: _outlineView]) delta = YES; @@ -399,8 +437,6 @@ static NSString *kDragType = @"private.ample.media"; } -//- (NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item; - - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { NSString *ident = [item viewIdentifier]; @@ -440,12 +476,6 @@ static NSString *kDragType = @"private.ample.media"; } -- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item { - //return nil; - return [[item cellClass] new]; -} - - #pragma mark - NSOutlineViewDataSource @@ -608,10 +638,9 @@ static NSString *kDragType = @"private.ample.media"; NSInteger row = [_outlineView rowForView: sender]; if (row < 0) return; - //TablePathView *pv = [_outlineView viewAtColumn: 0 row: row makeIfNecessary: NO]; MediaItem *item = [_outlineView itemAtRow: row]; [item setUrl: nil]; - //[[pv pathControl] setURL: nil]; + [item setString: nil]; // if item is invalid, should attempt to remove... if (![item valid]) { @@ -628,11 +657,11 @@ static NSString *kDragType = @"private.ample.media"; } - (IBAction)pathAction:(id)sender { - // need to update the eject button... NSURL *url = [(NSPathControl *)sender URL]; - - if (url) { + NSInteger tag = [sender tag]; + // TODO - don't add to recent disks if this is a bitbanger / midi / printer device. + if (url && tag == 0) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc postNotificationName: @"DiskImageAdded" object: url]; } @@ -640,6 +669,10 @@ static NSString *kDragType = @"private.ample.media"; [self rebuildArgs]; } +-(IBAction)textAction: (id)sender { + [self rebuildArgs]; +} + -(IBAction)resetMedia:(id)sender { [self resetDiskImages]; } @@ -673,7 +706,7 @@ static NSString *kDragType = @"private.ample.media"; NSLog(@"MediaViewController: too many categories."); break; } - MediaCategory *cat = _data[ix++]; + MediaCategory *cat = _data[ix]; NSInteger count = [cat count]; unsigned i = 0; for (NSString *path in a) { @@ -682,12 +715,16 @@ static NSString *kDragType = @"private.ample.media"; break; // } MediaItem *item = [cat objectAtIndex: i++]; - NSURL *url = nil; - if ([path length]) - url = [NSURL fileURLWithPath: path]; + if (![path length]) continue; - [item setUrl: url]; + if (ix == kIndexBitBanger) { + [item setString: path]; + } else { + NSURL *url = [NSURL fileURLWithPath: path]; + [item setUrl: url]; + } } + ++ix; } return YES; @@ -706,10 +743,9 @@ static NSString *kDragType = @"private.ample.media"; for (NSInteger i = 0; i < count; ++i) { MediaItem *item = [cat objectAtIndex: i]; - NSURL *url = [item url]; - NSString *s = @""; - if (url) - s = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding]; + // todo - bitbanger. + NSString *s = [item argument]; + if (!s) s = @""; [array addObject: s]; }