11#include " FredView.h"
22#include " ui_FredView.h"
33
4+ #include < QDir>
45#include < QFileDialog>
56#include < QMessageBox>
67#include < QDebug>
4344#include < ui/dialogs/MusicPlayerDialog.h>
4445#include < ui/dialogs/RelativeCoordinatesDialog.h>
4546#include < ui/dialogs/ControlsDialog.h>
47+ #include < ui/dialogs/SaveAsTemplateDialog.h>
48+ #include < ui/dialogs/TemplateBrowserDialog.h>
4649#include < ui/ControlBindings.h>
4750#include < iff_defs/iff_defs.h>
4851
4952#include " mission/Editor.h"
5053#include " mission/management.h"
54+ #include " mission/missionparse.h"
5155#include " missioneditor/missionsave.h"
5256
5357#include " widgets/ColorComboBox.h"
@@ -171,7 +175,7 @@ void FredView::setEditor(Editor* editor, EditorViewport* viewport) {
171175 connect (this , &FredView::viewIdle, this , [this ]() { ui->actionError_Checker_Checks_Potential_Issues ->setChecked (_viewport->Error_checker_checks_potential_issues ); });
172176}
173177
174- void FredView::loadMissionFile (const QString& pathName) {
178+ void FredView::loadMissionFile (const QString& pathName, int flags ) {
175179 if (!maybePromptToSaveMissionChanges (tr (" loading another mission" ))) {
176180 return ;
177181 }
@@ -184,9 +188,10 @@ void FredView::loadMissionFile(const QString& pathName) {
184188 fred->clean_up_selections ();
185189
186190 auto pathToLoad = pathName.toStdString ();
187- fred->maybeUseAutosave (pathToLoad);
191+ if (!(flags & MPF_IS_TEMPLATE ))
192+ fred->maybeUseAutosave (pathToLoad);
188193
189- fred->loadMission (pathToLoad);
194+ fred->loadMission (pathToLoad, flags );
190195
191196 QApplication::restoreOverrideCursor ();
192197 } catch (const fso::fred::mission_load_error&) {
@@ -273,6 +278,68 @@ bool FredView::saveMissionAs() {
273278 return true ;
274279}
275280
281+ void FredView::saveAsTemplate () {
282+ // Collect template metadata first
283+ dialogs::SaveAsTemplateDialog metaDialog (this , getUsername ());
284+ if (metaDialog.exec () != QDialog::Accepted)
285+ return ;
286+
287+ // Default to data/missions/templates/ and create it if needed
288+ QString templatesDir = QDir::currentPath () + " /data/missions/templates" ;
289+ QDir ().mkpath (templatesDir);
290+
291+ QString templateName = QFileDialog::getSaveFileName (this ,
292+ tr (" Save As Template" ),
293+ templatesDir,
294+ tr (" FS2 mission templates (*.fst)" ));
295+
296+ if (templateName.isEmpty ())
297+ return ;
298+
299+ if (!templateName.endsWith (" .fst" , Qt::CaseInsensitive))
300+ templateName += " .fst" ;
301+
302+ Fred_mission_save save;
303+ save.set_always_save_display_names (_viewport->Always_save_display_names );
304+ save.set_fred_alt_names (Fred_alt_names);
305+ save.set_fred_callsigns (Fred_callsigns);
306+ save.set_template_info (metaDialog.templateInfo ());
307+
308+ save.save_template_file (templateName.replace (' /' , DIR_SEPARATOR_CHAR ).toUtf8 ().constData ());
309+ }
310+
311+ void FredView::loadTemplate () {
312+ QString templatesDir = QDir::currentPath () + " /data/missions/templates" ;
313+ QDir ().mkpath (templatesDir);
314+
315+ dialogs::TemplateBrowserDialog browser (this , templatesDir);
316+ if (browser.exec () != QDialog::Accepted)
317+ return ;
318+
319+ QString templateName = browser.selectedTemplatePath ();
320+ if (templateName.isEmpty ())
321+ return ;
322+
323+ auto result = QMessageBox::question (this ,
324+ tr (" Load Template" ),
325+ tr (" This will replace all mission data. Continue?" ),
326+ QMessageBox::Yes | QMessageBox::No,
327+ QMessageBox::No);
328+
329+ if (result != QMessageBox::Yes)
330+ return ;
331+
332+ loadMissionFile (templateName.replace (' /' , DIR_SEPARATOR_CHAR ), MPF_IS_TEMPLATE );
333+ }
334+
335+ void FredView::on_actionLoad_Template_triggered (bool ) {
336+ loadTemplate ();
337+ }
338+
339+ void FredView::on_actionSave_As_Template_triggered (bool ) {
340+ saveAsTemplate ();
341+ }
342+
276343void FredView::on_mission_loaded (const std::string& filepath) {
277344 QString filename = " Untitled" ;
278345 if (!filepath.empty ()) {
@@ -304,6 +371,10 @@ void FredView::newMission() {
304371 fred->createNewMission ();
305372}
306373void FredView::addToRecentFiles (const QString& path) {
374+ // Templates are not mission files; don't pollute the recent list with them
375+ if (path.endsWith (" .fst" , Qt::CaseInsensitive))
376+ return ;
377+
307378 // First get the list of existing files
308379 QSettings settings;
309380 auto recentFiles = settings.value (" FredView/recentFiles" ).toStringList ();
0 commit comments