summaryrefslogtreecommitdiffstats
path: root/kmines/status.h
blob: 6fd06a7620b29fe8fffaccbfedba89c019af5ad8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 * Copyright (c) 1996-2002 Nicolas HADACEK (hadacek@kde.org)
 *
 * 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.
 */

#ifndef STATUS_H
#define STATUS_H

#include <qdom.h>

#include "field.h"

class Smiley;
class KGameLCD;
class DigitalClock;
class Solver;
class QWidgetStack;
class QTimer;

class Status : public QWidget, public KMines
{
 Q_OBJECT
 public :
    Status(QWidget *parent);

    const Level &currentLevel() const { return _field->level(); }
    bool isPlaying() const            { return _field->gameState()==Playing; }
    void settingsChanged();
    Field *field() { return _field; }

    bool checkBlackMark();

 signals:
    void pause();
	void gameStateChangedSignal(KMines::GameState);

 public slots:
    void newGame(int type);
	void restartGame();
	void updateStatus(bool);
    void pauseGame()     { _field->pause(); }

    void moveUp()        { _field->moveCursor(KGrid2D::SquareBase::Up); }
    void moveDown()      { _field->moveCursor(KGrid2D::SquareBase::Down); }
    void moveLeft()      { _field->moveCursor(KGrid2D::SquareBase::Left); }
    void moveRight()     { _field->moveCursor(KGrid2D::SquareBase::Right); }
    void moveLeftEdge()  { _field->moveToEdge(KGrid2D::SquareBase::Left); }
    void moveRightEdge() { _field->moveToEdge(KGrid2D::SquareBase::Right); }
    void moveTop()       { _field->moveToEdge(KGrid2D::SquareBase::Up); }
    void moveBottom()    { _field->moveToEdge(KGrid2D::SquareBase::Down); }
    void reveal()        { _field->doReveal(); }
    void mark()          { _field->doMark(); }
    void autoReveal()    { _field->keyboardAutoReveal(); }

    void advise();
    void solve();
    void solveRate();
    void addAction(const KGrid2D::Coord &, Field::ActionType type);

    void viewLog();
    void replayLog();
    void saveLog();
    void loadLog();

 private slots:
    void gameStateChangedSlot(GameState state)
        { gameStateChanged(state, false); }
    void smileyClicked();
    void solvingDone(bool success);
    void replayStep();

 private:
	Field        *_field;
    QWidget      *_fieldContainer, *_resumeContainer;
    QWidgetStack *_stack;

	Smiley       *smiley;
	KGameLCD     *left;
	DigitalClock *dg;
    Solver       *_solver;

    QDomDocument  _log;
    QDomElement   _logRoot, _logList;
    QDomNodeList  _actions;
    uint          _index;
    bool          _completeReveal;
    Level         _oldLevel;
    QTimer       *_timer;

    void setGameOver(bool won);
    void setStopped();
    void setPlaying();
    void newGame(const Level &);
    void gameStateChanged(GameState, bool won);
    static bool checkLog(const QDomDocument &);
};

#endif // STATUS_H