Retour aux projetsKLEIN.
Projet C++ / Scolaire$ Terminé
Dépôt GitHub

ShapesEditor

Éditeur de formes géométriques 2D interactif et extensible développé en C++20 avec la bibliothèque EZ-Draw++ : création, manipulation, stylisation et persistance de formes via la souris et le clavier.

Vue d'ensemble de ShapesEditor avec plusieurs formes à l'écran
~/stack.json

"Langage & Standard":

C++20

"Bibliothèque graphique":

EZ-Draw++ / EZ-Draw (Eric Rémy)

"Backend graphique":

X11 (Linux)

"Build multiplateforme":

Makefiles (Linux / MinGW / MSYS)

Langage

C++20

Bibliothèque

EZ-Draw++

Backend

X11 (Linux)

Présentation & Architecture Technique

Pas de Qt, pas de framework GUI tout fait : EZ-Draw donne un canvas et des événements souris/clavier à l'état brut. Boutons, callbacks, sélection multiple - tout UI.hpp est écrit à la main, ce qui oblige à comprendre exactement ce qu'un framework fait d'habitude à ta place.

Classe abstraite Shape

Racine de la hiérarchie, portant les attributs communs à toutes les formes : point d'ancrage, couleur, épaisseur de trait, mode de remplissage.

Spécialisation par héritage

Square hérite de Rectangle, Circle hérite de Ellipse - les formes dérivées réutilisent la géométrie de leur parent au lieu de la dupliquer.

Factory Pattern (sauvegarde/chargement)

Enregistrement dynamique via register_factory_function : chaque classe s'enregistre auprès de Shape pour permettre une désérialisation polymorphique depuis shapes.txt.

SetOfShapes & MyWindow

SetOfShapes gère la scène globale ; MyWindow (héritant de EZWindow) gère l'événementiel souris/clavier et s'appuie sur UI.hpp pour les briques GUI personnalisées.

Vue d'ensemble de l'éditeur avec plusieurs formes différentes à l'écran
Capture 1 - Vue d'ensemble de l'éditeur

Fonctionnalités Clés

Création & Outils

Ajout de formes via boutons d'interface ou raccourcis clavier dédiés :

rRectangleeEllipsesCarrécCerclelÉtiquette

Interactions & Édition

Sélection simple et multiple (Ctrl + clic), glisser-déposer, personnalisation du remplissage, de l'épaisseur et de la typographie des étiquettes.

Palette de couleurs, ou raccourcis directs :

01234567

Persistance de données

Sauvegarde (S) et chargement (L) de l'état complet de la scène dans un fichier texte structuré, shapes.txt.

Sélection multiple de formes, avec poignées de sélection visibles
Capture 2 - Sélection multiple & glisser-déposer
Barre d'outils : palette de couleurs, remplissage, épaisseur et taille de police
Capture 3 - Personnalisation (couleur, remplissage, épaisseur)

Compilation & Tooling Multiplateforme

Support natif C++20 avec un système de build dédié par système d'exploitation, plutôt qu'un unique Makefile générique masquant les différences de backend graphique.

~/shapes-editor/build

$ compilation (Linux / X11)

sudo apt install libx11-dev libxext-dev
make

$ compilation (Windows)

# MinGW
make -f Makefile_win.mk
# ou MSYS
make -f Makefile_MSYS.mk

Ce que j'ai appris

Héritage & Abstraction (POO)

Classe abstraite racine Shape portant les attributs communs (ancrage 2D Point, couleur, épaisseur de trait, mode de remplissage), avec spécialisation par héritage : Square hérite de Rectangle, Circle hérite de Ellipse.

Factory Pattern & Sérialisation Polymorphique

Système d'enregistrement dynamique via register_factory_function : chaque classe s'enregistre auprès de Shape pour permettre de recréer le bon type concret au chargement du fichier shapes.txt, sans le connaître à l'avance.

Événementiel & UI Custom (EZWindow)

MyWindow hérite de EZWindow pour gérer souris et clavier bas niveau (glisser-déposer, sélection multiple via Ctrl), avec des briques d'interface personnalisées (boutons, callbacks, labels) écrites à la main dans UI.hpp.

Compilation Multiplateforme

Système de build dédié par OS : Makefile classique sous Linux (dépendances libx11-dev / libxext-dev), et scripts MinGW / MSYS séparés sous Windows pour gérer les différences de backend graphique.