23 #include "serverfilterdock.h"
24 #include "ui_serverfilterdock.h"
26 #include "configuration/doomseekerconfig.h"
27 #include "gui/commongui.h"
28 #include "gui/entity/serverlistfilterinfo.h"
29 #include "gui/icons.h"
30 #include "strings.hpp"
33 #include <QMessageBox>
36 DClass<ServerFilterDock> :
public Ui::ServerFilterDock
39 static const int CUSTOM_PRESET_IDX = 0;
48 QLineEdit *leQuickSearch;
55 void clearCustomPresets()
57 cboServerFilterPresets->blockSignals(
true);
58 for (
int i = cboServerFilterPresets->count() - 1;
59 i > CUSTOM_PRESET_IDX;
62 cboServerFilterPresets->removeItem(i);
64 cboServerFilterPresets->blockSignals(
false);
69 return isCustomPresetName(preset.name);
72 bool isCustomPresetName(
const QString &name)
const
74 return name.isEmpty();
77 bool isCustomPresetIndex(
int index)
const
79 return index == CUSTOM_PRESET_IDX;
82 bool isCustomPresetSelected()
const
84 return isCustomPresetIndex(cboServerFilterPresets->currentIndex());
89 return ServerListFilterInfo::deserialize(cboServerFilterPresets->itemData(index));
94 return presetAtIndex(cboServerFilterPresets->currentIndex());
97 QString presetNameAtIndex(
int index)
const
99 return isCustomPresetIndex(index) ?
100 QString() : presetAtIndex(index).name;
103 int presetIndex(
const QString &name)
const
105 if (isCustomPresetName(name))
106 return CUSTOM_PRESET_IDX;
107 for (
int i = CUSTOM_PRESET_IDX + 1; i < cboServerFilterPresets->count(); ++i)
109 if (presetAtIndex(i).name.compare(name, Qt::CaseInsensitive) == 0)
117 QString currentPresetName()
const
119 return presetNameAtIndex(cboServerFilterPresets->currentIndex());
126 : QDockWidget(pParent)
129 d->leQuickSearch =
nullptr;
130 d->bDisableUpdate =
false;
133 toggleViewAction()->setIcon(QIcon(
":/icons/filter.png"));
135 toggleViewAction()->setText(ServerFilterDock::tr(
"Server &filter"));
136 toggleViewAction()->setShortcut(ServerFilterDock::tr(
"CTRL+F"));
138 QTimer::singleShot(0,
this, &ServerFilterDock::loadSettings);
141 ServerFilterDock::~ServerFilterDock()
145 void ServerFilterDock::addGameModeToComboBox(
const QString &gameMode)
147 addSortedNonDuplicate(d->cboGameMode, gameMode.trimmed());
148 addSortedNonDuplicate(d->cboExcludeGameMode, gameMode.trimmed());
151 void ServerFilterDock::addSortedNonDuplicate(QComboBox *comboBox,
const QString &text)
153 if (comboBox->findText(text, Qt::MatchFixedString) < 0)
156 for (
int i = 0; i < comboBox->count(); ++i)
158 if (text < comboBox->itemText(i))
160 comboBox->insertItem(i, text);
167 comboBox->addItem(text);
171 void ServerFilterDock::clear()
180 if (d->leQuickSearch ==
nullptr)
182 auto qs =
new QLineEdit();
183 qs->setText(d->leServerName->text());
185 connect(d->leServerName, SIGNAL(textEdited(
const QString&)), qs, SLOT(setText(
const QString&)));
186 connect(qs, SIGNAL(textEdited(
const QString&)), d->leServerName, SLOT(setText(
const QString&)));
188 d->leQuickSearch = qs;
191 return d->leQuickSearch;
194 void ServerFilterDock::emitUpdated()
196 if (d->bDisableUpdate)
200 if (d->isCustomPresetSelected())
202 setCustomPreset(filterInfo);
207 d->cboServerFilterPresets->setItemText(d->cboServerFilterPresets->currentIndex(),
210 QString(
"%1 *").arg(currentPreset.name));
213 emit filterUpdated(filterInfo);
216 void ServerFilterDock::enableFilter()
218 d->cbFilteringEnabled->setChecked(
true);
226 filterInfo.bEnabled = d->cbFilteringEnabled->isChecked();
228 filterInfo.bShowEmpty = d->cbShowEmpty->isChecked();
229 filterInfo.bShowFull = d->cbShowFull->isChecked();
230 filterInfo.bShowOnlyValid = d->cbShowOnlyValid->isChecked();
231 filterInfo.bShowBannedServers = d->cbShowBannedServers->isChecked();
232 filterInfo.bShowTooSoonServers = d->cbShowTooSoonServers->isChecked();
233 filterInfo.bShowNotRespondingServers = d->cbShowNotRespondingServers->isChecked();
234 filterInfo.gameModes = d->cboGameMode->selectedItemTexts();
235 filterInfo.gameModesExcluded = d->cboExcludeGameMode->selectedItemTexts();
236 filterInfo.lockedServers = Doomseeker::checkboxTristateToShowMode(d->cbShowLockedServers->checkState());
237 filterInfo.
maxPing = d->spinMaxPing->value();
238 filterInfo.testingServers = Doomseeker::checkboxTristateToShowMode(d->cbShowTestingServers->checkState());
239 filterInfo.serverName = d->leServerName->text();
240 filterInfo.wads = d->leWads->text().trimmed().split(
",", Qt::SkipEmptyParts);
241 filterInfo.wadsExcluded = d->leExcludeWads->text().trimmed().split(
",", Qt::SkipEmptyParts);
248 if (d->isCustomPreset(preset))
250 setCustomPreset(preset);
254 int index = d->presetIndex(preset.name);
257 d->cboServerFilterPresets->setItemData(index, preset.serialize());
262 for (; index < d->cboServerFilterPresets->count(); ++index)
264 if (d->presetAtIndex(index).name.compare(
265 preset.name, Qt::CaseInsensitive) > 0)
270 d->cboServerFilterPresets->insertItem(index, preset.name, preset.serialize());
278 d->cboServerFilterPresets->setItemText(idxCustom,
280 d->cboServerFilterPresets->setItemData(idxCustom, preset.serialize());
285 d->bDisableUpdate =
true;
287 d->cbFilteringEnabled->setChecked(filterInfo.bEnabled);
289 d->cbShowEmpty->setChecked(filterInfo.bShowEmpty);
290 d->cbShowFull->setChecked(filterInfo.bShowFull);
291 d->cbShowOnlyValid->setChecked(filterInfo.bShowOnlyValid);
292 d->cbShowBannedServers->setChecked(filterInfo.bShowBannedServers);
293 d->cbShowTooSoonServers->setChecked(filterInfo.bShowTooSoonServers);
294 d->cbShowNotRespondingServers->setChecked(filterInfo.bShowNotRespondingServers);
296 for (
const QString &gameMode : filterInfo.gameModes)
298 addGameModeToComboBox(gameMode);
300 d->cboGameMode->setSelectedTexts(filterInfo.gameModes);
302 for (
const QString &gameMode : filterInfo.gameModesExcluded)
304 addGameModeToComboBox(gameMode);
306 d->cboExcludeGameMode->setSelectedTexts(filterInfo.gameModesExcluded);
308 d->spinMaxPing->setValue(filterInfo.
maxPing);
309 if (d->leQuickSearch !=
nullptr)
310 d->leQuickSearch->setText(filterInfo.serverName.trimmed());
312 d->leServerName->setText(filterInfo.serverName.trimmed());
313 d->leWads->setText(filterInfo.wads.join(
",").trimmed());
314 d->leExcludeWads->setText(filterInfo.wadsExcluded.join(
",").trimmed());
316 d->cbShowLockedServers->setCheckState(Doomseeker::showModeToCheckboxState(
317 filterInfo.lockedServers));
318 d->cbShowTestingServers->setCheckState(Doomseeker::showModeToCheckboxState(
319 filterInfo.testingServers));
321 d->bDisableUpdate =
false;
325 void ServerFilterDock::removeFilterPreset()
327 const QString name = d->currentPresetName();
328 if (QMessageBox::Yes == QMessageBox::question(
this,
329 tr(
"Doomseeker - Remove filter preset"),
330 tr(
"Are you sure you wish to remove the filter preset \"%1\"?").arg(name)))
332 if (!name.isEmpty() && !d->isCustomPresetName(name))
334 gConfig.serverFilter.presets.remove(name);
335 d->cboServerFilterPresets->removeItem(d->presetIndex(name));
340 void ServerFilterDock::saveFilterAsPreset()
344 tr(
"Enter name for the filter preset (will overwrite if exists):"),
345 QLineEdit::Normal, d->currentPresetName(), &ok).trimmed();
347 if (!ok || name.isEmpty())
352 gConfig.serverFilter.presets[filter.name] = filter.serialize();
353 gConfig.saveToFile();
354 const int index = addPreset(filter);
355 d->cboServerFilterPresets->setCurrentIndex(index);
356 d->cboServerFilterPresets->setItemText(index, name);
359 void ServerFilterDock::loadSettings()
362 d->clearCustomPresets();
363 for (
const QVariant &serialized : gConfig.serverFilter.presets)
366 if (!preset.name.isEmpty())
371 setCustomPreset(gConfig.serverFilter.info);
374 int currentPresetIdx = d->presetIndex(gConfig.serverFilter.currentPreset);
375 if (currentPresetIdx < 0 || currentPresetIdx >= d->cboServerFilterPresets->count())
379 selectFilterPreset(currentPresetIdx);
382 void ServerFilterDock::selectFilterPreset(
int index)
384 d->cboServerFilterPresets->blockSignals(
true);
385 d->cboServerFilterPresets->setCurrentIndex(index);
386 d->cboServerFilterPresets->blockSignals(
false);
387 d->btnRemovePreset->setEnabled(!d->isCustomPresetIndex(index) && index > 0);
388 gConfig.serverFilter.currentPreset = d->currentPresetName();
390 i < d->cboServerFilterPresets->count();
394 d->cboServerFilterPresets->setItemText(i, d->presetNameAtIndex(i));
397 d->cboServerFilterPresets->itemData(index)));