From 357903134b06a1e3d8dae097573319b2b4c99573 Mon Sep 17 00:00:00 2001 From: meancoot Date: Fri, 12 Jul 2013 19:44:25 -0400 Subject: [PATCH] (OSX) Use NSOutlineView instead of NSMatrix for settings --- apple/OSX/Settings.xib | 913 ++++++++++++++++++++++++++++++----------- apple/OSX/settings.m | 232 ++++++----- 2 files changed, 814 insertions(+), 331 deletions(-) diff --git a/apple/OSX/Settings.xib b/apple/OSX/Settings.xib index 98f95c9a53..1d5c744237 100644 --- a/apple/OSX/Settings.xib +++ b/apple/OSX/Settings.xib @@ -15,10 +15,12 @@ NSButton NSButtonCell NSCustomObject + NSOutlineView NSScrollView NSScroller NSTableCellView NSTableColumn + NSTableHeaderView NSTableView NSTextField NSTextFieldCell @@ -84,6 +86,7 @@ + title 145 40 1000 @@ -91,7 +94,7 @@ 75497536 2048 - + LucidaGrande 11 3100 @@ -100,7 +103,7 @@ 3 MC4zMzMzMzI5ODU2AA - + 6 System headerTextColor @@ -138,17 +141,21 @@ 3 YES - YES + + key + YES + compare: + 3 2 - + 3 MQA - + 6 System gridColor @@ -158,7 +165,7 @@ 17 - 373293056 + 104857600 4 @@ -197,7 +204,7 @@ {{1, 119}, {223, 15}} - + _NS:60 NO 1 @@ -220,84 +227,10 @@ 4 1 - - - 268 - - - - 2304 - - - - 274 - {471, 514} - - - - _NS:13 - - - {{1, 1}, {471, 514}} - - - - _NS:11 - - - 6 - System - controlColor - - - 4 - - - - 256 - {{456, 1}, {16, 514}} - - - - _NS:15 - NO - - _doScroller: - 1 - 0.96363627910614014 - - - - 256 - {{1, 499}, {471, 16}} - - - - _NS:26 - NO - 1 - - _doScroller: - 0.50602412223815918 - - - {{178, 61}, {473, 516}} - - - - _NS:9 - 133170 - - - - 0.25 - 4 - 1 - 268 - {{575, 13}, {82, 32}} + {{582, 13}, {75, 32}} _NS:9 @@ -318,6 +251,184 @@ NO + + + 268 + + + + 2304 + + + + 256 + + {471, 498} + + + + _NS:13 + YES + NO + YES + + + 256 + {471, 17} + + + + + + + + -2147483392 + {{224, 0}, {16, 17}} + + _NS:18 + + + + title + 101 + 16 + 1000 + + 75497536 + 2048 + + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 337641536 + 2048 + Text Cell + + + + + + 3 + YES + YES + + + + accessory + 364 + 40 + 1000 + + 75497536 + 2048 + + + + + + + 337641536 + 2048 + Text Cell + + + + + + 3 + YES + YES + + + + 3 + 2 + + + 17 + 306216960 + + + 1 + 15 + 0 + YES + 0 + 1 + NO + + + {{1, 17}, {471, 498}} + + + + _NS:11 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + + _NS:58 + NO + + _doScroller: + 0.99799599198396793 + + + + -2147483392 + {{1, 499}, {471, 16}} + + + + _NS:60 + NO + 1 + + _doScroller: + 0.82055749128919864 + + + + 2304 + + + + {{1, 0}, {471, 17}} + + + + + + 4 + + + {{178, 61}, {473, 516}} + + + + _NS:9 + 133682 + + + + + QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 + {671, 597} @@ -366,14 +477,6 @@ 104 - - - _scroller - - - - 114 - close: @@ -382,6 +485,14 @@ 122 + + + _outline + + + + 180 + textField @@ -403,7 +514,12 @@ Table View Cell - + + 6 + System + controlColor + + NO @@ -416,6 +532,90 @@ 108 + + + dataSource + + + + 181 + + + + delegate + + + + 182 + + + + textField + + + 274 + + + + 266 + {101, 17} + + + {250, 750} + YES + + 67108928 + 272631808 + Table View Cell + + + + + + NO + + + {{1, 1}, {101, 17}} + + + + + 168 + + + + textField + + + 274 + + + + 266 + {364, 17} + + + {250, 750} + YES + + 67108928 + 272631808 + Table View Cell + + + + + + NO + + + {{105, 1}, {364, 17}} + + + + + 172 + @@ -455,20 +655,23 @@ 2 - - - 3 + + + + + + 6 0 - - 4 + + 6 1 20 1000 - 6 - 24 + 8 + 29 3 @@ -487,24 +690,24 @@ 29 3 - - - 6 + + + 3 0 - - 6 + + 4 1 20 1000 - 8 - 29 + 6 + 24 3 - + 4 0 @@ -519,11 +722,11 @@ 24 2 - + 6 0 - + 6 1 @@ -535,24 +738,8 @@ 29 3 - - - 3 - 0 - - 3 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - + 5 0 @@ -567,8 +754,24 @@ 9 3 + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + - + 5 0 @@ -583,7 +786,7 @@ 24 3 - + 3 0 @@ -615,9 +818,6 @@ 29 3 - - - @@ -663,61 +863,6 @@ - - 61 - - - - - 63 - - - - - 72 - - - - - - - - - - 73 - - - - - 74 - - - - - 75 - - - - - 80 - - - - - 83 - - - - - 85 - - - - - 87 - - - 99 @@ -792,21 +937,6 @@ - - 109 - - - - - 110 - - - - - 111 - - - 116 @@ -821,25 +951,280 @@ - 118 - + 148 + + + + + + + - 119 - + 149 + + + + + + + + + 150 + + + + + 152 + + + + + 153 + + + + + + + + + 154 + + + + + + + + + 155 + + + + + 156 + + + + + 165 + + + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + 5 + 0 + + 5 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + + + 166 + + + + + + + + 167 + + + + + 169 + + + + + + 6 + 0 + + 6 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + + + 170 + + + + + + + + 171 + + + + + 179 + + + + + 195 + - 120 + 196 + + + + + 197 + + + + + 198 + + + + + 199 - 121 + 200 + + + + + 201 + + + + + 202 + + + + + 203 + + 204 + + + + + 205 + + + + + 206 + + + + + 207 + + + + + 208 + + + + + 209 + + + + + 210 + + + + + 211 + + + + + 212 + + + @@ -858,29 +1243,76 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + - + - - + + - - + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -893,24 +1325,13 @@ com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - 122 + 212 @@ -925,6 +1346,36 @@ RASettingsDelegate NSObject + + close: + id + + + close: + + close: + id + + + + NSOutlineView + NSTableView + NSWindow + + + + _outline + NSOutlineView + + + _table + NSTableView + + + _window + NSWindow + + IBProjectSource ./Classes/RASettingsDelegate.h diff --git a/apple/OSX/settings.m b/apple/OSX/settings.m index e2f84fe837..4bebfb07ec 100644 --- a/apple/OSX/settings.m +++ b/apple/OSX/settings.m @@ -17,111 +17,64 @@ #import "../RetroArch/RetroArch_Apple.h" #include "../RetroArch/setting_data.h" -@interface RASettingsDelegate : NSObject +@interface RASettingsDelegate : NSObject @end @implementation RASettingsDelegate { NSWindow IBOutlet* _window; - NSScrollView IBOutlet* _scroller; NSTableView IBOutlet* _table; + NSOutlineView IBOutlet* _outline; - NSMutableArray* _groups; + NSMutableArray* _settings; + NSMutableArray* _currentGroup; } - (void)awakeFromNib { - _groups = [NSMutableArray array]; - - NSMatrix* mtx = nil; - NSMutableArray* subGroups = nil; - + NSMutableArray* thisGroup = nil; + NSMutableArray* thisSubGroup = nil; + _settings = [NSMutableArray array]; + for (int i = 0; setting_data[i].type; i ++) { - const rarch_setting_t* s = &setting_data[i]; - - if (s->type == ST_GROUP) + switch (setting_data[i].type) { - subGroups = [NSMutableArray array]; - objc_setAssociatedObject(subGroups, "NAME", [NSString stringWithFormat:@"%s", s->name], OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - else if(s->type == ST_END_GROUP) - { - NSView* view = [NSView new]; - uint32_t height = 0; - - for (NSMatrix* mtx in subGroups) - height += mtx.frame.size.height + 20; - - view.frameSize = CGSizeMake(_scroller.frame.size.width, height); - - for (NSMatrix* mtx in subGroups) + case ST_GROUP: { - mtx.frameOrigin = CGPointMake(0, height - mtx.frame.size.height); - height -= mtx.frame.size.height + 20; - - NSBox* box = [[NSBox alloc] initWithFrame:mtx.frame]; - box.title = objc_getAssociatedObject(mtx, "NAME"); - box.contentView = mtx; - [view addSubview:box]; - } - - [_groups addObject:view]; - objc_setAssociatedObject(view, "NAME", objc_getAssociatedObject(subGroups, "NAME"), OBJC_ASSOCIATION_RETAIN_NONATOMIC); - subGroups = nil; - } - else if (s->type == ST_SUB_GROUP) - { - mtx = [[NSMatrix alloc] initWithFrame:CGRectMake(0, 0, 480, 480) - mode:NSHighlightModeMatrix - prototype:nil - numberOfRows:0 - numberOfColumns:2]; - mtx.cellSize = NSMakeSize(240, 20); - objc_setAssociatedObject(mtx, "NAME", [NSString stringWithFormat:@"%s", s->name], OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - else if (s->type == ST_END_SUB_GROUP) - { - [mtx sizeToCells]; - [subGroups addObject:mtx]; - mtx = nil; - } - else - { - NSTextFieldCell* label = [[NSTextFieldCell alloc] initTextCell:[NSString stringWithFormat:@"%s", s->short_description]]; - id accessory = nil; - - switch (s->type) - { - case ST_BOOL: - { - accessory = [NSButtonCell new]; - - [accessory setButtonType:NSSwitchButton]; - [accessory setState:*(bool*)s->value]; - [accessory setTitle:@""]; - break; - } - - case ST_STRING: - case ST_PATH: - case ST_INT: - case ST_FLOAT: - { - accessory = [NSTextFieldCell new]; - - if (s->type == ST_INT) [accessory setIntValue:*(int32_t*)s->value]; - else if (s->type == ST_FLOAT) [accessory setFloatValue:*(float*)s->value]; - else [accessory setTitle:[NSString stringWithFormat:@"%s", (const char*)s->value]]; - break; - } - - default: abort(); + thisGroup = [NSMutableArray array]; + objc_setAssociatedObject(thisGroup, "NAME", [NSString stringWithFormat:@"%s", setting_data[i].name], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + break; } - [mtx addRowWithCells:[NSArray arrayWithObjects:label, accessory, nil]]; + case ST_END_GROUP: + { + [_settings addObject:thisGroup]; + thisGroup = nil; + break; + } + + case ST_SUB_GROUP: + { + thisSubGroup = [NSMutableArray array]; + objc_setAssociatedObject(thisSubGroup, "NAME", [NSString stringWithFormat:@"%s", setting_data[i].name], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + break; + } + + case ST_END_SUB_GROUP: + { + [thisGroup addObject:thisSubGroup]; + thisSubGroup = nil; + break; + } + + default: + { + [thisSubGroup addObject:[NSNumber numberWithInt:i]]; + break; + } } - } [NSApplication.sharedApplication beginSheet:_window modalForWindow:RetroArch_OSX.get->window modalDelegate:nil didEndSelector:nil contextInfo:nil]; @@ -135,29 +88,108 @@ [_window orderOut:nil]; } + +#pragma mark View Builders +- (NSView*)labelAccessoryFor:(NSString*)text onTable:(NSTableView*)table +{ + NSTextField* result = [table makeViewWithIdentifier:@"label" owner:self]; + if (result == nil) + { + result = [NSTextField new]; + result.bordered = NO; + result.drawsBackground = NO; + result.identifier = @"label"; + } + + result.stringValue = text; + return result; +} + +- (NSView*)booleanAccessoryFor:(const rarch_setting_t*)setting onTable:(NSTableView*)table +{ + NSButton* result = [table makeViewWithIdentifier:@"boolean" owner:self]; + + if (!result) + { + result = [NSButton new]; + result.buttonType = NSSwitchButton; + result.title = @""; + } + + result.state = *(bool*)setting->value; + return result; +} + +#pragma mark Section Table - (NSInteger)numberOfRowsInTableView:(NSTableView*)view { - return _groups.count; + return _settings.count; } - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - NSTextField* result = [tableView makeViewWithIdentifier:@"category" owner:self]; - if (result == nil) - { - result = [[NSTextField alloc] initWithFrame:CGRectMake(0, 0, 100, 10)]; - result.bordered = NO; - result.drawsBackground = NO; - result.identifier = @"category"; - } - - result.stringValue = objc_getAssociatedObject(_groups[row], "NAME"); - return result; + return [self labelAccessoryFor:objc_getAssociatedObject(_settings[row], "NAME") onTable:tableView]; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { - _scroller.documentView = _groups[_table.selectedRow]; + _currentGroup = _settings[_table.selectedRow]; + [_outline reloadData]; +} + +#pragma mark Setting Outline +- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item +{ + return (item == nil) ? _currentGroup.count : [item count]; +} + +- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item +{ + return (item == nil) ? _currentGroup[index] : [item objectAtIndex:index]; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item +{ + return [item isKindOfClass:[NSArray class]]; +} + +- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item +{ + if ([item isKindOfClass:[NSArray class]]) + { + if ([tableColumn.identifier isEqualToString:@"title"]) + return [self labelAccessoryFor:objc_getAssociatedObject(item, "NAME") onTable:outlineView]; + else + return [self labelAccessoryFor:[NSString stringWithFormat:@"%d items", (int)[item count]] onTable:outlineView]; + } + else + { + const rarch_setting_t* setting = &setting_data[[item intValue]]; + + if ([tableColumn.identifier isEqualToString:@"title"]) + return [self labelAccessoryFor:[NSString stringWithFormat:@"%s", setting->short_description] onTable:outlineView]; // < The outlineView will fill the value + else if([tableColumn.identifier isEqualToString:@"accessory"]) + { + switch (setting->type) + { + case ST_BOOL: return [self booleanAccessoryFor:setting onTable:outlineView]; + + case ST_PATH: + case ST_STRING: + return [self labelAccessoryFor:[NSString stringWithFormat:@"%s", (const char*)setting->value] onTable:outlineView]; + + case ST_INT: + return [self labelAccessoryFor:[NSString stringWithFormat:@"%d", *(int*)setting->value] onTable:outlineView]; + + case ST_FLOAT: + return [self labelAccessoryFor:[NSString stringWithFormat:@"%f", *(float*)setting->value] onTable:outlineView]; + + default: abort(); + } + } + } + + return nil; } @end