23 #include "gamerulespanel.h"
24 #include "ui_gamerulespanel.h"
26 #include "gui/createserver/gamecvaredit.h"
28 #include "plugins/engineplugin.h"
29 #include "serverapi/gamecreateparams.h"
39 std::shared_ptr<QLabel> label;
40 std::shared_ptr<GameCVarEdit> edit;
42 QString command()
const {
return cvar().command(); }
43 GameCVar cvar()
const {
return edit->cvar(); }
44 QVariant value()
const {
return edit->value(); }
45 void setValue(
const QVariant &value) { edit->setValue(value); }
49 DClass<GameRulesPanel> :
public Ui::GameRulesPanel
52 bool anythingAvailable;
54 GameCreateParams::HostMode hostMode;
56 QList<GameCVar> gameModifiers;
57 QList<std::shared_ptr<CVarUi> > cvarWidgets;
58 QMap<QString, QMap<QString, QVariant> > memorizedCVars;
67 d->anythingAvailable =
true;
69 d->hostMode = GameCreateParams::Host;
72 GameRulesPanel::~GameRulesPanel()
74 d->cvarWidgets.clear();
77 void GameRulesPanel::applyModeToUi()
79 bool engineAllowsSlotsLimits =
false;
80 bool engineHasModifiers =
false;
81 bool engineHasMapList =
false;
83 if (d->engine !=
nullptr)
85 setupModifiers(d->engine);
86 d->mapListPanel->setupForEngine(d->engine);
87 setupCVarWidgets(d->engine, d->gameMode);
89 auto ecfg = d->engine->data();
91 d->labelMaxClients->setVisible(ecfg->allowsClientSlots);
92 d->spinMaxClients->setVisible(ecfg->allowsClientSlots);
93 d->labelMaxPlayers->setVisible(ecfg->allowsPlayerSlots);
94 d->spinMaxPlayers->setVisible(ecfg->allowsPlayerSlots);
98 d->hostingLimitsLayout->removeWidget(d->labelMaxClients);
99 d->hostingLimitsLayout->removeWidget(d->spinMaxClients);
100 d->hostingLimitsLayout->removeWidget(d->labelMaxPlayers);
101 d->hostingLimitsLayout->removeWidget(d->spinMaxPlayers);
103 if (ecfg->allowsClientSlots)
104 d->hostingLimitsLayout->addRow(d->labelMaxClients, d->spinMaxClients);
105 if (ecfg->allowsPlayerSlots)
106 d->hostingLimitsLayout->addRow(d->labelMaxPlayers, d->spinMaxPlayers);
108 engineAllowsSlotsLimits = ecfg->allowsClientSlots || ecfg->allowsPlayerSlots;
109 engineHasMapList = ecfg->hasMapList;
110 engineHasModifiers = !d->engine->gameModifiers().isEmpty();
113 d->extraSettingsBox->setVisible(!d->cvarWidgets.isEmpty());
115 bool slotLimitsBoxAvailable = d->hostMode == GameCreateParams::Host && engineAllowsSlotsLimits;
116 d->hostLimitsBox->setVisible(slotLimitsBoxAvailable);
117 d->mapListBox->setVisible(engineHasMapList);
119 d->anythingAvailable = !d->cvarWidgets.isEmpty()
120 || engineHasModifiers
122 || slotLimitsBoxAvailable;
127 params.setMaxClients(d->spinMaxClients->value());
128 params.setMaxPlayers(d->spinMaxPlayers->value());
131 fillInModifiers(params);
133 d->mapListPanel->fillInParams(params);
138 for (
auto &cvarUi : d->cvarWidgets)
140 params.
cvars() << cvarUi->cvar();
146 int modIndex = d->cboModifier->currentIndex();
150 d->gameModifiers[modIndex].setValue(1);
151 params.
cvars() << d->gameModifiers[modIndex];
155 bool GameRulesPanel::isAnythingAvailable()
const
157 return d->anythingAvailable;
162 return d->mapListPanel;
165 void GameRulesPanel::memorizeCVars()
167 if (d->engine !=
nullptr)
169 const QString &engineName = d->engine->nameCanonical();
170 QMap<QString, QVariant> &cvars = d->memorizedCVars[engineName];
171 for (
auto &cvarUi : d->cvarWidgets)
172 cvars[cvarUi->command()] = cvarUi->value();
176 void GameRulesPanel::loadMemorizedCVars(
const EnginePlugin *engine)
180 const QMap<QString, QVariant> &cvars = d->memorizedCVars[engine->
nameCanonical()];
181 for (
auto &cvarUi : d->cvarWidgets)
183 if (cvars.contains(cvarUi->command()))
184 cvarUi->setValue(cvars[cvarUi->command()]);
189 void GameRulesPanel::loadConfig(
Ini &config)
193 d->cboModifier->setCurrentIndex(section[
"modifier"]);
194 d->spinMaxClients->setValue(section[
"maxClients"]);
195 d->spinMaxPlayers->setValue(section[
"maxPlayers"]);
196 for (
auto &cvarUi : d->cvarWidgets)
198 cvarUi->setValue(section[cvarUi->command()].
value());
201 d->mapListPanel->loadConfig(config);
204 void GameRulesPanel::saveConfig(
Ini &config)
208 section[
"modifier"] = d->cboModifier->currentIndex();
209 section[
"maxClients"] = d->spinMaxClients->value();
210 section[
"maxPlayers"] = d->spinMaxPlayers->value();
211 for (
auto &cvarUi : d->cvarWidgets)
213 section[cvarUi->command()].
setValue(cvarUi->value());
216 d->mapListPanel->saveConfig(config);
221 d->mapListPanel->setCreateServerDialog(dialog);
227 d->gameMode = gameMode;
231 void GameRulesPanel::setupForHostMode(GameCreateParams::HostMode hostMode)
233 d->hostMode = hostMode;
237 void GameRulesPanel::setupModifiers(
const EnginePlugin *engine)
239 QString selectedModifier = d->cboModifier->currentText();
240 d->cboModifier->clear();
241 d->gameModifiers.clear();
245 if (!modifiers.isEmpty())
247 d->modifierBox->show();
249 d->cboModifier->addItem(tr(
"< NONE >"));
251 for (
const GameCVar &cvar : modifiers)
253 d->cboModifier->addItem(cvar.name());
254 d->gameModifiers << cvar;
256 if (!selectedModifier.isEmpty())
258 int modifierIndex = d->cboModifier->findText(selectedModifier);
259 if (modifierIndex >= 0)
260 d->cboModifier->setCurrentIndex(modifierIndex);
265 d->modifierBox->hide();
273 d->cvarWidgets.clear();
274 QList<GameCVar> cvars = engine->
limits(gameMode);
278 std::shared_ptr<CVarUi> cvarUi(
new CVarUi);
280 if (cvarUi->edit->externalLabel())
282 cvarUi->label.reset(
new QLabel(
this));
283 cvarUi->label->setText(cvar.name());
286 d->extraSettingsLayout->addRow(cvarUi->label.get(), cvarUi->edit.get());
287 d->cvarWidgets << std::move(cvarUi);
290 loadMemorizedCVars(engine);