JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
MainWindow.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 <QByteArray>
7#include <QHash>
8#include <QMainWindow>
9#include <array>
10#include <filesystem>
11#include <memory>
12#include <optional>
13#include <string>
14
22#include "HMI/Game/GameEvents.h"
27
32
33class QAction;
34class QLabel;
35class QMenu;
36class QStackedWidget;
37class QTimer;
38class QToolBar;
39class QToolButton;
40class QWidget;
41
42namespace Ui {
43class EditorMainWindow;
44}
45
46namespace core {
47class MemoryLogSink;
48}
49
50namespace hmi {
51
52class EditorActions;
53class GameViewport;
54class MainMenu;
55class OptionsPage;
56class PauseScreen;
57class CreditsScreen;
58class RpgScreenHost;
59class PalettePanel;
60class PlanesPanel;
62class LinkPanel;
63class TexturePanel;
64class PixelCanvas;
67
81class MainWindow : public QMainWindow {
82public:
85 explicit MainWindow(core::MemoryLogSink* sessionLog = nullptr);
86 ~MainWindow() override;
87
88protected:
90 void closeEvent(QCloseEvent* event) override;
93 void resizeEvent(QResizeEvent* event) override;
94
95private:
100 void applyWorkspace(EditorWorkspace workspace);
101
104 void switchToWorkspace(EditorWorkspace workspace);
105
108 [[nodiscard]] static QString layoutKeyFor(EditorWorkspace workspace);
112 [[nodiscard]] static QString workspaceSettingsName(EditorWorkspace workspace);
115 [[nodiscard]] static EditorWorkspace workspaceFromSettingsName(const QString& name);
117 [[nodiscard]] QAction* workspaceSelector(EditorWorkspace workspace) const;
118
122 [[nodiscard]] std::array<std::pair<QDockWidget*, hmi::PanelId>, hmi::PANEL_COUNT>
123 workspacePanels() const;
124
125protected:
126 void moveEvent(QMoveEvent* event) override;
130 bool eventFilter(QObject* watched, QEvent* event) override;
131
132private:
134 void connectPlanesPanel();
136 [[nodiscard]] std::filesystem::path planesDirectory() const;
139 void createPlane();
142 void changePlaneDensity(std::size_t index, int pixelsPerUnit);
143
145 void buildUi();
146 void restoreLayout();
147 void saveLayout();
150 void openResizeDialog();
151
155 void openShortcutsDialog();
156
158 void retranslateUi();
163 void refreshStatusHelp();
168 void showTransientStatusMessage(const QString& message, int timeoutMs);
178 void raisePanel(hmi::PanelId panel);
182 void updateActiveEditContext(QWidget* focused);
183
184 // Atelier pixel art : ouvrir/créer/enregistrer (LOT-54 TACHE-05).
187 [[nodiscard]] bool confirmDiscardPixelChanges();
197 void savePixelAsset(bool saveAs);
198
199 // Aperçu live et mode planche à raccords (LOT-54 TACHE-08).
204 [[nodiscard]] std::string pixelAssetCacheKey() const;
208 void updateLivePreview();
209
210 // Mode création : peinture d'un plan pictural dans le canevas (LOT-69 TACHE-08).
215 void loadPlaneIntoCanvas(std::size_t index);
218 void savePlaneImage();
221 void closePlaneInCanvas();
228 [[nodiscard]] bool confirmDiscardPlaneChanges();
230 [[nodiscard]] std::filesystem::path planeFilePath(std::size_t index) const;
231
238 void updatePixelColorButtonIcon(std::uint32_t color);
239
240 // Palette de projet (LOT-54 TACHE-07).
244 void syncPaletteToCanvas();
246 void savePixelPalette();
248 void changeLanguage(const QString& code);
250 void saveSessionLogs();
252 [[nodiscard]] QString text(const char* key) const;
253
255 void showEditor();
257 void setDocksVisible(bool visible);
258
259 // Invariant de taille des écrans (`LOT-73`, `EX-IHM-080`).
260
261 // Écran de pause (LOT-59 TACHE-02).
262
265 void playInterfaceSound(GameEvent event);
266
267 std::unique_ptr<Ui::EditorMainWindow> _ui;
279 nullptr;
300 std::filesystem::path _pixelAssetPath;
305 std::optional<std::size_t> _paintedPlane;
311 bool _closing = false;
313 QToolBar* _toolBar;
314 QToolBar* _pixelToolBar;
315 QToolButton* _pixelColorButton =
316 nullptr;
317 QMenu* _pixelMenu =
318 nullptr;
319 QMenu* _themeMenu;
323 QByteArray _defaultState;
324
325 // Regroupement des panneaux de droite en onglets, suivant l'outil actif (LOT-57 TACHE-02).
326 QAction* _actFollowActiveTool = nullptr;
329 bool _userPickedTab = false;
330
331 // Mode d'inspection par calque, déplacé du panneau Textures vers le menu Affichage
332 // (LOT-57 TACHE-03) : une entrée cochable par calque, dans l'ordre de dessin, plus « tout
333 // afficher ».
334 std::array<QAction*, 7> _layerVisibilityActions{};
335 QAction* _actShowAllLayers = nullptr;
340
341 // Barre d'état structurée (LOT-57 TACHE-01) : zones permanentes (widgets ajoutés via
342 // addPermanentWidget, jamais recouvertes par un message transitoire), dans l'ordre décidé par
343 // hmi::editorStatusLines.
344 QLabel* _statusLevel = nullptr;
345 QLabel* _statusDirty = nullptr;
346 QLabel* _statusTool = nullptr;
347 QLabel* _statusHover = nullptr;
348 QLabel* _statusZoom = nullptr;
350 QLabel* _statusColor = nullptr;
353 QLabel* _statusCameraFraming = nullptr;
356 QTimer* _statusMessageTimer = nullptr;
357
367};
368
369} // namespace hmi
Socle de lecture audio : enveloppe fine autour de QSoundEffect (EX-REN-047).
Cible des commandes Annuler/Refaire/Copier/Coller, indépendante du contexte d'édition qui les impléme...
Outil actif dans la grille de l'éditeur (LOT-15, EX-EDIT-014).
Espaces de travail exclusifs de l'éditeur (LOT-68, EX-IHM-073).
Détection pure des transitions d'état du jeu et de l'IHM (EX-REN-047, LOT-60).
Sondage XInput de la manette, fusionné dans un InputState (réutilisable).
État des entrées clavier/souris/manette échantillonné une fois par frame.
Catalogue de traduction : résolution des textes d'interface par clé et par langue.
Correspondance outil actif → panneau à mettre en avant (LOT-57 TACHE-02, EX-IHM-061).
Palette de projet persistée, extraction depuis un asset et contrainte de couleur (LOT-54 TACHE-07,...
Outil actif du canevas pixel art (LOT-54 TACHE-03/TACHE-04).
Association nom logique d'événement → fichier de son (EX-REN-047).
Sink de test : mémorise les messages reçus pour inspection.
Definition MemoryLogSink.h:21
Lecture d'échantillons courts à faible latence, avec volume global et repli muet.
Definition AudioEngine.h:36
Interface pure implémentée par le contexte d'édition actif.
Definition EditContextTarget.h:24
Construit et possède les QAction du catalogue (HMI/Interface/ActionCatalog.h) : chaque outil et chaqu...
Definition EditorActions.h:35
Widget de rendu (QRhiWidget) où la scène est dessinée, composé avec le reste de l'interface.
Definition GameViewport.h:81
Panneau de gestion des niveaux : liste filtrable + créer/renommer/dupliquer/supprimer.
Definition LevelBrowserPanel.h:38
Vue tabulaire des liaisons (Mechanism) du brouillon courant (EX-IHM-031).
Definition LinkPanel.h:46
Catalogue de traduction (i18n) : associe des clés stables à des chaînes selon la langue active,...
Definition Localization.h:29
QLabel * _statusLevel
Definition MainWindow.h:344
QAction * workspaceSelector(EditorWorkspace workspace) const
Definition MainWindow.cpp:1444
QLabel * _statusTool
Definition MainWindow.h:346
std::filesystem::path planeFilePath(std::size_t index) const
Definition MainWindow.cpp:666
void openShortcutsDialog()
Ouvre l'aperçu des raccourcis (ShortcutsDialog.ui).
Definition MainWindow.cpp:1378
std::string pixelAssetCacheKey() const
Nom logique de l'asset ouvert, relatif à Assets/ (ex.
Definition MainWindow.cpp:1754
void resizeEvent(QResizeEvent *event) override
Repris de QMainWindow.
Definition MainWindow.cpp:836
void retranslateUi()
Applique la langue active à tous les textes de l'IHM (fenêtre, menus, docks, panneaux).
Definition MainWindow.cpp:1977
GameViewport * _viewport
Surface de rendu QRhi, et widget central depuis le LOT-86.
Definition MainWindow.h:271
QString text(const char *key) const
Raccourci : texte localisé d'une clé, en QString.
Definition MainWindow.cpp:1610
LinkPanel * _links
Placement/inspection de décors (dock Décors, LOT-57 amendement) — contenait déjà tout ce qui concerne...
Definition MainWindow.h:285
QAction * _themeDarkAction
Definition MainWindow.h:322
void openPixelColorPicker()
Ouvre un sélecteur de couleur (QColorDialog) pour choisir librement la couleur courante du canevas — ...
Definition MainWindow.cpp:1786
void playInterfaceSound(GameEvent event)
Joue le son associé à event (hmi::SoundTriggers), sans effet si aucun son ne lui est associé (LOT-60 ...
Definition MainWindow.cpp:852
void buildUi()
Crée les panneaux (contenu des docks du .ui) et branche les actions de la barre de menus.
Definition MainWindow.cpp:866
bool eventFilter(QObject *watched, QEvent *event) override
Suit la taille du viewport pour les recouvrements qui s'y superposent (pause, fin de niveau) : enfant...
Definition MainWindow.cpp:844
QTimer * _statusMessageTimer
Restaure l'aide contextuelle à l'expiration d'un message transitoire (showTransientStatusMessage).
Definition MainWindow.h:356
QAction * _themeLightAction
Definition MainWindow.h:321
bool _userPickedTab
true dès que l'utilisateur a choisi un onglet ou déplacé un panneau lui-même : la mise en avant autom...
Definition MainWindow.h:329
QLabel * _statusColor
Couleur courante de l'atelier pixel art (LOT-54 TACHE-04) ; vide hors contexte d'atelier.
Definition MainWindow.h:350
QToolBar * _pixelToolBar
Barre d'outils du canevas pixel art (LOT-54 TACHE-04).
Definition MainWindow.h:314
void saveLayout()
Definition MainWindow.cpp:1596
void updatePixelColorButtonIcon(std::uint32_t color)
Met à jour le témoin de couleur de la barre d'outils du canevas (pastille de _pixelColorButton).
Definition MainWindow.cpp:1777
core::MemoryLogSink * _sessionLog
Sink mémoire des logs (nul en Release).
Definition MainWindow.h:366
std::optional< std::size_t > _paintedPlane
Rang du plan actuellement peint dans _pixelCanvas (mode création, LOT-69 TACHE-08) ; absent dès que l...
Definition MainWindow.h:305
static QString workspaceSettingsName(EditorWorkspace workspace)
Definition MainWindow.cpp:1422
TexturePanel * _textures
Habillage : jeu de skins et assignations (dock Textures, LOT-42).
Definition MainWindow.h:286
void savePlaneImage()
Écrit l'image du canevas dans le PNG du plan ouvert (Ctrl+S dans l'espace « Plans »).
Definition MainWindow.cpp:795
void switchToWorkspace(EditorWorkspace workspace)
Bascule sur workspace s'il n'est pas déjà actif, en synchronisant le sélecteur du menu sans réémettre...
Definition MainWindow.cpp:1456
Localization _loc
Catalogue de traduction (i18n), source de tous les textes.
Definition MainWindow.h:358
QAction * _actFollowActiveTool
Réglage persisté (menu Affichage).
Definition MainWindow.h:326
QAction * _actShowAllLayers
Definition MainWindow.h:335
void savePixelAsset(bool saveAs)
Enregistre l'asset ouvert.
Definition MainWindow.cpp:1909
void changePlaneDensity(std::size_t index, int pixelsPerUnit)
Change la densité d'un plan : rééchantillonne l'image puis met à jour la déclaration,...
Definition MainWindow.cpp:633
void closeEvent(QCloseEvent *event) override
Sauvegarde la disposition avant fermeture.
Definition MainWindow.cpp:1602
QLabel * _statusHover
Definition MainWindow.h:347
std::array< std::pair< QDockWidget *, hmi::PanelId >, hmi::PANEL_COUNT > workspacePanels() const
Definition MainWindow.cpp:509
void updateLivePreview()
Écrit l'image en cours sur _pixelAssetPath et invalide son entrée de TextureCache,...
Definition MainWindow.cpp:1765
void showTransientStatusMessage(const QString &message, int timeoutMs)
Affiche message pour timeoutMs dans la barre d'état, puis restaure l'aide contextuelle (refreshStatus...
Definition MainWindow.cpp:1673
void raisePanel(hmi::PanelId panel)
Met en avant panel (résolution PanelId -> QDockWidget*), sans jamais voler le focus clavier — factori...
Definition MainWindow.cpp:1703
void applyPanelFocus(hmi::EditorTool tool)
Met en avant le panneau associé à tool (hmi::panelForTool), si le réglage est actif et que l'utilisat...
Definition MainWindow.cpp:1681
hmi::AudioEngine _audio
Moteur audio (LOT-60) : ouvert au démarrage (EX-REN-047), dégrade en silence sans périphérique (EX-NF...
Definition MainWindow.h:362
PixelCanvas * _pixelCanvas
Réglages de gameplay de l'élément sélectionné et du tableau (dock Propriétés, LOT-67).
Definition MainWindow.h:290
void showEditor()
Affiche l'éditeur (viewport + docks + barre de menu).
Definition MainWindow.cpp:858
MainWindow(core::MemoryLogSink *sessionLog=nullptr)
Definition MainWindow.cpp:126
std::filesystem::path _pixelAssetPath
Chemin complet du fichier de l'asset ouvert dans l'atelier, vide si aucun ou pas encore enregistré (L...
Definition MainWindow.h:300
QMenu * _pixelMenu
Menu « Atelier » : ouvrir/créer/enregistrer (LOT-54 TACHE-05).
Definition MainWindow.h:317
void applyPixelPanelFocus(hmi::PixelTool tool)
Équivalent pour les outils du canevas pixel art (hmi::panelForPixelTool, LOT-54 TACHE-04) — même gard...
Definition MainWindow.cpp:1692
void openPixelAssetOpenDialog()
Ouvre un asset existant choisi par l'utilisateur (bibliothèque Assets/), après le garde-fou de perte ...
Definition MainWindow.cpp:1803
void moveEvent(QMoveEvent *event) override
Definition MainWindow.cpp:840
~MainWindow() override
void connectPlanesPanel()
Branche le panneau « Plans » (LOT-69 TACHE-08) : il demande, le viewport applique.
Definition MainWindow.cpp:525
void syncPaletteToCanvas()
Recopie les couleurs de _pixelPalette vers _pixelCanvas (mode contraint) — à appeler après toute muta...
Definition MainWindow.cpp:1962
void applyWorkspace(EditorWorkspace workspace)
Applique l'espace de travail workspace (LOT-68, EX-IHM-073) : masque les panneaux de l'autre espace,...
Definition MainWindow.cpp:1509
QByteArray _defaultState
Disposition par défaut (pour « Réinitialiser la disposition »).
Definition MainWindow.h:323
EditorActions * _actions
Outils et commandes principales, barre d'outils (LOT-56 TACHE-04).
Definition MainWindow.h:307
PixelPalettePanel * _pixelPalettePanel
Édition de la palette de projet (dock, LOT-54 TACHE-07).
Definition MainWindow.h:294
LevelBrowserPanel * _levels
Liste/gestion des fichiers de niveaux (contenu du dock Niveaux).
Definition MainWindow.h:281
bool confirmDiscardPixelChanges()
Definition MainWindow.cpp:1743
QLabel * _statusDirty
Definition MainWindow.h:345
static QString layoutKeyFor(EditorWorkspace workspace)
Definition MainWindow.cpp:1407
QLabel * _statusZoom
Definition MainWindow.h:348
QToolBar * _toolBar
Barre d'outils de l'éditeur, alimentée par _actions.
Definition MainWindow.h:313
QToolButton * _pixelColorButton
Témoin + sélecteur de couleur courante (canevas).
Definition MainWindow.h:315
EditorWorkspace _workspace
Definition MainWindow.h:312
void openResizeDialog()
Ouvre la boîte de dialogue de redimensionnement du niveau (avec confirmation si destructeur).
Definition MainWindow.cpp:1348
std::unique_ptr< Ui::EditorMainWindow > _ui
Mise en page (MainWindow.ui : menubar + docks).
Definition MainWindow.h:267
static EditorWorkspace workspaceFromSettingsName(const QString &name)
Definition MainWindow.cpp:1434
QAction * _themeSystemAction
Definition MainWindow.h:320
void changeLanguage(const QString &code)
Change la langue active (recharge le catalogue, persiste, retraduit tout).
Definition MainWindow.cpp:2036
void createPlane()
Crée un plan : un PNG entièrement transparent aux dimensions exactes, puis l'entrée dans le brouillon...
Definition MainWindow.cpp:593
void savePixelPalette()
Enregistre _pixelPalette dans Assets/palettes.json, journalise un échec éventuel.
Definition MainWindow.cpp:1971
hmi::SoundCatalog _sounds
Catalogue de sons (LOT-60 TACHE-02), lu une fois au démarrage depuis Audio/sounds....
Definition MainWindow.h:365
EditContextTarget * _editContext
Contexte d'édition actif, cible d'Annuler/Refaire/Copier/Coller (LOT-57 TACHE-04) : _viewport (nivea...
Definition MainWindow.h:276
void refreshStatusHelp()
Recalcule et réaffiche la barre d'état (zones permanentes + aide contextuelle) depuis l'état courant ...
Definition MainWindow.cpp:1614
bool _closing
Espace de travail actif (LOT-68).
Definition MainWindow.h:311
QLabel * _statusCameraFraming
Mode de cadrage de caméra du niveau courant (EX-EDIT-028, LOT-64) ; vide hors contexte de niveau.
Definition MainWindow.h:353
void saveSessionLogs()
Enregistre les journaux de session accumulés dans un fichier horodaté.
Definition MainWindow.cpp:2049
void openPixelAssetCreateDialog()
Crée un nouvel asset à une taille choisie parmi celles admises par le contrat de sa famille (hmi::val...
Definition MainWindow.cpp:1826
void setDocksVisible(bool visible)
Montre/masque tous les panneaux dockables.
Definition MainWindow.cpp:491
PlanesPanel * _planes
Liste des plans picturaux (LOT-69, contenu du dock Plans).
Definition MainWindow.h:278
PixelHistoryPanel * _pixelHistoryPanel
Historique visuel de l'atelier (dock, LOT-54 TACHE-04).
Definition MainWindow.h:292
void closePlaneInCanvas()
Vide le canevas de son plan et retire les repères — l'atelier pixel art retrouve alors son comporteme...
Definition MainWindow.cpp:780
void refreshPlaneReferences()
Reconstruit les repères du plan ouvert depuis le brouillon courant : appelé après toute mutation qui ...
Definition MainWindow.cpp:715
QMenu * _themeMenu
Sous-menu Affichage > Thème (LOT-56 TACHE-06).
Definition MainWindow.h:319
void loadPlaneIntoCanvas(std::size_t index)
Charge le PNG du plan index dans _pixelCanvas, avec ses repères (pelure d'oignon des tuiles sous le p...
Definition MainWindow.cpp:674
PixelPalette _pixelPalette
Palette de projet, chargée/enregistrée dans Assets/palettes.json.
Definition MainWindow.h:296
std::filesystem::path planesDirectory() const
Definition MainWindow.cpp:589
void updateActiveEditContext(QWidget *focused)
Réassigne le contexte d'édition actif (_editContext) et le contexte de la barre d'état selon le widge...
Definition MainWindow.cpp:1729
void restoreLayout()
Definition MainWindow.cpp:1556
PalettePanel * _palette
Arbre de sélection du type de tuile (contenu du dock Palette).
Definition MainWindow.h:277
bool confirmDiscardPlaneChanges()
Definition MainWindow.cpp:819
bool _suppressPanelFocusTracking
true pendant un changement de visibilité provoqué par le code (mise en avant automatique,...
Definition MainWindow.h:339
std::array< QAction *, 7 > _layerVisibilityActions
Definition MainWindow.h:334
Palette de tuiles en arbre (QTreeView) : catégories → sous-groupes → tuiles.
Definition PalettePanel.h:44
Widget affichant l'image en cours d'édition et transformant les gestes de souris en appels aux opérat...
Definition PixelCanvas.h:62
Liste ordonnée des opérations nommées de l'historique du canevas pixel art actif.
Definition PixelHistoryPanel.h:36
Liste éditable de la palette de projet (hmi::PixelPalette), avec le réglage « contraindre à la palett...
Definition PixelPalettePanel.h:41
Palette de couleurs nommées du projet, lue/écrite dans Assets/palettes.json.
Definition PixelPalette.h:44
Liste ordonnée des plans d'un niveau, avec leurs réglages.
Definition PlanesPanel.h:51
Catalogue des sons : nom d'événement → fichier (relatif à Source/Elements/Audio/).
Definition SoundCatalog.h:49
Panneau d'habillage, organisé en sections extensibles (EX-EDIT-042, EX-EDIT-024).
Definition TexturePanel.h:68
Definition AssetThumbnailView.h:26
Espace de noms du moteur et de la logique de jeu.
Definition Bootstrap.h:9
Definition AudioEngine.cpp:15
EditorTool
Outil actif dans la grille de l'éditeur, changé via Tab ou la barre d'outils (hmi::EditorActions).
Definition EditorTool.h:35
GameEvent
Événement discret survenu sur un pas de simulation ou une action d'interface.
Definition GameEvents.h:28
PixelTool
Outil actif du canevas pixel art — détermine ce que produisent les gestes de souris (hmi::PixelCanvas...
Definition PixelTool.h:22
PanelId
Panneau dockable de l'éditeur.
Definition PanelFocus.h:28
constexpr std::size_t PANEL_COUNT
Nombre de panneaux, declare au plus pres de l'enumeration qu'il compte.
Definition PanelFocus.h:45
EditorWorkspace
Espace de travail actif. Ils s'excluent : aucun état intermédiaire n'existe.
Definition EditorWorkspace.h:34
@ Level
Édition de niveau.
Definition EditorWorkspace.h:35