Compare commits
3 commits
c372a4db3a
...
762d165cd1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
762d165cd1 | ||
|
|
d54d5add5e | ||
|
|
5e16b201c4 |
|
|
@ -20,7 +20,7 @@ void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intpt
|
||||||
},
|
},
|
||||||
}) {
|
}) {
|
||||||
Clay_OnHover(onHovered, onHoveredData);
|
Clay_OnHover(onHovered, onHoveredData);
|
||||||
cera::Body(text, {
|
Body(text, {
|
||||||
.textColor = theme->textColor,
|
.textColor = theme->textColor,
|
||||||
.textAlignment = CLAY_TEXT_ALIGN_CENTER,
|
.textAlignment = CLAY_TEXT_ALIGN_CENTER,
|
||||||
});
|
});
|
||||||
|
|
@ -35,7 +35,8 @@ void ToggleHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t da
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Toggle(Clay_String label, Clay_Color selected, bool &state) {
|
bool Toggle(Clay_String label, Clay_Color selected, bool &state) {
|
||||||
|
bool const before{state};
|
||||||
CLAY_AUTO_ID({
|
CLAY_AUTO_ID({
|
||||||
.layout = {
|
.layout = {
|
||||||
.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() },
|
.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() },
|
||||||
|
|
@ -68,10 +69,12 @@ void Toggle(Clay_String label, Clay_Color selected, bool &state) {
|
||||||
.textColor = theme->textColor
|
.textColor = theme->textColor
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// return if the value changed this frame
|
||||||
|
return before != state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Body(Clay_String string, Clay_TextElementConfig baseCfg) {
|
void Body(Clay_String string, Clay_TextElementConfig baseCfg) {
|
||||||
baseCfg.fontId = cera::FONT_DEFAULT;
|
baseCfg.fontId = cera::FONT_REGULAR;
|
||||||
baseCfg.fontSize = cera::baseFontSize;
|
baseCfg.fontSize = cera::baseFontSize;
|
||||||
CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg));
|
CLAY_TEXT(string, CLAY_TEXT_CONFIG(baseCfg));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
#ifndef ELEMENTS_H
|
#ifndef ELEMENTS_H
|
||||||
#define ELEMENTS_H
|
#define ELEMENTS_H
|
||||||
|
|
||||||
#include <clay/clay.h>
|
|
||||||
#include "style.h"
|
#include "style.h"
|
||||||
|
#include <SDL3/SDL_render.h>
|
||||||
|
#include <clay/clay.h>
|
||||||
|
|
||||||
namespace cera {
|
namespace cera {
|
||||||
typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data);
|
typedef void(*OnHoveredFn)(Clay_ElementId element, Clay_PointerData pointer, intptr_t data);
|
||||||
void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0);
|
void TextButton(Clay_String text, Clay_Color color, OnHoveredFn onHovered, intptr_t onHoveredData = 0);
|
||||||
void Toggle(Clay_String label, Clay_Color selected, bool &state);
|
bool Toggle(Clay_String label, Clay_Color selected, bool &state);
|
||||||
void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = theme->textColor});
|
void Body(Clay_String string, Clay_TextElementConfig baseCfg = {.textColor = theme->textColor});
|
||||||
void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = theme->textColor});
|
void Header(Clay_String string, size_t header, Clay_TextElementConfig baseCfg = {.textColor = theme->textColor});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,34 @@
|
||||||
#include <SDL3/SDL_log.h>
|
#include <SDL3/SDL_log.h>
|
||||||
#include <SDL3/SDL_render.h>
|
#include <SDL3/SDL_render.h>
|
||||||
#include <SDL3_image/SDL_image.h>
|
#include <SDL3_image/SDL_image.h>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
#ifndef CERA_RESOURCE_REGISTRY_SIZE
|
||||||
|
#define CERA_RESOURCE_REGISTRY_SIZE 64
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace cera {
|
namespace cera {
|
||||||
|
struct ResourceRegistry {
|
||||||
|
void *data;
|
||||||
|
DestructorFn destructor;
|
||||||
|
};
|
||||||
|
|
||||||
TTF_Font *defaultFont[FONT_MAX];
|
TTF_Font *defaultFont[FONT_MAX];
|
||||||
TTF_TextEngine *textEngine = nullptr;
|
TTF_TextEngine *textEngine = nullptr;
|
||||||
|
|
||||||
|
ResourceRegistry resources[CERA_RESOURCE_REGISTRY_SIZE]{};
|
||||||
|
size_t usedResources{0};
|
||||||
|
|
||||||
void SetDefaultFont(char const *path) {
|
void SetDefaultFont(char const *path) {
|
||||||
defaultFont[FONT_DEFAULT] = TTF_OpenFont(path, cera::baseFontSize * 5);
|
// LOAD REGULAR FONT
|
||||||
if (defaultFont[FONT_DEFAULT] == nullptr) {
|
defaultFont[FONT_REGULAR] = TTF_OpenFont(path, cera::baseFontSize * 5);
|
||||||
|
if (defaultFont[FONT_REGULAR] == nullptr) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default font '%s': %s", path, SDL_GetError());
|
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default font '%s': %s", path, SDL_GetError());
|
||||||
exit(6);
|
exit(6);
|
||||||
}
|
}
|
||||||
TTF_SetFontHinting(defaultFont[FONT_DEFAULT], TTF_HINTING_LIGHT_SUBPIXEL);
|
TTF_SetFontHinting(defaultFont[FONT_REGULAR], TTF_HINTING_LIGHT_SUBPIXEL);
|
||||||
|
StoreResource(defaultFont[FONT_REGULAR], (DestructorFn)&TTF_CloseFont);
|
||||||
|
// LOAD BOLD FONT
|
||||||
defaultFont[FONT_BOLD] = TTF_OpenFont(path, cera::baseFontSize * 5);
|
defaultFont[FONT_BOLD] = TTF_OpenFont(path, cera::baseFontSize * 5);
|
||||||
if (defaultFont[FONT_BOLD] == nullptr) {
|
if (defaultFont[FONT_BOLD] == nullptr) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default bold font '%s': %s", path, SDL_GetError());
|
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "TTF_OpenFont failed: Failed to load default bold font '%s': %s", path, SDL_GetError());
|
||||||
|
|
@ -23,6 +39,33 @@ void SetDefaultFont(char const *path) {
|
||||||
}
|
}
|
||||||
TTF_SetFontHinting(defaultFont[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL);
|
TTF_SetFontHinting(defaultFont[FONT_BOLD], TTF_HINTING_LIGHT_SUBPIXEL);
|
||||||
TTF_SetFontStyle(defaultFont[FONT_BOLD], TTF_STYLE_BOLD);
|
TTF_SetFontStyle(defaultFont[FONT_BOLD], TTF_STYLE_BOLD);
|
||||||
|
StoreResource(defaultFont[FONT_BOLD], (DestructorFn)&TTF_CloseFont);
|
||||||
SDL_Log("SetDefaultFont: Success");
|
SDL_Log("SetDefaultFont: Success");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StoreResource(void *data, DestructorFn destructor) {
|
||||||
|
for (size_t i{0}; i < usedResources; ++i) {
|
||||||
|
if(resources[i].data == nullptr) {
|
||||||
|
resources[i].data = data;
|
||||||
|
resources[i].destructor = destructor;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(usedResources < CERA_RESOURCE_REGISTRY_SIZE) {
|
||||||
|
resources[usedResources].data = data;
|
||||||
|
resources[usedResources].destructor = destructor;
|
||||||
|
++usedResources;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Failed to register resource, expect memory leaks. Consider using less resources or defining a higher CERA_RESOURCE_REGISTRY_SIZE at compile time");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupResources() {
|
||||||
|
for (size_t i{0}; i < usedResources; ++i) {
|
||||||
|
if(resources[i].data) {
|
||||||
|
resources[i].destructor(resources[i].data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usedResources = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
resources.h
16
resources.h
|
|
@ -1,11 +1,13 @@
|
||||||
#ifndef RESOURCES_H
|
#ifndef RESOURCES_H
|
||||||
#define RESOURCES_H
|
#define RESOURCES_H
|
||||||
|
|
||||||
|
#include "SDL3/SDL_render.h"
|
||||||
|
#include <SDL3_image/SDL_image.h>
|
||||||
#include <SDL3_ttf/SDL_ttf.h>
|
#include <SDL3_ttf/SDL_ttf.h>
|
||||||
|
|
||||||
namespace cera {
|
namespace cera {
|
||||||
enum Font {
|
enum Font {
|
||||||
FONT_DEFAULT = 0,
|
FONT_REGULAR = 0,
|
||||||
FONT_BOLD = 1,
|
FONT_BOLD = 1,
|
||||||
FONT_MAX
|
FONT_MAX
|
||||||
};
|
};
|
||||||
|
|
@ -13,7 +15,19 @@ enum Font {
|
||||||
extern TTF_TextEngine *textEngine;
|
extern TTF_TextEngine *textEngine;
|
||||||
extern TTF_Font *defaultFont[FONT_MAX];
|
extern TTF_Font *defaultFont[FONT_MAX];
|
||||||
|
|
||||||
|
typedef void (*DestructorFn)(void* data);
|
||||||
|
|
||||||
void SetDefaultFont(char const *path);
|
void SetDefaultFont(char const *path);
|
||||||
|
void StoreResource(void *data, DestructorFn destructor);
|
||||||
|
void CleanupResources();
|
||||||
|
|
||||||
|
static inline SDL_Texture *LoadAndStoreTexture(SDL_Renderer *renderer, char const *path) {
|
||||||
|
if(SDL_Texture *texture{IMG_LoadTexture(renderer, path)}) {
|
||||||
|
StoreResource(texture, (DestructorFn)&SDL_DestroyTexture);
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !RESOURCES_H
|
#endif // !RESOURCES_H
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue