Fix minor issues with resize layout

This commit is contained in:
GriffinR 2025-05-16 12:12:41 -04:00
parent 760b6119d0
commit deaf067c50
5 changed files with 56 additions and 49 deletions

View File

@ -34,6 +34,7 @@
#include "mapheaderform.h"
#include "newlayoutdialog.h"
#include "message.h"
#include "resizelayoutpopup.h"
@ -253,8 +254,8 @@ private slots:
void on_actionTileset_Editor_triggered();
void moveEvent(QMoveEvent *event);
void closeEvent(QCloseEvent *);
void moveEvent(QMoveEvent *event) override;
void closeEvent(QCloseEvent *) override;
void eventTabChanged(int index);
@ -326,6 +327,7 @@ private:
QPointer<WildMonChart> wildMonChart = nullptr;
QPointer<WildMonSearch> wildMonSearch = nullptr;
QPointer<QuestionMessage> fileWatcherWarning = nullptr;
QPointer<ResizeLayoutPopup> resizeLayoutPopup = nullptr;
QAction *undoAction = nullptr;
QAction *redoAction = nullptr;

View File

@ -9,11 +9,13 @@
#include <QDialogButtonBox>
class ResizableRect;
class Editor;
namespace Ui {
class ResizeLayoutPopup;
}
class Layout;
class Project;
/// Custom scene that paints its background a gray checkered pattern.
@ -68,7 +70,7 @@ class ResizeLayoutPopup : public QDialog
Q_OBJECT
public:
ResizeLayoutPopup(QWidget *parent, Editor *editor);
ResizeLayoutPopup(QWidget *parent, Layout *layout, Project *project);
~ResizeLayoutPopup();
void setupLayoutView();
@ -96,7 +98,8 @@ private slots:
private:
QWidget *parent = nullptr;
Editor *editor = nullptr;
QPointer<Layout> layout = nullptr;
QPointer<Project> project = nullptr;
Ui::ResizeLayoutPopup *ui;

View File

@ -1755,7 +1755,11 @@ void Editor::displayMapEvents() {
events_group = new QGraphicsItemGroup;
scene->addItem(events_group);
for (const auto &event : map->getEvents()) {
const auto events = map->getEvents();
if (!events.isEmpty()) {
this->selectedEvents.append(events.first());
}
for (const auto &event : events) {
addEventPixmapItem(event);
}

View File

@ -1215,6 +1215,8 @@ bool MainWindow::setLayout(const QString &layoutId) {
return true;
}
// TODO: This is being used to do more work than necessary (e.g. when a layout is resized,
// we don't need to be recreating the metatile selector, all the events, etc.)
void MainWindow::redrawMapScene() {
editor->displayLayout();
editor->displayMap();
@ -2623,8 +2625,12 @@ void MainWindow::onMapRulerStatusChanged(const QString &status) {
void MainWindow::moveEvent(QMoveEvent *event) {
QMainWindow::moveEvent(event);
if (label_MapRulerStatus && label_MapRulerStatus->isVisible() && label_MapRulerStatus->parentWidget())
if (label_MapRulerStatus && label_MapRulerStatus->isVisible() && label_MapRulerStatus->parentWidget()) {
label_MapRulerStatus->move(label_MapRulerStatus->parentWidget()->mapToGlobal(QPoint(6, 6)));
}
if (this->resizeLayoutPopup) {
this->resizeLayoutPopup->resetPosition();
}
}
void MainWindow::on_action_Export_Map_Image_triggered() {
@ -2768,17 +2774,15 @@ void MainWindow::on_comboBox_SecondaryTileset_currentTextChanged(const QString &
}
void MainWindow::on_pushButton_ChangeDimensions_clicked() {
if (!editor || !editor->layout) return;
if (this->resizeLayoutPopup || !this->editor->layout || !this->editor->project) return;
ResizeLayoutPopup popup(this->ui->graphicsView_Map, this->editor);
popup.show();
popup.setupLayoutView();
if (popup.exec() == QDialog::Accepted) {
this->resizeLayoutPopup = new ResizeLayoutPopup(this->ui->graphicsView_Map, this->editor->layout, this->editor->project);
this->resizeLayoutPopup->show();
this->resizeLayoutPopup->setupLayoutView();
if (this->resizeLayoutPopup->exec() == QDialog::Accepted) {
Layout *layout = this->editor->layout;
Map *map = this->editor->map;
QMargins result = popup.getResult();
QSize borderResult = popup.getBorderResult();
QMargins result = this->resizeLayoutPopup->getResult();
QSize borderResult = this->resizeLayoutPopup->getBorderResult();
QSize oldLayoutDimensions(layout->getWidth(), layout->getHeight());
QSize oldBorderDimensions(layout->getBorderWidth(), layout->getBorderHeight());
if (!result.isNull() || (borderResult != oldBorderDimensions)) {
@ -2795,6 +2799,7 @@ void MainWindow::on_pushButton_ChangeDimensions_clicked() {
));
}
// If we're in map-editing mode, adjust the events' position by the same amount.
Map *map = this->editor->map;
if (map) {
auto events = map->getEvents();
int deltaX = result.left();
@ -2804,6 +2809,7 @@ void MainWindow::on_pushButton_ChangeDimensions_clicked() {
}
}
}
this->resizeLayoutPopup->deleteLater();
}
void MainWindow::setSmartPathsEnabled(bool enabled)

View File

@ -3,6 +3,7 @@
#include "movablerect.h"
#include "config.h"
#include "utility.h"
#include "message.h"
#include "ui_resizelayoutpopup.h"
@ -70,10 +71,11 @@ QVariant BoundedPixmapItem::itemChange(GraphicsItemChange change, const QVariant
************************************************************************
******************************************************************************/
ResizeLayoutPopup::ResizeLayoutPopup(QWidget *parent, Editor *editor) :
ResizeLayoutPopup::ResizeLayoutPopup(QWidget *parent, Layout *layout, Project *project) :
QDialog(parent),
parent(parent),
editor(editor),
layout(layout),
project(project),
ui(new Ui::ResizeLayoutPopup)
{
ui->setupUi(this);
@ -107,11 +109,10 @@ void ResizeLayoutPopup::on_buttonBox_clicked(QAbstractButton *button) {
/// (1) pixmap representing the current layout / not resizable / drag-movable
/// (1) layout outline / resizable / not movable
void ResizeLayoutPopup::setupLayoutView() {
if (!this->editor || !this->editor->layout) return;
if (!this->layout || !this->project) return;
// Border stuff
bool bordersEnabled = projectConfig.useCustomBorderSize;
if (bordersEnabled) {
if (projectConfig.useCustomBorderSize) {
this->ui->spinBox_borderWidth->setMinimum(1);
this->ui->spinBox_borderHeight->setMinimum(1);
this->ui->spinBox_borderWidth->setMaximum(MAX_BORDER_WIDTH);
@ -119,15 +120,14 @@ void ResizeLayoutPopup::setupLayoutView() {
} else {
this->ui->frame_border->setVisible(false);
}
this->ui->spinBox_borderWidth->setValue(this->editor->layout->getBorderWidth());
this->ui->spinBox_borderHeight->setValue(this->editor->layout->getBorderHeight());
this->ui->spinBox_borderWidth->setValue(this->layout->getBorderWidth());
this->ui->spinBox_borderHeight->setValue(this->layout->getBorderHeight());
// Layout stuff
QPixmap pixmap = this->editor->layout->pixmap;
this->layoutPixmap = new BoundedPixmapItem(pixmap);
this->layoutPixmap = new BoundedPixmapItem(this->layout->pixmap);
this->scene->addItem(layoutPixmap);
int maxWidth = this->editor->project->getMaxMapWidth();
int maxHeight = this->editor->project->getMaxMapHeight();
int maxWidth = this->project->getMaxMapWidth();
int maxHeight = this->project->getMaxMapHeight();
QGraphicsRectItem *cover = new QGraphicsRectItem(-maxWidth * 8, -maxHeight * 8, maxWidth * 16, maxHeight * 16);
this->scene->addItem(cover);
@ -138,33 +138,25 @@ void ResizeLayoutPopup::setupLayoutView() {
static bool layoutSizeRectVisible = true;
this->outline = new ResizableRect(this, &layoutSizeRectVisible, this->editor->layout->getWidth(), this->editor->layout->getHeight(), qRgb(255, 0, 255));
this->outline = new ResizableRect(this, &layoutSizeRectVisible, this->layout->getWidth(), this->layout->getHeight(), qRgb(255, 0, 255));
this->outline->setZValue(Editor::ZValue::ResizeLayoutPopup); // Ensure on top of view
this->outline->setLimit(cover->rect().toAlignedRect());
connect(outline, &ResizableRect::rectUpdated, [=](QRect rect){
// Note: this extra limit check needs access to the project values, so it is done here and not ResizableRect::mouseMoveEvent
// Upper limits: maximum metatiles in a map formula:
// max = (width + 15) * (height + 14)
// This limit can be found in fieldmap.c in pokeruby/pokeemerald/pokefirered.
int size = editor->project->getMapDataSize(rect.width() / 16, rect.height() / 16);
int maxSize = editor->project->getMaxMapDataSize();
int size = this->project->getMapDataSize(rect.width() / 16, rect.height() / 16);
int maxSize = this->project->getMaxMapDataSize();
if (size > maxSize) {
QSize addition = editor->project->getMapSizeAddition();
QString errorText = QString("The maximum layout width and height is the following: (width + %1) * (height + %2) <= %3\n"
"The specified layout width and height was: (%4 + %1) * (%5 + %2) = %6")
.arg(addition.width())
.arg(addition.height())
.arg(maxSize)
.arg(rect.width() / 16)
.arg(rect.height() / 16)
.arg(size);
QMessageBox warning;
warning.setIcon(QMessageBox::Warning);
warning.setText("The specified width and height are too large.");
warning.setInformativeText(errorText);
warning.setStandardButtons(QMessageBox::Ok);
warning.setDefaultButton(QMessageBox::Ok);
warning.exec();
QSize addition = this->project->getMapSizeAddition();
WarningMessage::show(QStringLiteral("The specified width and height are too large."),
QString("The maximum layout width and height is the following: (width + %1) * (height + %2) <= %3\n"
"The specified layout width and height was: (%4 + %1) * (%5 + %2) = %6")
.arg(addition.width())
.arg(addition.height())
.arg(maxSize)
.arg(rect.width() / 16)
.arg(rect.height() / 16)
.arg(size),
this);
// adjust rect to last accepted size
rect = this->scene->getValidRect();
}