23 #include "ui_wadspicker.h"
24 #include "wadspicker.h"
26 #include "configuration/doomseekerconfig.h"
27 #include "datapaths.h"
28 #include "gui/commongui.h"
29 #include "gui/icons.h"
30 #include "templatedpathresolver.h"
32 #include <QApplication>
34 #include <QFileDialog>
36 #include <QSignalBlocker>
37 #include <QStandardItemModel>
40 DClass<WadsPicker> :
public Ui::WadsPicker
43 QStandardItemModel *model;
52 d->model =
new QStandardItemModel(
this);
53 connect(d->model, &QStandardItemModel::itemChanged,
54 this, &WadsPicker::checkItemPathExists);
55 d->lstAdditionalFiles->setModel(d->model);
56 d->lstAdditionalFiles->installEventFilter(
this);
58 d->btnBrowsePwad->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon));
61 auto *checkPathsAction =
new QAction(QIcon(
":/icons/refresh.png"),
62 WadsPicker::tr(
"Check paths"),
this);
63 d->lstAdditionalFiles->addAction(checkPathsAction);
64 connect(checkPathsAction, &QAction::triggered,
65 this, &WadsPicker::checkAllItemsPathsExist);
66 d->lstAdditionalFiles->setContextMenuPolicy(Qt::ActionsContextMenu);
69 WadsPicker::~WadsPicker()
73 void WadsPicker::addEmptyPath()
75 addPathToTable(QString(),
true);
78 void WadsPicker::addWadPath(
const QString &wadPath,
bool required)
80 if (wadPath.isEmpty())
83 QStandardItem *existing = findPath(wadPath);
84 if (existing !=
nullptr)
87 checkItemPathExists(existing);
91 addPathToTable(wadPath, required);
95 void WadsPicker::addPathToTable(
const QString &path,
bool required)
97 auto it =
new QStandardItem(path);
99 it->setDragEnabled(
true);
100 it->setDropEnabled(
false);
101 it->setToolTip(path);
102 it->setCheckable(
true);
103 it->setCheckState(required ? Qt::Checked : Qt::Unchecked);
104 it->setData(path, Qt::EditRole);
105 checkItemPathExists(it);
107 d->model->appendRow(it);
110 void WadsPicker::browseAndAdd()
112 QString dialogDir = gConfig.doomseeker.previousCreateServerWadDir;
113 QStringList filesNames = QFileDialog::getOpenFileNames(
this,
114 tr(
"Doomseeker - Add file(s)"), dialogDir);
116 if (!filesNames.isEmpty())
120 QFileInfo fi(filesNames[0]);
121 gConfig.doomseeker.previousCreateServerWadDir = fi.absolutePath();
123 for (
const QString &strFile : filesNames)
125 addWadPath(gDefaultDataPaths->portablizePath(strFile));
130 void WadsPicker::checkAllItemsPathsExist()
132 for (
int i = 0; i < d->model->rowCount(); ++i)
134 checkItemPathExists(d->model->item(i));
138 void WadsPicker::checkItemPathExists(QStandardItem *item)
140 QFont font = item->font();
141 QString path = item->data(Qt::EditRole).toString().trimmed();
153 QSignalBlocker signalBlocker(d->model);
154 if (fileInfo.exists())
156 font.setItalic(
false);
157 item->setToolTip(path);
158 item->setIcon(QIcon());
162 font.setItalic(
true);
163 item->setToolTip(QString(
"<font color=\"#ff0000\">")
164 + tr(
"%1 MISSING").arg(path)
165 + QString(
"</font>"));
166 item->setIcon(QIcon(
":/icons/exclamation_16.png"));
171 bool WadsPicker::eventFilter(QObject *obj, QEvent *event)
173 if (obj == d->lstAdditionalFiles)
175 if (event->type() == QEvent::KeyPress)
177 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>(event);
178 switch (keyEvent->key())
192 else if (event->type() == QEvent::Show)
194 checkAllItemsPathsExist();
200 QList<PickedGameFile> WadsPicker::files()
const
202 QList<PickedGameFile> list;
203 for (
int i = 0; i < d->model->rowCount(); ++i)
205 auto item = d->model->item(i);
207 if (!item->data(Qt::EditRole).toString().trimmed().isEmpty())
209 list <<
PickedGameFile { item->text(), (item->checkState() == Qt::Unchecked) };
216 QStandardItem *WadsPicker::findPath(
const QString &path)
219 static const Qt::CaseSensitivity cs = Qt::CaseInsensitive;
221 static const Qt::CaseSensitivity cs = Qt::CaseSensitive;
224 for (
int i = 0; i < d->model->rowCount(); ++i)
226 QStandardItem *item = d->model->item(i);
227 if (item->text().compare(path, cs) == 0)
233 void WadsPicker::setFiles(
const QList<PickedGameFile> &files)
236 for (
auto file : files)
237 addWadPath(file.path, !file.optional);
240 void WadsPicker::removeAll()
245 void WadsPicker::removeSelected()
247 const bool bSelectNextLowest =
true;