Better pan control

This commit is contained in:
GriffinR 2025-06-20 12:59:09 -04:00
parent d1142d244e
commit 440c0f9d5c
3 changed files with 31 additions and 30 deletions

View File

@ -210,10 +210,10 @@ void Editor::setEditAction(EditAction editAction) {
// Update cursor
static const QMap<EditAction, QCursor> cursors = {
{EditAction::Paint, QCursor(QPixmap(":/icons/pencil_cursor.ico"), 10, 10)},
{EditAction::Select, QCursor()},
{EditAction::Select, QCursor(Qt::ArrowCursor)},
{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::Move, QCursor(Qt::OpenHandCursor)},
{EditAction::Shift, QCursor(QPixmap(":/icons/shift_cursor.ico"), 10, 10)},
};
this->settings->mapCursor = cursors.value(editAction);
@ -1354,7 +1354,7 @@ void Editor::onMapStartPaint(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *
}
QPoint pos = Metatile::coordFromPixmapCoord(event->pos());
if (event->buttons() & Qt::RightButton && (mapEditAction == EditAction::Paint || mapEditAction == EditAction::Fill)) {
if (event->buttons() & Qt::RightButton && (this->mapEditAction == EditAction::Paint || this->mapEditAction == EditAction::Fill)) {
this->cursorMapTileRect->initRightClickSelectionAnchor(pos.x(), pos.y());
} else {
this->cursorMapTileRect->initAnchor(pos.x(), pos.y());
@ -1395,14 +1395,16 @@ void Editor::adjustStraightPathPos(QGraphicsSceneMouseEvent *event, LayoutPixmap
}
void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *item) {
if (!item->getEditsEnabled()) {
auto editAction = getEditAction();
if (!item->getEditsEnabled() || editAction == EditAction::Move) {
event->ignore();
return;
}
QPoint pos = Metatile::coordFromPixmapCoord(event->pos());
if (this->getEditingLayout()) {
if (mapEditAction == EditAction::Paint) {
if (editAction == EditAction::Paint) {
if (event->buttons() & Qt::RightButton) {
item->updateMetatileSelection(event);
} else if (event->buttons() & Qt::MiddleButton) {
@ -1420,9 +1422,9 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i
adjustStraightPathPos(event, item, &pos);
item->paint(event);
}
} else if (mapEditAction == EditAction::Select) {
} else if (editAction == EditAction::Select) {
item->select(event);
} else if (mapEditAction == EditAction::Fill) {
} else if (editAction == EditAction::Fill) {
if (event->buttons() & Qt::RightButton) {
item->updateMetatileSelection(event);
} else if (event->modifiers() & Qt::ControlModifier) {
@ -1430,18 +1432,18 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i
} else {
item->floodFill(event);
}
} else if (mapEditAction == EditAction::Pick) {
} else if (editAction == EditAction::Pick) {
if (event->buttons() & Qt::RightButton) {
item->updateMetatileSelection(event);
} else if (event->type() != QEvent::GraphicsSceneMouseRelease) {
item->pick(event);
}
} else if (mapEditAction == EditAction::Shift) {
} else if (editAction == EditAction::Shift) {
adjustStraightPathPos(event, item, &pos);
item->shift(event);
}
} else if (this->editMode == EditMode::Events) {
if (eventEditAction == EditAction::Paint && event->type() == QEvent::GraphicsSceneMousePress) {
if (editAction == EditAction::Paint && event->type() == QEvent::GraphicsSceneMousePress) {
// Right-clicking while in paint mode will change mode to select.
if (event->buttons() & Qt::RightButton) {
setEditAction(EditAction::Select);
@ -1456,12 +1458,12 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i
if (event && event->getPixmapItem())
event->getPixmapItem()->moveTo(pos);
}
} else if (eventEditAction == EditAction::Select && event->type() == QEvent::GraphicsSceneMousePress) {
} else if (editAction == EditAction::Select && event->type() == QEvent::GraphicsSceneMousePress) {
if (!(event->modifiers() & Qt::ControlModifier) && this->selectedEvents.length() > 1) {
// User is clearing group selection by clicking on the background
selectMapEvent(this->selectedEvents.first());
}
} else if (eventEditAction == EditAction::Shift) {
} else if (editAction == EditAction::Shift) {
static QPoint selection_origin;
if (event->type() == QEvent::GraphicsSceneMouseRelease) {
@ -1484,13 +1486,15 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, LayoutPixmapItem *i
}
void Editor::mouseEvent_collision(QGraphicsSceneMouseEvent *event, CollisionPixmapItem *item) {
if (!item->getEditsEnabled()) {
auto editAction = getEditAction();
if (!item->getEditsEnabled() || editAction == EditAction::Move) {
event->ignore();
return;
}
QPoint pos = Metatile::coordFromPixmapCoord(event->pos());
if (mapEditAction == EditAction::Paint) {
if (editAction == EditAction::Paint) {
if (event->buttons() & Qt::RightButton) {
item->updateMovementPermissionSelection(event);
} else if (event->buttons() & Qt::MiddleButton) {
@ -1503,9 +1507,9 @@ void Editor::mouseEvent_collision(QGraphicsSceneMouseEvent *event, CollisionPixm
adjustStraightPathPos(event, item, &pos);
item->paint(event);
}
} else if (mapEditAction == EditAction::Select) {
} else if (editAction == EditAction::Select) {
item->select(event);
} else if (mapEditAction == EditAction::Fill) {
} else if (editAction == EditAction::Fill) {
if (event->buttons() & Qt::RightButton) {
item->pick(event);
} else if (event->modifiers() & Qt::ControlModifier) {
@ -1513,9 +1517,9 @@ void Editor::mouseEvent_collision(QGraphicsSceneMouseEvent *event, CollisionPixm
} else {
item->floodFill(event);
}
} else if (mapEditAction == EditAction::Pick) {
} else if (editAction == EditAction::Pick) {
item->pick(event);
} else if (mapEditAction == EditAction::Shift) {
} else if (editAction == EditAction::Shift) {
adjustStraightPathPos(event, item, &pos);
item->shift(event);
}

View File

@ -2579,17 +2579,10 @@ void MainWindow::on_toolButton_Move_clicked() { editor->setEditAction(Editor:
void MainWindow::on_toolButton_Shift_clicked() { editor->setEditAction(Editor::EditAction::Shift); }
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 {
ui->graphicsView_Map->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
ui->graphicsView_Map->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
QScroller::ungrabGesture(ui->graphicsView_Map);
ui->graphicsView_Map->setViewportUpdateMode(QGraphicsView::ViewportUpdateMode::MinimalViewportUpdate);
}
// TODO: Viewport's hand cursor is not reliably cleared when changing to QGraphicsView::NoDrag.
auto dragMode = (editAction == Editor::EditAction::Move) ? QGraphicsView::ScrollHandDrag : QGraphicsView::NoDrag;
ui->graphicsView_Connections->setDragMode(dragMode);
ui->graphicsView_Map->setDragMode(dragMode);
ui->graphicsView_Map->setFocus();
ui->toolButton_Paint->setChecked(editAction == Editor::EditAction::Paint);

View File

@ -126,7 +126,11 @@ void ConnectionPixmapItem::setSelected(bool selected) {
emit selectionChanged(selected);
}
void ConnectionPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *) {
void ConnectionPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
if (!this->getEditable()) {
event->ignore();
return;
}
this->setSelected(true);
}