diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bb48837..70f45d1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project somewhat adheres to [Semantic Versioning](https://semver.org/sp - Fix event sprite names that appear in `symbol_obj_event_gfx_pointers` by value and not by name not rendering with the correct sprite. - Fix event sprites sometimes rendering with incorrect transparency temporarily after a sprite change. - Fix not being able to minimize/maximize some windows. +- Fix some menu items under `Tools` not being disabled when their corresponding button is disabled. ## [6.3.0] - 2025-12-26 ### Added diff --git a/include/mainwindow.h b/include/mainwindow.h index 824683ed..8f57c511 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -231,24 +231,18 @@ private slots: void on_actionBetter_Cursors_triggered(); void on_actionPlayer_View_Rectangle_triggered(); void on_actionCursor_Tile_Outline_triggered(); - void on_actionPencil_triggered(); - void on_actionPointer_triggered(); - void on_actionFlood_Fill_triggered(); - void on_actionEyedropper_triggered(); - void on_actionMove_triggered(); - void on_actionMap_Shift_triggered(); void tryAddEventTab(QWidget * tab); void displayEventTabs(); void updateSelectedEvents(); void updateEvents(); - void on_toolButton_Paint_clicked(); - void on_toolButton_Select_clicked(); - void on_toolButton_Fill_clicked(); - void on_toolButton_Dropper_clicked(); - void on_toolButton_Move_clicked(); - void on_toolButton_Shift_clicked(); + void activatePaintTool(); + void activateSelectTool(); + void activateFillTool(); + void activatePickTool(); + void activateMoveTool(); + void activateShiftTool(); void onOpenMapListContextMenu(const QPoint &point); void currentMetatilesSelectionChanged(); @@ -429,6 +423,7 @@ private: void initLogStatusBar(); void initCustomUI(); void initExtraSignals(); + void connectToolButtons(); void initEditor(); void initMiscHeapObjects(); void initMapList(); diff --git a/include/ui/eventfilters.h b/include/ui/eventfilters.h index d39e8474..97604f00 100644 --- a/include/ui/eventfilters.h +++ b/include/ui/eventfilters.h @@ -17,15 +17,22 @@ public slots: }; -/// Emits a signal when a window gets activated / regains focus -class ActiveWindowFilter : public QObject { +/// Emits a signal when the given event or events occur +class EventSignaler : public QObject { Q_OBJECT public: - ActiveWindowFilter(QObject *parent) : QObject(parent) {} - virtual ~ActiveWindowFilter() {} + EventSignaler(const QSet& types, QObject *parent) : QObject(parent), m_types(types) {} + EventSignaler(QEvent::Type type, QObject *parent) : EventSignaler(QSet{type}, parent) {} + virtual ~EventSignaler() {} + + void addEventType(QEvent::Type type) { m_types.insert(type); } + void removeEventType(QEvent::Type type) { m_types.remove(type); } + bool eventFilter(QObject *obj, QEvent *event) override; signals: - void activated(); + void triggered(); +private: + QSet m_types; }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 09fa0b1b..6936db9d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -89,7 +89,7 @@ void MainWindow::initialize() { this->initWindow(); this->installEventFilter(new GeometrySaver(this)); if (porymapConfig.reopenOnLaunch && !porymapConfig.projectManuallyClosed && this->openProject(porymapConfig.getRecentProject(), true)) { - on_toolButton_Paint_clicked(); + activatePaintTool(); } // there is a bug affecting macOS users, where the trackpad deilveres a bad touch-release gesture @@ -390,8 +390,7 @@ void MainWindow::initExtraSignals() { connect(ui->actionProject_Settings, &QAction::triggered, this, &MainWindow::openProjectSettingsEditor); connect(ui->actionCopy, &QAction::triggered, this, &MainWindow::copy); connect(ui->actionPaste, &QAction::triggered, this, &MainWindow::paste); - connect(ui->actionChange_Map_Dimensions, &QAction::triggered, this, &MainWindow::resizeMapLayout); - connect(ui->toolButton_Resize, &QToolButton::clicked, this, &MainWindow::resizeMapLayout); + connectToolButtons(); } void MainWindow::on_actionCheck_for_Updates_triggered() { @@ -2671,19 +2670,12 @@ void MainWindow::on_horizontalSlider_CollisionTransparency_valueChanged(int valu this->editor->collision_item->draw(true); } -void MainWindow::on_actionPencil_triggered() { on_toolButton_Paint_clicked(); } -void MainWindow::on_actionPointer_triggered() { on_toolButton_Select_clicked(); } -void MainWindow::on_actionFlood_Fill_triggered() { on_toolButton_Fill_clicked(); } -void MainWindow::on_actionEyedropper_triggered() { on_toolButton_Dropper_clicked(); } -void MainWindow::on_actionMove_triggered() { on_toolButton_Move_clicked(); } -void MainWindow::on_actionMap_Shift_triggered() { on_toolButton_Shift_clicked(); } - -void MainWindow::on_toolButton_Paint_clicked() { editor->setEditAction(Editor::EditAction::Paint); } -void MainWindow::on_toolButton_Select_clicked() { editor->setEditAction(Editor::EditAction::Select); } -void MainWindow::on_toolButton_Fill_clicked() { editor->setEditAction(Editor::EditAction::Fill); } -void MainWindow::on_toolButton_Dropper_clicked() { editor->setEditAction(Editor::EditAction::Pick); } -void MainWindow::on_toolButton_Move_clicked() { editor->setEditAction(Editor::EditAction::Move); } -void MainWindow::on_toolButton_Shift_clicked() { editor->setEditAction(Editor::EditAction::Shift); } +void MainWindow::activatePaintTool() { editor->setEditAction(Editor::EditAction::Paint); } +void MainWindow::activateSelectTool() { editor->setEditAction(Editor::EditAction::Select); } +void MainWindow::activateFillTool() { editor->setEditAction(Editor::EditAction::Fill); } +void MainWindow::activatePickTool() { editor->setEditAction(Editor::EditAction::Pick); } +void MainWindow::activateMoveTool() { editor->setEditAction(Editor::EditAction::Move); } +void MainWindow::activateShiftTool() { editor->setEditAction(Editor::EditAction::Shift); } void MainWindow::setEditActionUi(Editor::EditAction editAction) { ui->toolButton_Paint->setChecked(editAction == Editor::EditAction::Paint); @@ -2694,6 +2686,28 @@ void MainWindow::setEditActionUi(Editor::EditAction editAction) { ui->toolButton_Shift->setChecked(editAction == Editor::EditAction::Shift); } +void MainWindow::connectToolButtons() { + auto connectToolButton = [this](QToolButton* button, QAction* action, void (MainWindow::*activateFunc)()) { + connect(action, &QAction::triggered, this, activateFunc); + connect(button, &QAbstractButton::clicked, this, activateFunc); + + // When one of the tool buttons is enabled/disabled, + // sync this state to the corresponding menu action. + auto monitor = new EventSignaler(QEvent::EnabledChange, button); + connect(monitor, &EventSignaler::triggered, button, [action, button]{ + action->setEnabled(button->isEnabled()); + }); + button->installEventFilter(monitor); + }; + connectToolButton(ui->toolButton_Paint, ui->actionPencil, &MainWindow::activatePaintTool); + connectToolButton(ui->toolButton_Select, ui->actionPointer, &MainWindow::activateSelectTool); + connectToolButton(ui->toolButton_Fill, ui->actionFlood_Fill, &MainWindow::activateFillTool); + connectToolButton(ui->toolButton_Dropper, ui->actionEyedropper, &MainWindow::activatePickTool); + connectToolButton(ui->toolButton_Move, ui->actionMove, &MainWindow::activateMoveTool); + connectToolButton(ui->toolButton_Shift, ui->actionMap_Shift, &MainWindow::activateShiftTool); + connectToolButton(ui->toolButton_Resize, ui->actionChange_Map_Dimensions, &MainWindow::resizeMapLayout); +} + void MainWindow::onOpenConnectedMap(MapConnection *connection) { if (!connection) return; diff --git a/src/ui/eventfilters.cpp b/src/ui/eventfilters.cpp index d32c5b01..1093cb30 100644 --- a/src/ui/eventfilters.cpp +++ b/src/ui/eventfilters.cpp @@ -18,10 +18,8 @@ bool MapSceneEventFilter::eventFilter(QObject*, QEvent *event) { } -bool ActiveWindowFilter::eventFilter(QObject*, QEvent *event) { - if (event->type() == QEvent::WindowActivate) { - emit activated(); - } +bool EventSignaler::eventFilter(QObject*, QEvent *event) { + if (m_types.contains(event->type())) emit triggered(); return false; } diff --git a/src/ui/palettecolorsearch.cpp b/src/ui/palettecolorsearch.cpp index 9d49d252..f1a6ab7c 100644 --- a/src/ui/palettecolorsearch.cpp +++ b/src/ui/palettecolorsearch.cpp @@ -27,8 +27,8 @@ PaletteColorSearch::PaletteColorSearch(Project *project, const Tileset *primaryT // Rather than try to keep track of metatile/tile changes that affect which colors are used, // we'll just refresh when the window is activated. - ActiveWindowFilter *filter = new ActiveWindowFilter(this); - connect(filter, &ActiveWindowFilter::activated, this, &PaletteColorSearch::refresh); + auto filter = new EventSignaler(QEvent::WindowActivate, this); + connect(filter, &EventSignaler::triggered, this, &PaletteColorSearch::refresh); this->installEventFilter(filter); ui->spinBox_ColorId->setRange(0, Tileset::numColorsPerPalette() - 1); diff --git a/src/ui/paletteeditor.cpp b/src/ui/paletteeditor.cpp index 72a53eb2..7592695a 100644 --- a/src/ui/paletteeditor.cpp +++ b/src/ui/paletteeditor.cpp @@ -48,8 +48,8 @@ PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset // Rather than try to keep track of metatile/tile changes that affect which colors are used, // we'll just refresh when the window is activated. - ActiveWindowFilter *filter = new ActiveWindowFilter(this); - connect(filter, &ActiveWindowFilter::activated, this, &PaletteEditor::invalidateCache); + auto filter = new EventSignaler(QEvent::WindowActivate, this); + connect(filter, &EventSignaler::triggered, this, &PaletteEditor::invalidateCache); this->installEventFilter(filter); this->ui->spinBox_PaletteId->setRange(0, Project::getNumPalettesTotal() - 1); diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 78f72c20..cba3067b 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -39,8 +39,8 @@ TilesetEditor::TilesetEditor(Project *project, Layout *layout, QWidget *parent) ui->actionShow_Tileset_Divider->setChecked(porymapConfig.showTilesetEditorDivider); ui->actionShow_Raw_Metatile_Attributes->setChecked(porymapConfig.showTilesetEditorRawAttributes); - ActiveWindowFilter *filter = new ActiveWindowFilter(this); - connect(filter, &ActiveWindowFilter::activated, this, &TilesetEditor::onWindowActivated); + auto filter = new EventSignaler(QEvent::WindowActivate, this); + connect(filter, &EventSignaler::triggered, this, &TilesetEditor::onWindowActivated); installEventFilter(filter); setTilesets(this->layout->tileset_primary_label, this->layout->tileset_secondary_label);