ObjectivelyMVC
Object oriented MVC framework for SDL3 and GNU C
Loading...
Searching...
No Matches
ViewController.c
Go to the documentation of this file.
1/*
2 * ObjectivelyMVC: Object oriented MVC framework for SDL3 and C.
3 * Copyright (C) 2014 Jay Dolan <jay@jaydolan.com>
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 *
18 * 2. Altered source versions must be plainly marked as such, and must not be
19 * misrepresented as being the original software.
20 *
21 * 3. This notice may not be removed or altered from any source distribution.
22 */
23
24#include <assert.h>
25
26#include "ViewController.h"
27
28#define _Class _ViewController
29
30#pragma mark - Object
31
35static void dealloc(Object *self) {
36
37 ViewController *this = (ViewController *) self;
38
39 release(this->childViewControllers);
40 release(this->view);
41
42 super(Object, self, dealloc);
43}
44
45#pragma mark - ViewController
46
51static void addChildViewController(ViewController *self, ViewController *childViewController) {
52
53 assert(childViewController);
54
55 ViewController *that = retain(childViewController);
56
57 $(childViewController, removeFromParentViewController);
58
59 $(self->childViewControllers, addObject, childViewController);
60 childViewController->parentViewController = self;
61
62 $(self, loadViewIfNeeded);
63 $(childViewController, loadViewIfNeeded);
64
65 if (self->view->window) {
66 $(childViewController, viewWillAppear);
67 }
68
69 $(self->view, addSubview, childViewController->view);
70 $(childViewController->view, updateBindings);
71
72 if (self->view->window) {
73 $(childViewController, viewDidAppear);
74 }
75
76 release(that);
77}
78
84
85 self = (ViewController *) super(Object, self, init);
86 if (self) {
87 self->childViewControllers = $$(Array, arrayWithCapacity, 0);
88 assert(self->childViewControllers);
89 }
90
91 return self;
92}
93
98static void loadView(ViewController *self) {
99
100 View *view = $(alloc(View), initWithFrame, NULL);
101 assert(view);
102
104
105 $(self, setView, view);
106 release(view);
107}
108
114
115 if (self->view == NULL) {
116 $(self, loadView);
117 }
118
119 assert(self->view);
120 assert(self->view->viewController == self);
121}
122
127static void moveToParentViewController(ViewController *self, ViewController *parentViewController) {
128
129 ViewController *this = retain(self);
130
132
133 if (parentViewController) {
134 $(parentViewController, addChildViewController, self);
135 }
136
137 release(this);
138}
139
144static void removeChildViewController(ViewController *self, ViewController *childViewController) {
145
146 assert(childViewController);
147 assert(childViewController->parentViewController == self);
148
149 ViewController *that = retain(childViewController);
150
151 $(self->childViewControllers, removeObject, childViewController);
152 childViewController->parentViewController = NULL;
153
154 $(childViewController, viewWillDisappear);
155 $(childViewController->view, removeFromSuperview);
156 $(childViewController, viewDidDisappear);
157
158 release(that);
159}
160
166
167 if (self->parentViewController) {
169 }
170}
171
175static void respondToEvent_enumerate(const Array *array, ident obj, ident data) {
176 $((ViewController *) obj, respondToEvent, (const SDL_Event *) data);
177}
178
183static void respondToEvent(ViewController *self, const SDL_Event *event) {
184 $((Array *) self->childViewControllers, enumerate, respondToEvent_enumerate, (ident) event);
185}
186
190static void renderDeviceDidReset_enumerate(const Array *array, ident obj, ident data) {
192}
193
199
200 $(self->view, renderDeviceDidReset);
201
203}
204
208static void renderDeviceWillReset_enumerate(const Array *array, ident obj, ident data) {
210}
211
217
218 $(self->view, renderDeviceWillReset);
219
221}
222
227static void setView(ViewController *self, View *view) {
228
229 if (view != self->view) {
230
231 if (self->view) {
232 self->view->viewController = NULL;
233 release(self->view);
234 }
235
236 if (view) {
237 self->view = retain(view);
238 self->view->viewController = self;
239 } else {
240 self->view = NULL;
241 }
242 }
243}
244
248static void viewDidAppear_enumerate(const Array *array, ident obj, ident data) {
249 $((ViewController *) obj, viewDidAppear);
250}
251
256static void viewDidAppear(ViewController *self) {
257 $((Array *) self->childViewControllers, enumerate, viewDidAppear_enumerate, NULL);
258}
259
263static void viewDidDisappear_enumerate(const Array *array, ident obj, ident data) {
265}
266
273}
274
278static void viewWillAppear_enumerate(const Array *array, ident obj, ident data) {
279 $((ViewController *) obj, viewWillAppear);
280}
281
286static void viewWillAppear(ViewController *self) {
288}
289
293static void viewWillDisappear_enumerate(const Array *array, ident obj, ident data) {
295}
296
303}
304
305#pragma mark - Class lifecycle
306
310static void initialize(Class *clazz) {
311
312 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
313
314 ((ViewControllerInterface *) clazz->interface)->addChildViewController = addChildViewController;
315 ((ViewControllerInterface *) clazz->interface)->init = init;
316 ((ViewControllerInterface *) clazz->interface)->loadView = loadView;
317 ((ViewControllerInterface *) clazz->interface)->loadViewIfNeeded = loadViewIfNeeded;
318 ((ViewControllerInterface *) clazz->interface)->moveToParentViewController = moveToParentViewController;
319 ((ViewControllerInterface *) clazz->interface)->removeChildViewController = removeChildViewController;
320 ((ViewControllerInterface *) clazz->interface)->removeFromParentViewController = removeFromParentViewController;
321 ((ViewControllerInterface *) clazz->interface)->respondToEvent = respondToEvent;
322 ((ViewControllerInterface *) clazz->interface)->renderDeviceDidReset = renderDeviceDidReset;
323 ((ViewControllerInterface *) clazz->interface)->renderDeviceWillReset = renderDeviceWillReset;
324 ((ViewControllerInterface *) clazz->interface)->setView = setView;
325 ((ViewControllerInterface *) clazz->interface)->viewDidAppear = viewDidAppear;
326 ((ViewControllerInterface *) clazz->interface)->viewDidDisappear = viewDidDisappear;
327 ((ViewControllerInterface *) clazz->interface)->viewWillAppear = viewWillAppear;
328 ((ViewControllerInterface *) clazz->interface)->viewWillDisappear = viewWillDisappear;
329}
330
335Class *_ViewController(void) {
336 static Class *clazz;
337 static Once once;
338
339 do_once(&once, {
340 clazz = _initialize(&(const ClassDef) {
341 .name = "ViewController",
342 .superclass = _Object(),
343 .instanceSize = sizeof(ViewController),
344 .interfaceOffset = offsetof(ViewController, interface),
345 .interfaceSize = sizeof(ViewControllerInterface),
347 });
348 });
349
350 return clazz;
351}
352
353#undef _Class
static Box * initWithFrame(Box *self, const SDL_Rect *frame)
Definition Box.c:92
static void updateBindings(View *self)
static void addSubview(View *self, View *subview)
Definition PageView.c:49
static void removeFromSuperview(View *self)
Definition View.c:1361
static void enumerate(View *self, ViewEnumerator enumerator, ident data)
Definition View.c:749
@ ViewAutoresizingFill
Definition View.h:90
static void viewWillAppear(ViewController *self)
static void addChildViewController(ViewController *self, ViewController *childViewController)
Class * _ViewController(void)
static void loadView(ViewController *self)
static void viewWillDisappear(ViewController *self)
static void viewDidAppear_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for viewDidAppear recursion.
static void loadViewIfNeeded(ViewController *self)
static void moveToParentViewController(ViewController *self, ViewController *parentViewController)
static void viewWillAppear_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for viewWillAppear recursion.
static void renderDeviceWillReset(ViewController *self)
static void viewDidAppear(ViewController *self)
static void removeChildViewController(ViewController *self, ViewController *childViewController)
static void renderDeviceWillReset_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for renderDeviceWillReset recursion.
static void respondToEvent(ViewController *self, const SDL_Event *event)
static void renderDeviceDidReset(ViewController *self)
static ViewController * init(ViewController *self)
static void removeFromParentViewController(ViewController *self)
static void setView(ViewController *self, View *view)
static void dealloc(Object *self)
static void respondToEvent_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for respondToEvent recursion.
static void initialize(Class *clazz)
static void renderDeviceDidReset_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for renderDeviceDidReset recursion.
static void viewDidDisappear(ViewController *self)
static void viewDidDisappear_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for viewDidDisappear recursion.
static void viewWillDisappear_enumerate(const Array *array, ident obj, ident data)
ArrayEnumerator for viewWillDisappear recursion.
A ViewController manages a View and its descendants.
A ViewController manages a View and its descendants.
Array * childViewControllers
The child view controllers.
View * view
The main view.
void loadView(ViewController *self)
Loads this ViewController's View.
ViewController * parentViewController
The parent view controller.
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
Definition View.h:134
ViewController * viewController
The ViewController.
Definition View.h:265
SDL_Window * window
The window.
Definition View.h:277
int autoresizingMask
The ViewAutoresizing bitmask.
Definition View.h:155