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 @@
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
+
+
+
+ -2147483392
+ {{224, 0}, {16, 17}}
+
+ _NS:18
+
+
+
+ title
+ 101
+ 16
+ 1000
+
+
+ 337641536
+ 2048
+ Text Cell
+
+
+
+
+
+ 3
+ YES
+ YES
+
+
+
+ accessory
+ 364
+ 40
+ 1000
+
+
+ 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