ObjectivelyMVC 0.1.0
Object oriented MVC framework for OpenGL, SDL2 and GNU C
Macros | Functions | Variables
Stylesheet.c File Reference
#include <assert.h>
#include <string.h>
#include <Objectively/Hash.h>
#include "ObjectivelyMVC.h"
#include "stylesheet.css.h"

Go to the source code of this file.

Macros

#define _Class   _Stylesheet
 

Functions

Class * _Stylesheet (void)
 
static void dealloc (Object *self)
 
static StylesheetdefaultStylesheet (void)
 
static void destroy (Class *clazz)
 
static int hash (const Object *self)
 
static void initialize (Class *clazz)
 
static StylesheetinitWithCharacters (Stylesheet *self, const char *chars)
 
static StylesheetinitWithData (Stylesheet *self, const Data *data)
 
static StylesheetinitWithResource (Stylesheet *self, const Resource *resource)
 
static StylesheetinitWithResourceName (Stylesheet *self, const char *name)
 
static StylesheetinitWithString (Stylesheet *self, const String *string)
 
static _Bool isEqual (const Object *self, const Object *other)
 
static Order selectorsComparator (const ident a, const ident b)
 Comparator for Selector sorting. More...
 
static ident selectorsReducer (const ident obj, ident accumulator, ident data)
 
static StylesheetstylesheetWithCharacters (const char *chars)
 
static StylesheetstylesheetWithData (const Data *data)
 
static StylesheetstylesheetWithResource (const Resource *resource)
 
static StylesheetstylesheetWithResourceName (const char *name)
 
static StylesheetstylesheetWithString (const String *string)
 

Variables

static Stylesheet_defaultStylesheet
 

Macro Definition Documentation

◆ _Class

#define _Class   _Stylesheet

Definition at line 33 of file Stylesheet.c.

Function Documentation

◆ _Stylesheet()

Class * _Stylesheet ( void  )

Definition at line 277 of file Stylesheet.c.

277 {
278 static Class *clazz;
279 static Once once;
280
281 do_once(&once, {
282 clazz = _initialize(&(const ClassDef) {
283 .name = "Stylesheet",
284 .superclass = _Object(),
285 .instanceSize = sizeof(Stylesheet),
286 .interfaceOffset = offsetof(Stylesheet, interface),
287 .interfaceSize = sizeof(StylesheetInterface),
289 .destroy = destroy,
290 });
291 });
292
293 return clazz;
294}
static void destroy(Class *clazz)
Definition: Stylesheet.c:269
static void initialize(Class *clazz)
Definition: Stylesheet.c:247
Stylesheets are comprised of Selectors and Styles.
Definition: Stylesheet.h:44

◆ dealloc()

static void dealloc ( Object *  self)
static
See also
Object::dealloc(Object *)

Definition at line 40 of file Stylesheet.c.

40 {
41
42 Stylesheet *this = (Stylesheet *) self;
43
44 release(this->selectors);
45 release(this->styles);
46
47 super(Object, self, dealloc);
48}
static void dealloc(Object *self)
Definition: Stylesheet.c:40

◆ defaultStylesheet()

static Stylesheet * defaultStylesheet ( void  )
static

Definition at line 95 of file Stylesheet.c.

95 {
96 static Once once;
97
98 do_once(&once, {
99 _defaultStylesheet = $$(Stylesheet, stylesheetWithCharacters, (char *) stylesheet_css);
100 assert(_defaultStylesheet);
101 });
102
103 return _defaultStylesheet;
104}
static Stylesheet * _defaultStylesheet
Definition: Stylesheet.c:89
Stylesheet * stylesheetWithCharacters(const char *chars)
Instantiates a new Stylesheet with the given CSS definitions.
Definition: Stylesheet.c:206

◆ destroy()

static void destroy ( Class *  clazz)
static
See also
Class::destroy(Class *)

Definition at line 269 of file Stylesheet.c.

269 {
270 release(_defaultStylesheet);
271}

◆ hash()

static int hash ( const Object *  self)
static
See also
Object::hash(const Object *)

Definition at line 53 of file Stylesheet.c.

53 {
54
55 Stylesheet *this = (Stylesheet *) self;
56
57 int hash = HASH_SEED;
58
59 hash = HashForObject(hash, this->selectors);
60 hash = HashForObject(hash, this->styles);
61
62 return hash;
63}
static int hash(const Object *self)
Definition: Stylesheet.c:53

