Et salut à tous !
J'avais envie de présenter ce projet depuis un moment sans en trouver le temps; je me suis lancé dans un petit projet pour progresser un peut en rust, un genre de QML.
Je l'ai appelé RML avec beaucoup d'humidité.
Le rendu est fait grâce à macroquad (que je recommande, c'est vraiment ultra complet comme lib de rendu 2D [et même 3D]).
Pour le cœur j'ai fait un arena tree pour stocker les noeuds de mon ihm, avec quelques méthodes métiers, un système de propriétés abstraites, un système d'events (je remap d'ailleurs les events système dedans) et enfin une bonne grosse macro pour parser mon DSL.
Le DSL supporte la déclaration d'élements (Rectangle, Text, Node, MouseArea), la définitions de signaux, de callback, de fonctions et de propriétés (qui peuvent être initialisées par des fonctions ou par des valeurs). On peut aussi importer des composants depuis un répertoire contenant des .rml .
Pour les callback et les fonctions, je n'ai pas implémenté de langage interprété, c'est du rust natif, avec une petite transformation (un peu bancale) pour passer d'une notation $noeud.propriété.
Pour positionner les éléments, on a le choix entre du positionnement relatif au parent (en modifiant x et y), ou bien via un système d'ancre et de marges.
C'est très loin de ce que propose Slint, Ribir, ou bien son inspiration, le QML bien sur.
Mais je me suis presque étonné de voir qu'avec au final assez peu de code, on pouvait obtenir un truc relativement fonctionnel.
Voilà ce que ça donne :
let mut engine = rml!(
import "components" as UI
Node {
id: root
anchors: fill
text: "Please don't hit my button!"
signal click
on_click: {
$.root.text = "outch!".to_string();
}
Rectangle {
anchors: fill
margins: 10
color: { GRAY }
}
Text {
anchors: center
text: { $.root.text }
color: { WHITE }
font_size: 16
}
UI::Button {
id: test_btn
anchors: center | bottom
margins: 20
text: "Click me!"
on_click: {
emit!(engine, root, click);
}
}
}
);
Bref, voilà le lien : https://github.com/aldebaranzbradaradjan/rml
Si une bonne âme qui s'y connaît en DSL et macro Rust veut bien me donner un coup de main c'est là dessus que j'ai fait le code le plus sale.
La macro en elle même est relativement propre, mais je passe par des phases de transformation en chaîne de caractères et il y a pas mal de limitations.
J'espère que vous trouverez le projet sympa, moi je me suis bien amusé à le développer !
+++
# Application
Posté par abriotde (site web personnel, Mastodon) . Évalué à 3 (+2/-0).
Je préfère l'intro de ton Readme : "RML is a simple DSL for creating 2D GUIs in Rust" parce que Markup Langage ça sert a rien ;)
Mais sinon, certes le projet est aujourd'hui très basique (peu puissant) mais au fond si je comprends bien c'est une ré-implémentation en Rust de QML (Sans toutes les fonctionnalités pour le moment bien sûr), ce que ne propose pas les alternatives que tu cite non? Si c'est le cas, il pourrait avoir un bel avenir. Je suis sûr qu'il y a des applications Qt/QML à porter en Rust. Aujourd'hui le plus simple c'est le binding de QML depuis Rust mais c'est sans la sécurité de Rust. C'est un peu comme mettre une super alarme mais laisser ton or dans une caisse en bois (ou l'inverse un super coffre fort mais sans surveillance). Tout le travail de migration pour un résultat en mi-teinte.
Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.
[^] # Re: Application
Posté par Aldebaran (site web personnel) . Évalué à 2 (+1/-0).
Salut; oui je suis pas au point sur le nom on est d'accord ;)
Alors pour répondre à ta question, oui et non, c'est fortement inspiré du QML, mais la syntaxe est différente et il n'y a pas de js.
À la limite ça peut servir de base pour une qml en rust, mais c'est un taf terrible pour la compatibilité.
Slint par exemple de mon point de vue, remplis vachement mieux cet objectif. Là non plus on est pas sur du QML, mais ça reste proche, et surtout ça fonctionne bien.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.