Add actual preview to Export Map Stitch Image

This commit is contained in:
GriffinR 2024-10-02 01:44:09 -04:00
parent d369806c94
commit ae6312c131
3 changed files with 387 additions and 339 deletions

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>696</width> <width>817</width>
<height>396</height> <height>518</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -16,110 +16,15 @@
<property name="sizeGripEnabled"> <property name="sizeGripEnabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QGridLayout" name="gridLayout_4" columnstretch="2,1">
<item> <item row="1" column="1">
<widget class="QGroupBox" name="groupBox"> <widget class="QFrame" name="frame_Options">
<property name="title">
<string>Preview</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>403</width>
<height>343</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="4">
<widget class="QGraphicsView" name="graphicsView_Preview">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="dragMode">
<enum>QGraphicsView::NoDrag</enum>
</property>
</widget>
</item>
<item row="4" column="4">
<spacer name="verticalSpacer_South">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="4">
<spacer name="verticalSpacer_North">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="5">
<spacer name="horizontalSpacer_West">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>100</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0">
<spacer name="horizontalSpacer_East">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>100</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_Options"> <layout class="QVBoxLayout" name="verticalLayout_Options">
<item> <item>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
@ -133,7 +38,7 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="NoScrollComboBox" name="comboBox_MapSelection"> <widget class="NoScrollComboBox" name="comboBox_MapSelection">
<property name="sizeAdjustPolicy"> <property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum> <enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
</property> </property>
</widget> </widget>
</item> </item>
@ -320,7 +225,7 @@
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@ -330,6 +235,13 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="QCheckBox" name="checkBox_ActualSize">
<property name="text">
<string>Preview actual size</string>
</property>
</widget>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
@ -342,7 +254,7 @@
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@ -369,6 +281,100 @@
</layout> </layout>
</item> </item>
</layout> </layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_Preview">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Preview</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QScrollArea" name="scrollArea_Preview">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>439</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="2" column="3">
<widget class="QGraphicsView" name="graphicsView_Preview">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::SizeAdjustPolicy::AdjustIgnored</enum>
</property>
<property name="dragMode">
<enum>QGraphicsView::DragMode::NoDrag</enum>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_Description">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>

View file

@ -45,17 +45,23 @@ private:
bool showGrid = false; bool showGrid = false;
bool showBorder = false; bool showBorder = false;
bool showCollision = false; bool showCollision = false;
bool previewActualSize = false;
int timelapseSkipAmount = 1; int timelapseSkipAmount = 1;
int timelapseDelayMs = 200; int timelapseDelayMs = 200;
ImageExporterMode mode = ImageExporterMode::Normal; ImageExporterMode mode = ImageExporterMode::Normal;
void updatePreview(); void updatePreview();
void scalePreview();
void updateShowBorderState(); void updateShowBorderState();
void saveImage(); void saveImage();
QPixmap getStitchedImage(QProgressDialog *progress, bool includeBorder); QPixmap getStitchedImage(QProgressDialog *progress, bool includeBorder);
QPixmap getFormattedMapPixmap(Map *map, bool ignoreBorder = false); QPixmap getFormattedMapPixmap(Map *map, bool ignoreBorder = false);
bool historyItemAppliesToFrame(const QUndoCommand *command); bool historyItemAppliesToFrame(const QUndoCommand *command);
protected:
virtual void showEvent(QShowEvent *) override;
virtual void resizeEvent(QResizeEvent *) override;
private slots: private slots:
void on_checkBox_Objects_stateChanged(int state); void on_checkBox_Objects_stateChanged(int state);
void on_checkBox_Warps_stateChanged(int state); void on_checkBox_Warps_stateChanged(int state);
@ -77,6 +83,8 @@ private slots:
void on_pushButton_Cancel_pressed(); void on_pushButton_Cancel_pressed();
void on_spinBox_TimelapseDelay_valueChanged(int delayMs); void on_spinBox_TimelapseDelay_valueChanged(int delayMs);
void on_spinBox_FrameSkip_valueChanged(int skip); void on_spinBox_FrameSkip_valueChanged(int skip);
void on_checkBox_ActualSize_stateChanged(int state);
}; };
#endif // MAPIMAGEEXPORTER_H #endif // MAPIMAGEEXPORTER_H

View file

