23 #include "serverfilterdock.h"
24 #include "ui_serverfilterdock.h"
26 #include "configuration/doomseekerconfig.h"
27 #include "gui/commongui.h"
28 #include "gui/entity/addressfilter.h"
29 #include "gui/entity/serverlistfilterinfo.h"
30 #include "gui/icons.h"
31 #include "strings.hpp"
34 #include <QMessageBox>
37 DClass<ServerFilterDock> :
public Ui::ServerFilterDock
40 static const int CUSTOM_PRESET_IDX = 0;
49 QLineEdit *leQuickSearch;
56 void clearCustomPresets()
58 cboServerFilterPresets->blockSignals(
true);
59 for (
int i = cboServerFilterPresets->count() - 1;
60 i > CUSTOM_PRESET_IDX;
63 cboServerFilterPresets->removeItem(i);
65 cboServerFilterPresets->blockSignals(
false);
70 return isCustomPresetName(preset.name);
73 bool isCustomPresetName(
const QString &name)
const
75 return name.isEmpty();
78 bool isCustomPresetIndex(
int index)
const
80 return index == CUSTOM_PRESET_IDX;
83 bool isCustomPresetSelected()
const
85 return isCustomPresetIndex(cboServerFilterPresets->currentIndex());
90 return ServerListFilterInfo::deserialize(cboServerFilterPresets->itemData(index));
95 return presetAtIndex(cboServerFilterPresets->currentIndex());
98 QString presetNameAtIndex(
int index)
const
100 return isCustomPresetIndex(index) ?
101 QString() : presetAtIndex(index).name;
104 int presetIndex(
const QString &name)
const
106 if (isCustomPresetName(name))
107 return CUSTOM_PRESET_IDX;
108 for (
int i = CUSTOM_PRESET_IDX + 1; i < cboServerFilterPresets->count(); ++i)
110 if (presetAtIndex(i).name.compare(name, Qt::CaseInsensitive) == 0)
118 QString currentPresetName()
const
120 return presetNameAtIndex(cboServerFilterPresets->currentIndex());
125 QStringList tokens = subnets.split(
",");
127 for (
const QString &token : tokens)
129 QPair<QHostAddress, int> subnet = QHostAddress::parseSubnet(token.trimmed());
130 if (!subnet.first.isNull())
142 : QDockWidget(pParent)
145 d->leQuickSearch =
nullptr;
146 d->bDisableUpdate =
false;
149 toggleViewAction()->setIcon(QIcon(
":/icons/filter.png"));
151 toggleViewAction()->setText(ServerFilterDock::tr(
"Server &filter"));
152 toggleViewAction()->setShortcut(ServerFilterDock::tr(
"CTRL+F"));
154 QTimer::singleShot(0,
this, &ServerFilterDock::loadSettings);
157 ServerFilterDock::~ServerFilterDock()
161 void ServerFilterDock::addGameModeToComboBox(
const QString &gameMode)
163 addSortedNonDuplicate(d->cboGameMode, gameMode.trimmed());
164 addSortedNonDuplicate(d->cboExcludeGameMode, gameMode.trimmed());
167 void ServerFilterDock::addSortedNonDuplicate(QComboBox *comboBox,
const QString &text)
169 if (comboBox->findText(text, Qt::MatchFixedString) < 0)
172 for (
int i = 0; i < comboBox->count(); ++i)
174 if (text < comboBox->itemText(i))
176 comboBox->insertItem(i, text);
183 comboBox->addItem(text);
187 void ServerFilterDock::clear()
196 if (d->leQuickSearch ==
nullptr)
198 auto qs =
new QLineEdit();
199 qs->setText(d->leServerName->text());
201 connect(d->leServerName, SIGNAL(textEdited(
const QString&)), qs, SLOT(setText(
const QString&)));
202 connect(qs, SIGNAL(textEdited(
const QString&)), d->leServerName, SLOT(setText(
const QString&)));
204 d->leQuickSearch = qs;
207 return d->leQuickSearch;
210 void ServerFilterDock::emitUpdated()
212 if (d->bDisableUpdate)
216 if (d->isCustomPresetSelected())
218 setCustomPreset(filterInfo);
223 d->cboServerFilterPresets->setItemText(d->cboServerFilterPresets->currentIndex(),
226 QString(
"%1 *").arg(currentPreset.name));
229 emit filterUpdated(filterInfo);
232 void ServerFilterDock::enableFilter()
234 d->cbFilteringEnabled->setChecked(
true);
242 filterInfo.bEnabled = d->cbFilteringEnabled->isChecked();
244 filterInfo.bShowEmpty = d->cbShowEmpty->isChecked();
245 filterInfo.bShowFull = d->cbShowFull->isChecked();
246 filterInfo.bShowOnlyValid = d->cbShowOnlyValid->isChecked();
247 filterInfo.bShowBannedServers = d->cbShowBannedServers->isChecked();
248 filterInfo.bShowTooSoonServers = d->cbShowTooSoonServers->isChecked();
249 filterInfo.bShowNotRespondingServers = d->cbShowNotRespondingServers->isChecked();
250 filterInfo.addresses = d->parseSubnets(d->leAddresses->text());
251 filterInfo.gameModes = d->cboGameMode->selectedItemTexts();
252 filterInfo.gameModesExcluded = d->cboExcludeGameMode->selectedItemTexts();
253 filterInfo.lockedServers = Doomseeker::checkboxTristateToShowMode(d->cbShowLockedServers->checkState());
254 filterInfo.
maxPing = d->spinMaxPing->value();
255 filterInfo.testingServers = Doomseeker::checkboxTristateToShowMode(d->cbShowTestingServers->checkState());
256 filterInfo.serverName = d->leServerName->text();
257 filterInfo.wads = d->leWads->text().trimmed().split(
",", Qt::SkipEmptyParts);
258 filterInfo.wadsExcluded = d->leExcludeWads->text().trimmed().split(
",", Qt::SkipEmptyParts);
265 if (d->isCustomPreset(preset))
267 setCustomPreset(preset);
271 int index = d->presetIndex(preset.name);
274 d->cboServerFilterPresets->setItemData(index, preset.serialize());
279 for (; index < d->cboServerFilterPresets->count(); ++index)
281 if (d->presetAtIndex(index).name.compare(
282 preset.name, Qt::CaseInsensitive) > 0)
287 d->cboServerFilterPresets->insertItem(index, preset.name, preset.serialize());
295 d->cboServerFilterPresets->setItemText(idxCustom,
297 d->cboServerFilterPresets->setItemData(idxCustom, preset.serialize());
302 d->bDisableUpdate =
true;
304 d->cbFilteringEnabled->setChecked(filterInfo.bEnabled);
306 d->cbShowEmpty->setChecked(filterInfo.bShowEmpty);
307 d->cbShowFull->setChecked(filterInfo.bShowFull);
308 d->cbShowOnlyValid->setChecked(filterInfo.bShowOnlyValid);
309 d->cbShowBannedServers->setChecked(filterInfo.bShowBannedServers);
310 d->cbShowTooSoonServers->setChecked(filterInfo.bShowTooSoonServers);
311 d->cbShowNotRespondingServers->setChecked(filterInfo.bShowNotRespondingServers);
313 d->leAddresses->setText(filterInfo.addresses.
toString());
315 for (
const QString &gameMode : filterInfo.gameModes)
317 addGameModeToComboBox(gameMode);
319 d->cboGameMode->setSelectedTexts(filterInfo.gameModes);
321 for (
const QString &gameMode : filterInfo.gameModesExcluded)
323 addGameModeToComboBox(gameMode);
325 d->cboExcludeGameMode->setSelectedTexts(filterInfo.gameModesExcluded);
327 d->spinMaxPing->setValue(filterInfo.
maxPing);
328 if (d->leQuickSearch !=
nullptr)
329 d->leQuickSearch->setText(filterInfo.serverName.trimmed());
331 d->leServerName->setText(filterInfo.serverName.trimmed());
332 d->leWads->setText(filterInfo.wads.join(
",").trimmed());
333 d->leExcludeWads->setText(filterInfo.wadsExcluded.join(
",").trimmed());
335 d->cbShowLockedServers->setCheckState(Doomseeker::showModeToCheckboxState(
336 filterInfo.lockedServers));
337 d->cbShowTestingServers->setCheckState(Doomseeker::showModeToCheckboxState(
338 filterInfo.testingServers));
340 d->bDisableUpdate =
false;
344 void ServerFilterDock::removeFilterPreset()
346 const QString name = d->currentPresetName();
347 if (QMessageBox::Yes == QMessageBox::question(
this,
348 tr(
"Doomseeker - Remove filter preset"),
349 tr(
"Are you sure you wish to remove the filter preset \"%1\"?").arg(name)))
351 if (!name.isEmpty() && !d->isCustomPresetName(name))
353 gConfig.serverFilter.presets.remove(name);
354 d->cboServerFilterPresets->removeItem(d->presetIndex(name));
359 void ServerFilterDock::saveFilterAsPreset()
363 tr(
"Enter name for the filter preset (will overwrite if exists):"),
364 QLineEdit::Normal, d->currentPresetName(), &ok).trimmed();
366 if (!ok || name.isEmpty())
371 gConfig.serverFilter.presets[filter.name] = filter.serialize();
372 gConfig.saveToFile();
373 const int index = addPreset(filter);
374 d->cboServerFilterPresets->setCurrentIndex(index);
375 d->cboServerFilterPresets->setItemText(index, name);
378 void ServerFilterDock::loadSettings()
381 d->clearCustomPresets();
382 for (
const QVariant &serialized : gConfig.serverFilter.presets)
385 if (!preset.name.isEmpty())
390 setCustomPreset(gConfig.serverFilter.info);
393 int currentPresetIdx = d->presetIndex(gConfig.serverFilter.currentPreset);
394 if (currentPresetIdx < 0 || currentPresetIdx >= d->cboServerFilterPresets->count())
398 selectFilterPreset(currentPresetIdx);
401 void ServerFilterDock::selectFilterPreset(
int index)
403 d->cboServerFilterPresets->blockSignals(
true);
404 d->cboServerFilterPresets->setCurrentIndex(index);
405 d->cboServerFilterPresets->blockSignals(
false);
406 d->btnRemovePreset->setEnabled(!d->isCustomPresetIndex(index) && index > 0);
407 gConfig.serverFilter.currentPreset = d->currentPresetName();
409 i < d->cboServerFilterPresets->count();
413 d->cboServerFilterPresets->setItemText(i, d->presetNameAtIndex(i));
416 d->cboServerFilterPresets->itemData(index)));