JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
PixelCanvas.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Valentin Eloy
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <QPointF>
7#include <QSize>
8#include <QWidget>
9#include <cstdint>
10#include <optional>
11#include <string>
12#include <utility>
13#include <vector>
14
21
22class QEvent;
23class QMouseEvent;
24class QPaintEvent;
25class QPixmap;
26class QWheelEvent;
27
28namespace hmi {
29class Localization;
30} // namespace hmi
31
37
38namespace hmi {
39
62class PixelCanvas : public QWidget, public EditContextTarget {
63 Q_OBJECT
64
65public:
66 explicit PixelCanvas(QWidget* parent = nullptr);
67
71 void setLocalization(const Localization* loc) noexcept {
72 _loc = loc;
73 }
74
77
91 void setUnderlay(DecodedImage image, float opacity = 1.0f);
92
99 void setOverlay(DecodedImage image, float opacity = 1.0f);
100
108 void setReferenceGridStep(int step);
109 [[nodiscard]] const DecodedImage& image() const noexcept {
110 return _image;
111 }
112
116 void setAssetName(std::string name) {
117 _assetName = std::move(name);
118 }
119 [[nodiscard]] const std::string& assetName() const noexcept {
120 return _assetName;
121 }
122
125 [[nodiscard]] bool isDirty() const noexcept {
126 return _dirty;
127 }
128
131 void markSaved() noexcept {
132 _dirty = false;
133 }
134
135 void setActiveTool(PixelTool tool) noexcept {
136 _activeTool = tool;
137 }
138 [[nodiscard]] PixelTool activeTool() const noexcept {
139 return _activeTool;
140 }
141
146 void setCurrentColor(std::uint32_t color);
147 [[nodiscard]] std::uint32_t currentColor() const noexcept {
148 return _currentColor;
149 }
150
154 void setPaletteColors(std::vector<std::uint32_t> colors) {
155 _paletteColors = std::move(colors);
156 }
157
160 void setPaletteConstrained(bool enabled) noexcept {
161 _paletteConstrained = enabled;
162 }
163 [[nodiscard]] bool paletteConstrained() const noexcept {
164 return _paletteConstrained;
165 }
166
167 [[nodiscard]] const PixelHistory& history() const noexcept {
168 return _history;
169 }
170
171 // hmi::EditContextTarget (TACHE-04/TACHE-06) : Annuler/Refaire/Copier/Coller à cible
172 // contextuelle (EX-IHM-062).
173 [[nodiscard]] bool canUndo() const override {
174 return _history.canUndo();
175 }
176 void undo() override;
177 [[nodiscard]] bool canRedo() const override {
178 return _history.canRedo();
179 }
180 void redo() override;
183 void jumpHistoryTo(std::size_t index);
184 [[nodiscard]] bool canCopy() const override {
185 return _image.width > 0 && _image.height > 0;
186 }
187
188 void copy() override;
189 [[nodiscard]] bool canPaste() const override {
190 return !_clipboard.empty();
191 }
192
195 void paste() override;
196
198 [[nodiscard]] int referenceGridStep() const noexcept {
199 return _referenceGridStep;
200 }
201
203 [[nodiscard]] const PixelRegion& selection() const noexcept {
204 return _selection;
205 }
206
207 void applyFlipHorizontal();
209 void applyFlipVertical();
215
216 [[nodiscard]] const PixelCanvasView& view() const noexcept {
217 return _view;
218 }
219 void zoomIn();
220 void zoomOut();
221
224 [[nodiscard]] std::optional<std::pair<int, int>> imagePixelAt(
225 const QPointF& widgetPosition) const;
228 [[nodiscard]] std::optional<std::pair<int, int>> hoveredPixel() const noexcept {
229 return _hoveredPixel;
230 }
231
232 [[nodiscard]] QSize sizeHint() const override;
233
234signals:
242 void hoveredPixelChanged(std::optional<std::pair<int, int>> pixel);
245 void currentColorChanged(std::uint32_t color);
246
247protected:
248 void paintEvent(QPaintEvent* event) override;
249 void mousePressEvent(QMouseEvent* event) override;
250 void mouseMoveEvent(QMouseEvent* event) override;
251 void mouseReleaseEvent(QMouseEvent* event) override;
252 void leaveEvent(QEvent* event) override;
253 void wheelEvent(QWheelEvent* event) override;
254
255private:
256 [[nodiscard]] QPixmap renderPixmap() const;
257
260 void applyToolAtPoint(int x, int y);
263 void continueToolTo(int x, int y);
264 void beginGesture(int x, int y);
265 void endGesture();
266
269 [[nodiscard]] PixelRegion effectiveRegion() const;
273 void commitRegionMutation(PixelOperationKind kind, const DecodedImage& beforeSnapshot,
274 const PixelRegion& touched);
278 PixelRegion (*operation)(DecodedImage&, const PixelRegion&));
281 [[nodiscard]] std::uint32_t effectivePaintColor() const noexcept;
282
287 float _underlayOpacity = 1.0f;
290 float _overlayOpacity = 1.0f;
293 std::string _assetName;
294 bool _dirty = false;
298 std::uint32_t _currentColor = 0xFF000000u; // noir opaque (R8G8B8A8_UNORM, LOT-54 TACHE-01).
299 std::vector<std::uint32_t> _paletteColors;
301
302 bool _gestureActive = false;
305 std::optional<std::pair<int, int>> _lastGesturePixel;
306 std::optional<std::pair<int, int>> _hoveredPixel;
307
308 // Outils de région (LOT-54 TACHE-06).
311 bool _selectionMoveActive = false;
312 std::pair<int, int> _selectionDragAnchor{0, 0};
313
314 bool _panning = false;
317
318 const Localization* _loc = nullptr;
319};
320
321} // namespace hmi
Cible des commandes Annuler/Refaire/Copier/Coller, indépendante du contexte d'édition qui les impléme...
Conversions pures vue ↔ image du canevas pixel art (LOT-54 TACHE-03, EX-EDIT-045).
Historique nommé, annulation et rétablissement du canevas pixel art (LOT-54 TACHE-02).
Opérations pures sur un tampon de pixels RGBA (atelier pixel art, LOT-54 TACHE-02).
Outil actif du canevas pixel art (LOT-54 TACHE-03/TACHE-04).
Chargement de textures GPU depuis des fichiers image (EX-REN-041), au travers de QRhi.
Interface pure implémentée par le contexte d'édition actif.
Definition EditContextTarget.h:24
Catalogue de traduction (i18n) : associe des clés stables à des chaînes selon la langue active,...
Definition Localization.h:29
const PixelRegion & selection() const noexcept
Région actuellement sélectionnée (outil Sélection), vide si aucune.
Definition PixelCanvas.h:203
bool isDirty() const noexcept
Modifications non enregistrées depuis l'ouverture/le dernier enregistrement (barre d'état TACHE-04,...
Definition PixelCanvas.h:125
void applyToolAtPoint(int x, int y)
Applique l'outil actif au pixel (x, y) (un seul point : clic, pipette, pot de peinture) et étend _ges...
Definition PixelCanvas.cpp:169
void setReferenceGridStep(int step)
Pose une grille de tuiles, distincte de la grille de pixels existante.
Definition PixelCanvas.cpp:451
DecodedImage _underlay
Repère dessiné sous le contenu édité (setUnderlay) — jamais dans _image, donc jamais dans l'historiqu...
Definition PixelCanvas.h:286
PixelHistory _history
Definition PixelCanvas.h:295
PixelRegion _gestureRegion
Union des régions touchées depuis le début du geste.
Definition PixelCanvas.h:304
void undo() override
Definition PixelCanvas.cpp:110
PixelTool _activeTool
Definition PixelCanvas.h:297
void hoveredPixelChanged(std::optional< std::pair< int, int > > pixel)
Émis à chaque changement du pixel survolé (barre d'état, TACHE-04).
bool canPaste() const override
Definition PixelCanvas.h:189
void zoomOut()
Definition PixelCanvas.cpp:152
void leaveEvent(QEvent *event) override
Definition PixelCanvas.cpp:408
std::uint32_t currentColor() const noexcept
Definition PixelCanvas.h:147
PixelCanvasView _view
Definition PixelCanvas.h:296
int referenceGridStep() const noexcept
Definition PixelCanvas.h:198
void mouseMoveEvent(QMouseEvent *event) override
Definition PixelCanvas.cpp:367
bool paletteConstrained() const noexcept
Definition PixelCanvas.h:163
bool _selectionMoveActive
true : le geste en cours déplace _selection.
Definition PixelCanvas.h:311
const DecodedImage & image() const noexcept
Definition PixelCanvas.h:109
float _overlayOpacity
Definition PixelCanvas.h:290
void applyRotateCounterClockwise()
Pivote la sélection d'un quart de tour antihoraire, ou l'image entière à défaut de sélection.
Definition PixelCanvas.cpp:325
void setImage(DecodedImage image)
Remplace l'image éditée et réinitialise l'historique local (ouverture d'un asset, TACHE-05).
Definition PixelCanvas.cpp:87
PixelTool activeTool() const noexcept
Definition PixelCanvas.h:138
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.
Definition PixelCanvas.h:154
std::optional< std::pair< int, int > > _hoveredPixel
Definition PixelCanvas.h:306
void jumpHistoryTo(std::size_t index)
Revient à l'état immédiatement après l'entrée index de history().appliedEntries() (panneau d'historiq...
Definition PixelCanvas.cpp:128
float _underlayOpacity
Definition PixelCanvas.h:287
const Localization * _loc
Pour l'infobulle de case en mode planche (TACHE-08).
Definition PixelCanvas.h:318
void mouseReleaseEvent(QMouseEvent *event) override
Definition PixelCanvas.cpp:416
void applyRegionOperation(PixelOperationKind kind, PixelRegion(*operation)(DecodedImage &, const PixelRegion &))
Applique une transformation pure de hmi::PixelOperations (même signature que flipHorizontal/rotateClo...
Definition PixelCanvas.cpp:301
QSize sizeHint() const override
Definition PixelCanvas.cpp:163
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 —...
Definition PixelCanvas.cpp:158
void redo() override
Definition PixelCanvas.cpp:119
void historyChanged()
Émis après chaque changement de l'historique (nouvelle entrée, annuler, refaire) — alimente le pannea...
QPointF _panStartWidgetPos
Definition PixelCanvas.h:315
int _referenceGridStep
Pas de la grille de tuiles, en pixels image ; 0 si aucune.
Definition PixelCanvas.h:292
DecodedImage _image
Definition PixelCanvas.h:283
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 pa...
Definition PixelCanvas.h:228
void beginGesture(int x, int y)
Definition PixelCanvas.cpp:244
bool _gestureActive
Definition PixelCanvas.h:302
void markSaved() noexcept
Marque l'image comme enregistrée — appelé après une écriture réussie (TACHE-05).
Definition PixelCanvas.h:131
const PixelHistory & history() const noexcept
Definition PixelCanvas.h:167
bool canCopy() const override
Definition PixelCanvas.h:184
void imageChanged()
Émis après chaque mutation de image() (geste, annuler, refaire) — la barre d'état et l'aperçu live (T...
void currentColorChanged(std::uint32_t color)
Émis à chaque changement de la couleur courante, quelle qu'en soit la source (pipette,...
std::string _assetName
Definition PixelCanvas.h:293
DecodedImage _overlay
Repère dessiné par-dessus le contenu édité (setOverlay), mêmes règles.
Definition PixelCanvas.h:289
PixelCanvasView _panStartView
Definition PixelCanvas.h:316
void zoomIn()
Definition PixelCanvas.cpp:146
void wheelEvent(QWheelEvent *event) override
Definition PixelCanvas.cpp:429
bool _dirty
Definition PixelCanvas.h:294
void continueToolTo(int x, int y)
Prolonge le geste courant du dernier point traité jusqu'à (x, y) (pinceau/gomme : ligne sans trou ent...
Definition PixelCanvas.cpp:208
void applyFlipVertical()
Retourne la sélection verticalement, ou l'image entière à défaut de sélection.
Definition PixelCanvas.cpp:317
std::vector< std::uint32_t > _paletteColors
Copie des couleurs de la palette (TACHE-07).
Definition PixelCanvas.h:299
void copy() override
Copie la sélection courante, ou l'image entière à défaut de sélection.
Definition PixelCanvas.cpp:329
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,...
Definition PixelCanvas.cpp:287
DecodedImage _gestureBeforeSnapshot
Copie de _image au début du geste courant.
Definition PixelCanvas.h:303
PixelClipboard _clipboard
Presse-papiers de l'atelier, distinct du niveau.
Definition PixelCanvas.h:310
QPixmap renderPixmap() const
Definition PixelCanvas.cpp:456
const PixelCanvasView & view() const noexcept
Definition PixelCanvas.h:216
bool _panning
Definition PixelCanvas.h:314
void setLocalization(const Localization *loc) noexcept
Catalogue de traduction utilisé pour l'infobulle de case en mode planche à raccords (hmi::autotileCon...
Definition PixelCanvas.h:71
void paintEvent(QPaintEvent *event) override
Definition PixelCanvas.cpp:599
void endGesture()
Definition PixelCanvas.cpp:253
void setActiveTool(PixelTool tool) noexcept
Definition PixelCanvas.h:135
void setAssetName(std::string name)
Nom de l'asset ouvert (barre d'état, TACHE-04), vide si aucun.
Definition PixelCanvas.h:116
std::pair< int, int > _selectionDragAnchor
Point de départ d'une nouvelle sélection.
Definition PixelCanvas.h:312
void paste() override
Colle le presse-papiers de l'atelier au pixel survolé (coin haut-gauche), tronqué au cadre ; sans eff...
Definition PixelCanvas.cpp:334
void setUnderlay(DecodedImage image, float opacity=1.0f)
Pose un repère dessiné sous le contenu édité (mode création, EX-EDIT-046).
Definition PixelCanvas.cpp:439
PixelRegion _selection
Sélection courante, vide si aucune.
Definition PixelCanvas.h:309
std::optional< std::pair< int, int > > _lastGesturePixel
Definition PixelCanvas.h:305
void applyFlipHorizontal()
Retourne la sélection horizontalement, ou l'image entière à défaut de sélection.
Definition PixelCanvas.cpp:313
PixelCanvas(QWidget *parent=nullptr)
Definition PixelCanvas.cpp:73
void setPaletteConstrained(bool enabled) noexcept
Active/désactive le mode « contraindre à la palette » : toute couleur posée (pinceau,...
Definition PixelCanvas.h:160
std::uint32_t _currentColor
Definition PixelCanvas.h:298
void setOverlay(DecodedImage image, float opacity=1.0f)
Pose un repère dessiné par-dessus le contenu édité — mêmes règles que setUnderlay.
Definition PixelCanvas.cpp:445
const std::string & assetName() const noexcept
Definition PixelCanvas.h:119
std::uint32_t effectivePaintColor() const noexcept
_currentColor, ramenée à l'entrée de palette la plus proche si le mode contraint est actif (hmi::near...
Definition PixelCanvas.cpp:270
bool _paletteConstrained
Definition PixelCanvas.h:300
bool canUndo() const override
Definition PixelCanvas.h:173
bool canRedo() const override
Definition PixelCanvas.h:177
void mousePressEvent(QMouseEvent *event) override
Definition PixelCanvas.cpp:349
void setCurrentColor(std::uint32_t color)
Couleur courante (pinceau, pot de peinture).
Definition PixelCanvas.cpp:137
PixelRegion effectiveRegion() const
Région effective d'une transformation : la sélection courante, ou l'image entière si aucune sélection...
Definition PixelCanvas.cpp:277
void applyRotateClockwise()
Pivote la sélection d'un quart de tour horaire, ou l'image entière à défaut de sélection.
Definition PixelCanvas.cpp:321
Pile d'annulation/rétablissement nommée d'un canevas pixel art.
Definition PixelHistory.h:72
Definition AudioEngine.cpp:15
PixelOperationKind
Type d'une opération d'historique — détermine sa clé de traduction (EX-REN-033).
Definition PixelHistory.h:30
@ Brush
Definition PixelHistory.h:31
PixelTool
Outil actif du canevas pixel art — détermine ce que produisent les gestes de souris (hmi::PixelCanvas...
Definition PixelTool.h:22
Pixels RGBA décodés d'un fichier image, alpha non prémultiplié (cohérent avec le mélange du pipeline ...
Definition TextureLoader.h:27
État de la vue du canevas : zoom entier et décalage de défilement, en pixels image.
Definition PixelCanvasGeometry.h:33
Contenu copié depuis un tampon (presse-papiers de l'atelier, LOT-54 TACHE-06).
Definition PixelOperations.h:191
Rectangle de pixels modifié par une opération (bornes incluses).
Definition PixelOperations.h:29