diff options
author | Jason Katz-Brown <jason@airbnb.com> | 2013-08-25 02:17:13 -0700 |
---|---|---|
committer | Jason Katz-Brown <jason@airbnb.com> | 2013-08-25 02:17:13 -0700 |
commit | 9306cb60c32082c5403931de0823a9fd5daa196c (patch) | |
tree | ca1b6eb695fdf3f0c2294e92416b272164bae642 /quacker/boardsetupdialog.cpp | |
parent | 8fb2c681cecc01b46b0f4ba02d5cc177c4747b1c (diff) |
Initial git commit.
Diffstat (limited to 'quacker/boardsetupdialog.cpp')
-rw-r--r-- | quacker/boardsetupdialog.cpp | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/quacker/boardsetupdialog.cpp b/quacker/boardsetupdialog.cpp new file mode 100644 index 0000000..5cbc8db --- /dev/null +++ b/quacker/boardsetupdialog.cpp @@ -0,0 +1,232 @@ +/* + * Quackle -- Crossword game artificial intelligence and analysis tool + * Copyright (C) 2005-2006 Jason Katz-Brown and John O'Laughlin. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include <sstream> +#include <QtGui> +#include <boardparameters.h> +#include <board.h> +#include <datamanager.h> +#include <quackleio/util.h> + +#include "boardsetupdialog.h" +#include "boardsetup.h" +#include "brb.h" +#include "customqsettings.h" +#include "geometry.h" +#include "widgetfactory.h" +#include "settings.h" + +BoardSetupDialog::BoardSetupDialog(QWidget *parent) : QDialog(parent) +{ + resize(600,450); + setSizeGripEnabled(true); + + // construct the board + BoardSetupFactory factory; + BRB * brb = new BRB(&factory); + m_boardFrame = static_cast<BoardSetup *>(brb->getBoardView())->boardFrame(); + initializeBoardName(); + + // construct the UI elements + m_horizontalSymmetry = new QCheckBox(tr("Horizontal")); + m_verticalSymmetry = new QCheckBox(tr("Vertical")); + m_horizontalSymmetry->setCheckState(Qt::Checked); + m_verticalSymmetry->setCheckState(Qt::Checked); + + m_horizontalDimension = constructDimensionComboBox(QUACKLE_BOARD_PARAMETERS->width()); + m_verticalDimension = constructDimensionComboBox(QUACKLE_BOARD_PARAMETERS->height()); + + m_boardName = new QLineEdit(QuackleIO::Util::uvStringToQString(QUACKLE_BOARD_PARAMETERS->name())); + + m_saveChanges = new QPushButton(tr("&Save Changes")); + m_cancel = new QPushButton(tr("&Cancel")); + m_undoAll = new QPushButton(tr("&Undo All Changes")); + + QVBoxLayout * superLayout = new QVBoxLayout; + Geometry::setupFramedLayout(superLayout); + QHBoxLayout * mainLayout = new QHBoxLayout; + Geometry::setupInnerLayout(mainLayout); + QVBoxLayout * leftSideLayout = new QVBoxLayout; + Geometry::setupInnerLayout(leftSideLayout); + QLabel * boardNameLabel = new QLabel(tr("&Board name:")); + boardNameLabel->setBuddy(m_boardName); + QGroupBox * dimensionGroup = new QGroupBox(tr("Board dimensions")); + QHBoxLayout * dimensionRow = new QHBoxLayout(dimensionGroup); + Geometry::setupFramedLayout(dimensionRow); + QLabel * dimensionLabel = new QLabel(tr(" by ")); + QGroupBox * symmetryGroup = new QGroupBox(tr("Board symmetry")); + QVBoxLayout * symmetryCol = new QVBoxLayout(symmetryGroup); + Geometry::setupFramedLayout(symmetryCol); + QHBoxLayout * buttonRow = new QHBoxLayout; + Geometry::setupInnerLayout(buttonRow); + + // build the layout + dimensionRow->addWidget(m_horizontalDimension); + dimensionRow->addWidget(dimensionLabel); + dimensionRow->addWidget(m_verticalDimension); + dimensionRow->addStretch(); + + symmetryCol->addWidget(m_horizontalSymmetry); + symmetryCol->addWidget(m_verticalSymmetry); + + buttonRow->addStretch(1); + buttonRow->addWidget(m_cancel); + buttonRow->addWidget(m_saveChanges); + + leftSideLayout->addWidget(boardNameLabel); + leftSideLayout->addWidget(m_boardName); + leftSideLayout->addWidget(dimensionGroup); + leftSideLayout->addWidget(symmetryGroup); + leftSideLayout->addWidget(m_undoAll); + leftSideLayout->addStretch(); + + mainLayout->addLayout(leftSideLayout); + mainLayout->addWidget(brb); + mainLayout->setStretchFactor(leftSideLayout, 0); + mainLayout->setStretchFactor(brb, 10); + + superLayout->addLayout(mainLayout); + superLayout->addLayout(buttonRow); + + setLayout(superLayout); + m_saveChanges->setDefault(true); + + // hook up signals and slots + connect(m_horizontalDimension, SIGNAL(activated(const QString &)), this, SLOT(parametersChanged(const QString &))); + connect(m_verticalDimension, SIGNAL(activated(const QString &)), this, SLOT(parametersChanged(const QString &))); + connect(m_boardName, SIGNAL(textEdited(const QString &)), this, SLOT(parametersChanged(const QString &))); + connect(m_saveChanges, SIGNAL(clicked()), this, SLOT(accept())); + connect(m_cancel, SIGNAL(clicked()), this, SLOT(reject())); + connect(m_undoAll, SIGNAL(clicked()), this, SLOT(undoAllChanges())); + connect(m_horizontalSymmetry, SIGNAL(stateChanged(int)), this, SLOT(symmetryChanged())); + connect(m_verticalSymmetry, SIGNAL(stateChanged(int)), this, SLOT(symmetryChanged())); + + setWindowTitle(tr("Configure Board - Quackle")); + + // sync game board with control states and draw board + ostringstream boardStream; + QUACKLE_BOARD_PARAMETERS->Serialize(boardStream); + m_serializedOriginalBoard = boardStream.str(); + + parametersChanged(QString()); + symmetryChanged(); +} + +BoardSetupDialog::~BoardSetupDialog() +{ +} + +QComboBox * BoardSetupDialog::constructDimensionComboBox(int defaultDimension) +{ + QComboBox * returnValue = new QComboBox; + + for (int i = QUACKLE_MINIMUM_BOARD_SIZE; i <= QUACKLE_MAXIMUM_BOARD_SIZE; i++) + { + returnValue->addItem(QString::number(i)); + if (i == defaultDimension) + returnValue->setCurrentIndex(returnValue->count() - 1); + } + + return returnValue; +} + +void BoardSetupDialog::initializeBoardName() +{ + m_originalName = QuackleIO::Util::uvStringToQString(QUACKLE_BOARD_PARAMETERS->name()); + + if (m_originalName.isEmpty()) + { + CustomQSettings settings; + QString generatedName = "New Board"; + int i = 1; + settings.beginGroup("quackle/boardparameters"); + while (settings.contains(generatedName)) + { + generatedName = "New Board "; + generatedName += QString::number(i++); + } + QUACKLE_BOARD_PARAMETERS->setName(QuackleIO::Util::qstringToString(generatedName)); + } +} + +void BoardSetupDialog::parametersChanged(const QString &) +{ + QUACKLE_BOARD_PARAMETERS->setWidth(m_horizontalDimension->currentIndex() + QUACKLE_MINIMUM_BOARD_SIZE); + QUACKLE_BOARD_PARAMETERS->setHeight(m_verticalDimension->currentIndex() + QUACKLE_MINIMUM_BOARD_SIZE); + + if (QUACKLE_BOARD_PARAMETERS->startColumn() >= QUACKLE_BOARD_PARAMETERS->width()) + QUACKLE_BOARD_PARAMETERS->setStartColumn(QUACKLE_BOARD_PARAMETERS->width() - 1); + if (QUACKLE_BOARD_PARAMETERS->startRow() >= QUACKLE_BOARD_PARAMETERS->height()) + QUACKLE_BOARD_PARAMETERS->setStartRow(QUACKLE_BOARD_PARAMETERS->height() - 1); + UVString boardName = QuackleIO::Util::qstringToString(m_boardName->text()); + QUACKLE_BOARD_PARAMETERS->setName(boardName); + + m_game.reset(); + m_game.addPosition(); + m_boardFrame->setBoard(m_game.currentPosition().board()); + m_boardFrame->parametersChanged(); +} + +void BoardSetupDialog::symmetryChanged() +{ + m_boardFrame->setSymmetry( + m_horizontalSymmetry->checkState() == Qt::Checked, + m_verticalSymmetry->checkState() == Qt::Checked); +} + +void BoardSetupDialog::accept() +{ + if (m_boardName->text().isEmpty()) + { + QMessageBox::critical(this, tr("Missing board name"), + "You must type in a board name before saving this change.", + QMessageBox::Ok, QMessageBox::NoButton); + return; + } + else if (m_boardName->text() != m_originalName) + { + CustomQSettings settings; + settings.beginGroup("quackle/boardparameters"); + if (settings.contains(m_boardName->text())) + { + if (QMessageBox::warning(this, tr("Overwrite existing board?"), + tr("You've specified a board name which already exists. Do you want to overwrite the existing board?"), + QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) + return; + } + } + + PixmapCacher::self()->invalidate(); + QDialog::accept(); +} + +void BoardSetupDialog::reject() +{ + undoAllChanges(); + QDialog::reject(); +} + +void BoardSetupDialog::undoAllChanges() +{ + istringstream boardStream(m_serializedOriginalBoard); + + QUACKLE_DATAMANAGER->setBoardParameters(Quackle::BoardParameters::Deserialize(boardStream)); + parametersChanged(QString()); +} |