Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions qtfred/source_groups.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ add_file_folder("Source/UI/General"
)

add_file_folder("Source/UI/Util"
src/ui/util/default_dir.cpp
src/ui/util/default_dir.h
src/ui/util/ImageRenderer.cpp
src/ui/util/ImageRenderer.h
src/ui/util/menu.cpp
Expand Down
42 changes: 30 additions & 12 deletions qtfred/src/ui/FredView.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "FredView.h"
#include "ui_FredView.h"

#include <ui/util/default_dir.h>

#include <QDir>
#include <QFileDialog>
#include <QFileInfo>
Expand Down Expand Up @@ -254,13 +256,15 @@ void FredView::loadMissionFile(const QString& pathName, int flags) {
}

void FredView::openLoadMissionDialog() {
qDebug() << "Loading from directory:" << QDir::currentPath();
QString pathName = QFileDialog::getOpenFileName(this, tr("Load mission"), QString(), tr("FS2 missions (*.fs2)"));
const QString lastDir = fso::fred::util::getLastDir("missions/loadMission", CF_TYPE_MISSIONS);

QString pathName = QFileDialog::getOpenFileName(this, tr("Load mission"), lastDir, tr("FS2 missions (*.fs2)"));

if (pathName.isEmpty()) {
return;
}

fso::fred::util::saveLastDir("missions/loadMission", pathName);
loadMissionFile(pathName.replace('/',DIR_SEPARATOR_CHAR));
}

Expand Down Expand Up @@ -302,10 +306,15 @@ bool FredView::saveMissionAs() {
save.set_fred_alt_names(Fred_alt_names);
save.set_fred_callsigns(Fred_callsigns);

saveName = QFileDialog::getSaveFileName(this, tr("Save mission"), QString(), tr("FS2 missions (*.fs2)"));
{
const QString lastDir = fso::fred::util::getLastDir("missions/saveMission", CF_TYPE_MISSIONS);
saveName = QFileDialog::getSaveFileName(this, tr("Save mission"), lastDir, tr("FS2 missions (*.fs2)"));

if (saveName.isEmpty()) {
return false;
if (saveName.isEmpty()) {
return false;
}

fso::fred::util::saveLastDir("missions/saveMission", saveName);
}

save.save_mission_file(saveName.replace('/',DIR_SEPARATOR_CHAR).toUtf8().constData());
Expand All @@ -319,18 +328,22 @@ void FredView::saveAsTemplate() {
if (metaDialog.exec() != QDialog::Accepted)
return;

// Default to data/missions/templates/ and create it if needed
QString templatesDir = QDir::currentPath() + "/data/missions/templates";
QDir().mkpath(templatesDir);
// Ensure templates subdir exists; use missions dir as fallback default
const QString defaultTemplatesDir = fso::fred::util::fredDefaultDir(CF_TYPE_MISSIONS) + "/templates";
QDir().mkpath(defaultTemplatesDir);

const QString lastTemplatesDir = fso::fred::util::getLastDir("missions/saveTemplate", defaultTemplatesDir);

QString templateName = QFileDialog::getSaveFileName(this,
tr("Save As Template"),
templatesDir,
lastTemplatesDir,
tr("FS2 mission templates (*.fst)"));

if (templateName.isEmpty())
return;

fso::fred::util::saveLastDir("missions/saveTemplate", templateName);

if (!templateName.endsWith(".fst", Qt::CaseInsensitive))
templateName += ".fst";

Expand All @@ -344,7 +357,7 @@ void FredView::saveAsTemplate() {
}

void FredView::loadTemplate() {
QString templatesDir = QDir::currentPath() + "/data/missions/templates";
QString templatesDir = fso::fred::util::fredDefaultDir(CF_TYPE_MISSIONS) + "/templates";
QDir().mkpath(templatesDir);

dialogs::TemplateBrowserDialog browser(this, templatesDir);
Expand Down Expand Up @@ -429,18 +442,23 @@ void FredView::on_actionFS1_Mission_triggered(bool) {

QStringList srcPaths = QFileDialog::getOpenFileNames(this,
tr("Select FS1 mission(s) to import"),
QString(),
fso::fred::util::getLastDir("missions/importFS1Source", QDir::homePath()),
tr("FreeSpace Missions (*.fsm)"));

if (srcPaths.isEmpty())
return;

fso::fred::util::saveLastDir("missions/importFS1Source", srcPaths.first());

QString destDir = QFileDialog::getExistingDirectory(this,
tr("Select destination folder for converted missions"));
tr("Select destination folder for converted missions"),
fso::fred::util::getLastDir("missions/importFS1Dest", CF_TYPE_MISSIONS));

if (destDir.isEmpty())
return;

fso::fred::util::saveLastDir("missions/importFS1Dest", destDir);

QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

int successes = 0;
Expand Down
26 changes: 11 additions & 15 deletions qtfred/src/ui/dialogs/BackgroundEditorDialog.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
#include "BackgroundEditorDialog.h"
#include <QCloseEvent>
#include "ui/util/default_dir.h"
#include "ui/util/SignalBlockers.h"
#include "ui/dialogs/General/ImagePickerDialog.h"
#include "ui_BackgroundEditor.h"

#include <globalincs/globals.h>
#include <QMessageBox>
#include <QSettings>
#include <QFileDialog>
#include <QFileInfo>
#include <QInputDialog>
Expand Down Expand Up @@ -451,9 +451,12 @@ void BackgroundEditorDialog::on_removeButton_clicked()

void BackgroundEditorDialog::on_importButton_clicked()
{
const QString file = QFileDialog::getOpenFileName(this, "Import Backgrounds from File", QString(), "Freespace 2 Mission Files (*.fs2);;All Files (*)");
const QString importLastDir = util::getLastDir("background/importBackgrounds", CF_TYPE_MISSIONS);

const QString file = QFileDialog::getOpenFileName(this, "Import Backgrounds from File", importLastDir, "Freespace 2 Mission Files (*.fs2);;All Files (*)");
if (file.isEmpty())
return;
util::saveLastDir("background/importBackgrounds", file);
int count = _model->getImportableBackgroundCount(file.toUtf8().constData());

if (count <= 0) {
Expand Down Expand Up @@ -852,19 +855,15 @@ void BackgroundEditorDialog::updateAmbientSwatch()

void BackgroundEditorDialog::on_skyboxModelButton_clicked()
{
QSettings settings("QtFRED", "BackgroundEditor");
const QString lastDir = settings.value("skybox/lastDir", QDir::homePath()).toString();
const QString lastDir = util::getLastDir("background/skyboxModel", CF_TYPE_MODELS);

const QString path =
QFileDialog::getOpenFileName(this, tr("Select Skybox Model"), lastDir, tr("FS2 Models (*.pof);;All Files (*)"));
if (path.isEmpty())
return;

const QFileInfo fi(path);
settings.setValue("skybox/lastDir", fi.absolutePath());

const QString baseName = fi.completeBaseName();
_model->setSkyboxModelName(baseName.toUtf8().constData());
util::saveLastDir("background/skyboxModel", path);
_model->setSkyboxModelName(QFileInfo(path).completeBaseName().toUtf8().constData());

updateSkyboxControls();
}
Expand Down Expand Up @@ -940,18 +939,15 @@ void BackgroundEditorDialog::on_subspaceCheckBox_toggled(bool checked)

void BackgroundEditorDialog::on_envMapButton_clicked()
{
QSettings settings("QtFRED", "BackgroundEditor");
const QString lastDir = settings.value("envmap/lastDir", QDir::homePath()).toString();
const QString lastDir = util::getLastDir("background/envMap", CF_TYPE_MAPS);
const QString path = QFileDialog::getOpenFileName(this,
tr("Select Environment Map"),
lastDir,
tr("Environment Maps (*.dds);;All Files (*)"));
if (path.isEmpty())
return;
const QFileInfo fi(path);
settings.setValue("envmap/lastDir", fi.absolutePath());
const QString baseName = fi.completeBaseName();
_model->setEnvironmentMapName(baseName.toUtf8().constData());
util::saveLastDir("background/envMap", path);
_model->setEnvironmentMapName(QFileInfo(path).completeBaseName().toUtf8().constData());
updateMiscControls();
}

Expand Down
13 changes: 6 additions & 7 deletions qtfred/src/ui/dialogs/BriefingEditorDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
#include <globalincs/globals.h>
#include <globalincs/linklist.h>
#include <mission/missionbriefcommon.h>
#include <ui/util/default_dir.h>
#include <ui/util/SignalBlockers.h>

#include <QCloseEvent>
#include <QCheckBox>
#include <QFileDialog>
#include <QVBoxLayout>
#include <QFileInfo>

namespace fso::fred::dialogs {

Expand Down Expand Up @@ -679,21 +681,18 @@ void BriefingEditorDialog::on_voiceFileLineEdit_textChanged(const QString& strin

void BriefingEditorDialog::on_voiceFileBrowseButton_clicked()
{
int dir_pushed = cfile_push_chdir(CF_TYPE_VOICE_DEBRIEFINGS);
const QString lastDir = util::getLastDir("briefing/voiceFile", CF_TYPE_VOICE_DEBRIEFINGS);

QFileDialog dlg(this, "Select Voice File", "", "Voice Files (*.ogg *.wav)");
QFileDialog dlg(this, "Select Voice File", lastDir, "Voice Files (*.ogg *.wav)");
if (dlg.exec() == QDialog::Accepted) {
QStringList files = dlg.selectedFiles();
if (!files.isEmpty()) {
QFileInfo fileInfo(files.first());
const QFileInfo fileInfo(files.first());
util::saveLastDir("briefing/voiceFile", files.first());
_model->setSpeechFilename(fileInfo.fileName().toUtf8().constData());
updateUi();
}
}

if (dir_pushed) {
cfile_pop_dir();
}
}

void BriefingEditorDialog::on_voiceFilePlayButton_clicked()
Expand Down
31 changes: 23 additions & 8 deletions qtfred/src/ui/dialogs/CampaignEditorDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
#include <globalincs/globals.h>
#include "ui/widgets/sexp_tree.h"
#include "ui/widgets/SimpleListSelectDialog.h"
#include "ui/util/default_dir.h"
#include "ui/util/SignalBlockers.h"
#include "mission/util.h"
#include <ui/dialogs/MissionSpecs/CustomDataDialog.h>
#include <QFileInfo>
#include <QInputDialog>
#include <QFileDialog>
#include <QMessageBox>
Expand Down Expand Up @@ -387,12 +389,15 @@ void CampaignEditorDialog::on_actionOpen_triggered()
}

// Open a file dialog to let the user select a campaign file.
QString pathName = QFileDialog::getOpenFileName(this, "Load Campaign", "", "FS2 Campaigns (*.fc2)");
const QString lastDir = util::getLastDir("campaign/loadCampaign", CF_TYPE_MISSIONS);

QString pathName = QFileDialog::getOpenFileName(this, "Load Campaign", lastDir, "FS2 Campaigns (*.fc2)");

if (pathName.isEmpty()) {
return; // User cancelled the file dialog.
}

util::saveLastDir("campaign/loadCampaign", pathName);
QString nativePath = QDir::toNativeSeparators(pathName);

_model->loadCampaignFromFile(nativePath.toUtf8().constData());
Expand All @@ -416,12 +421,16 @@ void CampaignEditorDialog::on_actionSave_triggered()
void CampaignEditorDialog::on_actionSave_As_triggered()
{
// Open a file dialog to let the user choose a save location and filename.
QString pathName = QFileDialog::getSaveFileName(this, "Save Campaign As", "", "FS2 Campaigns (*.fc2)");
const QString lastDir = util::getLastDir("campaign/saveCampaign", CF_TYPE_MISSIONS);

QString pathName = QFileDialog::getSaveFileName(this, "Save Campaign As", lastDir, "FS2 Campaigns (*.fc2)");

if (pathName.isEmpty()) {
return; // User cancelled the file dialog.
}

util::saveLastDir("campaign/saveCampaign", pathName);

// The model will handle the actual save operation.
_model->saveCampaign(pathName.toUtf8().constData());
}
Expand Down Expand Up @@ -744,21 +753,27 @@ void CampaignEditorDialog::on_loopVoiceLineEdit_textChanged(const QString& arg1)
void CampaignEditorDialog::on_loopAnimBrowseButton_clicked()
{
util::SignalBlockers blocker(this);

QString filter = "FSO Animations (*.ani *.eff *.png);;All Files (*.*)";
QString fileName = QFileDialog::getOpenFileName(this, "Select Loop Animation", "", filter);

const QString lastDir = util::getLastDir("campaign/loopAnim", CF_TYPE_INTERFACE);

const QString filter = "FSO Animations (*.ani *.eff *.png);;All Files (*.*)";
const QString fileName = QFileDialog::getOpenFileName(this, "Select Loop Animation", lastDir, filter);
if (!fileName.isEmpty()) {
util::saveLastDir("campaign/loopAnim", fileName);
ui->loopAnimLineEdit->setText(fileName);
}
}

void CampaignEditorDialog::on_loopVoiceBrowseButton_clicked()
{
util::SignalBlockers blocker(this);

QString filter = "Audio Files (*.wav *.ogg);;All Files (*.*)";
QString fileName = QFileDialog::getOpenFileName(this, "Select Loop Voice", "", filter);

const QString lastDir = util::getLastDir("campaign/loopVoice", CF_TYPE_VOICE_SPECIAL);

const QString filter = "Audio Files (*.wav *.ogg);;All Files (*.*)";
const QString fileName = QFileDialog::getOpenFileName(this, "Select Loop Voice", lastDir, filter);
if (!fileName.isEmpty()) {
util::saveLastDir("campaign/loopVoice", fileName);
ui->loopVoiceLineEdit->setText(fileName);
}

Expand Down
21 changes: 13 additions & 8 deletions qtfred/src/ui/dialogs/CommandBriefingDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
#include "mission/util.h"
#include <globalincs/globals.h>
#include <globalincs/linklist.h>
#include <ui/util/default_dir.h>
#include <ui/util/SignalBlockers.h>
#include <QCloseEvent>
#include <QFileDialog>
#include <QFileInfo>

namespace fso::fred::dialogs {

Expand Down Expand Up @@ -172,7 +174,7 @@ void CommandBriefingDialog::on_actionBrowseAnimation_clicked()
{
QString filename;

if (CommandBriefingDialog::browseFile(&filename)) {
if (browseFile(&filename, "commandBriefing/animation", util::fredDefaultDir(CF_TYPE_INTERFACE), "FSO Animations (*.ani *.eff *.png);;All Files (*.*)")) {
_model->setAnimationFilename(filename.toUtf8().constData());
}
updateUi();
Expand All @@ -182,12 +184,12 @@ void CommandBriefingDialog::on_actionBrowseSpeechFile_clicked()
{
QString filename;

if (CommandBriefingDialog::browseFile(&filename)) {
if (browseFile(&filename, "commandBriefing/speechFile", util::fredDefaultDir(CF_TYPE_VOICE), "Voice Files (*.ogg *.wav);;All Files (*.*)")) {
_model->setSpeechFilename(filename.toUtf8().constData());
}
updateUi();
}

void CommandBriefingDialog::on_actionTestSpeechFileButton_clicked()
{
_model->testSpeech();
Expand All @@ -197,7 +199,7 @@ void CommandBriefingDialog::on_actionLowResolutionBrowse_clicked()
{
QString filename;

if (CommandBriefingDialog::browseFile(&filename)) {
if (browseFile(&filename, "commandBriefing/lowRes", util::fredDefaultDir(CF_TYPE_INTERFACE), "FSO Animations (*.ani *.eff *.png);;All Files (*.*)")) {
_model->setLowResolutionFilename(filename.toUtf8().constData());
}
updateUi();
Expand All @@ -207,7 +209,7 @@ void CommandBriefingDialog::on_actionHighResolutionBrowse_clicked()
{
QString filename;

if (CommandBriefingDialog::browseFile(&filename)) {
if (browseFile(&filename, "commandBriefing/highRes", util::fredDefaultDir(CF_TYPE_INTERFACE), "FSO Animations (*.ani *.eff *.png);;All Files (*.*)")) {
_model->setHighResolutionFilename(filename.toUtf8().constData());
}
updateUi();
Expand Down Expand Up @@ -245,9 +247,11 @@ void CommandBriefingDialog::on_actionHighResolutionFilenameEdit_textChanged(cons
}

// string in returns the file name, and the function returns true for success or false for fail.
bool CommandBriefingDialog::browseFile(QString* stringIn)
bool CommandBriefingDialog::browseFile(QString* stringIn, const QString& settingsKey, const QString& defaultDir, const QString& filter)
{
QFileInfo fileInfo(QFileDialog::getOpenFileName());
const QString lastDir = util::getLastDir(settingsKey, defaultDir);

const QFileInfo fileInfo(QFileDialog::getOpenFileName(this, QString(), lastDir, filter));
*stringIn = fileInfo.fileName();

if (stringIn->length() >= CF_MAX_FILENAME_LENGTH) {
Expand All @@ -257,7 +261,8 @@ bool CommandBriefingDialog::browseFile(QString* stringIn)
return false;
}

util::saveLastDir(settingsKey, fileInfo.absoluteFilePath());
return true;
}

} // namespace fso::fred::dialogs
} // namespace fso::fred::dialogs
Loading
Loading