From 089d90c9cb2e592478d43406d97b34f1ed85fd73 Mon Sep 17 00:00:00 2001 From: garak Date: Wed, 19 Feb 2025 16:39:29 -0500 Subject: [PATCH] update tile & metatile usage counts automatically when painting --- include/ui/eventfilters.h | 13 +++++++++++++ include/ui/tileseteditor.h | 1 + src/ui/eventfilters.cpp | 9 +++++++++ src/ui/tileseteditor.cpp | 22 +++++++++++++++++++++- src/ui/tileseteditortileselector.cpp | 2 +- 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/include/ui/eventfilters.h b/include/ui/eventfilters.h index 851c344b..4fc5ee83 100644 --- a/include/ui/eventfilters.h +++ b/include/ui/eventfilters.h @@ -26,3 +26,16 @@ signals: void wheelZoom(int delta); public slots: }; + + + +/// Emits a signal when a window gets activated / regains focus +class ActiveWindowFilter : public QObject { + Q_OBJECT +public: + ActiveWindowFilter(QObject *parent) : QObject(parent) {} + virtual ~ActiveWindowFilter() {} + bool eventFilter(QObject *obj, QEvent *event) override; +signals: + void activated(); +}; diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h index 53d5717f..0198122f 100644 --- a/include/ui/tileseteditor.h +++ b/include/ui/tileseteditor.h @@ -57,6 +57,7 @@ public slots: void onSelectedMetatileChanged(uint16_t); private slots: + void onWindowActivated(); void onHoveredMetatileChanged(uint16_t); void onHoveredMetatileCleared(); void onHoveredTileChanged(uint16_t); diff --git a/src/ui/eventfilters.cpp b/src/ui/eventfilters.cpp index 1e7b2b80..553b21fc 100644 --- a/src/ui/eventfilters.cpp +++ b/src/ui/eventfilters.cpp @@ -24,3 +24,12 @@ bool MapSceneEventFilter::eventFilter(QObject*, QEvent *event) { } return false; } + + + +bool ActiveWindowFilter::eventFilter(QObject*, QEvent *event) { + if (event->type() == QEvent::WindowActivate) { + emit activated(); + } + return false; +} diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index e05750dc..8065497c 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -9,6 +9,7 @@ #include "shortcut.h" #include "filedialog.h" #include "validator.h" +#include "eventfilters.h" #include #include #include @@ -40,6 +41,10 @@ TilesetEditor::TilesetEditor(Project *project, Layout *layout, QWidget *parent) ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1); ui->lineEdit_metatileLabel->setValidator(new IdentifierValidator(this)); + ActiveWindowFilter *filter = new ActiveWindowFilter(this); + connect(filter, &ActiveWindowFilter::activated, this, &TilesetEditor::onWindowActivated); + this->installEventFilter(filter); + setAttributesUi(); initMetatileSelector(); initMetatileLayersItem(); @@ -300,6 +305,16 @@ void TilesetEditor::restoreWindowState() { this->ui->splitter->restoreState(geometry.value("tileset_editor_splitter_state")); } +void TilesetEditor::onWindowActivated() { + // User may have made layout edits since window was last focused, so update counts + if (this->metatileSelector) { + if (this->metatileSelector->selectorShowUnused || this->metatileSelector->selectorShowCounts) { + countMetatileUsage(); + this->metatileSelector->draw(); + } + } +} + void TilesetEditor::initMetatileHistory() { metatileHistory.clear(); MetatileHistoryItem *commit = new MetatileHistoryItem(0, nullptr, new Metatile(), QString(), QString()); @@ -455,6 +470,10 @@ void TilesetEditor::onMetatileLayerTileChanged(int x, int y) { tile.xflip = tiles.at(selectedTileIndex).xflip; tile.yflip = tiles.at(selectedTileIndex).yflip; tile.palette = tiles.at(selectedTileIndex).palette; + if (this->tileSelector->showUnused) { + this->tileSelector->usedTiles[tile.tileId] += 1; + this->tileSelector->usedTiles[prevMetatile->tiles[tileIndex].tileId] -= 1; + } } selectedTileIndex++; } @@ -462,6 +481,7 @@ void TilesetEditor::onMetatileLayerTileChanged(int x, int y) { this->metatileSelector->draw(); this->metatileLayersItem->draw(); + this->tileSelector->draw(); this->commitMetatileChange(prevMetatile); } @@ -1049,7 +1069,7 @@ void TilesetEditor::on_actionShow_Tileset_Divider_triggered(bool checked) { void TilesetEditor::countMetatileUsage() { // do not double count - metatileSelector->usedMetatiles.fill(0); + this->metatileSelector->usedMetatiles.fill(0); for (auto layout : this->project->mapLayouts.values()) { bool usesPrimary = false; diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp index 4cec089e..01e4008c 100644 --- a/src/ui/tileseteditortileselector.cpp +++ b/src/ui/tileseteditortileselector.cpp @@ -304,7 +304,7 @@ void TilesetEditorTileSelector::drawUnused() { unusedPainter.setOpacity(0.5); for (int tile = 0; tile < this->usedTiles.size(); tile++) { - if (!usedTiles[tile]) { + if (!this->usedTiles[tile]) { unusedPainter.drawPixmap((tile % 16) * 16, (tile / 16) * 16, redX); } }