summaryrefslogtreecommitdiffstats
path: root/atlantik/client/selectconfiguration_widget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'atlantik/client/selectconfiguration_widget.cpp')
-rw-r--r--atlantik/client/selectconfiguration_widget.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/atlantik/client/selectconfiguration_widget.cpp b/atlantik/client/selectconfiguration_widget.cpp
new file mode 100644
index 00000000..0e7d5cdb
--- /dev/null
+++ b/atlantik/client/selectconfiguration_widget.cpp
@@ -0,0 +1,189 @@
+// Copyright (c) 2002-2004 Rob Kaper <cap@capsi.com>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// version 2 as published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; see the file COPYING. If not, write to
+// the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+#include <iostream>
+
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+#include <kdebug.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+
+#include <atlantic_core.h>
+#include <configoption.h>
+#include <game.h>
+#include <player.h>
+
+#include "selectconfiguration_widget.moc"
+
+SelectConfiguration::SelectConfiguration(AtlanticCore *atlanticCore, QWidget *parent, const char *name) : QWidget(parent, name)
+{
+ m_atlanticCore = atlanticCore;
+ m_game = 0;
+
+ m_mainLayout = new QVBoxLayout(this, KDialog::marginHint());
+ Q_CHECK_PTR(m_mainLayout);
+
+ // Game configuration.
+ m_configBox = new QVGroupBox(i18n("Game Configuration"), this, "configBox");
+ m_mainLayout->addWidget(m_configBox);
+
+ // Player buttons.
+ QHBoxLayout *playerButtons = new QHBoxLayout(m_mainLayout, KDialog::spacingHint());
+ playerButtons->setMargin(0);
+
+ playerButtons->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
+
+ // Vertical spacer.
+ m_mainLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));
+
+ // Server buttons.
+ QHBoxLayout *serverButtons = new QHBoxLayout(m_mainLayout, KDialog::spacingHint());
+ serverButtons->setMargin(0);
+
+ m_backButton = new KPushButton(SmallIcon("back"), i18n("Leave Game"), this);
+ serverButtons->addWidget(m_backButton);
+
+ connect(m_backButton, SIGNAL(clicked()), this, SIGNAL(leaveGame()));
+
+ serverButtons->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
+
+ m_startButton = new KPushButton(SmallIconSet("forward"), i18n("Start Game"), this);
+ serverButtons->addWidget(m_startButton);
+ m_startButton->setEnabled(false);
+
+ connect(m_startButton, SIGNAL(clicked()), this, SIGNAL(startGame()));
+
+ Player *playerSelf = m_atlanticCore->playerSelf();
+ playerChanged(playerSelf);
+ connect(playerSelf, SIGNAL(changed(Player *)), this, SLOT(playerChanged(Player *)));
+
+ emit statusMessage(i18n("Retrieving configuration list..."));
+}
+
+void SelectConfiguration::initGame()
+{
+ emit statusMessage(i18n("Game started. Retrieving full game data..."));
+}
+
+void SelectConfiguration::addConfigOption(ConfigOption *configOption)
+{
+ // FIXME: only bool types supported!
+ QCheckBox *checkBox = new QCheckBox(configOption->description(), m_configBox, "checkbox");
+ m_configMap[(QObject *)checkBox] = configOption;
+ m_configBoxMap[configOption] = checkBox;
+
+ checkBox->setChecked( configOption->value().toInt() );
+ checkBox->setEnabled( configOption->edit() && m_atlanticCore->selfIsMaster() );
+ checkBox->show();
+
+ connect(checkBox, SIGNAL(clicked()), this, SLOT(changeOption()));
+ connect(configOption, SIGNAL(changed(ConfigOption *)), this, SLOT(optionChanged(ConfigOption *)));
+}
+
+void SelectConfiguration::gameOption(QString title, QString type, QString value, QString edit, QString command)
+{
+ // Find if option exists in GUI yet
+ if (QCheckBox *checkBox = dynamic_cast<QCheckBox *>(m_checkBoxMap[command]))
+ {
+ checkBox->setChecked(value.toInt());
+ checkBox->setEnabled(edit.toInt());
+ return;
+ }
+
+ // Create option
+ if (type == "bool")
+ {
+ QCheckBox *checkBox = new QCheckBox(title, m_configBox, "checkbox");
+ m_optionCommandMap[(QObject *)checkBox] = command;
+ m_checkBoxMap[command] = checkBox;
+ checkBox->setChecked(value.toInt());
+ checkBox->setEnabled(edit.toInt());
+ checkBox->show();
+
+ connect(checkBox, SIGNAL(clicked()), this, SLOT(optionChanged()));
+ }
+ // TODO: create options other than type=bool
+
+ // TODO: Enable edit for master only
+}
+
+void SelectConfiguration::changeOption()
+{
+ ConfigOption *configOption = m_configMap[(QObject *)QObject::sender()];
+ if (configOption)
+ {
+ kdDebug() << "checked " << ((QCheckBox *)QObject::sender())->isChecked() << endl;
+ emit changeOption( configOption->id(), QString::number( ((QCheckBox *)QObject::sender())->isChecked() ) );
+ }
+}
+
+void SelectConfiguration::optionChanged(ConfigOption *configOption)
+{
+ QCheckBox *checkBox = m_configBoxMap[configOption];
+ if (checkBox)
+ {
+ checkBox->setText( configOption->description() );
+ checkBox->setChecked( configOption->value().toInt() );
+ checkBox->setEnabled( configOption->edit() && m_atlanticCore->selfIsMaster() );
+ }
+}
+
+void SelectConfiguration::optionChanged()
+{
+ QString command = m_optionCommandMap[(QObject *)QObject::sender()];
+
+ if (QCheckBox *checkBox = m_checkBoxMap[command])
+ {
+ command.append(QString::number(checkBox->isChecked()));
+ emit buttonCommand(command);
+ }
+}
+
+void SelectConfiguration::slotEndUpdate()
+{
+ emit statusMessage(i18n("Retrieved configuration list."));
+}
+
+void SelectConfiguration::playerChanged(Player *player)
+{
+ kdDebug() << "playerChanged" << endl;
+
+ if (player->game() != m_game)
+ {
+ kdDebug() << "playerChanged::change" << endl;
+
+ if (m_game)
+ disconnect(m_game, SIGNAL(changed(Game *)), this, SLOT(gameChanged(Game *)));
+
+ m_game = player->game();
+
+ if (m_game)
+ connect(m_game, SIGNAL(changed(Game *)), this, SLOT(gameChanged(Game *)));
+ }
+}
+
+void SelectConfiguration::gameChanged(Game *game)
+{
+ m_startButton->setEnabled( game->master() == m_atlanticCore->playerSelf() );
+
+ for (QMapIterator<ConfigOption *, QCheckBox *> it = m_configBoxMap.begin() ; it != m_configBoxMap.end() ; ++it)
+ (*it)->setEnabled( it.key()->edit() && m_atlanticCore->selfIsMaster() );
+}