23 #include "missingwadsdialog.h"
25 #include "application.h"
26 #include "gui/mainwindow.h"
27 #include "gui/wadseekerinterface.h"
28 #include "plugins/engineplugin.h"
30 #include "ui_missingwadsdialog.h"
31 #include <QListWidgetItem>
32 #include <wadseeker/entities/modfile.h>
33 #include <wadseeker/freedoom.h>
34 #include <wadseeker/wadseeker.h>
36 DClass<MissingWadsDialog> :
public Ui::MissingWadsDialog
39 ::MissingWadsDialog::MissingWadsProceed decision;
40 QList<PWad> missingWads;
41 QList<PWad> incompatibleWads;
51 d->missingWads = missingWads;
52 d->incompatibleWads = incompatibleWads;
58 MissingWadsDialog::~MissingWadsDialog()
62 void MissingWadsDialog::setAllowIgnore(
bool allow)
64 d->btnIgnore->setVisible(allow);
65 d->lblUseIgnore->setVisible(allow);
66 d->lblUseIgnoreCantRun->setVisible(allow);
69 void MissingWadsDialog::setup()
71 d->btnInstallFreedoom->hide();
72 if (WadseekerInterface::isInstantiated())
73 setupWadseekerIsRunning();
75 setupWadseekerNotRunning();
78 void MissingWadsDialog::setupWadseekerIsRunning()
80 d->areaWadseekerAlreadyRunning->show();
81 d->areaWadseekerCanBeRun->hide();
82 d->btnInstall->hide();
85 void MissingWadsDialog::setupWadseekerNotRunning()
87 d->areaWadseekerAlreadyRunning->hide();
88 d->areaWadseekerCanBeRun->show();
90 setupForbiddenFilesArea();
91 setupDownloadableFilesArea();
92 setupOptionalFilesArea();
93 setupIncompatibleFilesArea();
95 d->btnInstall->setVisible(hasAnyAllowedFile());
96 setAllowIgnore(((optionalFiles().size() == d->missingWads.size()) ||
97 d->missingWads.size() == 0 ||
98 (d->plugin !=
nullptr && d->plugin->data()->inGameFileDownloads)));
101 void MissingWadsDialog::setupForbiddenFilesArea()
103 QList<PWad> files = forbiddenFiles();
104 if (!files.isEmpty())
106 d->areaCantBeDownloaded->show();
108 for (
PWad file : files)
110 names << file.name();
112 d->lblCantBeDownloadedFiles->setText(names.join(
", "));
114 bool installFreedoom = isFreedoomReplaceableOnList(names);
115 d->lblInstallFreedoom->setVisible(installFreedoom);
116 d->btnInstallFreedoom->setVisible(installFreedoom);
119 d->areaCantBeDownloaded->hide();
122 void MissingWadsDialog::setupDownloadableFilesArea()
124 QList<PWad> files = downloadableFiles();
125 if (!files.isEmpty())
127 d->areaCanBeDownloadedFiles->show();
129 for (
PWad file : files)
131 names << file.name();
133 d->lblCanBeDownloadedFiles->setText(names.join(
", "));
136 d->areaCanBeDownloadedFiles->hide();
139 void MissingWadsDialog::setupOptionalFilesArea()
141 QList<PWad> files = optionalFiles();
142 if (!files.isEmpty())
144 d->areaOptionalFiles->show();
145 for (
const PWad &file : files)
147 auto item =
new QListWidgetItem(file.name(), d->optionalFilesList);
148 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
149 item->setCheckState(Qt::Checked);
153 d->areaOptionalFiles->hide();
156 void MissingWadsDialog::setupIncompatibleFilesArea()
158 QList<PWad> files = incompatibleFiles();
159 if (!files.isEmpty())
161 d->areaIncompatibleFiles->show();
162 for (
const PWad &file : files)
164 auto item =
new QListWidgetItem(file.name(), d->incompatibleFilesList);
165 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
166 item->setCheckState(Qt::Checked);
170 d->areaIncompatibleFiles->hide();
173 bool MissingWadsDialog::isFreedoomReplaceableOnList(
const QStringList &files)
const
175 for (
const QString &file : files)
177 if (Freedoom::hasFreedoomReplacement(file))
183 void MissingWadsDialog::updateStateAccordingToFileSelection()
185 d->btnInstall->setEnabled(!filesToDownload().isEmpty());
188 void MissingWadsDialog::ignoreMissingFiles()
190 d->decision = Ignore;
194 void MissingWadsDialog::installFreedoom()
196 QTimer::singleShot(0, gApp->mainWindow(), SLOT(showInstallFreedoomDialog()));
200 void MissingWadsDialog::installMissingFiles()
202 d->decision = Install;
206 QList<PWad> MissingWadsDialog::downloadableFiles()
const
209 for (
PWad file : d->missingWads)
211 if (!Wadseeker::isForbiddenWad(file) && !file.
isOptional())
217 QList<PWad> MissingWadsDialog::forbiddenFiles()
const
221 wads << d->missingWads << d->incompatibleWads;
222 for (
const PWad &file : wads)
224 if (Wadseeker::isForbiddenWad(file.
name()))
230 QList<PWad> MissingWadsDialog::optionalFiles()
const
233 for (
const PWad &file : d->missingWads)
241 QList<PWad> MissingWadsDialog::incompatibleFiles()
const
244 for (
const PWad &file : d->incompatibleWads)
246 if (!Wadseeker::isForbiddenWad(file.
name()))
252 QList<PWad> MissingWadsDialog::filesToDownload()
const
254 QList<PWad> result = downloadableFiles();
255 result << selectedOptionalFiles();
256 result << selectedIncompatibleFiles();
260 QList<PWad> MissingWadsDialog::selectedOptionalFiles()
const
263 for (
int i = 0; i < d->optionalFilesList->count(); ++i)
265 QListWidgetItem *item = d->optionalFilesList->item(i);
266 if (item->checkState() == Qt::Checked)
267 result << item->text();
269 return filenamesToPwads(result, optionalFiles());
272 QList<PWad> MissingWadsDialog::selectedIncompatibleFiles()
const
275 for (
int i = 0; i < d->incompatibleFilesList->count(); ++i)
277 QListWidgetItem *item = d->incompatibleFilesList->item(i);
278 if (item->checkState() == Qt::Checked)
279 result << item->text();
281 return filenamesToPwads(result, incompatibleFiles());
284 QList<PWad> MissingWadsDialog::filenamesToPwads(
const QStringList &names, QList<PWad> files)
const
287 for (QString name : names)
289 for (
int i = 0; i < files.size(); ++i)
291 if (files[i].name() == name)
302 bool MissingWadsDialog::hasAnyAllowedFile()
const
304 return !downloadableFiles().isEmpty() ||
305 !optionalFiles().isEmpty() ||
306 !incompatibleFiles().isEmpty();
309 MissingWadsDialog::MissingWadsProceed MissingWadsDialog::decision()
const