Immediate-Mode-UI / Nuklear

A single-header ANSI C immediate mode cross-platform GUI library
https://immediate-mode-ui.github.io/Nuklear/doc/index.html
8.89k stars 533 forks source link

Two Issues with Fonts #601

Open raphael10-collab opened 6 months ago

raphael10-collab commented 6 months ago

I have issues in the font management:

First Issue:

I tried to follow step-by-step these indications: https://github.com/Immediate-Mode-UI/Nuklear/wiki/Complete-font-guide#configuring-the-fon :

struct nk_font * latin, * icons, * japan; // This name is how you will access and switch the fonts in your GUI definition

struct nk_font_atlas  *atlas;

struct nk_font_config cfg_latin = nk_font_config(0);

but got this error:

/home/raphy/MyPrj/src/basic.cc:48:23: error: variable ‘nk_font_config cfg_latin’ has initializer but incomplete type
   48 | struct nk_font_config cfg_latin = nk_font_config(0);

Second Issue:

Executing the compiled and built file:

raphy@raohy:~/MyPrj$ ./cmakebuilddir/basic 
basic: /home/raphy/MyPrj/src/../../Nuklear/nuklear.h:20345: nk_bool nk_begin_titled(nk_context*, const char*, const char*, nk_rect, nk_flags): Assertion `ctx->style.font && ctx->style.font->width && "if this triggers you forgot to add a font"' failed.
Aborted (core dumped)

This is /src/basic.cc file :

#include "iostream"
#define NK_IMPLEMENTATION
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
//#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#include "../../Nuklear/nuklear.h"
#include "nuklear_glfw_gl3.h"

int main(int argc, char* argv[]) {
    // init gui state
    enum {EASY, HARD};
    static int op = EASY;
    static float value = 0.6f;
    static int i =  20;
    struct nk_context ctx;

    nk_init_default(&ctx, 0);

    if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220),
        NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) {
        // fixed widget pixel width
        nk_layout_row_static(&ctx, 30, 80, 1);
        if (nk_button_label(&ctx, "button")) {
            // event handling
        }
        // fixed widget window ratio width
        nk_layout_row_dynamic(&ctx, 30, 2);
        if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY;
        if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD;
        // custom widget pixel width
        nk_layout_row_begin(&ctx, NK_STATIC, 30, 2);
        {
            nk_layout_row_push(&ctx, 50);
            nk_label(&ctx, "Volume:", NK_TEXT_LEFT);
            nk_layout_row_push(&ctx, 110);
            nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f);
        }
        nk_layout_row_end(&ctx);
    }
    nk_end(&ctx);

    return 0;
}

CMakeLists.txt :

cmake_minimum_required(VERSION 3.24)
project (MyPrj LANGUAGES C CXX)

find_package(PkgConfig REQUIRED)
pkg_check_modules(glew REQUIRED IMPORTED_TARGET glew)
pkg_check_modules(gl REQUIRED IMPORTED_TARGET gl)
pkg_check_modules(x11 REQUIRED IMPORTED_TARGET x11)
pkg_check_modules(glu REQUIRED IMPORTED_TARGET glu)
pkg_check_modules(openlibm REQUIRED IMPORTED_TARGET openlibm)

find_package(glfw3 REQUIRED)

add_executable(basic
    src/basic.cc
)

target_compile_options(basic PUBLIC ${glfw_CFLAGS_OTHER} ${glew_CFLAGS_OTHER} ${gl_CFLAGS_OTHER} ${x11_CFLAGS_OTHER} ${glu_CFLAGS_OTHER} ${openlibm_CFLAGS_OTHER})
target_include_directories(basic PUBLIC ${webkit2gtk_INCLUDE_DIRS} ${gtk_INCLUDE_DIRS})
target_include_directories(basic PUBLIC libs/webview)

target_link_libraries(basic PUBLIC
    glfw
    PkgConfig::glew
    PkgConfig::gl
    PkgConfig::x11
    PkgConfig::glu
    PkgConfig::openlibm
)

How to make it work?