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 <QPushButton>
34 #include <wadseeker/entities/modfile.h>
35 #include <wadseeker/freedoom.h>
36 #include <wadseeker/wadseeker.h>
38 DClass<MissingWadsDialog> :
public Ui::MissingWadsDialog
41 QPushButton *btnInstall;
42 QPushButton *btnIgnore;
44 ::MissingWadsDialog::MissingWadsProceed decision;
45 QList<PWad> missingWads;
46 QList<PWad> incompatibleWads;
56 d->btnInstall = d->buttonBox->button(QDialogButtonBox::Yes);
57 d->btnIgnore = d->buttonBox->button(QDialogButtonBox::Ignore);
59 d->missingWads = missingWads;
60 d->incompatibleWads = incompatibleWads;
63 d->btnInstall->setText(MissingWadsDialog::tr(
"Install"));
64 connect(d->btnInstall, &QAbstractButton::clicked,
65 this, &MissingWadsDialog::installMissingFiles);
66 connect(d->btnIgnore, &QAbstractButton::clicked,
67 this, &MissingWadsDialog::ignoreMissingFiles);
73 MissingWadsDialog::~MissingWadsDialog()
77 void MissingWadsDialog::setAllowIgnore(
bool allow)
79 d->btnIgnore->setVisible(allow);
80 d->lblUseIgnore->setVisible(allow);
81 d->lblUseIgnoreCantRun->setVisible(allow);
84 void MissingWadsDialog::setup()
86 d->btnInstallFreedoom->hide();
87 if (WadseekerInterface::isInstantiated())
88 setupWadseekerIsRunning();
90 setupWadseekerNotRunning();
93 void MissingWadsDialog::setupWadseekerIsRunning()
95 d->areaWadseekerAlreadyRunning->show();
96 d->areaWadseekerCanBeRun->hide();
97 d->btnInstall->hide();
100 void MissingWadsDialog::setupWadseekerNotRunning()
102 d->areaWadseekerAlreadyRunning->hide();
103 d->areaWadseekerCanBeRun->show();
105 setupForbiddenFilesArea();
106 setupDownloadableFilesArea();
107 setupOptionalFilesArea();
108 setupIncompatibleFilesArea();
110 d->btnInstall->setVisible(hasAnyAllowedFile());
111 setAllowIgnore(((optionalFiles().size() == d->missingWads.size()) ||
112 d->missingWads.size() == 0 ||
113 (d->plugin !=
nullptr && d->plugin->data()->inGameFileDownloads)));
116 void MissingWadsDialog::setupForbiddenFilesArea()
118 QList<PWad> files = forbiddenFiles();
119 if (!files.isEmpty())
121 d->areaCantBeDownloaded->show();
123 for (
PWad file : files)
125 names << file.name();
127 d->lblCantBeDownloadedFiles->setText(names.join(
", "));
129 bool installFreedoom = isFreedoomReplaceableOnList(names);
130 d->lblInstallFreedoom->setVisible(installFreedoom);
131 d->btnInstallFreedoom->setVisible(installFreedoom);
134 d->areaCantBeDownloaded->hide();
137 void MissingWadsDialog::setupDownloadableFilesArea()
139 QList<PWad> files = downloadableFiles();
140 if (!files.isEmpty())
142 d->areaCanBeDownloadedFiles->show();
144 for (
PWad file : files)
146 names << file.name();
148 d->lblCanBeDownloadedFiles->setText(names.join(
", "));
151 d->areaCanBeDownloadedFiles->hide();
154 void MissingWadsDialog::setupOptionalFilesArea()
156 QList<PWad> files = optionalFiles();
157 if (!files.isEmpty())
159 d->areaOptionalFiles->show();
160 for (
const PWad &file : files)
162 auto item =
new QListWidgetItem(file.name(), d->optionalFilesList);
163 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
164 item->setCheckState(Qt::Checked);
168 d->areaOptionalFiles->hide();
171 void MissingWadsDialog::setupIncompatibleFilesArea()
173 QList<PWad> files = incompatibleFiles();
174 if (!files.isEmpty())
176 d->areaIncompatibleFiles->show();
177 for (
const PWad &file : files)
179 auto item =
new QListWidgetItem(file.name(), d->incompatibleFilesList);
180 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
181 item->setCheckState(Qt::Checked);
185 d->areaIncompatibleFiles->hide();
188 bool MissingWadsDialog::isFreedoomReplaceableOnList(
const QStringList &files)
const
190 for (
const QString &file : files)
192 if (Freedoom::hasFreedoomReplacement(file))
198 void MissingWadsDialog::updateStateAccordingToFileSelection()
200 d->btnInstall->setEnabled(!filesToDownload().isEmpty());
203 void MissingWadsDialog::ignoreMissingFiles()
205 d->decision = Ignore;
209 void MissingWadsDialog::installFreedoom()
211 if (gApp->mainWindow() !=
nullptr)
213 QTimer::singleShot(0, gApp->mainWindow(), SLOT(showInstallFreedoomDialog()));
218 void MissingWadsDialog::installMissingFiles()
220 d->decision = Install;
224 QList<PWad> MissingWadsDialog::downloadableFiles()
const
227 for (
PWad file : d->missingWads)
229 if (!Wadseeker::isForbiddenWad(file) && !file.
isOptional())
235 QList<PWad> MissingWadsDialog::forbiddenFiles()
const
239 wads << d->missingWads << d->incompatibleWads;
240 for (
const PWad &file : wads)
242 if (Wadseeker::isForbiddenWad(file.
name()))
248 QList<PWad> MissingWadsDialog::optionalFiles()
const
251 for (
const PWad &file : d->missingWads)
259 QList<PWad> MissingWadsDialog::incompatibleFiles()
const
262 for (
const PWad &file : d->incompatibleWads)
264 if (!Wadseeker::isForbiddenWad(file.
name()))
270 QList<PWad> MissingWadsDialog::filesToDownload()
const
272 QList<PWad> result = downloadableFiles();
273 result << selectedOptionalFiles();
274 result << selectedIncompatibleFiles();
278 QList<PWad> MissingWadsDialog::selectedOptionalFiles()
const
281 for (
int i = 0; i < d->optionalFilesList->count(); ++i)
283 QListWidgetItem *item = d->optionalFilesList->item(i);
284 if (item->checkState() == Qt::Checked)
285 result << item->text();
287 return filenamesToPwads(result, optionalFiles());
290 QList<PWad> MissingWadsDialog::selectedIncompatibleFiles()
const
293 for (
int i = 0; i < d->incompatibleFilesList->count(); ++i)
295 QListWidgetItem *item = d->incompatibleFilesList->item(i);
296 if (item->checkState() == Qt::Checked)
297 result << item->text();
299 return filenamesToPwads(result, incompatibleFiles());
302 QList<PWad> MissingWadsDialog::filenamesToPwads(
const QStringList &names, QList<PWad> files)
const
305 for (QString name : names)
307 for (
int i = 0; i < files.size(); ++i)
309 if (files[i].name() == name)
320 bool MissingWadsDialog::hasAnyAllowedFile()
const
322 return !downloadableFiles().isEmpty() ||
323 !optionalFiles().isEmpty() ||
324 !incompatibleFiles().isEmpty();
327 MissingWadsDialog::MissingWadsProceed MissingWadsDialog::decision()
const