Example #1
0
void localMap::paintTile(QPainter &painter, 
                           int row, int col, 
                           char type)
{
  painter.setPen(Qt::NoPen);

  if(type == 'g')
    painter.setBrush(Qt::green);
  else if(type == 'r')
    painter.setBrush(Qt::gray);
  else if(type == 'n')
    painter.setBrush(Qt::black);
  else if(type == 'd')
    painter.setBrush(QColor(250, 25, 150));
  else if(type == 'u')
    painter.setBrush(QColor(250, 150, 25));
  else if(type == 'p')
    painter.setBrush(Qt::red);
  else if(type == 'i')
    painter.setBrush(QColor(0, 125, 0));
  else if(type == 'w')
    painter.setBrush(Qt::blue);
    
  painter.drawRect(currentTile(row, col));
}
Example #2
0
void GraphicalBoardFrame::resizeWidgets(int sideLength)
{
    PixmapCacher::self()->invalidate();

    bool firstTile = true;
    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
    {
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
        {
            TileWidget *tile = tileAt(currentTile);
            if (!tile)
                continue;

            tile->setSideLength(sideLength);

            if (firstTile)
            {
                emit tileFontChanged(tile->actualLetterFont());
                firstTile = false;
            }
        }
    }

    for (int row = 0; row <= m_boardSize.height(); ++row)
    {
        TileWidget *mark = markAt(QSize(0, row));
        mark->setSideLength(sideLength);
    }

    for (int col = 1; col <= m_boardSize.width(); ++col)
    {
        TileWidget *mark = markAt(QSize(col, 0));
        mark->setSideLength(sideLength);
    }
}
Example #3
0
void GraphicalBoardFrame::deleteWidgets()
{
    if (m_boardSize.isEmpty())
        return;

    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
    {
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
        {
            delete tileAt(currentTile);
            removeTile(currentTile);
        }
    }

    for (int row = 0; row <= m_boardSize.height(); ++row)
    {
        delete markAt(QSize(0, row));
        removeMark(QSize(0, row));
    }

    for (int col = 1; col <= m_boardSize.width(); ++col)
    {
        delete markAt(QSize(col, 0));
        removeMark(QSize(col, 0));
    }
}
Example #4
0
void GraphicalBoardFrame::generateBoardPixmap(QPixmap *pixmap)
{
    if (m_sizeForBoard.isEmpty())
    {
        *pixmap = QPixmap(0, 0);
        return;
    }

    *pixmap = QPixmap(m_sizeForBoard);
    QPainter painter(pixmap);

    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
    {
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
        {
            TileWidget *tile = tileAt(currentTile);
            if (!tile)
                continue;

            painter.drawPixmap(coordinatesOfTile(currentTile), tile->tilePixmap());
        }
    }

    for (int row = 0; row <= m_boardSize.height(); ++row)
    {
        const QSize location(0, row);
        painter.drawPixmap(coordinatesOfMark(location), markAt(location)->tilePixmap());
    }

    for (int col = 1; col <= m_boardSize.width(); ++col)
    {
        const QSize location(col, 0);
        painter.drawPixmap(coordinatesOfMark(location), markAt(location)->tilePixmap());
    }
}
Example #5
0
void TileMapEditor::updateFromTilePicker() {
  switch (toolManager_.currentTool()) {
  case TileMapEditorTools::pencil:
    break;
  default:
    currentTile().setTileNum(
      tilePickerPreview_.pickedIndex() - currentTileMapInfo().offset);
    break;
  }
}
Example #6
0
void TileMapEditor::updateFromTileMap() {
  switch (toolManager_.currentTool()) {
  case TileMapEditorTools::pencil:
    tilePickerPreview_.pickIndex(
      toolManager_.pencilDrawIndex() + currentTileMapInfo().offset);
    break;
  default:
    tilePickerPreview_.pickIndex(currentTile().tileNum()
                                        + currentTileMapInfo().offset);
    break;
  }
}
Example #7
0
void GraphicalBoardFrame::drawMove(const Quackle::Move &move)
{
    if (move.action == Quackle::Move::Place)
    {
        if (move.tiles().empty())
            return;

        const QSize startTile(move.startcol, move.startrow);

        const Quackle::LetterString::const_iterator end(move.tiles().end());
        int i = 0;
        for (Quackle::LetterString::const_iterator it = move.tiles().begin(); it != end; ++it, ++i)
        {
            // if this is a cemented letter that we shouldn't overwrite
            if (move.isAlreadyOnBoard(*it))
                continue;

            QSize currentTile(startTile);
            if (move.horizontal)
                currentTile.setWidth(currentTile.width() + i);
            else
                currentTile.setHeight(currentTile.height() + i);

            TileWidget *tileWidget = tileAt(currentTile);
            if (!tileWidget)
                continue;

            Quackle::Board::TileInformation info;
            info.tileType = Quackle::Board::LetterTile;

            info.isBlank = QUACKLE_ALPHABET_PARAMETERS->isBlankLetter(*it);
            info.letter = QUACKLE_ALPHABET_PARAMETERS->clearBlankness(*it);

            tileWidget->setInformation(info);
            tileWidget->setCemented(false);
            tileWidget->prepare();
        }
    }
}
Example #8
0
void GraphicalBoardFrame::recreateWidgets()
{
    Quackle::Board emptyBoard;
    emptyBoard.prepareEmptyBoard();

    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
    {
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
        {
            TileWidget *newTile = new TileWidget;

            newTile->setLocation(currentTile);
            newTile->setAlwaysShowVerboseLabels(m_alwaysShowVerboseLabels);
            newTile->setOriginalInformation(emptyBoard.tileInformation(currentTile.height(), currentTile.width()));

            addTile(currentTile, newTile);
        }
    }

    for (int row = 0; row <= m_boardSize.height(); ++row)
    {
        MarkWidget *newMark = new MarkWidget;

        if (row == 0)
            newMark->setCapstone();
        else
            newMark->setRow(row);

        addMark(QSize(0, row), newMark);
    }

    for (int col = 1; col <= m_boardSize.width(); ++col)
    {
        MarkWidget *newMark = new MarkWidget;
        newMark->setCol(col);
        addMark(QSize(col, 0), newMark);
    }
}
Example #9
0
void GraphicalBoardFrame::drawBoard(const Quackle::Board &board)
{
    QSize newBoardSize(board.width(), board.height());

    if (m_boardSize != newBoardSize)
    {
        // if it was empty, we need to recalculate
        // tile widths
        bool wasEmpty = m_boardSize.isEmpty();
        
        deleteWidgets();
        m_boardSize = newBoardSize;
        recreateWidgets();

        if (wasEmpty)
            expandToSize(m_maxSize);
    }

    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
    {
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
        {
            Quackle::Board::TileInformation info(board.tileInformation(currentTile.height(), currentTile.width()));

            TileWidget *tile = tileAt(currentTile);
            if (!tile)
                continue;

            tile->setInformation(info);

            tile->setArrowDirection(NoArrow);
            tile->setCemented(info.tileType == Quackle::Board::LetterTile);
            tile->prepare();
        }
    }
}
Example #10
0
void GraphicalBoardFrame::tileClicked(const QSize &tileLocation, const QMouseEvent * /* event */)
{
    Quackle::Board::TileInformation info(m_board.tileInformation(tileLocation.height(), tileLocation.width()));
    if (info.tileType == Quackle::Board::LetterTile)
        return;

    if (m_arrowRoot == tileLocation)
    {
        ++m_arrowDirection;
        if (m_arrowDirection == ArrowWorm)
            m_arrowDirection = s_firstArrowDirection;
    }
    else
        m_arrowDirection = s_firstArrowDirection;

    m_arrowRoot = tileLocation;

    Quackle::Move originalMove;
    Quackle::LetterString hoppedTiles;

    QSize currentTile(tileLocation);
    while (true)
    {
        const QSize previousTile = currentTile - arrowVector();

        bool stopHere;

        if (!isOnBoard(previousTile))
            stopHere = true;
        else
        {
            Quackle::Board::TileInformation previousTileInformation(m_board.tileInformation(previousTile.height(), previousTile.width()));

            stopHere = previousTileInformation.tileType != Quackle::Board::LetterTile;
        }

        if (stopHere)
        {
            const bool horizontal = m_arrowDirection == ArrowRight;
            originalMove = Quackle::Move::createPlaceMove(currentTile.height(), currentTile.width(), horizontal, hoppedTiles);
            break;
        }

        hoppedTiles += QUACKLE_PLAYED_THRU_MARK;
        currentTile = previousTile;
    }

    prettifyAndSetLocalCandidate(originalMove);

    // TODO work some cleverness so we can do this!
    //emit setCandidateMove(Quackle::Move::createNonmove());

    for (QSize currentTile(0, 0); currentTile.height() < m_boardSize.height(); currentTile.setHeight(currentTile.height() + 1))
        for (currentTile.setWidth(0); currentTile.width() < m_boardSize.width(); currentTile.setWidth(currentTile.width() + 1))
            if (currentTile != tileLocation)
            {
                TileWidget *tile = tileAt(currentTile);
                if (!tile)
                    continue;

                tile->setArrowDirection(NoArrow);
            }

    prepare();
}
Example #11
0
void GraphicalBoardFrame::appendHandler(const QString &text, bool shiftPressed)
{
    if (!isOnBoard(m_arrowRoot))
        return;

    if (!hasCandidate())
        return;

    Quackle::LetterString appendedLetterString(QuackleIO::Util::encode(text));

    if (appendedLetterString.length() == 0 || Quackle::String::front(appendedLetterString) < QUACKLE_FIRST_LETTER)
        return;
    
    if (shiftPressed)
        appendedLetterString = Quackle::String::setBlankness(appendedLetterString);
    else
        appendedLetterString = Quackle::String::clearBlankness(appendedLetterString);

    Quackle::Move newCandidate(m_candidate);
    Quackle::LetterString newTiles(m_candidate.tiles() + appendedLetterString);
    if (!m_ignoreRack && !m_rack.contains(Quackle::String::usedTiles(newTiles)))
    {
        Quackle::LetterString blankedNewTiles(m_candidate.tiles() + Quackle::String::setBlankness(appendedLetterString));

        if (m_rack.contains(Quackle::String::usedTiles(blankedNewTiles)))
        {
            newTiles = blankedNewTiles;
        }
    }

    newCandidate.setTiles(newTiles);

    Quackle::LetterString hoppedTiles;

    QSize currentTile(m_arrowRoot);
    while (true)
    {
        const QSize nextTile = currentTile + arrowVector();

        bool stopHere = false;
        bool resetArrowAfter = false;

        if (!isOnBoard(nextTile))
        {
            stopHere = true;
        }
        else
        {
            Quackle::Board::TileInformation nextTileInformation(m_board.tileInformation(nextTile.height(), nextTile.width()));

            if (nextTileInformation.tileType != Quackle::Board::LetterTile)
                stopHere = true;
        }

        if (stopHere)
        {
            newCandidate.setTiles(newCandidate.tiles() + hoppedTiles);

            if (resetArrowAfter)
                resetArrow();
            else
                m_arrowRoot = nextTile;

            break;
        }

        hoppedTiles += QUACKLE_PLAYED_THRU_MARK;
        currentTile = nextTile;
    }

    prettifyAndSetLocalCandidate(newCandidate);
}
Example #12
0
void GraphicalBoardFrame::backspaceHandler()
{
    unsigned int hoppedTiles = 0;
    QSize currentTile(m_arrowRoot);
    while (true)
    {
        const QSize previousTile = currentTile - arrowVector();

        bool stopHere;

        if (!isOnBoard(previousTile))
            stopHere = true;
        else
        {
            Quackle::Board::TileInformation previousTileInformation(m_board.tileInformation(previousTile.height(), previousTile.width()));

            stopHere = previousTileInformation.tileType != Quackle::Board::LetterTile;
        }

        ++hoppedTiles;

        if (stopHere)
        {
            m_arrowRoot = previousTile;
            break;
        }

        currentTile = previousTile;
    }

    Quackle::LetterString tiles(m_candidate.tiles());
    
    if (hoppedTiles > tiles.length())
        tiles = Quackle::LetterString();
    else
        tiles = Quackle::String::left(m_candidate.tiles(), m_candidate.tiles().length() - hoppedTiles);
    
    if (tiles.empty())
    {
        Quackle::Move originalMove;
        Quackle::LetterString hoppedLetters;

        currentTile = m_arrowRoot;
        while (true)
        {
            const QSize previousTile = currentTile - arrowVector();
    
            bool stopHere;

            if (!isOnBoard(previousTile))
                stopHere = true;
            else
            {
                Quackle::Board::TileInformation previousTileInformation(m_board.tileInformation(previousTile.height(), previousTile.width()));

                stopHere = previousTileInformation.tileType != Quackle::Board::LetterTile;
            }

            if (stopHere)
            {
                const bool horizontal = m_arrowDirection == ArrowRight;
                m_candidate = Quackle::Move::createPlaceMove(currentTile.height(), currentTile.width(), horizontal, hoppedLetters);
                break;
            }

            hoppedLetters += QUACKLE_PLAYED_THRU_MARK;
            currentTile = previousTile;
        }
    }
    else
    {
        m_candidate.setTiles(tiles);
    }

    ensureCandidatePlacedProperly();
    prettifyAndSetLocalCandidate(m_candidate);
}