23 #include "missingwadsdialog.h" 25 #include "application.h" 26 #include "gui/mainwindow.h" 27 #include "gui/wadseekerinterface.h" 29 #include "ui_missingwadsdialog.h" 30 #include <QListWidgetItem> 31 #include <wadseeker/entities/modfile.h> 32 #include <wadseeker/freedoom.h> 33 #include <wadseeker/wadseeker.h> 35 DClass<MissingWadsDialog> :
public Ui::MissingWadsDialog
38 ::MissingWadsDialog::MissingWadsProceed decision;
39 QList<PWad> missingWads;
40 QList<PWad> incompatibleWads;
49 d->missingWads = missingWads;
50 d->incompatibleWads = incompatibleWads;
56 MissingWadsDialog::~MissingWadsDialog()
60 void MissingWadsDialog::setAllowIgnore(
bool allow)
62 d->btnIgnore->setVisible(allow);
63 d->lblUseIgnore->setVisible(allow);
64 d->lblUseIgnoreCantRun->setVisible(allow);
67 void MissingWadsDialog::setup()
69 d->btnInstallFreedoom->hide();
70 if (WadseekerInterface::isInstantiated())
71 setupWadseekerIsRunning();
73 setupWadseekerNotRunning();
76 void MissingWadsDialog::setupWadseekerIsRunning()
78 d->areaWadseekerAlreadyRunning->show();
79 d->areaWadseekerCanBeRun->hide();
80 d->btnInstall->hide();
83 void MissingWadsDialog::setupWadseekerNotRunning()
85 d->areaWadseekerAlreadyRunning->hide();
86 d->areaWadseekerCanBeRun->show();
88 setupForbiddenFilesArea();
89 setupDownloadableFilesArea();
90 setupOptionalFilesArea();
91 setupIncompatibleFilesArea();
93 d->btnInstall->setVisible(hasAnyAllowedFile());
96 void MissingWadsDialog::setupForbiddenFilesArea()
98 QList<PWad> files = forbiddenFiles();
101 d->areaCantBeDownloaded->show();
103 for (
PWad file : files)
105 names << file.name();
107 d->lblCantBeDownloadedFiles->setText(names.join(
", "));
109 bool installFreedoom = isFreedoomReplaceableOnList(names);
110 d->lblInstallFreedoom->setVisible(installFreedoom);
111 d->btnInstallFreedoom->setVisible(installFreedoom);
114 d->areaCantBeDownloaded->hide();
117 void MissingWadsDialog::setupDownloadableFilesArea()
119 QList<PWad> files = downloadableFiles();
120 if (!files.isEmpty())
122 d->areaCanBeDownloadedFiles->show();
124 for (
PWad file : files)
126 names << file.name();
128 d->lblCanBeDownloadedFiles->setText(names.join(
", "));
131 d->areaCanBeDownloadedFiles->hide();
134 void MissingWadsDialog::setupOptionalFilesArea()
136 QList<PWad> files = optionalFiles();
137 if (!files.isEmpty())
139 d->areaOptionalFiles->show();
140 for (
const PWad &file : files)
142 auto item =
new QListWidgetItem(file.name(), d->optionalFilesList);
143 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
144 item->setCheckState(Qt::Checked);
148 d->areaOptionalFiles->hide();
151 void MissingWadsDialog::setupIncompatibleFilesArea()
153 QList<PWad> files = incompatibleFiles();
154 if (!files.isEmpty())
156 d->areaIncompatibleFiles->show();
157 for (
const PWad &file : files)
159 auto item =
new QListWidgetItem(file.name(), d->incompatibleFilesList);
160 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
161 item->setCheckState(Qt::Checked);
165 d->areaIncompatibleFiles->hide();
168 bool MissingWadsDialog::isFreedoomReplaceableOnList(
const QStringList &files)
const 170 for (
const QString &file : files)
172 if (Freedoom::hasFreedoomReplacement(file))
178 void MissingWadsDialog::updateStateAccordingToFileSelection()
180 d->btnInstall->setEnabled(!filesToDownload().isEmpty());
183 void MissingWadsDialog::ignoreMissingFiles()
185 d->decision = Ignore;
189 void MissingWadsDialog::installFreedoom()
191 QTimer::singleShot(0, gApp->mainWindow(), SLOT(showInstallFreedoomDialog()));
195 void MissingWadsDialog::installMissingFiles()
197 d->decision = Install;
201 QList<PWad> MissingWadsDialog::downloadableFiles()
const 204 for (
PWad file : d->missingWads)
206 if (!Wadseeker::isForbiddenWad(file) && !file.
isOptional())
212 QList<PWad> MissingWadsDialog::forbiddenFiles()
const 216 wads << d->missingWads << d->incompatibleWads;
217 for (
const PWad &file : wads)
219 if (Wadseeker::isForbiddenWad(file.
name()))
225 QList<PWad> MissingWadsDialog::optionalFiles()
const 228 for (
const PWad &file : d->missingWads)
236 QList<PWad> MissingWadsDialog::incompatibleFiles()
const 239 for (
const PWad &file : d->incompatibleWads)
241 if (!Wadseeker::isForbiddenWad(file.
name()))
247 QList<PWad> MissingWadsDialog::filesToDownload()
const 249 QList<PWad> result = downloadableFiles();
250 result << selectedOptionalFiles();
251 result << selectedIncompatibleFiles();
255 QList<PWad> MissingWadsDialog::selectedOptionalFiles()
const 258 for (
int i = 0; i < d->optionalFilesList->count(); ++i)
260 QListWidgetItem *item = d->optionalFilesList->item(i);
261 if (item->checkState() == Qt::Checked)
262 result << item->text();
264 return filenamesToPwads(result, optionalFiles());
267 QList<PWad> MissingWadsDialog::selectedIncompatibleFiles()
const 270 for (
int i = 0; i < d->incompatibleFilesList->count(); ++i)
272 QListWidgetItem *item = d->incompatibleFilesList->item(i);
273 if (item->checkState() == Qt::Checked)
274 result << item->text();
276 return filenamesToPwads(result, incompatibleFiles());
279 QList<PWad> MissingWadsDialog::filenamesToPwads(
const QStringList &names, QList<PWad> files)
const 282 for (QString name : names)
284 for (
int i = 0; i < files.size(); ++i)
286 if (files[i].name() == name)
297 bool MissingWadsDialog::hasAnyAllowedFile()
const 299 return !downloadableFiles().isEmpty() ||
300 !optionalFiles().isEmpty() ||
301 !incompatibleFiles().isEmpty();
304 MissingWadsDialog::MissingWadsProceed MissingWadsDialog::decision()
const
bool isOptional() const
Is this WAD required to join the server?
const QString & name() const
File name of the WAD.