23 #include "missingwadsdialog.h"
25 #include "application.h"
26 #include "gui/commongui.h"
27 #include "gui/mainwindow.h"
28 #include "gui/wadseekerinterface.h"
29 #include "plugins/engineplugin.h"
31 #include "ui_missingwadsdialog.h"
32 #include <QListWidgetItem>
33 #include <wadseeker/entities/modfile.h>
34 #include <wadseeker/freedoom.h>
35 #include <wadseeker/wadseeker.h>
37 DClass<MissingWadsDialog> :
public Ui::MissingWadsDialog
40 ::MissingWadsDialog::MissingWadsProceed decision;
41 QList<PWad> missingWads;
42 QList<PWad> incompatibleWads;
53 d->missingWads = missingWads;
54 d->incompatibleWads = incompatibleWads;
60 MissingWadsDialog::~MissingWadsDialog()
64 void MissingWadsDialog::setAllowIgnore(
bool allow)
66 d->btnIgnore->setVisible(allow);
67 d->lblUseIgnore->setVisible(allow);
68 d->lblUseIgnoreCantRun->setVisible(allow);
71 void MissingWadsDialog::setup()
73 d->btnInstallFreedoom->hide();
74 if (WadseekerInterface::isInstantiated())
75 setupWadseekerIsRunning();
77 setupWadseekerNotRunning();
80 void MissingWadsDialog::setupWadseekerIsRunning()
82 d->areaWadseekerAlreadyRunning->show();
83 d->areaWadseekerCanBeRun->hide();
84 d->btnInstall->hide();
87 void MissingWadsDialog::setupWadseekerNotRunning()
89 d->areaWadseekerAlreadyRunning->hide();
90 d->areaWadseekerCanBeRun->show();
92 setupForbiddenFilesArea();
93 setupDownloadableFilesArea();
94 setupOptionalFilesArea();
95 setupIncompatibleFilesArea();
97 d->btnInstall->setVisible(hasAnyAllowedFile());
98 setAllowIgnore(((optionalFiles().size() == d->missingWads.size()) ||
99 d->missingWads.size() == 0 ||
100 (d->plugin !=
nullptr && d->plugin->data()->inGameFileDownloads)));
103 void MissingWadsDialog::setupForbiddenFilesArea()
105 QList<PWad> files = forbiddenFiles();
106 if (!files.isEmpty())
108 d->areaCantBeDownloaded->show();
110 for (
PWad file : files)
112 names << file.name();
114 d->lblCantBeDownloadedFiles->setText(names.join(
", "));
116 bool installFreedoom = isFreedoomReplaceableOnList(names);
117 d->lblInstallFreedoom->setVisible(installFreedoom);
118 d->btnInstallFreedoom->setVisible(installFreedoom);
121 d->areaCantBeDownloaded->hide();
124 void MissingWadsDialog::setupDownloadableFilesArea()
126 QList<PWad> files = downloadableFiles();
127 if (!files.isEmpty())
129 d->areaCanBeDownloadedFiles->show();
131 for (
PWad file : files)
133 names << file.name();
135 d->lblCanBeDownloadedFiles->setText(names.join(
", "));
138 d->areaCanBeDownloadedFiles->hide();
141 void MissingWadsDialog::setupOptionalFilesArea()
143 QList<PWad> files = optionalFiles();
144 if (!files.isEmpty())
146 d->areaOptionalFiles->show();
147 for (
const PWad &file : files)
149 auto item =
new QListWidgetItem(file.name(), d->optionalFilesList);
150 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
151 item->setCheckState(Qt::Checked);
155 d->areaOptionalFiles->hide();
158 void MissingWadsDialog::setupIncompatibleFilesArea()
160 QList<PWad> files = incompatibleFiles();
161 if (!files.isEmpty())
163 d->areaIncompatibleFiles->show();
164 for (
const PWad &file : files)
166 auto item =
new QListWidgetItem(file.name(), d->incompatibleFilesList);
167 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
168 item->setCheckState(Qt::Checked);
172 d->areaIncompatibleFiles->hide();
175 bool MissingWadsDialog::isFreedoomReplaceableOnList(
const QStringList &files)
const
177 for (
const QString &file : files)
179 if (Freedoom::hasFreedoomReplacement(file))
185 void MissingWadsDialog::updateStateAccordingToFileSelection()
187 d->btnInstall->setEnabled(!filesToDownload().isEmpty());
190 void MissingWadsDialog::ignoreMissingFiles()
192 d->decision = Ignore;
196 void MissingWadsDialog::installFreedoom()
198 QTimer::singleShot(0, gApp->mainWindow(), SLOT(showInstallFreedoomDialog()));
202 void MissingWadsDialog::installMissingFiles()
204 d->decision = Install;
208 QList<PWad> MissingWadsDialog::downloadableFiles()
const
211 for (
PWad file : d->missingWads)
213 if (!Wadseeker::isForbiddenWad(file) && !file.
isOptional())
219 QList<PWad> MissingWadsDialog::forbiddenFiles()
const
223 wads << d->missingWads << d->incompatibleWads;
224 for (
const PWad &file : wads)
226 if (Wadseeker::isForbiddenWad(file.
name()))
232 QList<PWad> MissingWadsDialog::optionalFiles()
const
235 for (
const PWad &file : d->missingWads)
243 QList<PWad> MissingWadsDialog::incompatibleFiles()
const
246 for (
const PWad &file : d->incompatibleWads)
248 if (!Wadseeker::isForbiddenWad(file.
name()))
254 QList<PWad> MissingWadsDialog::filesToDownload()
const
256 QList<PWad> result = downloadableFiles();
257 result << selectedOptionalFiles();
258 result << selectedIncompatibleFiles();
262 QList<PWad> MissingWadsDialog::selectedOptionalFiles()
const
265 for (
int i = 0; i < d->optionalFilesList->count(); ++i)
267 QListWidgetItem *item = d->optionalFilesList->item(i);
268 if (item->checkState() == Qt::Checked)
269 result << item->text();
271 return filenamesToPwads(result, optionalFiles());
274 QList<PWad> MissingWadsDialog::selectedIncompatibleFiles()
const
277 for (
int i = 0; i < d->incompatibleFilesList->count(); ++i)
279 QListWidgetItem *item = d->incompatibleFilesList->item(i);
280 if (item->checkState() == Qt::Checked)
281 result << item->text();
283 return filenamesToPwads(result, incompatibleFiles());
286 QList<PWad> MissingWadsDialog::filenamesToPwads(
const QStringList &names, QList<PWad> files)
const
289 for (QString name : names)
291 for (
int i = 0; i < files.size(); ++i)
293 if (files[i].name() == name)
304 bool MissingWadsDialog::hasAnyAllowedFile()
const
306 return !downloadableFiles().isEmpty() ||
307 !optionalFiles().isEmpty() ||
308 !incompatibleFiles().isEmpty();
311 MissingWadsDialog::MissingWadsProceed MissingWadsDialog::decision()
const