diff --git a/editor.cpp b/editor.cpp index 9a07e9b7..8bafbb4d 100755 --- a/editor.cpp +++ b/editor.cpp @@ -1484,9 +1484,15 @@ void MapPixmapItem::updateCurHoveredTile(QPointF pos) { void MapPixmapItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { updateCurHoveredTile(event->pos()); + if (editor->ui->actionBetter_Cursors->isChecked()){ + setCursor(editor->cursor); + } } void MapPixmapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { map->clearHoveredTile(); + if (editor->ui->actionBetter_Cursors->isChecked()){ + unsetCursor(); + } } void MapPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { QPointF pos = event->pos(); diff --git a/editor.h b/editor.h index 1beadf75..4bfbfb23 100755 --- a/editor.h +++ b/editor.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "project.h" #include "ui_mainwindow.h" @@ -108,6 +109,8 @@ public: QList *copiedMetatileSelection = new QList; QString map_edit_mode; + QString prev_edit_mode; + QCursor cursor; void objectsView_onMousePress(QMouseEvent *event); void objectsView_onMouseMove(QMouseEvent *event); diff --git a/mainwindow.cpp b/mainwindow.cpp index d7edf674..daf19ceb 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -35,6 +37,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->newEventToolButton, SIGNAL(newEventAdded(QString)), this, SLOT(addNewEvent(QString))); new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Z), this, SLOT(redo())); + new QShortcut(Qt::Key_M, this, SLOT(toggleEditModeMove())); editor = new Editor(ui); connect(editor, SIGNAL(objectsChanged()), this, SLOT(updateSelectedObjects())); @@ -55,6 +58,10 @@ MainWindow::MainWindow(QWidget *parent) : openProject(default_dir); } } + + if (settings.contains("cursor_mode") && settings.value("cursor_mode") == "0") { + ui->actionBetter_Cursors->setChecked(false); + } } MainWindow::~MainWindow() @@ -599,6 +606,36 @@ void MainWindow::on_actionRedo_triggered() redo(); } +void MainWindow::on_actionZoom_In_triggered() { + scaleMapView(1); +} + +void MainWindow::on_actionZoom_Out_triggered() { + scaleMapView(-1); +} + +void MainWindow::on_actionBetter_Cursors_triggered() { + QSettings settings; + settings.setValue("cursor_mode", QString::number(ui->actionBetter_Cursors->isChecked())); +} + +void MainWindow::scaleMapView(int s) { + editor->map->scale_exp += s; + + double base = (double)editor->map->scale_base; + double exp = editor->map->scale_exp; + double sfactor = pow(base,s); + + ui->graphicsView_Map->scale(sfactor,sfactor); + ui->graphicsView_Objects_Map->scale(sfactor,sfactor); + + ui->graphicsView_Map->setFixedSize((editor->scene->width() + 2) * pow(base,exp), + (editor->scene->height() + 2) * pow(base,exp)); + + ui->graphicsView_Objects_Map->setFixedSize((editor->scene->width() + 2) * pow(base,exp), + (editor->scene->height() + 2) * pow(base,exp)); +} + void MainWindow::addNewEvent(QString event_type) { if (editor) { @@ -899,24 +936,60 @@ void MainWindow::on_toolButton_Open_Scripts_clicked() void MainWindow::on_toolButton_Paint_clicked() { editor->map_edit_mode = "paint"; + editor->cursor = QCursor(QPixmap(":/icons/pencil_cursor.ico"), 10, 10); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + QScroller::ungrabGesture(ui->scrollArea); + checkToolButtons(); } void MainWindow::on_toolButton_Select_clicked() { editor->map_edit_mode = "select"; + editor->cursor = QCursor(QPixmap(":/icons/cursor.ico"), 0, 0); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + QScroller::ungrabGesture(ui->scrollArea); + checkToolButtons(); } void MainWindow::on_toolButton_Fill_clicked() { editor->map_edit_mode = "fill"; + editor->cursor = QCursor(QPixmap(":/icons/fill_color_cursor.ico"), 10, 10); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + QScroller::ungrabGesture(ui->scrollArea); + checkToolButtons(); } void MainWindow::on_toolButton_Dropper_clicked() { editor->map_edit_mode = "pick"; + editor->cursor = QCursor(QPixmap(":/icons/pipette_cursor.ico"), 10, 10); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + QScroller::ungrabGesture(ui->scrollArea); + + checkToolButtons(); +} + +void MainWindow::on_toolButton_Move_clicked() +{ + editor->map_edit_mode = "move"; + editor->cursor = QCursor(QPixmap(":/icons/move.ico"), 7, 7); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); + checkToolButtons(); } @@ -925,6 +998,25 @@ void MainWindow::checkToolButtons() { ui->toolButton_Select->setChecked(editor->map_edit_mode == "select"); ui->toolButton_Fill->setChecked(editor->map_edit_mode == "fill"); ui->toolButton_Dropper->setChecked(editor->map_edit_mode == "pick"); + ui->toolButton_Move->setChecked(editor->map_edit_mode == "move"); +} + +void MainWindow::toggleEditModeMove() { + if (editor->map_edit_mode == "move") { + if (editor->prev_edit_mode == "paint") { + on_toolButton_Paint_clicked(); + } else if (editor->prev_edit_mode == "fill") { + on_toolButton_Fill_clicked(); + } else if (editor->prev_edit_mode == "pick") { + on_toolButton_Dropper_clicked(); + } else if (editor->prev_edit_mode == "select") { + on_toolButton_Select_clicked(); + } + } + else { + editor->prev_edit_mode = editor->map_edit_mode; + on_toolButton_Move_clicked(); + } } void MainWindow::onLoadMapRequested(QString mapName, QString fromMapName) { diff --git a/mainwindow.h b/mainwindow.h index be782842..b2c74610 100755 --- a/mainwindow.h +++ b/mainwindow.h @@ -37,6 +37,7 @@ private slots: void undo(); void redo(); + void toggleEditModeMove(); void openInTextEditor(); void onLoadMapRequested(QString, QString); @@ -60,6 +61,10 @@ private slots: void on_actionRedo_triggered(); + void on_actionZoom_In_triggered(); + void on_actionZoom_Out_triggered(); + void on_actionBetter_Cursors_triggered(); + void on_toolButton_deleteObject_clicked(); void on_toolButton_Open_Scripts_clicked(); @@ -74,6 +79,8 @@ private slots: void on_toolButton_Dropper_clicked(); + void on_toolButton_Move_clicked(); + void onOpenMapListContextMenu(const QPoint &point); void onAddNewMapToGroupClick(QAction* triggeredAction); void onTilesetChanged(QString); @@ -127,6 +134,8 @@ private: void displayMapProperties(); void checkToolButtons(); + + void scaleMapView(int); }; enum MapListUserRoles { diff --git a/mainwindow.ui b/mainwindow.ui index d24583d2..09e9f9d1 100755 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -245,6 +245,23 @@ + + + + <html><head/><body><p>Move</p><p>Click to drag map around.</p></body></html> + + + ... + + + + :/icons/move.ico:/icons/move.ico + + + true + + + @@ -334,8 +351,8 @@ 0 0 - 462 - 599 + 429 + 620 @@ -362,9 +379,18 @@ 0 + + false + false + + QAbstractScrollArea::AdjustIgnored + + + QGraphicsView::NoDrag + @@ -708,7 +734,7 @@ 0 0 - 252 + 315 86 @@ -812,10 +838,10 @@ - 8 + 0 0 - 323 - 368 + 365 + 405 @@ -1050,8 +1076,8 @@ 0 0 - 371 - 643 + 381 + 657 @@ -1216,8 +1242,8 @@ 0 0 - 410 - 560 + 420 + 584 @@ -1872,8 +1898,8 @@ 0 0 - 818 - 539 + 826 + 557 @@ -2045,7 +2071,7 @@ 0 0 1117 - 22 + 21 @@ -2067,8 +2093,17 @@ + + + View + + + + + + @@ -2127,6 +2162,36 @@ Export Map Image... + + + Zoom In + + + + + + + + + Zoom Out + + + - + + + + + true + + + true + + + Cursor Icons + + + <html><head/><body><p>Use reticule-styled cursors with icon showing currently selected tool.</p></body></html> + + diff --git a/map.cpp b/map.cpp index f114884f..626724f2 100755 --- a/map.cpp +++ b/map.cpp @@ -608,10 +608,11 @@ bool Map::hasUnsavedChanges() { } void Map::hoveredTileChanged(int x, int y, int block) { - emit statusBarMessage(QString("X: %1, Y: %2, Metatile: 0x%3") + emit statusBarMessage(QString("X: %1, Y: %2, Metatile: 0x%3, Scale = %4x") .arg(x) .arg(y) - .arg(QString("%1").arg(block, 3, 16, QChar('0')).toUpper())); + .arg(QString("%1").arg(block, 3, 16, QChar('0')).toUpper()) + .arg(QString::number(pow(this->scale_base,this->scale_exp)))); } void Map::clearHoveredTile() { diff --git a/map.h b/map.h index 017c7b8b..b41c97c4 100755 --- a/map.h +++ b/map.h @@ -9,6 +9,7 @@ #include #include #include +#include class HistoryItem { public: @@ -135,6 +136,8 @@ public: QString show_location; QString battle_scene; MapLayout *layout; + int scale_exp = 0; + double scale_base = sqrt(2); // adjust scale factor with this bool isPersistedToFile = true; diff --git a/resources/icons/fill_color_cursor.ico b/resources/icons/fill_color_cursor.ico new file mode 100644 index 00000000..712ab992 Binary files /dev/null and b/resources/icons/fill_color_cursor.ico differ diff --git a/resources/icons/move.ico b/resources/icons/move.ico new file mode 100644 index 00000000..1d247401 Binary files /dev/null and b/resources/icons/move.ico differ diff --git a/resources/icons/pencil_cursor.ico b/resources/icons/pencil_cursor.ico new file mode 100644 index 00000000..1ff8d8fb Binary files /dev/null and b/resources/icons/pencil_cursor.ico differ diff --git a/resources/icons/pipette_cursor.ico b/resources/icons/pipette_cursor.ico new file mode 100644 index 00000000..8c226945 Binary files /dev/null and b/resources/icons/pipette_cursor.ico differ diff --git a/resources/images.qrc b/resources/images.qrc index dfca147d..fcee557f 100755 --- a/resources/images.qrc +++ b/resources/images.qrc @@ -9,6 +9,7 @@ icons/map.ico icons/cursor.ico icons/fill_color.ico + icons/move.ico icons/pencil.ico icons/pipette.ico images/Entities_16x16.png @@ -16,5 +17,8 @@ icons/delete.ico icons/viewsprites.ico images/collisions.png + icons/fill_color_cursor.ico + icons/pencil_cursor.ico + icons/pipette_cursor.ico