/*************************************************************************** * Copyright (C) 2004-2005 Artur Wiebe * * wibix@gmx.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include <stdlib.h> #include <QLayout> #include <QDebug> #include "newgamedlg.h" #include "pdn.h" #include "common.h" #include "history.h" #include "player.h" #define BEGINNER 2 #define NOVICE 4 #define AVERAGE 6 #define GOOD 7 #define EXPERT 8 #define MASTER 9 #define CFG_SKILL CFG_KEY"Skill" #define CFG_RULES CFG_KEY"Rules" #define CFG_WHITE CFG_KEY"White" #define CFG_PLAYER1 CFG_KEY"Player1" #define CFG_PLAYER2 CFG_KEY"Player2" myNewGameDlg::myNewGameDlg(QWidget* parent) : QDialog(parent) { setModal(true); setWindowTitle(tr("New Game")+QString(" - "APPNAME)); /* * buttons, options. */ start_button = new QPushButton(tr("&Start"), this); start_button->setDefault(true); connect(start_button, SIGNAL(clicked()), this, SLOT(slot_start())); QPushButton* cn = new QPushButton(tr("&Cancel"), this); connect(cn, SIGNAL(clicked()), this, SLOT(slot_reject())); // TODO - better text m_freeplace = new QCheckBox(tr("Free Men Placement"), this); QHBoxLayout* buttons_layout = new QHBoxLayout(); buttons_layout->addWidget(m_freeplace); buttons_layout->addStretch(); buttons_layout->addWidget(start_button); buttons_layout->addWidget(cn); /* * global layout. */ QHBoxLayout* players_layout = new QHBoxLayout(); players_layout->addWidget(create_player_one()); players_layout->addWidget(create_player_two()); QVBoxLayout* global_layout = new QVBoxLayout(this); global_layout->addLayout(players_layout); global_layout->addLayout(buttons_layout); } myNewGameDlg::~myNewGameDlg() { } QWidget* myNewGameDlg::create_human_options() { QFrame* frm = new QFrame(); QVBoxLayout* frm_layout = new QVBoxLayout(frm); frm_layout->addWidget(new QLabel("No options available.")); frm_layout->addStretch(); return frm; } QWidget* myNewGameDlg::create_player_one() { m_player_one.box = new QGroupBox(tr("Player One"), this); // name m_player_one.name = new QLineEdit(m_player_one.box); // rules group box m_player_one.rules = new QGroupBox(tr("Rules"), m_player_one.box); m_player_one.rule_english = new QRadioButton( myHistory::typeToString(ENGLISH), m_player_one.rules); m_player_one.rule_russian = new QRadioButton( myHistory::typeToString(RUSSIAN), m_player_one.rules); QVBoxLayout* rules_layout = new QVBoxLayout(m_player_one.rules); rules_layout->addWidget(m_player_one.rule_english); rules_layout->addWidget(m_player_one.rule_russian); // play white men? m_player_one.white = new QCheckBox(tr("White"), m_player_one.box); // layout QVBoxLayout* vb1_layout = new QVBoxLayout(m_player_one.box); vb1_layout->addWidget(m_player_one.name); vb1_layout->addWidget(m_player_one.rules); vb1_layout->addWidget(m_player_one.white); return m_player_one.box; } QWidget* myNewGameDlg::create_player_two() { m_player_two.box = new QGroupBox(tr("Player Two"), this); // name m_player_two.name = new QLineEdit(m_player_two.box); // options m_player_two.options = new QTabWidget(m_player_two.box); m_player_two.options->insertTab(COMPUTER, create_computer_options(), tr("Computer")); m_player_two.options->insertTab(HUMAN, create_human_options(), tr("Human")); connect(m_player_two.options, SIGNAL(currentChanged(int)), this, SLOT(slot_game(int))); /* * frame layout */ QVBoxLayout* frm_layout = new QVBoxLayout(m_player_two.box); frm_layout->addWidget(m_player_two.name); frm_layout->addWidget(m_player_two.options); return m_player_two.box; } QWidget* myNewGameDlg::create_computer_options() { QFrame* frm = new QFrame(); // skills QGroupBox* skills = new QGroupBox(tr("Skill"), frm); m_player_two.computer.skills[BEGINNER] = new QRadioButton(tr("Beginner"), skills); m_player_two.computer.skills[NOVICE] = new QRadioButton(tr("Novice"), skills); m_player_two.computer.skills[AVERAGE] = new QRadioButton(tr("Average"), skills); m_player_two.computer.skills[GOOD] = new QRadioButton(tr("Good"), skills); m_player_two.computer.skills[EXPERT] = new QRadioButton(tr("Expert"), skills); m_player_two.computer.skills[MASTER] = new QRadioButton(tr("Master"), skills); QGridLayout* skills_layout = new QGridLayout(skills); int row = 0; int col = 0; foreach(QRadioButton* rb, m_player_two.computer.skills) { skills_layout->addWidget(rb, row++, col); connect(rb, SIGNAL(clicked()), this, SLOT(slot_skills())); if(row > 2) { row = 0; col = 1; } } // layout QHBoxLayout* frm_layout = new QHBoxLayout(frm); frm_layout->addWidget(skills); return frm; } void myNewGameDlg::slot_reject() { reject(); } void myNewGameDlg::slot_start() { accept(); } void myNewGameDlg::slot_skills() { QRadioButton* skill = 0; foreach(QRadioButton* rb, m_player_two.computer.skills) { if(rb->isChecked()) { skill = rb; break; } } if(skill) m_player_two.name->setText("*"+skill->text()+"*"); } void myNewGameDlg::slot_game_start(int id) { slot_game(id); slot_start(); } void myNewGameDlg::slot_game(int id) { start_button->setEnabled(true); m_player_one.box->setEnabled(true); m_player_two.options->setEnabled(true); if(m_player_two.last_game_index==HUMAN) { m_cfg_player2 = m_player_two.name->text(); } m_player_two.last_game_index = id; switch(id) { case COMPUTER: m_player_two.name->setReadOnly(true); slot_skills(); m_player_one.rules->setEnabled(true); m_player_one.white->setEnabled(true); break; case HUMAN: m_player_two.name->setReadOnly(false); m_player_two.name->setText(m_cfg_player2); m_player_one.rules->setEnabled(true); m_player_one.white->setEnabled(true); break; default: qDebug() << __PRETTY_FUNCTION__ << "ERR"; break; } } void myNewGameDlg::writeSettings(QSettings* cfg) { cfg->setValue(CFG_SKILL, skill()); cfg->setValue(CFG_RULES, rules()); cfg->setValue(CFG_WHITE, m_player_one.white->isChecked()); cfg->setValue(CFG_PLAYER1, m_player_one.name->text()); cfg->setValue(CFG_PLAYER2, m_cfg_player2); } void myNewGameDlg::readSettings(QSettings* cfg) { int skills = cfg->value(CFG_SKILL, BEGINNER).toInt(); QMap<int, QRadioButton*>::iterator it; it = m_player_two.computer.skills.find(skills); if(it != m_player_two.computer.skills.end()) it.value()->setChecked(true); else m_player_two.computer.skills[BEGINNER]->setChecked(true); slot_skills(); int rules = cfg->value(CFG_RULES, ENGLISH).toInt(); if(rules == ENGLISH) m_player_one.rule_english->setChecked(true); else m_player_one.rule_russian->setChecked(true); m_player_one.white->setChecked(cfg->value(CFG_WHITE, false).toBool()); m_player_one.name->setText(cfg->value(CFG_PLAYER1, getenv("USER")).toString()); m_cfg_player2 = cfg->value(CFG_PLAYER2, "Player2").toString(); } int myNewGameDlg::skill() const { QMap<int, QRadioButton*>::const_iterator it; it = m_player_two.computer.skills.begin(); for(; it!=m_player_two.computer.skills.end(); ++it) { if(it.value()->isChecked()) return it.key(); } qDebug() << __PRETTY_FUNCTION__ << "No skill selected."; return BEGINNER; } int myNewGameDlg::rules() const { if(m_player_one.rule_english->isChecked()) return ENGLISH; return RUSSIAN; }