ObjectivelyMVC 0.1.0
Object oriented MVC framework for OpenGL, SDL2 and GNU C
Public Member Functions | Data Fields | Protected Attributes
WindowController Struct Reference

A WindowController manages a ViewController and its descendants within an SDL_Window. More...

#include <WindowController.h>

Inheritance diagram for WindowController:

Public Member Functions

Class * _WindowController (void)
 The WindowController archetype. More...
 
void debug (WindowController *self)
 Debugs the current frame. More...
 
VieweventTarget (const WindowController *self, const SDL_Event *event)
 
ViewfirstResponder (const WindowController *self, const SDL_Event *event)
 
WindowControllerinitWithWindow (WindowController *self, SDL_Window *window)
 Initializes this WindowController with the given window. More...
 
void render (WindowController *self)
 Renders the ViewController's View. More...
 
void respondToEvent (WindowController *self, const SDL_Event *event)
 Responds to the given event. More...
 
void setRenderer (WindowController *self, Renderer *renderer)
 Sets this WindowController's Renderer. More...
 
void setSoundStage (WindowController *self, SoundStage *soundStage)
 Sets this WindowController's SoundStage. More...
 
void setTheme (WindowController *self, Theme *theme)
 Sets this WindowController's Theme. More...
 
void setViewController (WindowController *self, ViewController *viewController)
 Sets this WindowController's ViewController. More...
 
void setWindow (WindowController *self, SDL_Window *window)
 Sets this WindowController's window. More...
 
void toggleDebugger (WindowController *self)
 Toggles the debugger tools. More...
 
WindowControllerwindowController (SDL_Window *window)
 

Data Fields

DebugViewControllerdebugViewController
 The DebugViewController. More...
 
Object object
 The superclass. More...
 
Rendererrenderer
 The Renderer. More...
 
SoundStagesoundStage
 The SoundStage. More...
 
Themetheme
 The Theme. More...
 
ViewControllerviewController
 The ViewController. More...
 
SDL_Window * window
 The window. More...
 

Protected Attributes

WindowControllerInterface * interface
 The interface. More...
 

Detailed Description

A WindowController manages a ViewController and its descendants within an SDL_Window.

Definition at line 46 of file WindowController.h.

Member Function Documentation

◆ _WindowController()

Class * _WindowController ( void  )

The WindowController archetype.

Returns
The WindowController Class.

Definition at line 380 of file WindowController.c.

380 {
381 static Class *clazz;
382 static Once once;
383
384 do_once(&once, {
385 clazz = _initialize(&(const ClassDef) {
386 .name = "WindowController",
387 .superclass = _Object(),
388 .instanceSize = sizeof(WindowController),
389 .interfaceOffset = offsetof(WindowController, interface),
390 .interfaceSize = sizeof(WindowControllerInterface),
392 });
393 });
394
395 return clazz;
396}
static void initialize(Class *clazz)
A WindowController manages a ViewController and its descendants within an SDL_Window.
WindowControllerInterface * interface
The interface.

◆ debug()

void debug ( WindowController self)

Debugs the current frame.

Parameters
selfThe WindowController.

Definition at line 55 of file WindowController.c.

55 {
56
57 if (self->viewController && self->debugViewController) {
58
60
61 SDL_Point point = MakePoint(0, 0);
62 SDL_GetMouseState(&point.x, &point.y);
63
64 View *view = $(self->viewController->view, hitTest, &point);
65 if (view) {
66 $(self->debugViewController, debug, view, self->renderer);
67 }
68
72 }
73}
#define MakePoint(x, y)
Creates an SDL_Point with the given coordinates.
Definition: Types.h:69
static void layoutIfNeeded(View *self)
Definition: View.c:891
static void draw(View *self, Renderer *renderer)
Definition: View.c:572
static View * hitTest(const View *self, const SDL_Point *point)
Definition: View.c:743
static void applyThemeIfNeeded(View *self, const Theme *theme)
Definition: View.c:269
A ViewController manages a View and its descendants.
View * view
The main view.
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
Definition: View.h:133
ViewController * viewController
The ViewController.
Theme * theme
The Theme.
Renderer * renderer
The Renderer.
DebugViewController * debugViewController
The DebugViewController.
void debug(WindowController *self)
Debugs the current frame.

