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
|
#include <dirent.h>
#include <raylib.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "scenes.h"
#include "../ui_elements/UI.h"
#include "../resources/resources.h"
#include "../utils/arena.h"
static const size_t ARENA_SIZE = 1024 * 64;
typedef struct {
Arena arena;
char *DirPath;
char *Name;
CollectionElement *collection;
size_t count;
} CollectionSceneData;
CollectionSceneData *getData(void *self) {
return ((Scene *)self)->data;
}
void DrawCollectionName(char *name) {
Vector2 width = MeasureTextEx(*GetMainFont(), name, 50, 1);
int screen_width = GetScreenWidth();
Vector2 pos = { .y = 20, .x = (screen_width - width.x) / 2, };
DrawTextEx(*GetMainFont(), name, pos, HEADER_FONT_SIZE, 1, COLORSCHEME_BROWN);
}
// Does not allocate the memory
char *getCollectionName(char *path) {
char *outp = path;
size_t len = strlen(path);
for (size_t i = 0; i < len; ++i) {
if ((path[i] == '/' || path[i] == '\\') && path[i+1] != 0x0) {
outp = path + i + 1;
}
}
return outp;
}
bool updateCollectionScene(void *self) {
return true;
}
bool drawCollectionScene(void *self) {
CollectionSceneData *data = getData(self);
DrawBackground();
DrawCollectionName(data->Name);
DrawPageView(GetScreenHeight() - 60, 5, 2);
for (size_t i = 0; i < data->collection->childCount; ++i) {
DrawCollectionElement(&data->collection->children[i], (Rectangle) {
.x = 10 + 210 * i,
.y = 80,
.width = 200,
.height = 450,
});
}
return true;
}
void deinitCollectionScene(void *self) {
TraceLog(LOG_INFO, "Deleting a collection scene");
CollectionSceneData *data = getData(self);
if (data != NULL) {
free(data->arena.mem);
free(data);
}
free((Scene *)self);
}
Scene *CreatePuzzleCollectionScene(char *path, CollectionElement *el) {
TraceLog(LOG_INFO, "Creating a collection scene");
Scene *outp = malloc(sizeof(Scene));
if (outp == NULL) return NULL;
outp->Update = updateCollectionScene;
outp->Draw = drawCollectionScene;
outp->Deint = deinitCollectionScene;
outp->IsTransparent = false;
CollectionSceneData *data = malloc(sizeof(CollectionSceneData));
if (data == NULL) {
free(outp);
return NULL;
}
data->arena = (Arena){0};
ArenaInit(&data->arena, ARENA_SIZE);
data->DirPath = ArenaStrdup(&data->arena, path);
data->Name = getCollectionName(path);
if (!el->IsInitialized) InitializeCollection(el);
data->collection = el;
outp->data = data;
return outp;
}
|