/*
* Quackle -- Crossword game artificial intelligence and analysis tool
* Copyright (C) 2005-2014 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 3 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, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "boardsetup.h"
#include "geometry.h"
BoardSetup::BoardSetup(QWidget *parent)
: View(parent)
{
m_vlayout = new QVBoxLayout(this);
Geometry::setupInnerLayout(m_vlayout);
m_boardFrame = new BoardSetupFrame;
m_boardWrapper = new QWidget;
QLabel *helperLabel = new QLabel(tr("Click or right-click on a board square to cycle through bonuses. Shift-click on a square to designate it as the square that starts the game."));
helperLabel->setWordWrap(true);
QVBoxLayout *helperLayout = new QVBoxLayout(m_boardWrapper);
Geometry::setupInnerLayout(helperLayout);
m_vlayout->addWidget(helperLabel);
m_vlayout->addWidget(m_boardWrapper);
helperLayout->addWidget(m_boardFrame);
m_vlayout->setStretchFactor(m_boardWrapper, 10);
m_subviews.push_back(m_boardFrame);
connectSubviewSignals();
}
void BoardSetup::expandToFullWidth()
{
m_boardFrame->expandToSize(m_boardWrapper->size());
}
void BoardSetup::resizeEvent(QResizeEvent * /* event */)
{
QTimer::singleShot(0, this, SLOT(expandToFullWidth()));
}
///////////////////
BoardSetupFrame::BoardSetupFrame(QWidget *parent)
: GraphicalBoardFrame(parent)
{
m_alwaysShowVerboseLabels = true;
}
BoardSetupFrame::~BoardSetupFrame()
{
}
void BoardSetupFrame::setBoard(const Quackle::Board &board)
{
m_board = board;
}
void BoardSetupFrame::setSymmetry(bool horizontal, bool vertical, bool diagonal)
{
horizontalSymmetry = horizontal;
verticalSymmetry = vertical;
diagonalSymmetry = diagonal;
}
void BoardSetupFrame::parametersChanged()
{
flushPixmapsAndRedraw();
}
void BoardSetupFrame::tileClicked(const QSize &tileLocation, const QMouseEvent *event)
{
const int row = tileLocation.height();
const int col = tileLocation.width();
// set starting point...
if (event->button() == Qt::LeftButton && (event->modifiers() & Qt::SHIFT) != 0)
{
QUACKLE_BOARD_PARAMETERS->setStartRow(row);
QUACKLE_BOARD_PARAMETERS->setStartColumn(col);
prepare();
return;
}
// or change the value of a square
const int maxLetterMultiplier = (int) Quackle::BoardParameters::lsCount;
const int maxWordMultiplier = (int) Quackle::BoardParameters::wsCount;
const int maxMultiplier = maxLetterMultiplier + maxWordMultiplier - 1;
int wordMultiplier = QUACKLE_BOARD_PARAMETERS->wordMultiplier(row, col);
int letterMultiplier = QUACKLE_BOARD_PARAMETERS->letterMultiplier(row, col);
int combinedMultipliers = (wordMultiplier == 1) ? letterMultiplier : (maxLetterMultiplier + wordMultiplier - 1);
if (event->button() == Qt::LeftButton)
combinedMultipliers++;
else
combinedMultipliers--;
if (combinedMultipliers < 1)
combinedMultipliers = maxMultiplier;
else if (combinedMultipliers > maxMultiplier)
combinedMultipliers = 1;
if (combinedMultipliers <= maxLetterMultiplier)
{
wordMultiplier = 1;
letterMultiplier = combinedMultipliers;
}
else
{
wordMultiplier = combinedMultipliers - maxLetterMultiplier + 1;
letterMultiplier = 1;
}
setMultipliers(row, col, wordMultiplier, letterMultiplier);
const int height = QUACKLE_BOARD_PARAMETERS->height();
const int width = QUACKLE_BOARD_PARAMETERS->width();
if (horizontalSymmetry)
setMultipliers(row, width - 1 - col, wordMultiplier, letterMultiplier);
if (verticalSymmetry)
setMultipliers(height - 1 - row, col, wordMultiplier, letterMultiplier);
if (horizontalSymmetry && verticalSymmetry)
setMultipliers(height - 1 - row, width - 1 - col, wordMultiplier, letterMultiplier);
if (diagonalSymmetry && (row != col) && (height - 1 - row != col))
{
setMultipliers(col, row, wordMultiplier, letterMultiplier);
setMultipliers(col, width - 1 - row, wordMultiplier, letterMultiplier);
setMultipliers(height - 1 - col, row, wordMultiplier, letterMultiplier);
setMultipliers(height - 1 - col, width - 1 - row, wordMultiplier, letterMultiplier);
}
prepare();
}
bool BoardSetupFrame::wantMousePressEvent(const QMouseEvent *event) const
{
return (event->button() == Qt::LeftButton || event->button() == Qt::RightButton);
}
void BoardSetupFrame::setMultipliers(int row, int col, int word, int letter)
{
QUACKLE_BOARD_PARAMETERS->setWordMultiplier(row, col, (Quackle::BoardParameters::WordMultiplier) word);
QUACKLE_BOARD_PARAMETERS->setLetterMultiplier(row, col, (Quackle::BoardParameters::LetterMultiplier) letter);
}