summaryrefslogtreecommitdiff
path: root/app/mac/view-controller.mm
blob: eb81b6b1d3617aed2d8b6086ad67d540db6906bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#import "view-controller.hh"
#import "controller-adapter-keyboard.hh"
#import "controller-adapter-gamepad.hh"
#import "scene.hh"

@implementation ViewController
{
	Scene* _scene;
	NSSize _sceneSize;
	ControllerAdapterKeyboard* _keyboardController;
	NSMutableArray<ControllerAdapterGamepad*>* _gamepadControllers;
}

- (instancetype)initWithFilePath:(NSString*)filePath
{
	self = [super initWithNibName:nil bundle:nil];
	if (self)
	{
		_scene = [[Scene alloc] initWithFilePath:filePath];
		_sceneSize = [_scene size];

		_keyboardController = [[ControllerAdapterKeyboard alloc] init];
		_gamepadControllers = [NSMutableArray array];
		for (GCController* controller in [GCController controllers])
		{
			auto gamepad = [controller extendedGamepad];
			if (gamepad)
			{
				auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad];
				[_gamepadControllers addObject:adapter];
			}
		}
		[self updateControllers];

		[[NSNotificationCenter defaultCenter] addObserver:self
												 selector:@selector(handleControllerConnected:)
													 name:GCControllerDidConnectNotification
												   object:nil];
		[[NSNotificationCenter defaultCenter] addObserver:self
												 selector:@selector(handleControllerDisconnected:)
													 name:GCControllerDidDisconnectNotification
												   object:nil];
	}
	return self;
}

- (void)dealloc
{
	[[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)loadView
{
	auto view = [[SKView alloc] init];
	[view setIgnoresSiblingOrder:YES];
	[view setShowsFPS:YES];
	[view presentScene:_scene];

	[self setView:view];
}

- (void)updateControllers
{
	// Prefer controllers, then fallback to keyboard input.
	if ([_gamepadControllers count] >= 1)
	{
		[_scene setPrimaryController:[_gamepadControllers objectAtIndex:0]];
		if ([_gamepadControllers count] >= 2)
		{
			[_scene setSecondaryController:[_gamepadControllers objectAtIndex:1]];
		}
		else
		{
			[_scene setSecondaryController:_keyboardController];
		}
	}
	else
	{
		[_scene setPrimaryController:_keyboardController];
		[_scene setSecondaryController:nil];
	}
}

- (void)handleControllerConnected:(NSNotification*)notification
{
	auto controller = (GCController*)[notification object];
	auto gamepad = [controller extendedGamepad];
	if (gamepad)
	{
		auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad];
		[_gamepadControllers addObject:adapter];
	}
	[self updateControllers];
}

- (void)handleControllerDisconnected:(NSNotification*)notification
{
	auto controller = (GCController*)[notification object];
	for (auto i = NSUInteger{ [_gamepadControllers count] }; i > 0; --i)
	{
		auto adapter = [_gamepadControllers objectAtIndex:(i - 1)];
		if ([[adapter profile] controller] == controller)
		{
			[_gamepadControllers removeObjectAtIndex:(i - 1)];
		}
	}
	[self updateControllers];
}

- (NSSize)minimumDisplaySize
{
	return _sceneSize;
}

- (NSSize)preferredDisplaySize
{
	return NSMakeSize(_sceneSize.width * 3., _sceneSize.height * 3.);
}

@end