Compare commits
7 Commits
5f34cb34b2
..
ac2
| Author | SHA1 | Date | |
|---|---|---|---|
| b639bc6c4f | |||
| 7ee04c78cd | |||
| 7b58addf7e | |||
| ae52be591b | |||
| 93ab7690ba | |||
| 68c3f88181 | |||
| 830864aa8a |
+12
-1
@@ -13,6 +13,7 @@ cmake_policy(SET CMP0079 NEW)
|
|||||||
# set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
|
# set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
|
||||||
|
|
||||||
option(DUSK_BUILD_TESTS "Enable tests" OFF)
|
option(DUSK_BUILD_TESTS "Enable tests" OFF)
|
||||||
|
option(DUSK_NETWORKING "Enable networking support" OFF)
|
||||||
|
|
||||||
set(DUSK_GAME_NAME "Dusk" CACHE STRING "Game display name")
|
set(DUSK_GAME_NAME "Dusk" CACHE STRING "Game display name")
|
||||||
set(DUSK_GAME_AUTHOR "YourWishes" CACHE STRING "Game author / coder")
|
set(DUSK_GAME_AUTHOR "YourWishes" CACHE STRING "Game author / coder")
|
||||||
@@ -90,6 +91,12 @@ target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
|||||||
DUSK_VERSION="${DUSK_VERSION}"
|
DUSK_VERSION="${DUSK_VERSION}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(DUSK_NETWORKING)
|
||||||
|
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
||||||
|
DUSK_NETWORKING
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Toolchains
|
# Toolchains
|
||||||
include(cmake/targets/${DUSK_TARGET_SYSTEM}.cmake)
|
include(cmake/targets/${DUSK_TARGET_SYSTEM}.cmake)
|
||||||
|
|
||||||
@@ -116,7 +123,11 @@ if(DUSK_BUILD_TESTS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Build assets
|
# Build assets
|
||||||
file(GLOB_RECURSE DUSK_ASSET_FILES CONFIGURE_DEPENDS "${DUSK_ASSETS_DIR}/*")
|
# Deliberately not CONFIGURE_DEPENDS: that reruns the full CMake configure
|
||||||
|
# step (which invalidates generated headers and forces a huge rebuild) on
|
||||||
|
# every single asset edit. Re-run cmake manually when assets are added or
|
||||||
|
# removed.
|
||||||
|
file(GLOB_RECURSE DUSK_ASSET_FILES "${DUSK_ASSETS_DIR}/*")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT "${DUSK_ASSETS_ZIP}"
|
OUTPUT "${DUSK_ASSETS_ZIP}"
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${DUSK_ASSETS_DIR}"
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${DUSK_ASSETS_DIR}"
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Copyright (c) 2026 Dominic Masters
|
||||||
|
#
|
||||||
|
# This software is released under the MIT License.
|
||||||
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
add_subdirectory(debug)
|
||||||
|
add_subdirectory(frame)
|
||||||
|
add_subdirectory(focus)
|
||||||
|
add_subdirectory(overlay)
|
||||||
|
add_subdirectory(transition)
|
||||||
|
add_subdirectory(widget)
|
||||||
|
|
||||||
|
# Sources
|
||||||
|
target_sources(${DUSK_LIBRARY_TARGET_NAME}
|
||||||
|
PUBLIC
|
||||||
|
ui.c
|
||||||
|
uielement.c
|
||||||
|
)
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ui.h"
|
||||||
|
#include "util/memory.h"
|
||||||
|
#include "assert/assert.h"
|
||||||
|
#include "display/spritebatch/spritebatch.h"
|
||||||
|
#include "display/screen/screen.h"
|
||||||
|
#include "ui/uielement.h"
|
||||||
|
#include "ui/focus/uifocus.h"
|
||||||
|
|
||||||
|
ui_t UI;
|
||||||
|
|
||||||
|
errorret_t uiInit(void) {
|
||||||
|
memoryZero(&UI, sizeof(ui_t));
|
||||||
|
uiFocusInit();
|
||||||
|
uiElementsSort();
|
||||||
|
|
||||||
|
uielement_t *element = &UI_ELEMENTS[0];
|
||||||
|
while(!uiElementIsNull(element)) {
|
||||||
|
errorChain(uiElementInit(element));
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiUpdate(void) {
|
||||||
|
uiFocusUpdate();
|
||||||
|
|
||||||
|
uielement_t *element = &UI_ELEMENTS[0];
|
||||||
|
while(!uiElementIsNull(element)) {
|
||||||
|
errorChain(uiElementUpdate(element));
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiRender(void) {
|
||||||
|
const uielement_t *element = &UI_ELEMENTS[0];
|
||||||
|
while(!uiElementIsNull(element)) {
|
||||||
|
errorChain(uiElementDraw(element));
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorChain(spriteBatchFlush());
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiDispose(void) {
|
||||||
|
uielement_t *element = &UI_ELEMENTS[0];
|
||||||
|
while(!uiElementIsNull(element)) {
|
||||||
|
errorChain(uiElementDispose(element));
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "error/error.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *nothing;
|
||||||
|
} ui_t;
|
||||||
|
|
||||||
|
extern ui_t UI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the UI system.
|
||||||
|
*/
|
||||||
|
errorret_t uiInit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the UI system.
|
||||||
|
*
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiUpdate(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the UI system.
|
||||||
|
*
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiRender(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disposes of the UI system.
|
||||||
|
*
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiDispose(void);
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "uielement.h"
|
||||||
|
#include "assert/assert.h"
|
||||||
|
#include "util/sort.h"
|
||||||
|
#include "ui/frame/uiframe.h"
|
||||||
|
#include "ui/debug/uifps.h"
|
||||||
|
#include "engine/engine.h"
|
||||||
|
#include "ui/overlay/uifullbox.h"
|
||||||
|
#include "ui/overlay/uiloading.h"
|
||||||
|
#include "ui/overlay/uicrop.h"
|
||||||
|
#include "ui/transition/uitransition.h"
|
||||||
|
#include "ui/debug/uiconsole.h"
|
||||||
|
#include "ui/frame/uiconfirm.h"
|
||||||
|
|
||||||
|
// Priming pass: X does nothing here, so this only exists to process any
|
||||||
|
// #include directives nested in uielementlist.h/ui/uielementgame.h at
|
||||||
|
// file scope (each such header's own #pragma once makes it a no-op on
|
||||||
|
// the real pass below, which happens inside UI_ELEMENTS[]'s braces,
|
||||||
|
// where a raw #include of a declaration would be invalid).
|
||||||
|
#define X(initFn, updateFn, drawFn, disposeFn, order) // do nothing
|
||||||
|
#include "uielementlist.h"
|
||||||
|
#undef X
|
||||||
|
|
||||||
|
uielement_t UI_ELEMENTS[] = {
|
||||||
|
#define X(initFn, updateFn, drawFn, disposeFn, elementOrder) \
|
||||||
|
{ \
|
||||||
|
.init = initFn, .update = updateFn, .draw = drawFn, \
|
||||||
|
.dispose = disposeFn, .order = elementOrder \
|
||||||
|
},
|
||||||
|
#include "uielementlist.h"
|
||||||
|
#undef X
|
||||||
|
|
||||||
|
{ 0 } // Null terminator
|
||||||
|
};
|
||||||
|
|
||||||
|
bool_t uiElementIsNull(const uielement_t *element) {
|
||||||
|
return element->init == NULL &&
|
||||||
|
element->update == NULL &&
|
||||||
|
element->draw == NULL &&
|
||||||
|
element->dispose == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int_t uiElementCompareOrder(const void *a, const void *b) {
|
||||||
|
const uielement_t *elementA = (const uielement_t *)a;
|
||||||
|
const uielement_t *elementB = (const uielement_t *)b;
|
||||||
|
if(elementA->order < elementB->order) return -1;
|
||||||
|
if(elementA->order > elementB->order) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiElementsSort(void) {
|
||||||
|
// The trailing null terminator is always the last static entry -- sort
|
||||||
|
// everything before it, and leave it in place.
|
||||||
|
const size_t count = (sizeof(UI_ELEMENTS) / sizeof(UI_ELEMENTS[0])) - 1;
|
||||||
|
sortBubble(UI_ELEMENTS, count, sizeof(uielement_t), uiElementCompareOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiElementInit(uielement_t *element) {
|
||||||
|
assertNotNull(element, "element must not be NULL");
|
||||||
|
if(element->init != NULL) errorChain(element->init());
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiElementUpdate(uielement_t *element) {
|
||||||
|
assertNotNull(element, "element must not be NULL");
|
||||||
|
if(element->update != NULL) errorChain(element->update());
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiElementDraw(const uielement_t *element) {
|
||||||
|
assertNotNull(element, "element must not be NULL");
|
||||||
|
if(element->draw != NULL) errorChain(element->draw());
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiElementDispose(uielement_t *element) {
|
||||||
|
assertNotNull(element, "element must not be NULL");
|
||||||
|
if(element->dispose != NULL) errorChain(element->dispose());
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "error/error.h"
|
||||||
|
|
||||||
|
// Built-in order tiers. Lower values update/render first; ties preserve
|
||||||
|
// their relative UI_ELEMENTS declaration order (uiElementsSort uses a
|
||||||
|
// stable sort). Game-specific elements can use any int32_t value -- these
|
||||||
|
// are just the ones the engine itself relies on.
|
||||||
|
#define UI_ELEMENT_ORDER_DEFAULT 0
|
||||||
|
#define UI_ELEMENT_ORDER_DEBUG 1000
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
errorret_t (*init)();
|
||||||
|
errorret_t (*update)();
|
||||||
|
errorret_t (*draw)();
|
||||||
|
errorret_t (*dispose)();
|
||||||
|
int32_t order;
|
||||||
|
} uielement_t;
|
||||||
|
|
||||||
|
extern uielement_t UI_ELEMENTS[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true when all four callbacks on the element are NULL,
|
||||||
|
* which marks the end of the UI_ELEMENTS array.
|
||||||
|
*
|
||||||
|
* @param element The element to test.
|
||||||
|
* @returns True if the element is the null terminator.
|
||||||
|
*/
|
||||||
|
bool_t uiElementIsNull(const uielement_t *element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two elements by their .order field, ascending. Matches
|
||||||
|
* sortcompare_t, for use with the project's sort utilities.
|
||||||
|
*
|
||||||
|
* @param a First uielement_t to compare.
|
||||||
|
* @param b Second uielement_t to compare.
|
||||||
|
* @return Negative if a < b, zero if a == b, positive if a > b.
|
||||||
|
*/
|
||||||
|
int_t uiElementCompareOrder(const void *a, const void *b);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stably sorts UI_ELEMENTS in place by .order, ascending. The trailing
|
||||||
|
* null terminator is never moved. Called once by uiInit -- element order
|
||||||
|
* is static after that, so there's no need to re-sort every frame.
|
||||||
|
*/
|
||||||
|
void uiElementsSort(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a UI element, invoking its init callback if set.
|
||||||
|
*
|
||||||
|
* @param element The element to initialize.
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiElementInit(uielement_t *element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a UI element, calling its update callback if set.
|
||||||
|
*
|
||||||
|
* @param element The element to update.
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiElementUpdate(uielement_t *element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a UI element, calling its draw callback if set.
|
||||||
|
*
|
||||||
|
* @param element The element to render.
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiElementDraw(const uielement_t *element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disposes of a UI element, invoking its dispose callback if set.
|
||||||
|
*
|
||||||
|
* @param element The element to dispose.
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiElementDispose(uielement_t *element);
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Copyright (c) 2026 Dominic Masters
|
||||||
|
#
|
||||||
|
# This software is released under the MIT License.
|
||||||
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
target_sources(${DUSK_LIBRARY_TARGET_NAME}
|
||||||
|
PUBLIC
|
||||||
|
uibutton.c
|
||||||
|
uicheckbox.c
|
||||||
|
uitab.c
|
||||||
|
uislider.c
|
||||||
|
uidropdown.c
|
||||||
|
uiscrolling.c
|
||||||
|
uimenu.c
|
||||||
|
uilabel.c
|
||||||
|
uiwidgetlabel.c
|
||||||
|
)
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "uilabel.h"
|
||||||
|
#include "assert/assert.h"
|
||||||
|
#include "util/memory.h"
|
||||||
|
#include "util/string.h"
|
||||||
|
#include "display/text/text.h"
|
||||||
|
|
||||||
|
void uiLabelInit(uilabel_t *label, font_t *font) {
|
||||||
|
assertNotNull(label, "Label cannot be NULL");
|
||||||
|
assertNotNull(font, "Font cannot be NULL");
|
||||||
|
|
||||||
|
memoryZero(label, sizeof(uilabel_t));
|
||||||
|
label->font = font;
|
||||||
|
label->color = COLOR_WHITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiLabelSetText(uilabel_t *label, const char_t *text) {
|
||||||
|
assertNotNull(label, "Label cannot be NULL");
|
||||||
|
assertNotNull(text, "Text cannot be NULL");
|
||||||
|
assertStrLenMax(text, UI_LABEL_TEXT_MAX, "Label text too long");
|
||||||
|
|
||||||
|
stringCopy(label->text, text, UI_LABEL_TEXT_MAX);
|
||||||
|
label->spriteCount = textBuildSpriteCache(
|
||||||
|
label->text, label->font, label->sprites, UI_LABEL_SPRITE_COUNT_MAX,
|
||||||
|
&label->width, &label->height
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiLabelSetColor(uilabel_t *label, const color_t color) {
|
||||||
|
assertNotNull(label, "Label cannot be NULL");
|
||||||
|
label->color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiLabelGetSize(
|
||||||
|
const uilabel_t *label,
|
||||||
|
int32_t *outWidth,
|
||||||
|
int32_t *outHeight
|
||||||
|
) {
|
||||||
|
assertNotNull(label, "Label cannot be NULL");
|
||||||
|
assertNotNull(outWidth, "Output width cannot be NULL");
|
||||||
|
assertNotNull(outHeight, "Output height cannot be NULL");
|
||||||
|
*outWidth = label->width;
|
||||||
|
*outHeight = label->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t uiLabelDraw(
|
||||||
|
const uilabel_t *label,
|
||||||
|
const float_t x,
|
||||||
|
const float_t y
|
||||||
|
) {
|
||||||
|
assertNotNull(label, "Label cannot be NULL");
|
||||||
|
if(label->spriteCount == 0) errorOk();
|
||||||
|
|
||||||
|
// Cached sprites are relative to (0,0); textDrawSpriteCache translates
|
||||||
|
// into the requested screen position here instead of in
|
||||||
|
// uiLabelSetText, so a label can be repositioned every frame without
|
||||||
|
// rebuilding the (much more expensive) glyph/UV cache.
|
||||||
|
spritebatchsprite_t scratch[UI_LABEL_SPRITE_COUNT_MAX];
|
||||||
|
errorChain(textDrawSpriteCache(
|
||||||
|
label->sprites, label->spriteCount, scratch, x, y, label->color,
|
||||||
|
label->font->texture
|
||||||
|
));
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2026 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "error/error.h"
|
||||||
|
#include "display/text/font.h"
|
||||||
|
#include "display/spritebatch/spritebatchsprite.h"
|
||||||
|
#include "display/color.h"
|
||||||
|
|
||||||
|
#define UI_LABEL_TEXT_MAX 256
|
||||||
|
#define UI_LABEL_SPRITE_COUNT_MAX UI_LABEL_TEXT_MAX
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char_t text[UI_LABEL_TEXT_MAX];
|
||||||
|
color_t color;
|
||||||
|
font_t *font;
|
||||||
|
|
||||||
|
spritebatchsprite_t sprites[UI_LABEL_SPRITE_COUNT_MAX];
|
||||||
|
uint32_t spriteCount;
|
||||||
|
int32_t width;
|
||||||
|
int32_t height;
|
||||||
|
} uilabel_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a label, defaulting to white text and no text set.
|
||||||
|
*
|
||||||
|
* @param label The label to initialize.
|
||||||
|
* @param font Font to use for rendering. Must outlive the label.
|
||||||
|
*/
|
||||||
|
void uiLabelInit(uilabel_t *label, font_t *font);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the label's text, rebuilding its cached sprites (glyph lookup, UV,
|
||||||
|
* and layout) immediately. This is the only way the sprite cache gets
|
||||||
|
* rebuilt -- uiLabelDraw never recomputes it, so call this whenever the
|
||||||
|
* text changes rather than once up front and expecting it to stay in sync.
|
||||||
|
*
|
||||||
|
* @param label The label to update.
|
||||||
|
* @param text Null-terminated string to display. Must be shorter than
|
||||||
|
* UI_LABEL_TEXT_MAX.
|
||||||
|
*/
|
||||||
|
void uiLabelSetText(uilabel_t *label, const char_t *text);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the label's tint color. Cheap -- doesn't touch the sprite cache,
|
||||||
|
* since color is applied via the draw material, not baked into sprites.
|
||||||
|
*
|
||||||
|
* @param label The label to update.
|
||||||
|
* @param color The new tint color.
|
||||||
|
*/
|
||||||
|
void uiLabelSetColor(uilabel_t *label, const color_t color);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the measured size (in pixels) of the label's current text, cached
|
||||||
|
* from the last uiLabelSetText call.
|
||||||
|
*
|
||||||
|
* @param label The label to query.
|
||||||
|
* @param outWidth Pointer to store the width.
|
||||||
|
* @param outHeight Pointer to store the height.
|
||||||
|
*/
|
||||||
|
void uiLabelGetSize(
|
||||||
|
const uilabel_t *label,
|
||||||
|
int32_t *outWidth,
|
||||||
|
int32_t *outHeight
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws the label's cached sprites at the given screen position in a
|
||||||
|
* single batched buffer call. Does not recompute glyph layout -- call
|
||||||
|
* uiLabelSetText first whenever the text changes.
|
||||||
|
*
|
||||||
|
* @param label The label to draw.
|
||||||
|
* @param x Screen x position.
|
||||||
|
* @param y Screen y position.
|
||||||
|
* @return Any error that occurs.
|
||||||
|
*/
|
||||||
|
errorret_t uiLabelDraw(
|
||||||
|
const uilabel_t *label,
|
||||||
|
const float_t x,
|
||||||
|
const float_t y
|
||||||
|
);
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user