◆ eventTarget()

View * eventTarget ( const WindowController self,
const SDL_Event *  event 
)
Parameters
selfThe WindowController.
eventThe event.
Returns
The View that was targeted by the given event.
See also
View::hitTest(const View *, const SDL_Point *)

Definition at line 79 of file WindowController.c.

79 {
80
81 SDL_Point point;
82
83 if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) {
84 point = MakePoint(event->button.x, event->button.y);
85 } else if (event->type == SDL_MOUSEMOTION) {
86 point = MakePoint(event->motion.x, event->motion.y);
87 } else if (event->type == SDL_MOUSEWHEEL) {
88 SDL_GetMouseState(&point.x, &point.y);
89 } else {
90 return NULL;
91 }
92
93 return $(self->viewController->view, hitTest, &point);
94}

◆ firstResponder()

View * firstResponder ( const WindowController self,
const SDL_Event *  event 
)
Parameters
selfThe WindowController.
eventThe event.
Returns
The first responder for the given event.
See also
MVC_FirstResponder(SDL_Window *)

Definition at line 100 of file WindowController.c.

100 {
101 return $$(View, firstResponder, self->window) ?: $(self, eventTarget, event);
102}
SDL_Window * window
The window.
View * eventTarget(const WindowController *self, const SDL_Event *event)
View * firstResponder(const WindowController *self, const SDL_Event *event)

◆ initWithWindow()

WindowController * initWithWindow ( WindowController self,
SDL_Window *  window 
)

Initializes this WindowController with the given window.

Parameters
selfThe WindowController.
windowThe window.
Returns
The initialized WindowController, or NULL on error.

Definition at line 108 of file WindowController.c.

108 {
109
110 self = (WindowController *) super(Object, self, init);
111 if (self) {
112 $(self, setWindow, window);
113 $(self, setViewController, NULL);
114 $(self, setSoundStage, NULL);
115 $(self, setRenderer, NULL);
116 $(self, setTheme, NULL);
117 }
118
119 return self;
120}
static View * init(View *self)
Definition: Box.c:67
void setWindow(WindowController *self, SDL_Window *window)
Sets this WindowController's window.
void setRenderer(WindowController *self, Renderer *renderer)
Sets this WindowController's Renderer.
void setSoundStage(WindowController *self, SoundStage *soundStage)
Sets this WindowController's SoundStage.
void setViewController(WindowController *self, ViewController *viewController)
Sets this WindowController's ViewController.
void setTheme(WindowController *self, Theme *theme)
Sets this WindowController's Theme.

◆ render()

void render ( WindowController self)

Renders the ViewController's View.

Parameters
selfThe WindowController.
Remarks
Your application should call this method once per frame to render the View hierarchy.

Definition at line 126 of file WindowController.c.

126 {
127
128 assert(self->renderer);
129
130 $(self->renderer, beginFrame);
131
134
135 $(self->viewController->view, draw, self->renderer);
136
137 $(self, debug);
138
139 $(self->renderer, endFrame);
140}
static void beginFrame(Renderer *self)
Definition: Renderer.c:39
static void endFrame(Renderer *self)
Definition: Renderer.c:212

◆ respondToEvent()

void respondToEvent ( WindowController self,
const SDL_Event *  event 
)

Responds to the given event.

Parameters
selfThe WindowController.
eventThe event.
Remarks
Your application should call this method for each event that the View hierarchy is expected to respond to. The event will be dispatched to WindowController::firstResponder, which is the first of:
By default, the event is passed up the View hierarchy by View::respondToEvent. Subclasses of View, such as Control, may stop event propagation if an event has been adequately responded to.

