|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Widget affichant l'image en cours d'édition et transformant les gestes de souris en appels aux opérations pures de hmi::PixelOperations (TACHE-02). More...
#include <PixelCanvas.h>
Signals | |
| void | imageChanged () |
| Émis après chaque mutation de image() (geste, annuler, refaire) — la barre d'état et l'aperçu live (TACHE-08) s'y abonnent plutôt que d'interroger le canevas à chaque frame. | |
| void | historyChanged () |
| Émis après chaque changement de l'historique (nouvelle entrée, annuler, refaire) — alimente le panneau d'historique visuel (hmi::PixelHistoryPanel). | |
| void | hoveredPixelChanged (std::optional< std::pair< int, int > > pixel) |
| Émis à chaque changement du pixel survolé (barre d'état, TACHE-04). | |
| void | currentColorChanged (std::uint32_t color) |
| Émis à chaque changement de la couleur courante, quelle qu'en soit la source (pipette, pastille de palette, sélecteur dédié) — la barre d'outils y aligne son témoin de couleur. | |
Public Member Functions | |
| PixelCanvas (QWidget *parent=nullptr) | |
| void | setLocalization (const Localization *loc) noexcept |
| Catalogue de traduction utilisé pour l'infobulle de case en mode planche à raccords (hmi::autotileConfigurationLabelKey, TACHE-08). | |
| void | setImage (DecodedImage image) |
| Remplace l'image éditée et réinitialise l'historique local (ouverture d'un asset, TACHE-05). | |
| void | setUnderlay (DecodedImage image, float opacity=1.0f) |
| Pose un repère dessiné sous le contenu édité (mode création, EX-EDIT-046). | |
| void | setOverlay (DecodedImage image, float opacity=1.0f) |
| Pose un repère dessiné par-dessus le contenu édité — mêmes règles que setUnderlay. | |
| void | setReferenceGridStep (int step) |
| Pose une grille de tuiles, distincte de la grille de pixels existante. | |
| const DecodedImage & | image () const noexcept |
| void | setAssetName (std::string name) |
| Nom de l'asset ouvert (barre d'état, TACHE-04), vide si aucun. | |
| const std::string & | assetName () const noexcept |
| bool | isDirty () const noexcept |
| Modifications non enregistrées depuis l'ouverture/le dernier enregistrement (barre d'état TACHE-04, garde-fou de perte de travail TACHE-05) : un coup de pinceau la marque, un enregistrement (markSaved) la lève. | |
| void | markSaved () noexcept |
| Marque l'image comme enregistrée — appelé après une écriture réussie (TACHE-05). | |
| void | setActiveTool (PixelTool tool) noexcept |
| PixelTool | activeTool () const noexcept |
| void | setCurrentColor (std::uint32_t color) |
| Couleur courante (pinceau, pot de peinture). | |
| std::uint32_t | currentColor () const noexcept |
| void | setPaletteColors (std::vector< std::uint32_t > colors) |
| Couleurs de la palette de projet (LOT-54 TACHE-07), consultées quand le mode contraint est actif. | |
| void | setPaletteConstrained (bool enabled) noexcept |
| Active/désactive le mode « contraindre à la palette » : toute couleur posée (pinceau, pot de peinture) est ramenée à l'entrée la plus proche de setPaletteColors (hmi::
nearestPaletteColor) ; désactivable à tout moment, jamais imposé. | |
| bool | paletteConstrained () const noexcept |
| const PixelHistory & | history () const noexcept |
| bool | canUndo () const override |
| void | undo () override |
| bool | canRedo () const override |
| void | redo () override |
| void | jumpHistoryTo (std::size_t index) |
Revient à l'état immédiatement après l'entrée index de history().appliedEntries() (panneau d'historique visuel, TACHE-04) ; sans effet si index est hors bornes. | |
| bool | canCopy () const override |
| void | copy () override |
| Copie la sélection courante, ou l'image entière à défaut de sélection. | |
| bool | canPaste () const override |
| void | paste () override |
| Colle le presse-papiers de l'atelier au pixel survolé (coin haut-gauche), tronqué au cadre ; sans effet si le presse-papiers est vide. | |
| int | referenceGridStep () const noexcept |
| const PixelRegion & | selection () const noexcept |
| Région actuellement sélectionnée (outil Sélection), vide si aucune. | |
| void | applyFlipHorizontal () |
| Retourne la sélection horizontalement, ou l'image entière à défaut de sélection. | |
| void | applyFlipVertical () |
| Retourne la sélection verticalement, ou l'image entière à défaut de sélection. | |
| void | applyRotateClockwise () |
| Pivote la sélection d'un quart de tour horaire, ou l'image entière à défaut de sélection. | |
| void | applyRotateCounterClockwise () |
| Pivote la sélection d'un quart de tour antihoraire, ou l'image entière à défaut de sélection. | |
| const PixelCanvasView & | view () const noexcept |
| void | zoomIn () |
| void | zoomOut () |
| std::optional< std::pair< int, int > > | imagePixelAt (const QPointF &widgetPosition) const |
| Pixel image sous une position widget donnée (coordonnées logiques), ou std::nullopt hors de l'image — alimente le pixel survolé de la barre d'état (TACHE-04). | |
| std::optional< std::pair< int, int > > | hoveredPixel () const noexcept |
| Dernier pixel survolé par la souris à l'intérieur de l'image, ou std::nullopt si la souris n'y est pas (curseur sorti du widget, ou hors de l'image à zoom/décalage donnés). | |
| QSize | sizeHint () const override |
| Public Member Functions inherited from hmi::EditContextTarget | |
| virtual | ~EditContextTarget ()=default |
Protected Member Functions | |
| void | paintEvent (QPaintEvent *event) override |
| void | mousePressEvent (QMouseEvent *event) override |
| void | mouseMoveEvent (QMouseEvent *event) override |
| void | mouseReleaseEvent (QMouseEvent *event) override |
| void | leaveEvent (QEvent *event) override |
| void | wheelEvent (QWheelEvent *event) override |
Private Member Functions | |
| QPixmap | renderPixmap () const |
| void | applyToolAtPoint (int x, int y) |
| Applique l'outil actif au pixel (x, y) (un seul point : clic, pipette, pot de peinture) et étend _gestureRegion avec la région effectivement modifiée. | |
| void | continueToolTo (int x, int y) |
| Prolonge le geste courant du dernier point traité jusqu'à (x, y) (pinceau/gomme : ligne sans trou entre deux positions successives, TACHE-02 ; déplacement de sélection, TACHE-06). | |
| void | beginGesture (int x, int y) |
| void | endGesture () |
| PixelRegion | effectiveRegion () const |
| Région effective d'une transformation : la sélection courante, ou l'image entière si aucune sélection n'est active (TACHE-06 : « à défaut de sélection, à l'image entière »). | |
| void | commitRegionMutation (PixelOperationKind kind, const DecodedImage &beforeSnapshot, const PixelRegion &touched) |
Capture beforeSnapshot/`_image` sur touched, pousse l'entrée d'historique nommée si non vide, et émet les signaux de mutation — factorisé entre applyFlipHorizontal/ applyFlipVertical/applyRotateClockwise/applyRotateCounterClockwise/paste. | |
| void | applyRegionOperation (PixelOperationKind kind, PixelRegion(*operation)(DecodedImage &, const PixelRegion &)) |
| Applique une transformation pure de hmi::PixelOperations (même signature que flipHorizontal/rotateClockwise…) à effectiveRegion() et la pousse dans l'historique. | |
| std::uint32_t | effectivePaintColor () const noexcept |
| _currentColor, ramenée à l'entrée de palette la plus proche si le mode contraint est actif (hmi::nearestPaletteColor) ; _currentColor telle quelle sinon. | |
Private Attributes | |
| DecodedImage | _image |
| DecodedImage | _underlay |
| Repère dessiné sous le contenu édité (setUnderlay) — jamais dans _image, donc jamais dans l'historique ni dans le presse-papiers. | |
| float | _underlayOpacity = 1.0f |
| DecodedImage | _overlay |
| Repère dessiné par-dessus le contenu édité (setOverlay), mêmes règles. | |
| float | _overlayOpacity = 1.0f |
| int | _referenceGridStep = 0 |
| Pas de la grille de tuiles, en pixels image ; 0 si aucune. | |
| std::string | _assetName |
| bool | _dirty = false |
| PixelHistory | _history |
| PixelCanvasView | _view |
| PixelTool | _activeTool = PixelTool::Brush |
| std::uint32_t | _currentColor = 0xFF000000u |
| std::vector< std::uint32_t > | _paletteColors |
| Copie des couleurs de la palette (TACHE-07). | |
| bool | _paletteConstrained = false |
| bool | _gestureActive = false |
| DecodedImage | _gestureBeforeSnapshot |
| Copie de _image au début du geste courant. | |
| PixelRegion | _gestureRegion |
| Union des régions touchées depuis le début du geste. | |
| std::optional< std::pair< int, int > > | _lastGesturePixel |
| std::optional< std::pair< int, int > > | _hoveredPixel |
| PixelRegion | _selection |
| Sélection courante, vide si aucune. | |
| PixelClipboard | _clipboard |
| Presse-papiers de l'atelier, distinct du niveau. | |
| bool | _selectionMoveActive = false |
| true : le geste en cours déplace _selection. | |
| std::pair< int, int > | _selectionDragAnchor {0, 0} |
| Point de départ d'une nouvelle sélection. | |
| bool | _panning = false |
| QPointF | _panStartWidgetPos |
| PixelCanvasView | _panStartView |
| const Localization * | _loc = nullptr |
| Pour l'infobulle de case en mode planche (TACHE-08). | |
Widget affichant l'image en cours d'édition et transformant les gestes de souris en appels aux opérations pures de hmi::PixelOperations (TACHE-02).
Zoom entier, agrandi au plus proche voisin (EX-ARCH-022), rendu à la résolution réelle de l'écran (hmi::pixelCanvasRealSize, réutilise LOT-56 TACHE-05) : jamais flou à 125 %/150 % d'échelle d'affichage. La surface de peinture — fond et damier de transparence sous les zones à alpha nul — appartient à la portée invariante des jetons (hmi::identityTokens()) : elle ne change jamais avec le thème clair/sombre du châssis d'édition (LOT-56 TACHE-06), à la différence du châssis qui l'entoure (barre d'outils, panneaux — TACHE-04). Un fond qui change de clarté selon l'heure de la journée fausserait la perception des couleurs posées.
Un geste complet (appui, glisser, relâchement) produit une seule entrée dans hmi:: PixelHistory, locale à ce canevas et totalement indépendante de core::LevelDraft — annuler un coup de pinceau n'annule jamais une action d'édition de niveau, et réciproquement.
Implémente hmi::EditContextTarget (TACHE-04) : MainWindow y dispatche Annuler/Refaire/ Copier/Coller quand ce canevas est le contexte d'édition actif, exactement comme GameViewport pour le niveau — le seuil de dispatch prévu depuis LOT-57 TACHE-04, sans le réécrire. Copier et coller (TACHE-06) visent un presse-papiers propre à l'atelier (hmi::PixelClipboard), distinct de celui de l'éditeur de niveaux.
|
explicit |
|
inlinenodiscardnoexcept |
| void hmi::PixelCanvas::applyFlipHorizontal | ( | ) |
Retourne la sélection horizontalement, ou l'image entière à défaut de sélection.
| void hmi::PixelCanvas::applyFlipVertical | ( | ) |
Retourne la sélection verticalement, ou l'image entière à défaut de sélection.
|
private |
Applique une transformation pure de hmi::PixelOperations (même signature que flipHorizontal/rotateClockwise…) à effectiveRegion() et la pousse dans l'historique.
| void hmi::PixelCanvas::applyRotateClockwise | ( | ) |
Pivote la sélection d'un quart de tour horaire, ou l'image entière à défaut de sélection.
| void hmi::PixelCanvas::applyRotateCounterClockwise | ( | ) |
Pivote la sélection d'un quart de tour antihoraire, ou l'image entière à défaut de sélection.
|
private |
Applique l'outil actif au pixel (x, y) (un seul point : clic, pipette, pot de peinture) et étend _gestureRegion avec la région effectivement modifiée.
|
inlinenodiscardnoexcept |
|
private |
|
inlinenodiscardoverridevirtual |
Implements hmi::EditContextTarget.
|
inlinenodiscardoverridevirtual |
Implements hmi::EditContextTarget.
|
inlinenodiscardoverridevirtual |
Implements hmi::EditContextTarget.
|
inlinenodiscardoverridevirtual |
Implements hmi::EditContextTarget.
|
private |
Capture beforeSnapshot/`_image` sur touched, pousse l'entrée d'historique nommée si non vide, et émet les signaux de mutation — factorisé entre applyFlipHorizontal/ applyFlipVertical/applyRotateClockwise/applyRotateCounterClockwise/paste.
|
private |
Prolonge le geste courant du dernier point traité jusqu'à (x, y) (pinceau/gomme : ligne sans trou entre deux positions successives, TACHE-02 ; déplacement de sélection, TACHE-06).
|
overridevirtual |
Copie la sélection courante, ou l'image entière à défaut de sélection.
Implements hmi::EditContextTarget.
|
inlinenodiscardnoexcept |
|
signal |
Émis à chaque changement de la couleur courante, quelle qu'en soit la source (pipette, pastille de palette, sélecteur dédié) — la barre d'outils y aligne son témoin de couleur.
|
nodiscardprivatenoexcept |
_currentColor, ramenée à l'entrée de palette la plus proche si le mode contraint est actif (hmi::nearestPaletteColor) ; _currentColor telle quelle sinon.
|
nodiscardprivate |
Région effective d'une transformation : la sélection courante, ou l'image entière si aucune sélection n'est active (TACHE-06 : « à défaut de sélection, à l'image entière »).
|
private |
|
inlinenodiscardnoexcept |
|
signal |
Émis après chaque changement de l'historique (nouvelle entrée, annuler, refaire) — alimente le panneau d'historique visuel (hmi::PixelHistoryPanel).
|
inlinenodiscardnoexcept |
Dernier pixel survolé par la souris à l'intérieur de l'image, ou std::nullopt si la souris n'y est pas (curseur sorti du widget, ou hors de l'image à zoom/décalage donnés).
|
signal |
Émis à chaque changement du pixel survolé (barre d'état, TACHE-04).
|
inlinenodiscardnoexcept |
|
signal |
Émis après chaque mutation de image() (geste, annuler, refaire) — la barre d'état et l'aperçu live (TACHE-08) s'y abonnent plutôt que d'interroger le canevas à chaque frame.
|
nodiscard |
Pixel image sous une position widget donnée (coordonnées logiques), ou std::nullopt hors de l'image — alimente le pixel survolé de la barre d'état (TACHE-04).
|
inlinenodiscardnoexcept |
Modifications non enregistrées depuis l'ouverture/le dernier enregistrement (barre d'état TACHE-04, garde-fou de perte de travail TACHE-05) : un coup de pinceau la marque, un enregistrement (markSaved) la lève.
| void hmi::PixelCanvas::jumpHistoryTo | ( | std::size_t | index | ) |
Revient à l'état immédiatement après l'entrée index de history().appliedEntries() (panneau d'historique visuel, TACHE-04) ; sans effet si index est hors bornes.
|
overrideprotected |
|
inlinenoexcept |
Marque l'image comme enregistrée — appelé après une écriture réussie (TACHE-05).
Ne touche pas à l'historique : annuler après un enregistrement reste possible et remarque « modifié », comme dans tout éditeur (revenir en arrière s'écarte du fichier tout juste écrit).
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
inlinenodiscardnoexcept |
|
overridevirtual |
Colle le presse-papiers de l'atelier au pixel survolé (coin haut-gauche), tronqué au cadre ; sans effet si le presse-papiers est vide.
Sélectionne le contenu collé, pour l'ajuster (déplacer, transformer) immédiatement après.
Implements hmi::EditContextTarget.
|
overridevirtual |
Implements hmi::EditContextTarget.
|
inlinenodiscardnoexcept |
|
nodiscardprivate |
|
inlinenodiscardnoexcept |
Région actuellement sélectionnée (outil Sélection), vide si aucune.
|
inlinenoexcept |
|
inline |
Nom de l'asset ouvert (barre d'état, TACHE-04), vide si aucun.
setImage le remet à vide (nouveau document) ; l'appelant le renseigne ensuite après une ouverture ou un enregistrement réussi (TACHE-05).
| void hmi::PixelCanvas::setCurrentColor | ( | std::uint32_t | color | ) |
Couleur courante (pinceau, pot de peinture).
Point d'entrée unique de la mutation : la pipette (au clic) passe par ici aussi, pour qu'un seul signal (currentColorChanged) couvre toutes les sources — pipette, pastille de palette, sélecteur dédié de la barre d'outils (MainWindow).
| void hmi::PixelCanvas::setImage | ( | DecodedImage | image | ) |
Remplace l'image éditée et réinitialise l'historique local (ouverture d'un asset, TACHE-05).
|
inlinenoexcept |
Catalogue de traduction utilisé pour l'infobulle de case en mode planche à raccords (hmi::autotileConfigurationLabelKey, TACHE-08).
Même patron que GameViewport:: setLocalization.
| void hmi::PixelCanvas::setOverlay | ( | DecodedImage | image, |
| float | opacity = 1.0f ) |
Pose un repère dessiné par-dessus le contenu édité — mêmes règles que setUnderlay.
| image | Image du repère ; vide pour l'enlever. |
| opacity | Opacité d'affichage, dans [0, 1]. |
|
inline |
Couleurs de la palette de projet (LOT-54 TACHE-07), consultées quand le mode contraint est actif.
Simple copie des valeurs : le canevas n'est jamais propriétaire de la palette elle-même (MainWindow/hmi::PixelPalette).
|
inlinenoexcept |
Active/désactive le mode « contraindre à la palette » : toute couleur posée (pinceau, pot de peinture) est ramenée à l'entrée la plus proche de setPaletteColors (hmi:: nearestPaletteColor) ; désactivable à tout moment, jamais imposé.
| void hmi::PixelCanvas::setReferenceGridStep | ( | int | step | ) |
Pose une grille de tuiles, distincte de la grille de pixels existante.
Sur un plan pictural, la grille de pixels ne dit rien de la géométrie du niveau : c'est le pas de tuile qui permet de viser une case. Les deux coexistent, à des pas différents.
| step | Pas de la grille, en pixels image (la densité du plan) ; 0 l'enlève. |
| void hmi::PixelCanvas::setUnderlay | ( | DecodedImage | image, |
| float | opacity = 1.0f ) |
Pose un repère dessiné sous le contenu édité (mode création, EX-EDIT-046).
Trois entrées — celle-ci, setOverlay et setReferenceGridStep — sont optionnelles et additives : l'atelier pixel art qui les ignore se comporte exactement comme avant (LOT-54). Ce qu'elles montrent n'entre jamais dans le tampon édité, ni dans l'historique, ni dans le copier : ce sont des repères, pas du contenu.
La référence est un repère géométrique, pas un aperçu : ni raccords automatiques, ni skins, ni animation. L'aperçu fidèle reste l'essai.
| image | Image du repère, aux dimensions du contenu édité ; vide pour l'enlever. |
| opacity | Opacité d'affichage, dans [0, 1]. |
|
nodiscardoverride |
|
overridevirtual |
Implements hmi::EditContextTarget.
|
inlinenodiscardnoexcept |
|
overrideprotected |
| void hmi::PixelCanvas::zoomIn | ( | ) |
| void hmi::PixelCanvas::zoomOut | ( | ) |
|
private |
|
private |
|
private |
Presse-papiers de l'atelier, distinct du niveau.
|
private |
|
private |
|
private |
|
private |
Copie de _image au début du geste courant.
|
private |
Union des régions touchées depuis le début du geste.
|
private |
|
private |
|
private |
|
private |
|
private |
Pour l'infobulle de case en mode planche (TACHE-08).
|
private |
Repère dessiné par-dessus le contenu édité (setOverlay), mêmes règles.
|
private |
|
private |
Copie des couleurs de la palette (TACHE-07).
|
private |
|
private |
|
private |
|
private |
|
private |
Pas de la grille de tuiles, en pixels image ; 0 si aucune.
|
private |
Sélection courante, vide si aucune.
|
private |
Point de départ d'une nouvelle sélection.
|
private |
true : le geste en cours déplace _selection.
|
private |
Repère dessiné sous le contenu édité (setUnderlay) — jamais dans _image, donc jamais dans l'historique ni dans le presse-papiers.
|
private |
|
private |