From dd8486ba34af6c5ef93ec1d3db60fff10403f0d6 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 11 May 2025 18:13:51 -0400 Subject: [PATCH] Fix some tool button issues --- include/editor.h | 10 +- include/mainwindow.h | 3 +- include/ui/layoutpixmapitem.h | 1 + src/editor.cpp | 41 +++++-- src/mainwindow.cpp | 198 +++++----------------------------- src/ui/layoutpixmapitem.cpp | 4 + 6 files changed, 73 insertions(+), 184 deletions(-) diff --git a/include/editor.h b/include/editor.h index 40e0d1c5..a5601196 100644 --- a/include/editor.h +++ b/include/editor.h @@ -162,8 +162,10 @@ public: QPointer connection_to_select = nullptr; enum class EditAction { None, Paint, Select, Fill, Shift, Pick, Move }; - EditAction mapEditAction = EditAction::Paint; - EditAction eventEditAction = EditAction::Select; + void setEditAction(EditAction editAction); + EditAction getEditAction() const; + EditAction getMapEditAction() const { return this->mapEditAction; } + EditAction getEventEditAction() const { return this->eventEditAction; } enum class EditMode { None, Disabled, Metatiles, Collision, Header, Events, Connections, Encounters }; void setEditMode(EditMode editMode); @@ -220,6 +222,9 @@ private: EditMode editMode = EditMode::None; + EditAction mapEditAction = EditAction::Paint; + EditAction eventEditAction = EditAction::Select; + bool save(bool currentOnly); void clearMap(); void clearMetatileSelector(); @@ -280,6 +285,7 @@ signals: void mapRulerStatusChanged(const QString &); void tilesetUpdated(QString); void gridToggled(bool); + void editActionSet(EditAction newEditAction); }; #endif // EDITOR_H diff --git a/include/mainwindow.h b/include/mainwindow.h index 30022b61..010563fc 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -407,8 +407,7 @@ private: void openNextMap(); void displayMapProperties(); - void checkToolButtons(); - void clickToolButtonFromEditAction(Editor::EditAction editAction); + void setEditActionUi(Editor::EditAction editAction); void updateWindowTitle(); diff --git a/include/ui/layoutpixmapitem.h b/include/ui/layoutpixmapitem.h index 08496c54..695472a5 100644 --- a/include/ui/layoutpixmapitem.h +++ b/include/ui/layoutpixmapitem.h @@ -92,6 +92,7 @@ public: private: void paintSmartPath(int x, int y, bool fromScriptCall = false); static QList smartPathTable; + QPoint lastMetatileSelectionPos = QPoint(-1,-1); unsigned actionId_ = 0; diff --git a/src/editor.cpp b/src/editor.cpp index d285fb08..d0ebe59e 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -169,7 +169,6 @@ void Editor::setEditMode(EditMode editMode) { editStack = &this->layout->editHistory; } - this->cursorMapTileRect->setSingleTileMode(editMode == EditMode::Collision); this->cursorMapTileRect->setActive(editingLayout); this->playerViewRect->setActive(editingLayout); this->editGroup.setActiveStack(editStack); @@ -185,6 +184,39 @@ void Editor::setEditMode(EditMode editMode) { if (this->editMode == EditMode::Events){ updateWarpEventWarnings(); } + + if (current_view) { + // Updating the edit action is only relevant for edit modes with a graphics view. + setEditAction(getEditAction()); + } +} + +Editor::EditAction Editor::getEditAction() const { + return this->editMode == EditMode::Events ? getEventEditAction() : getMapEditAction(); +} + +void Editor::setEditAction(EditAction editAction) { + if (this->editMode == EditMode::Events) { + this->eventEditAction = editAction; + this->map_ruler->setEnabled(editAction == EditAction::Select); + } else { + this->mapEditAction = editAction; + this->map_ruler->setEnabled(false); + } + + this->cursorMapTileRect->setSingleTileMode(!(editAction == EditAction::Paint && this->editMode == EditMode::Metatiles)); + + // Update cursor + static const QMap cursors = { + {EditAction::Paint, QCursor(QPixmap(":/icons/pencil_cursor.ico"), 10, 10)}, + {EditAction::Select, QCursor()}, + {EditAction::Fill, QCursor(QPixmap(":/icons/fill_color_cursor.ico"), 10, 10)}, + {EditAction::Pick, QCursor(QPixmap(":/icons/pipette_cursor.ico"), 10, 10)}, + {EditAction::Move, QCursor(QPixmap(":/icons/move.ico"), 7, 7)}, + {EditAction::Shift, QCursor(QPixmap(":/icons/shift_cursor.ico"), 10, 10)}, + }; + this->settings->mapCursor = cursors.value(editAction); + emit editActionSet(editAction); } void Editor::clearWildMonTables() { @@ -1377,7 +1409,7 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i } else if (mapEditAction == EditAction::Pick) { if (event->buttons() & Qt::RightButton) { item->updateMetatileSelection(event); - } else { + } else if (event->type() != QEvent::GraphicsSceneMouseRelease) { item->pick(event); } } else if (mapEditAction == EditAction::Shift) { @@ -1392,10 +1424,7 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i if (eventEditAction == EditAction::Paint && event->type() == QEvent::GraphicsSceneMousePress) { // Right-clicking while in paint mode will change mode to select. if (event->buttons() & Qt::RightButton) { - this->eventEditAction = EditAction::Select; - this->settings->mapCursor = QCursor(); - this->ui->toolButton_Paint->setChecked(false); - this->ui->toolButton_Select->setChecked(true); + setEditAction(EditAction::Select); } else { // Left-clicking while in paint mode will add a new event of the // type of the first currently selected events. diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cf6d226d..c4cf83c5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -363,6 +363,7 @@ void MainWindow::initEditor() { connect(this->editor, &Editor::wildMonTableEdited, [this] { markMapEdited(this->editor->map); }); connect(this->editor, &Editor::mapRulerStatusChanged, this, &MainWindow::onMapRulerStatusChanged); connect(this->editor, &Editor::tilesetUpdated, this, &Scripting::cb_TilesetUpdated); + connect(this->editor, &Editor::editActionSet, this, &MainWindow::setEditActionUi); connect(ui->newEventToolButton, &NewEventToolButton::newEventAdded, this->editor, &Editor::addNewEvent); connect(ui->toolButton_deleteEvent, &QAbstractButton::clicked, this->editor, &Editor::deleteSelectedEvents); connect(ui->graphicsView_Connections, &ConnectionsView::pressedDelete, this->editor, &Editor::removeSelectedConnection); @@ -2167,10 +2168,8 @@ void MainWindow::on_mainTabBar_tabBarClicked(int index) if (index == MainTab::Map) { ui->stackedWidget_MapEvents->setCurrentIndex(0); on_mapViewTab_tabBarClicked(ui->mapViewTab->currentIndex()); - clickToolButtonFromEditAction(editor->mapEditAction); } else if (index == MainTab::Events) { ui->stackedWidget_MapEvents->setCurrentIndex(1); - clickToolButtonFromEditAction(editor->eventEditAction); } else if (index == MainTab::Connections) { ui->graphicsView_Connections->setFocus(); // Avoid opening tab with focus on something editable } @@ -2180,9 +2179,6 @@ void MainWindow::on_mainTabBar_tabBarClicked(int index) if (editor->project && editor->project->wildEncountersLoaded) editor->saveEncounterTabData(); } - if (index != MainTab::Events) { - editor->map_ruler->setEnabled(false); - } } void MainWindow::on_actionZoom_In_triggered() { @@ -2278,36 +2274,6 @@ void MainWindow::connectSubEditorsToShortcutsEditor() { customScriptsEditor, &CustomScriptsEditor::applyUserShortcuts); } -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::resetMapViewScale() { editor->scaleMapView(0); } @@ -2572,133 +2538,33 @@ void MainWindow::on_horizontalSlider_CollisionTransparency_valueChanged(int valu this->editor->collision_item->draw(true); } -void MainWindow::on_toolButton_Paint_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Paint; - else - editor->eventEditAction = Editor::EditAction::Paint; +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(); } - editor->settings->mapCursor = QCursor(QPixmap(":/icons/pencil_cursor.ico"), 10, 10); +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); } - if (ui->mapViewTab->currentIndex() != MapViewTab::Collision) - editor->cursorMapTileRect->setSingleTileMode(false); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QScroller::ungrabGesture(ui->graphicsView_Map); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::on_toolButton_Select_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Select; - else - editor->eventEditAction = Editor::EditAction::Select; - - editor->settings->mapCursor = QCursor(); - editor->cursorMapTileRect->setSingleTileMode(true); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QScroller::ungrabGesture(ui->graphicsView_Map); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::on_toolButton_Fill_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Fill; - else - editor->eventEditAction = Editor::EditAction::Fill; - - editor->settings->mapCursor = QCursor(QPixmap(":/icons/fill_color_cursor.ico"), 10, 10); - editor->cursorMapTileRect->setSingleTileMode(true); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QScroller::ungrabGesture(ui->graphicsView_Map); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::on_toolButton_Dropper_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Pick; - else - editor->eventEditAction = Editor::EditAction::Pick; - - editor->settings->mapCursor = QCursor(QPixmap(":/icons/pipette_cursor.ico"), 10, 10); - editor->cursorMapTileRect->setSingleTileMode(true); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QScroller::ungrabGesture(ui->graphicsView_Map); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::on_toolButton_Move_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Move; - else - editor->eventEditAction = Editor::EditAction::Move; - - editor->settings->mapCursor = QCursor(QPixmap(":/icons/move.ico"), 7, 7); - editor->cursorMapTileRect->setSingleTileMode(true); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - QScroller::grabGesture(ui->graphicsView_Map, QScroller::LeftMouseButtonGesture); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::FullViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::on_toolButton_Shift_clicked() -{ - if (ui->mainTabBar->currentIndex() == MainTab::Map) - editor->mapEditAction = Editor::EditAction::Shift; - else - editor->eventEditAction = Editor::EditAction::Shift; - - editor->settings->mapCursor = QCursor(QPixmap(":/icons/shift_cursor.ico"), 10, 10); - editor->cursorMapTileRect->setSingleTileMode(true); - - ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - QScroller::ungrabGesture(ui->graphicsView_Map); - ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); - ui->graphicsView_Map->setFocus(); - - checkToolButtons(); -} - -void MainWindow::checkToolButtons() { - Editor::EditAction editAction; - if (ui->mainTabBar->currentIndex() == MainTab::Map) { - editAction = editor->mapEditAction; +void MainWindow::setEditActionUi(Editor::EditAction editAction) { + if (editAction == Editor::EditAction::Move) { + ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + QScroller::grabGesture(ui->graphicsView_Map, QScroller::LeftMouseButtonGesture); + ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::FullViewportUpdate); } else { - editAction = editor->eventEditAction; - if (editAction == Editor::EditAction::Select && editor->map_ruler) - editor->map_ruler->setEnabled(true); - else if (editor->map_ruler) - editor->map_ruler->setEnabled(false); + ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + QScroller::ungrabGesture(ui->graphicsView_Map); + ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate); } + ui->graphicsView_Map->setFocus(); ui->toolButton_Paint->setChecked(editAction == Editor::EditAction::Paint); ui->toolButton_Select->setChecked(editAction == Editor::EditAction::Select); @@ -2708,22 +2574,6 @@ void MainWindow::checkToolButtons() { ui->toolButton_Shift->setChecked(editAction == Editor::EditAction::Shift); } -void MainWindow::clickToolButtonFromEditAction(Editor::EditAction editAction) { - if (editAction == Editor::EditAction::Paint) { - on_toolButton_Paint_clicked(); - } else if (editAction == Editor::EditAction::Select) { - on_toolButton_Select_clicked(); - } else if (editAction == Editor::EditAction::Fill) { - on_toolButton_Fill_clicked(); - } else if (editAction == Editor::EditAction::Pick) { - on_toolButton_Dropper_clicked(); - } else if (editAction == Editor::EditAction::Move) { - on_toolButton_Move_clicked(); - } else if (editAction == Editor::EditAction::Shift) { - on_toolButton_Shift_clicked(); - } -} - void MainWindow::onOpenConnectedMap(MapConnection *connection) { if (!connection) return; diff --git a/src/ui/layoutpixmapitem.cpp b/src/ui/layoutpixmapitem.cpp index 3417a4ce..8a2fbe5b 100644 --- a/src/ui/layoutpixmapitem.cpp +++ b/src/ui/layoutpixmapitem.cpp @@ -321,6 +321,7 @@ void LayoutPixmapItem::updateMetatileSelection(QGraphicsSceneMouseEvent *event) // Update/apply copied metatiles. if (event->type() == QEvent::GraphicsSceneMousePress) { + this->lastMetatileSelectionPos = pos; selection_origin = QPoint(pos.x(), pos.y()); selection.clear(); selection.append(QPoint(pos.x(), pos.y())); @@ -329,6 +330,9 @@ void LayoutPixmapItem::updateMetatileSelection(QGraphicsSceneMouseEvent *event) this->metatileSelector->selectFromMap(block.metatileId(), block.collision(), block.elevation()); } } else if (event->type() == QEvent::GraphicsSceneMouseMove) { + if (pos == this->lastMetatileSelectionPos) + return; + this->lastMetatileSelectionPos = pos; int x1 = selection_origin.x(); int y1 = selection_origin.y(); int x2 = pos.x();