ObjectivelyMVC
Object oriented MVC framework for SDL3 and GNU C
Loading...
Searching...
No Matches
Label.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 "Label.h"
27
28#define _Class _Label
29
30#pragma mark - Object
31
35static void dealloc(Object *self) {
36
37 Label *this = (Label *) self;
38
39 release(this->text);
40
41 super(Object, self, dealloc);
42}
43
47static String *description(const Object *self) {
48
49 View *this = (View *) self;
50 const SDL_Rect bounds = $(this, bounds);
51
52 String *classNames = $((Object *) this->classNames, description);
53 String *description = str("%s@%p \"%s\" %s [%d, %d, %d, %d]",
54 this->identifier ?: classnameof(self),
55 self,
56 ((Label *) self)->text->text,
57 classNames->chars,
58 bounds.x, bounds.y, bounds.w, bounds.h);
59
60 release(classNames);
61 return description;
62}
63
64#pragma mark - View
65
69static void awakeWithDictionary(View *self, const Dictionary *dictionary) {
70
71 super(View, self, awakeWithDictionary, dictionary);
72
73 Label *this = (Label *) self;
74
75 const Inlet inlets[] = MakeInlets(
76 MakeInlet("text", InletTypeView, &this->text, NULL)
77 );
78
79 $(self, bind, inlets, dictionary);
80
81 self->needsLayout = true;
82}
83
87static View *init(View *self) {
88 return (View *) $((Label *) self, initWithText, NULL, NULL);
89}
90
91#pragma mark - Label
92
97static Label *initWithText(Label *self, const char *text, Font *font) {
98
99 self = (Label *) super(View, self, initWithFrame, NULL);
100 if (self) {
101
102 self->text = $(alloc(Text), initWithText, text, font);
103 assert(self->text);
104
105 $((View *) self, addSubview, (View *) self->text);
106 }
107
108 return self;
109}
110
111#pragma mark - Class lifecycle
112
116static void initialize(Class *clazz) {
117
118 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
119 ((ObjectInterface *) clazz->interface)->description = description;
120
121 ((ViewInterface *) clazz->interface)->awakeWithDictionary = awakeWithDictionary;
122 ((ViewInterface *) clazz->interface)->init = init;
123
124 ((LabelInterface *) clazz->interface)->initWithText = initWithText;
125}
126
131Class *_Label(void) {
132 static Class *clazz;
133 static Once once;
134
135 do_once(&once, {
136 clazz = _initialize(&(const ClassDef) {
137 .name = "Label",
138 .superclass = _View(),
139 .instanceSize = sizeof(Label),
140 .interfaceOffset = offsetof(Label, interface),
141 .interfaceSize = sizeof(LabelInterface),
143 });
144 });
145
146 return clazz;
147}
148
149#undef _Class
static Box * initWithFrame(Box *self, const SDL_Rect *frame)
Definition Box.c:92
static View * init(View *self)
Definition Label.c:87
static void awakeWithDictionary(View *self, const Dictionary *dictionary)
Definition Label.c:69
static Label * initWithText(Label *self, const char *text, Font *font)
Definition Label.c:97
static String * description(const Object *self)
Definition Label.c:47
Class * _Label(void)
Definition Label.c:131
static void dealloc(Object *self)
Definition Label.c:35
static void initialize(Class *clazz)
Definition Label.c:116
The Label type.
static void addSubview(View *self, View *subview)
Definition PageView.c:49
@ InletTypeView
Definition View+JSON.h:139
#define MakeInlets(...)
Creates a null-termianted array of Inlets.
Definition View+JSON.h:221
#define MakeInlet(name, type, dest, data)
Creates an Inlet with the specified parameters.
Definition View+JSON.h:216
Class * _View(void)
Definition View.c:2067
static SDL_Rect bounds(const View *self)
Definition View.c:492
TrueType fonts.
Definition Font.h:63
Inlets enable inbound data binding of View attributes through JSON.
Definition View+JSON.h:155
Labels provide a configurable container for Text.
Definition Label.h:40
Text * text
The Label Text.
Definition Label.h:56
Text rendered with TrueType fonts.
Definition Text.h:69
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
Definition View.h:134
bool needsLayout
If true, this View will layout its subviews before it is drawn.
Definition View.h:222
void awakeWithDictionary(View *, const Dictionary *)
Wakes this View with the specified Dictionary.
Definition Box.c:50