23 #include "serverfilterbuildermenu.h"
25 #include "gui/entity/serverlistfilterinfo.h"
26 #include "serverapi/server.h"
29 DClass<ServerFilterBuilderMenu>
37 static void addIfNotContains(QStringList &target,
const QString &candidate)
39 if (!target.contains(candidate, Qt::CaseInsensitive))
48 : QMenu(tr("Build server filter ..."), parent)
51 d->address = server.address();
52 d->gameMode = server.gameMode().name();
53 d->maxPing = server.ping();
55 addAction(
this, tr(
"Show only servers with ping lower than %1").arg(d->maxPing),
56 SLOT(applyPingFilter()));
57 if (!d->filter.gameModes.contains(d->gameMode, Qt::CaseInsensitive))
59 addAction(
this, tr(
"Filter by game mode \"%1\"").arg(d->gameMode),
60 SLOT(applyGameModeFilter()));
62 if (!d->filter.gameModesExcluded.contains(d->gameMode, Qt::CaseInsensitive))
64 addAction(
this, tr(
"Hide game mode \"%1\"").arg(d->gameMode),
65 SLOT(applyGameModeExcludedFilter()));
68 QMenu *includeWads =
new QMenu(tr(
"Include WAD ..."),
this);
69 QMenu *excludeWads =
new QMenu(tr(
"Exclude WAD ..."),
this);
71 QStringList wads = server.allWadNames();
72 for (
const QString &wad : wads)
74 if (!d->filter.wadsExcluded.contains(wad, Qt::CaseInsensitive))
75 mkExcludeWadAction(excludeWads, wad);
76 if (!d->filter.wads.contains(wad, Qt::CaseInsensitive))
77 mkIncludeWadAction(includeWads, wad);
80 if (!excludeWads->isEmpty())
82 if (!includeWads->isEmpty())
85 addAction(
this, tr(
"Filter by address"), SLOT(applyAddressFilter()));
88 ServerFilterBuilderMenu::~ServerFilterBuilderMenu()
92 QAction *ServerFilterBuilderMenu::addAction(QMenu *menu,
const QString &text,
const char *slot)
94 auto action =
new QAction(menu);
95 action->setText(text);
96 this->connect(action, SIGNAL(triggered()), slot);
97 menu->addAction(action);
101 void ServerFilterBuilderMenu::applyAddressFilter()
103 const int mask = d->address.toIPv4Address() ? 32 : 128;
104 auto subnet = qMakePair(d->address, mask);
105 if (!d->filter.addresses.contains(subnet))
106 d->filter.addresses << subnet;
109 void ServerFilterBuilderMenu::applyGameModeExcludedFilter()
111 if (!d->filter.gameModesExcluded.contains(d->gameMode, Qt::CaseInsensitive))
112 d->filter.gameModesExcluded << d->gameMode;
115 void ServerFilterBuilderMenu::applyGameModeFilter()
117 if (!d->filter.gameModes.contains(d->gameMode, Qt::CaseInsensitive))
118 d->filter.gameModes << d->gameMode;
121 void ServerFilterBuilderMenu::applyPingFilter()
123 d->filter.maxPing = d->maxPing;
126 void ServerFilterBuilderMenu::excludeWadFromAction()
128 auto action =
static_cast<QAction *
>(sender());
137 void ServerFilterBuilderMenu::includeWadFromAction()
139 auto action =
static_cast<QAction *
>(sender());
143 QAction *ServerFilterBuilderMenu::mkExcludeWadAction(QMenu *menu,
const QString &wadName)
145 return addAction(menu, wadName, SLOT(excludeWadFromAction()));
148 QAction *ServerFilterBuilderMenu::mkIncludeWadAction(QMenu *menu,
const QString &wadName)
150 return addAction(menu, wadName, SLOT(includeWadFromAction()));