@ -23,6 +23,19 @@ QString getTitle(ImageExporterMode mode) {
return ""; return "";
} }
QString getDescription(ImageExporterMode mode) {
switch (mode)
{
case ImageExporterMode::Normal:
return "Exports an image of the selected map.";
case ImageExporterMode::Stitch:
return "Exports a combined image of all the maps connected to the selected map.";
case ImageExporterMode::Timelapse:
return "Exports a GIF of the edit history for the selected map.";
}
return "";
}
MapImageExporter::MapImageExporter(QWidget *parent_, Editor *editor_, ImageExporterMode mode) : MapImageExporter::MapImageExporter(QWidget *parent_, Editor *editor_, ImageExporterMode mode) :
QDialog(parent_), QDialog(parent_),
ui(new Ui::MapImageExporter) ui(new Ui::MapImageExporter)
@ -33,14 +46,13 @@ MapImageExporter::MapImageExporter(QWidget *parent_, Editor *editor_, ImageExpor
this->editor = editor_; this->editor = editor_;
this->mode = mode; this->mode = mode;
this->setWindowTitle(getTitle(this->mode)); this->setWindowTitle(getTitle(this->mode));
this->ui->label_Description->setText(getDescription(this->mode));
this->ui->groupBox_Connections->setVisible(this->mode != ImageExporterMode::Stitch); this->ui->groupBox_Connections->setVisible(this->mode != ImageExporterMode::Stitch);
this->ui->groupBox_Timelapse->setVisible(this->mode == ImageExporterMode::Timelapse); this->ui->groupBox_Timelapse->setVisible(this->mode == ImageExporterMode::Timelapse);
this->ui->comboBox_MapSelection->addItems(editor->project->mapNames); this->ui->comboBox_MapSelection->addItems(editor->project->mapNames);
this->ui->comboBox_MapSelection->setCurrentText(map->name); this->ui->comboBox_MapSelection->setCurrentText(map->name);
this->ui->comboBox_MapSelection->setEnabled(false);// TODO: allow selecting map from drop-down this->ui->comboBox_MapSelection->setEnabled(false);// TODO: allow selecting map from drop-down
updatePreview();
} }
MapImageExporter::~MapImageExporter() { MapImageExporter::~MapImageExporter() {
@ -48,6 +60,18 @@ MapImageExporter::~MapImageExporter() {
delete ui; delete ui;
} }
// Allow the window to open before displaying the preview.
void MapImageExporter::showEvent(QShowEvent *event) {
QWidget::showEvent(event);
if (!event->spontaneous())
QTimer::singleShot(0, this, &MapImageExporter::updatePreview);
}
void MapImageExporter::resizeEvent(QResizeEvent *event) {
QDialog::resizeEvent(event);
scalePreview();
}
void MapImageExporter::saveImage() { void MapImageExporter::saveImage() {
QString title = getTitle(this->mode); QString title = getTitle(this->mode);
QString defaultFilename; QString defaultFilename;
@ -74,22 +98,10 @@ void MapImageExporter::saveImage() {
editor->project->setImportExportPath(filepath); editor->project->setImportExportPath(filepath);
switch (this->mode) { switch (this->mode) {
case ImageExporterMode::Normal: case ImageExporterMode::Normal:
case ImageExporterMode::Stitch:
// Normal and Stitch modes already have the image ready to go in the preview.
this->preview.save(filepath); this->preview.save(filepath);
break; break;
case ImageExporterMode::Stitch: {
QProgressDialog progress("Building map stitch...", "Cancel", 0, 1, this);
progress.setAutoClose(true);
progress.setWindowModality(Qt::WindowModal);
progress.setModal(true);
QPixmap pixmap = this->getStitchedImage(&progress, this->showBorder);
if (progress.wasCanceled()) {
progress.close();
return;
}
pixmap.save(filepath);
progress.close();
break;
}
case ImageExporterMode::Timelapse: case ImageExporterMode::Timelapse:
QProgressDialog progress("Building map timelapse...", "Cancel", 0, 1, this); QProgressDialog progress("Building map timelapse...", "Cancel", 0, 1, this);
progress.setAutoClose(true); progress.setAutoClose(true);
@ -354,19 +366,32 @@ QPixmap MapImageExporter::getStitchedImage(QProgressDialog *progress, bool inclu
} }
void MapImageExporter::updatePreview() { void MapImageExporter::updatePreview() {
if (scene) { if (this->scene) {
delete scene; delete this->scene;
scene = nullptr; this->scene = nullptr;
} }
this->scene = new QGraphicsScene;
preview = getFormattedMapPixmap(this->map); if (this->mode == ImageExporterMode::Stitch) {
scene = new QGraphicsScene; QProgressDialog progress("Building map stitch...", "Cancel", 0, 1, this);
scene->addPixmap(preview); progress.setAutoClose(true);
this->scene->setSceneRect(this->scene->itemsBoundingRect()); progress.setWindowModality(Qt::WindowModal);
progress.setModal(true);
this->preview = getStitchedImage(&progress, this->showBorder);
progress.close();
} else {
// Timelapse mode doesn't currently have a real preview. It just displays the current map as in Normal mode.
this->preview = getFormattedMapPixmap(this->map);
}
this->scene->addPixmap(this->preview);
ui->graphicsView_Preview->setScene(scene);
scalePreview();
}
this->ui->graphicsView_Preview->setScene(scene); void MapImageExporter::scalePreview() {
this->ui->graphicsView_Preview->setFixedSize(scene->itemsBoundingRect().width() + 2, if (this->scene && !this->previewActualSize){
scene->itemsBoundingRect().height() + 2); ui->graphicsView_Preview->fitInView(this->scene->sceneRect(), Qt::KeepAspectRatioByExpanding);
}
} }
QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) { QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) {
@ -539,6 +564,15 @@ void MapImageExporter::on_checkBox_ConnectionRight_stateChanged(int state) {
updatePreview(); updatePreview();
} }
void MapImageExporter::on_checkBox_ActualSize_stateChanged(int state) {
previewActualSize = (state == Qt::Checked);
if (previewActualSize) {
ui->graphicsView_Preview->resetTransform();
} else {
scalePreview();
}
}
void MapImageExporter::on_pushButton_Save_pressed() { void MapImageExporter::on_pushButton_Save_pressed() {
saveImage(); saveImage();
} }