Definition at line 146 of file WindowController.c.

146 {
147
148 if (event->type == SDL_USEREVENT && event->user.type == MVC_NOTIFICATION_EVENT) {
150 .name = event->user.code,
151 .sender = event->user.data1,
152 .data = event->user.data2
153 });
154 } else {
155
156 if (event->type == SDL_WINDOWEVENT) {
157 switch (event->window.event) {
158 case SDL_WINDOWEVENT_EXPOSED:
159 $(self, setWindow, SDL_GL_GetCurrentWindow());
163 break;
164 case SDL_WINDOWEVENT_CLOSE:
167 break;
168 default:
169 break;
170 }
171 }
172
173 View *firstResponder = $(self, firstResponder, event);
174 if (firstResponder) {
175
176 switch (event->type) {
177 case SDL_MOUSEMOTION:
178 break;
179 default: {
180 String *desc = $((Object *) firstResponder, description);
181 MVC_LogMessage(SDL_LOG_PRIORITY_DEBUG, "%d -> %s\n", event->type, desc->chars);
182 release(desc);
183 }
184 }
185
187 }
188
189 if (event->type == SDL_KEYUP) {
190 if (event->key.keysym.sym == SDLK_d) {
191 if (event->key.keysym.mod & KMOD_CTRL) {
192 $(self, toggleDebugger);
193 }
194 }
195 }
196 }
197}
static void renderDeviceDidReset(Font *self)
Definition: Font.c:247
static void updateBindings(View *self)
static void renderDeviceWillReset(View *self)
Definition: ImageView.c:121
static String * description(const Object *self)
Definition: Label.c:47
#define MVC_LogMessage(priority, fmt,...)
Definition: Log.h:40
Uint32 MVC_NOTIFICATION_EVENT
Definition: Notification.c:30
static void handleNotification(ViewController *self, const Notification *notification)
The Notification type.
Definition: Notification.h:34
void toggleDebugger(WindowController *self)
Toggles the debugger tools.
void respondToEvent(WindowController *self, const SDL_Event *event)
Responds to the given event.

◆ setRenderer()

void setRenderer ( WindowController self,
Renderer renderer 
)

Sets this WindowController's Renderer.

Parameters
selfThe WindowController.
rendererThe Renderer.

Definition at line 203 of file WindowController.c.

203 {
204
205 if (self->renderer != renderer || self->renderer == NULL) {
206
207 release(self->renderer);
208
209 if (renderer) {
210 self->renderer = retain(renderer);
211 } else {
212 self->renderer = $(alloc(Renderer), init);
213 }
214
216 }
217}
The Renderer is responsible for rasterizing the View hierarchy of a WindowController.
Definition: Renderer.h:50

◆ setSoundStage()

void setSoundStage ( WindowController self,
SoundStage soundStage 
)

Sets this WindowController's SoundStage.

Parameters
selfThe WindowController.
soundStageThe SoundStage.

Definition at line 223 of file WindowController.c.

223 {
224
225 if (self->soundStage != soundStage || self->soundStage == NULL) {
226
227 release(self->soundStage);
228
229 if (soundStage) {
230 self->soundStage = retain(soundStage);
231 } else {
232 self->soundStage = $(alloc(SoundStage), init);
233 }
234 }
235}
The SoundStage type.
Definition: SoundStage.h:40
SoundStage * soundStage
The SoundStage.

◆ setTheme()

void setTheme ( WindowController self,
Theme theme 
)

Sets this WindowController's Theme.

Parameters
selfThe WindowController.
themeThe Theme.

Definition at line 241 of file WindowController.c.

241 {
242
243 if (self->theme != theme || self->theme == NULL) {
244
245 release(self->theme);
246
247 if (theme) {
248 self->theme = retain(theme);
249 } else {
250 self->theme = $(alloc(Theme), init);
251 }
252 }
253
255}
static void invalidateStyle(View *self)
Definition: View.c:822
The Theme type.
Definition: Theme.h:51

