23 #include "gamerulespanel.h"
24 #include "ui_gamerulespanel.h"
27 #include "plugins/engineplugin.h"
28 #include "serverapi/gamecreateparams.h"
34 DClass<GameRulesPanel> :
public Ui::GameRulesPanel
45 bool anythingAvailable;
47 GameCreateParams::HostMode hostMode;
49 QList<GameCVar> gameModifiers;
50 QList<GameLimitWidget *> limitWidgets;
51 QMap<QString, QMap<QString, int> > memorizedLimits;
60 d->anythingAvailable =
true;
62 d->hostMode = GameCreateParams::Host;
65 GameRulesPanel::~GameRulesPanel()
67 qDeleteAll(d->limitWidgets);
70 void GameRulesPanel::applyModeToUi()
72 bool engineAllowsSlotsLimits =
false;
73 bool engineHasModifiers =
false;
74 bool engineHasMapList =
false;
76 if (d->engine !=
nullptr)
78 setupModifiers(d->engine);
79 d->mapListPanel->setupForEngine(d->engine);
80 setupLimitWidgets(d->engine, d->gameMode);
82 auto ecfg = d->engine->data();
84 d->labelMaxClients->setVisible(ecfg->allowsClientSlots);
85 d->spinMaxClients->setVisible(ecfg->allowsClientSlots);
86 d->labelMaxPlayers->setVisible(ecfg->allowsPlayerSlots);
87 d->spinMaxPlayers->setVisible(ecfg->allowsPlayerSlots);
91 d->hostingLimitsLayout->removeWidget(d->labelMaxClients);
92 d->hostingLimitsLayout->removeWidget(d->spinMaxClients);
93 d->hostingLimitsLayout->removeWidget(d->labelMaxPlayers);
94 d->hostingLimitsLayout->removeWidget(d->spinMaxPlayers);
96 if (ecfg->allowsClientSlots)
97 d->hostingLimitsLayout->addRow(d->labelMaxClients, d->spinMaxClients);
98 if (ecfg->allowsPlayerSlots)
99 d->hostingLimitsLayout->addRow(d->labelMaxPlayers, d->spinMaxPlayers);
101 engineAllowsSlotsLimits = ecfg->allowsClientSlots || ecfg->allowsPlayerSlots;
102 engineHasMapList = ecfg->hasMapList;
103 engineHasModifiers = !d->engine->gameModifiers().isEmpty();
106 d->gameLimitsBox->setVisible(!d->limitWidgets.isEmpty());
108 bool slotLimitsBoxAvailable = d->hostMode == GameCreateParams::Host && engineAllowsSlotsLimits;
109 d->hostLimitsBox->setVisible(slotLimitsBoxAvailable);
110 d->mapListBox->setVisible(engineHasMapList);
112 d->anythingAvailable = !d->limitWidgets.isEmpty()
113 || engineHasModifiers
115 || slotLimitsBoxAvailable;
120 params.setMaxClients(d->spinMaxClients->value());
121 params.setMaxPlayers(d->spinMaxPlayers->value());
123 fillInLimits(params);
124 fillInModifiers(params);
126 d->mapListPanel->fillInParams(params);
133 p->limit.setValue(p->spinBox->value());
134 params.
cvars() << p->limit;
140 int modIndex = d->cboModifier->currentIndex();
144 d->gameModifiers[modIndex].setValue(1);
145 params.
cvars() << d->gameModifiers[modIndex];
149 bool GameRulesPanel::isAnythingAvailable()
const
151 return d->anythingAvailable;
156 return d->mapListPanel;
159 void GameRulesPanel::memorizeLimits()
161 if (d->engine !=
nullptr)
163 if (!d->memorizedLimits.contains(d->engine->nameCanonical()))
164 d->memorizedLimits[d->engine->nameCanonical()] = QMap<QString, int>();
165 QMap<QString, int> &limits = d->memorizedLimits[d->engine->nameCanonical()];
168 limits[limitWidget->limit.command()] = limitWidget->spinBox->value();
173 void GameRulesPanel::loadMemorizedLimits(
const EnginePlugin *engine)
177 QMap<QString, int> &limits = d->memorizedLimits[engine->
nameCanonical()];
180 if (limits.contains(limitWidget->limit.command()))
181 limitWidget->spinBox->setValue(limits[limitWidget->limit.command()]);
186 void GameRulesPanel::loadConfig(
Ini &config)
190 d->cboModifier->setCurrentIndex(section[
"modifier"]);
191 d->spinMaxClients->setValue(section[
"maxClients"]);
192 d->spinMaxPlayers->setValue(section[
"maxPlayers"]);
195 widget->spinBox->setValue(section[widget->limit.command()]);
198 d->mapListPanel->loadConfig(config);
201 void GameRulesPanel::saveConfig(
Ini &config)
205 section[
"modifier"] = d->cboModifier->currentIndex();
206 section[
"maxClients"] = d->spinMaxClients->value();
207 section[
"maxPlayers"] = d->spinMaxPlayers->value();
210 section[widget->limit.command()] = widget->spinBox->value();
213 d->mapListPanel->saveConfig(config);
218 d->mapListPanel->setCreateServerDialog(dialog);
224 d->gameMode = gameMode;
228 void GameRulesPanel::setupForHostMode(GameCreateParams::HostMode hostMode)
230 d->hostMode = hostMode;
234 void GameRulesPanel::setupModifiers(
const EnginePlugin *engine)
236 QString selectedModifier = d->cboModifier->currentText();
237 d->cboModifier->clear();
238 d->gameModifiers.clear();
242 if (!modifiers.isEmpty())
244 d->modifierBox->show();
246 d->cboModifier->addItem(tr(
"< NONE >"));
248 for (
const GameCVar &cvar : modifiers)
250 d->cboModifier->addItem(cvar.name());
251 d->gameModifiers << cvar;
253 if (!selectedModifier.isEmpty())
255 int modifierIndex = d->cboModifier->findText(selectedModifier);
256 if (modifierIndex >= 0)
257 d->cboModifier->setCurrentIndex(modifierIndex);
262 d->modifierBox->hide();
266 void GameRulesPanel::removeLimitWidgets()
270 delete widget->label;
271 delete widget->spinBox;
275 d->limitWidgets.clear();
281 removeLimitWidgets();
282 QList<GameCVar> limits = engine->
limits(gameMode);
284 for (
const GameCVar &limit : limits)
286 QLabel *label =
new QLabel(
this);
287 label->setText(limit.
name());
288 auto spinBox =
new QSpinBox(
this);
289 spinBox->setMaximum(INT_MAX);
290 spinBox->setMinimum(INT_MIN);
291 spinBox->setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue);
292 spinBox->setValue(limit.
value().toInt());
294 d->limitsLayout->addRow(label, spinBox);
298 glw->spinBox = spinBox;
300 d->limitWidgets << glw;
303 loadMemorizedLimits(engine);