◆ initialize()

static void initialize ( Class *  clazz)
static
See also
Class::initialize(Class *)

Definition at line 247 of file Stylesheet.c.

247 {
248
249 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
250 ((ObjectInterface *) clazz->interface)->hash = hash;
251 ((ObjectInterface *) clazz->interface)->isEqual = isEqual;
252
253 ((StylesheetInterface *) clazz->interface)->defaultStylesheet = defaultStylesheet;
254 ((StylesheetInterface *) clazz->interface)->initWithCharacters = initWithCharacters;
255 ((StylesheetInterface *) clazz->interface)->initWithData = initWithData;
256 ((StylesheetInterface *) clazz->interface)->initWithResource = initWithResource;
257 ((StylesheetInterface *) clazz->interface)->initWithResourceName = initWithResourceName;
258 ((StylesheetInterface *) clazz->interface)->initWithString = initWithString;
259 ((StylesheetInterface *) clazz->interface)->stylesheetWithCharacters = stylesheetWithCharacters;
260 ((StylesheetInterface *) clazz->interface)->stylesheetWithData = stylesheetWithData;
261 ((StylesheetInterface *) clazz->interface)->stylesheetWithResource = stylesheetWithResource;
262 ((StylesheetInterface *) clazz->interface)->stylesheetWithResourceName = stylesheetWithResourceName;
263 ((StylesheetInterface *) clazz->interface)->stylesheetWithString = stylesheetWithString;
264}
static Stylesheet * stylesheetWithData(const Data *data)
Definition: Stylesheet.c:214
static _Bool isEqual(const Object *self, const Object *other)
Definition: Stylesheet.c:68
Font * initWithData(Font *self, Data *data, int size, int index)
Image * initWithResourceName(Image *self, const char *name)
Initializes this Image, loading the Resource by the given name.
Definition: Image.c:142
Image * initWithResource(Image *self, const Resource *resource)
Initializes this Image with the specified Resource.
Definition: Image.c:126
Stylesheet * initWithData(Stylesheet *self, const Data *data)
Initializes this Stylesheet with the CSS definitions in data.
Definition: Stylesheet.c:150
Stylesheet * stylesheetWithString(const String *string)
Instantiates a new Stylesheet with the given CSS String.
Definition: Stylesheet.c:238
Stylesheet * defaultStylesheet(void)
Definition: Stylesheet.c:95
Stylesheet * stylesheetWithResource(const Resource *resource)
Instantiates a new Stylesheet with the given CSS Resource.
Definition: Stylesheet.c:222
Stylesheet * initWithCharacters(Stylesheet *self, const char *chars)
Initializes this Stylesheet with the given CSS definitions.
Definition: Stylesheet.c:124
Stylesheet * initWithString(Stylesheet *self, const String *string)
Initializes this Stylesheet with the CSS definitions in string.
Definition: Stylesheet.c:195
Stylesheet * stylesheetWithResourceName(const char *name)
Instantiates a new Stylesheet with the CSS Resource by the specified name.
Definition: Stylesheet.c:230

◆ initWithCharacters()

static Stylesheet * initWithCharacters ( Stylesheet self,
const char *  chars 
)
static

Definition at line 124 of file Stylesheet.c.

124 {
125
126 self = (Stylesheet *) super(Object, self, init);
127 if (self) {
128
129 self->styles = $$(Style, parse, chars);
130 assert(self->styles);
131
132 MutableArray *selectors = $$(MutableArray, array);
133 assert(selectors);
134
135 $(self->styles, reduce, selectorsReducer, selectors, NULL);
136
137 self->selectors = $((Array *) selectors, sortedArray, selectorsComparator);
138 assert(self->selectors);
139
140 release(selectors);
141 }
142
143 return self;
144}
static ident selectorsReducer(const ident obj, ident accumulator, ident data)
Definition: Stylesheet.c:106
static Order selectorsComparator(const ident a, const ident b)
Comparator for Selector sorting.
Definition: Stylesheet.c:116
CollectionView * init(CollectionView *self, const SDL_Rect *frame)
Initializes this CollectionView with the specified frame and style.
Array * parse(const char *rules)
Parses the null-terminated C string of Selector rules into an Array of Selectors.
Definition: Selector.c:274
The Style type.
Definition: Style.h:43
Array * styles
The Styles, keyed by Selector.
Definition: Stylesheet.h:65
Array * selectors
The Selectors, ordered by specificity.
Definition: Stylesheet.h:60