◆ setViewController()

void setViewController ( WindowController self,
ViewController viewController 
)

Sets this WindowController's ViewController.

Parameters
selfThe WindowController.
viewControllerThe ViewController.

Definition at line 261 of file WindowController.c.

261 {
262
263 if (self->viewController != viewController || self->viewController == NULL) {
264
265 if (self->viewController) {
267 $(self->viewController->view, moveToWindow, NULL);
269 }
270
271 release(self->viewController);
272
273 if (viewController) {
274 self->viewController = retain(viewController);
275 } else {
276 self->viewController = $(alloc(ViewController), init);
277 }
278
280
282 $(self->viewController->view, moveToWindow, self->window);
284 }
285}
static void moveToWindow(View *self, SDL_Window *window)
Definition: View.c:1073
static void viewWillAppear(ViewController *self)
static void viewWillDisappear(ViewController *self)
static void loadViewIfNeeded(ViewController *self)
static void viewDidAppear(ViewController *self)
static void viewDidDisappear(ViewController *self)

◆ setWindow()

void setWindow ( WindowController self,
SDL_Window *  window 
)

Sets this WindowController's window.

Parameters
selfThe WindowController.
windowThe window.

Definition at line 291 of file WindowController.c.

291 {
292
293 self->window = window;
294 assert(self->window);
295
296 const Uint32 flags = SDL_GetWindowFlags(self->window);
297 assert(flags & SDL_WINDOW_OPENGL);
298
299 SDL_SetWindowData(self->window, "windowController", self);
300 assert(SDL_GetWindowData(self->window, "windowController") == self);
301
302 if (self->viewController) {
303 $(self->viewController->view, moveToWindow, self->window);
304 }
305
306 if (self->debugViewController) {
308 }
309}
ViewController viewController
The superclass.

◆ toggleDebugger()

void toggleDebugger ( WindowController self)

Toggles the debugger tools.

Parameters
selfThe WindowViewController.

Definition at line 315 of file WindowController.c.

315 {
316
317 if (self->debugViewController == NULL) {
318
320 assert(self->debugViewController);
321
323
328
329 if (self->viewController) {
330 $(self->viewController->view, addClassName, "debug");
331 }
332 } else {
333 self->debugViewController = release(self->debugViewController);
334
335 if (self->viewController) {
336 $(self->viewController->view, removeClassName, "debug");
337 }
338 }
339}
static void loadView(ViewController *self)
static void removeClassName(View *self, const char *className)
Definition: View.c:1158
static void addClassName(View *self, const char *className)
Definition: View.c:120
The DebugViewController type.

◆ windowController()

WindowController * windowController ( SDL_Window *  window)
Parameters
windowThe window.
Returns
The WindowController bound to the given window.

Definition at line 345 of file WindowController.c.

345 {
346
347 assert(window);
348
349 return SDL_GetWindowData(window, "windowController");
350}

Field Documentation

◆ debugViewController

DebugViewController* WindowController::debugViewController

The DebugViewController.

Definition at line 62 of file WindowController.h.

◆ interface

WindowControllerInterface* WindowController::interface
protected

The interface.

Definition at line 57 of file WindowController.h.

◆ object

Object WindowController::object

The superclass.

Definition at line 51 of file WindowController.h.

◆ renderer

Renderer* WindowController::renderer

The Renderer.

Definition at line 67 of file WindowController.h.

◆ soundStage

SoundStage* WindowController::soundStage

The SoundStage.

Definition at line 72 of file WindowController.h.

◆ theme

Theme* WindowController::theme

The Theme.

Definition at line 77 of file WindowController.h.

◆ viewController

ViewController* WindowController::viewController

The ViewController.

Definition at line 82 of file WindowController.h.

◆ window

SDL_Window* WindowController::window

The window.

Definition at line 87 of file WindowController.h.


The documentation for this struct was generated from the following files: