25 #include "datapaths.h"
26 #include "fileutils.h"
28 #include "ini/settingsproviderqt.h"
30 #include "templatedpathresolver.h"
31 #include "plugins/engineplugin.h"
37 #include <QMessageBox>
39 class GameDemoTr :
public QObject
44 static QString title()
46 return tr(
"Doomseeker - Record Demo");
49 static QString pathDoesntExist(
const QString &path,
const QString &details)
52 if (!details.isEmpty())
54 detailsMsg = QString(
"\n") + tr(
"Error: %1").arg(details);
56 return tr(
"The demo storage directory doesn't exist "
57 "and cannot be created!%1\n\n%2").arg(detailsMsg).arg(path);
60 static QString pathMissingPermissions(
const QString &path)
62 return tr(
"The demo storage directory exists but "
63 "lacks the necessary permissions!\n\n%1").arg(path);
67 GameDemoTr() =
delete;
75 GameDemo::GameDemo(Control control)
80 bool GameDemo::ensureStorageExists(QWidget *parent)
82 auto popup = [parent](
const QString &message) ->
bool
84 return QMessageBox::Ignore ==
85 QMessageBox::warning(parent, GameDemoTr::title(), message,
86 QMessageBox::Abort | QMessageBox::Ignore);
89 QDir demoDir(gDefaultDataPaths->demosDirectoryPath());
91 if (mkResult.isError())
93 return popup(GameDemoTr::pathDoesntExist(demoDir.path(), mkResult.errnoString));
96 QFileInfo demoDirInfo(demoDir.path());
97 ++qt_ntfs_permission_lookup;
98 bool permissions = demoDirInfo.isReadable()
99 && demoDirInfo.isWritable()
100 && demoDirInfo.isExecutable();
101 --qt_ntfs_permission_lookup;
104 return popup(GameDemoTr::pathMissingPermissions(demoDir.path()));
110 QString GameDemo::mkDemoFullPath(Control control,
const EnginePlugin &plugin)
116 gDefaultDataPaths->demosDirectoryPath()) + QDir::separator()
117 + mkDemoName(plugin)).absoluteFilePath();
119 return mkDemoName(plugin);
123 assert(0 &&
"Unknown demo control type");
128 QString GameDemo::mkDemoName(
const EnginePlugin &plugin)
130 QString demoName =
"";
131 demoName += QString(
"%1_%2").
132 arg(plugin.data()->name).
133 arg(QDateTime::currentDateTime().toString(
"dd.MM.yyyy_hh.mm.ss"));
134 if (!plugin.data()->demoExtensionAutomatic)
135 demoName += QString(
".%1").arg(plugin.data()->demoExtension);
139 void GameDemo::saveDemoMetaData(
const QString &demoName,
const EnginePlugin &plugin,
140 const QString &iwad,
const QList<PWad> &pwads)
142 QString metaFileName;
144 if (plugin.data()->demoExtensionAutomatic)
146 metaFileName = QString(
"%1.%2.ini").arg(demoName)
147 .arg(plugin.data()->demoExtension);
150 metaFileName = demoName +
".ini";
152 QSettings settings(metaFileName, QSettings::IniFormat);
154 Ini metaFile(&settingsProvider);
155 IniSection metaSection = metaFile.section(
"meta");
157 QStringList requiredPwads;
158 QStringList optionalPwads;
160 for (
const PWad &wad : pwads)
162 if (wad.isOptional())
163 optionalPwads << wad.
name();
165 requiredPwads << wad.name();
173 GameDemo::operator GameDemo::Control()
const
178 #include "gamedemo.moc"