void GameView::setPieces(const QList<PuzzleItem *> pieces, bool shuffle)
{
+ PuzzleItem::setManuallyMovable(false);
+
if(pieces.isEmpty()) {
qDebug() << "Empty list @ GameView::setPieces";
return;
if(shuffle) {
QTimer::singleShot(750, this, SLOT(shufflePieces()));
}
+ else {
+ PuzzleItem::setManuallyMovable(true);
+ }
}
//TODO: fixme!
case 0:
if(pieces_.at(hiddenIndex_)->currentPlace().y() > topLeft.y()) {
QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
- item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, -verticalStep_)));
- if(item->movable()) {
- emptyPlace_ = item->currentPlace();
- pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
- pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
- item->setCurrentPlace(tmp);
- item->setPos(tmp);
- invalidateScene();
- scene()->update();
- setMovingPieces();
- movesMade++;
- }
- else {
- qDebug() << "Item right of hidden piece not movable";
+ QGraphicsItem *graphicsItem = scene()->itemAt(tmp + QPointF(0, -verticalStep_));
+ if(graphicsItem) {
+ item = dynamic_cast<PuzzleItem *>(graphicsItem);
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ invalidateScene();
+ scene()->update();
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item right of hidden piece not movable";
+ }
}
}
else {
case 1:
if(pieces_.at(hiddenIndex_)->currentPlace().y() < bottomRight.y()) {
QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
- item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, verticalStep_)));
- if(item->movable()) {
- emptyPlace_ = item->currentPlace();
- pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
- pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
- item->setCurrentPlace(tmp);
- item->setPos(tmp);
- setMovingPieces();
- movesMade++;
- }
- else {
- qDebug() << "Item down of hidden piece not movable";
+ QGraphicsItem *graphicsItem = scene()->itemAt(tmp + QPointF(0, verticalStep_));
+ if(graphicsItem) {
+ item = dynamic_cast<PuzzleItem *>(graphicsItem);
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item down of hidden piece not movable";
+ }
}
}
else {
case 2:
if(pieces_.at(hiddenIndex_)->currentPlace().x() > topLeft.x()) {
QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
- item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(-horizontalStep_, 0)));
- if(item->movable()) {
- emptyPlace_ = item->currentPlace();
- pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
- pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
- item->setCurrentPlace(tmp);
- item->setPos(tmp);
- setMovingPieces();
- movesMade++;
- }
- else {
- qDebug() << "Item left of hidden piece not movable";
+ QGraphicsItem *graphicsItem = scene()->itemAt(tmp + QPointF(-horizontalStep_, 0));
+ if(graphicsItem) {
+ item = dynamic_cast<PuzzleItem *>(graphicsItem);
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item left of hidden piece not movable";
+ }
}
}
else {
case 3:
if(pieces_.at(hiddenIndex_)->currentPlace().x() < bottomRight.x()) {
QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
- item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(horizontalStep_, 0)));
- if(item->movable()) {
- emptyPlace_ = item->currentPlace();
- pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
- pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
- item->setCurrentPlace(tmp);
- item->setPos(tmp);
- setMovingPieces();
- movesMade++;
- }
- else {
- qDebug() << "Item up of hidden piece not movable";
+ QGraphicsItem *graphicsItem = scene()->itemAt(tmp + QPointF(horizontalStep_, 0));
+ if(graphicsItem) {
+ item = dynamic_cast<PuzzleItem *>(graphicsItem);
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item up of hidden piece not movable";
+ }
}
}
else {
qDebug() << QString("Shuffle moves: %1/%2").arg(movesMade).arg(moveCount);
QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup(this);
+ connect(animationGroup, SIGNAL(finished()), this, SLOT(shuffleAnimationFinished()));
for(int i = 0; i < pieces_.count(); ++i) {
QPropertyAnimation *animation = new QPropertyAnimation(pieces_.at(i), "pos");
animation->setStartValue(pieces_.at(i)->correctPlace());
animationGroup->addAnimation(animation);
}
animationGroup->start();
-
- // Hide
pieces_.at(hiddenIndex_)->hide();
+}
+void GameView::shuffleAnimationFinished()
+{
setMovingPieces();
+ PuzzleItem::setManuallyMovable(true);
}
QPointF GameView::emptyPlace()