◆ initWithData()

static Stylesheet * initWithData ( Stylesheet self,
const Data *  data 
)
static

Definition at line 150 of file Stylesheet.c.

150 {
151
152 assert(data);
153
154 String *string = $$(String, stringWithData, data, STRING_ENCODING_UTF8);
155 assert(string);
156
157 self = $(self, initWithString, string);
158
159 release(string);
160 return self;
161}

◆ initWithResource()

static Stylesheet * initWithResource ( Stylesheet self,
const Resource *  resource 
)
static

Definition at line 167 of file Stylesheet.c.

167 {
168
169 assert(resource);
170
171 return $(self, initWithData, resource->data);
172}
Data * data
The raw font data.
Definition: Font.h:79

◆ initWithResourceName()

static Stylesheet * initWithResourceName ( Stylesheet self,
const char *  name 
)
static

Definition at line 178 of file Stylesheet.c.

178 {
179
180 assert(name);
181
182 Resource *resource = $$(Resource, resourceWithName, name);
183 assert(resource);
184
185 self = $(self, initWithResource, resource);
186
187 release(resource);
188 return self;
189}

◆ initWithString()

static Stylesheet * initWithString ( Stylesheet self,
const String *  string 
)
static

Definition at line 195 of file Stylesheet.c.

195 {
196
197 assert(string);
198
199 return $(self, initWithCharacters, string->chars);
200}

◆ isEqual()

static _Bool isEqual ( const Object *  self,
const Object *  other 
)
static
See also
Object::isEqual(const Object *, const Object *)

Definition at line 68 of file Stylesheet.c.

68 {
69
70 if (super(Object, self, isEqual, other)) {
71 return true;
72 }
73
74 if (other && $(other, isKindOfClass, _Stylesheet())) {
75
76 const Stylesheet *this = (Stylesheet *) self;
77 const Stylesheet *that = (Stylesheet *) other;
78
79 if ($((Object *) this->selectors, isEqual, (Object *) that->selectors)) {
80 return $((Object *) this->styles, isEqual, (Object *) that->styles);
81 }
82 }
83
84 return false;
85}
Class * _Stylesheet(void)
The Stylesheet archetype.
Definition: Stylesheet.c:277

◆ selectorsComparator()

static Order selectorsComparator ( const ident  a,
const ident  b 
)
static

Comparator for Selector sorting.

Definition at line 116 of file Stylesheet.c.

116 {
117 return $((Selector *) a, compareTo, (Selector *) b);
118}
Selectors are comprised of one or more SelectorSequences.
Definition: Selector.h:49
Order compareTo(const Selector *self, const Selector *other)
Compares this Selector to other, ordering by specificity.
Definition: Selector.c:149

◆ selectorsReducer()

static ident selectorsReducer ( const ident  obj,
ident  accumulator,
ident  data 
)
static

Definition at line 106 of file Stylesheet.c.

106 {
107
108 $((MutableArray *) accumulator, addObjectsFromArray, ((Style *) obj)->selectors);
109
110 return accumulator;
111}

◆ stylesheetWithCharacters()

static Stylesheet * stylesheetWithCharacters ( const char *  chars)
static

Definition at line 206 of file Stylesheet.c.

206 {
207 return $(alloc(Stylesheet), initWithCharacters, chars);
208}

◆ stylesheetWithData()

static Stylesheet * stylesheetWithData ( const Data *  data)
static

Definition at line 214 of file Stylesheet.c.

214 {
215 return $(alloc(Stylesheet), initWithData, data);
216}

◆ stylesheetWithResource()

static Stylesheet * stylesheetWithResource ( const Resource *  resource)
static

Definition at line 222 of file Stylesheet.c.

222 {
223 return $(alloc(Stylesheet), initWithResource, resource);
224}

◆ stylesheetWithResourceName()

static Stylesheet * stylesheetWithResourceName ( const char *  name)
static

Definition at line 230 of file Stylesheet.c.

230 {
231 return $(alloc(Stylesheet), initWithResourceName, name);
232}

◆ stylesheetWithString()

static Stylesheet * stylesheetWithString ( const String *  string)
static

Definition at line 238 of file Stylesheet.c.

238 {
239 return $(alloc(Stylesheet), initWithString, string);
240}

Variable Documentation

◆ _defaultStylesheet

Stylesheet* _defaultStylesheet
static

Definition at line 89 of file Stylesheet.c.