• [^] # Re: Clay

    Posté par (site web personnel) . En réponse au journal Clay Style Sheet. Évalué à 4.

    J'utilise "Dear ImGui" aussi, mais plutôt pour l'UI de l'éditeur / mode debug.

    Je la trouve puissante, mais difficile à styliser (peut être un problème chaise/clavier)

    Comme tu dis, ici la syntaxe à base de structure etc... rappelle HTML&CSS, et permet de créer des composants fonctionnels comme on le ferait en React. La grosse différence avec ImGui, c'est que Clay ne stocke aucun état. C'est à toi de gérer ça (cela a été un challenge tout particulier lorsque j'ai implémenté mes textbox avec stb_textedit).

    Ma lib "CSS" permet de créer les structures Clay_ElementDeclaration et Clay_TextElementConfig en amont, afin de pouvoir les donner aux macros CLAY(), CLAY_TEXT() etc...

    A la base, j'avais voulu séparer le style de la logique de l'UI (de la même manière, en HTML&CSS on veut éviter les styles "inline" et plutôt utiliser des classes CSS). Je me retrouvait avec des 100aines de lignes de code juste pour le style en amont, et ici c'est la faute de C++ :

    En C++23 (je sais plus depuis quand), lorsque l'on initialise une structure avec des "designated initializers", ils doivent être TOUS spécifiés, et dans le BON ORDRE :

    struct foo_type {
     int a;
     int b;
     int c;
    };
    // ERROR
    auto foo = foo_type{
     .b = 1,
    };
    // ERROR
    auto foo = foo_type{
     .b = 1,
     .c = 1,
     .a = 1,
    };
    // OK
    auto foo = foo_type{
     .a = 1,
     .b = 1,
     .c = 1,
    };

    Pourtant, en C23, les 3 exemples ci-dessus fonctionnent.

    Je peux t'assurer que c'était chiant avec les structures de Clay et pas mal de ces macros.

    Je me retrouvais avec ça au final:

    auto foo = foo_type{};
    foo.b = 1;

    Du coup, pour chaque élément Clay, je devais avoir un Clay_ElementDeclaration de prêt. J'avais donc une structure immense avec plein de variable membre, et un fichier immense qui répertoriait tout les styles. Et je devais stocker les ids des images et polices de caractères après les avoir ajouté à l'atlas de mon moteur de rendu NanoVG.

    C'était vraiment pénible, et j'ai essayé de résister pendant 3 semaines avec la pensée "je dois avancer sur le jeu, c'est pas un vrai problème". J'ai fini par craquer :D

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg