Starting to make things work again: dragging
[tagua.git] / src / kboard.h
blob3bbbeb3f510be60a35331212d5c420ac199e70da
1 /*
2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 */
11 #ifndef LOWLEVEL_H
12 #define LOWLEVEL_H
15 class GraphicalAPI;
18 /**
19 * @file kboard.h
20 * @brief Low level abstract classes used by the interface framework.
22 * This file includes definitions for abstract classes used from within
23 * the interface framework to access variant details using dynamic time
24 * polymorphism.
26 * One of the big problems with this approach is what I call 'lack of
27 * functional dependency support' for runtime polymorphism.
28 * What is missing is the ability to override a virtual member function
29 * in a derived class changing its signature. Or better, it is possible
30 * to only change its return type with a covariant type, while it would
31 * often be useful to change any of its argument types with covariant or
32 * even controvariant types.
33 * For controvariant types, I foresee no problems, and all type checking
34 * can be done statically (of course the method has to be dynamically
35 * bound) as they are now.
36 * When using covariant types, the compiler could insert appropriate
37 * dynamic cast's and type checks in the calling code, when there's no
38 * way to know the exact type of an argument at compile time.
40 * The file @ref highlevel.h tries to address this problem doing part
41 * of the compiler's work. One exception is that type checking code
42 * is inserted in a method wrapper, instead of the calling place, so
43 * even calling a method of a noncasted instance would cause some
44 * upcast / downcast overhead; this is negligible, though, because
45 * that scenario is rather unlikely, since wrapped classes are always
46 * kept in variables of abstract types.
49 #include <map>
50 #include <boost/shared_ptr.hpp>
51 #include <QString>
52 #include <QStringList>
53 #include "point.h"
54 #include "usermove.h"
55 #include "index.h"
56 #include "option.h"
57 #include "decoratedmove.h"
58 #include "kboard_fwd.h"
61 /**
62 * @brief An enumerated type to specify the type of an interaction with a position
64 enum InteractionType {
65 NoAction,
66 Moving,
67 Premoving
71 /**
72 * @brief A superclass for all the piece classes.
74 class AbstractPiece {
75 public:
76 typedef boost::shared_ptr<AbstractPiece> Ptr;
77 virtual ~AbstractPiece() { }
79 /**
80 * Piece equality. Return false if the second pointer
81 * is null.
83 virtual bool equals(AbstractPiece::Ptr other) const = 0;
85 /**
86 * Return a unique key for the piece.
87 * Used to store pixmaps.
89 virtual QString name() const = 0;
91 /**
92 * Create a deep copy of the piece.
94 virtual AbstractPiece::Ptr clone() const = 0;
98 /**
99 * @brief A superclass for all the move classes.
101 * An abstract move is simply something that can serialize
102 * itself either as SAN notation, or as coordinate notation.
104 class AbstractMove {
105 public:
106 typedef boost::shared_ptr<AbstractMove> Ptr;
107 virtual ~AbstractMove() { }
110 * Return a compact SAN representation for the move.
112 virtual QString SAN(boost::shared_ptr<AbstractPosition> ref) const = 0;
115 * Return a decorated representation for the move.
117 virtual DecoratedMove toDecoratedMove(boost::shared_ptr<AbstractPosition> ref) const = 0;
120 * Return the move in coordinate notation.
122 virtual QString toString(boost::shared_ptr<AbstractPosition> ref) const = 0;
125 * Convert the move to a normal user move. Used to
126 * perform move highlighting.
128 virtual NormalUserMove toUserMove() const = 0;
131 * Checks if the two moves are equal.
133 virtual bool equals(Ptr other) const = 0;
139 * @brief Superclass for pools
141 * A general interface for pools.
143 class AbstractPool {
144 public:
145 typedef boost::shared_ptr<AbstractPool> Ptr;
146 virtual ~AbstractPool() {}
149 * \return the number of items in the pool
151 virtual int size() = 0;
154 * Inserts a piece in the pool, preferably at the position \a pref_index.
155 * But the pool can be unpredictable and the piece can be placed at an arbitrary position.
156 * \return the position at which the item was placed.
158 virtual int insert(int pref_index, AbstractPiece::Ptr piece) = 0;
161 * Gets the piece at the position \a index in the pool.
163 virtual AbstractPiece::Ptr get(int index) = 0;
166 * Removes the piece at the position \a index in the pool.
167 * \return the removed piece.
169 virtual AbstractPiece::Ptr take(int index) = 0;
175 * @brief A superclass for all the position classes.
177 * A general interface for positions. It is used from within
178 * the graphical framework to validate external input wrt
179 * the played variant.
181 class AbstractPosition {
182 public:
183 typedef boost::shared_ptr<AbstractPosition> Ptr;
184 typedef boost::shared_ptr<AbstractPool> PoolPtr;
185 virtual ~AbstractPosition() { }
188 * Return board size in logical units. This could be
189 * static if C++ permitted virtual static functions.
191 virtual Point size() const = 0;
194 * Returns the text to be used for the border surrounding this position in a board
196 virtual QStringList borderCoords() const = 0;
199 * Create the starting piece setup.
201 virtual void setup() = 0;
204 * Retrieve the piece on square @a p.
205 * Return a null pointer if that square is empty.
207 virtual AbstractPiece::Ptr get(const Point& p) const = 0;
210 * Set a piece on the board.
212 virtual void set(const Point& p, AbstractPiece::Ptr piece) = 0;
215 * \return an interface to modify the pool of the board relative to \a player
217 virtual AbstractPool::Ptr pool(int player) = 0;
220 * \return 1 if the piece can be moved, -1 if could be moved in the future (premove), or else 0.
222 virtual InteractionType movable(const Point& p) const = 0;
225 * \return an id corresponding to the player
226 * who is in turn.
228 virtual int turn() const = 0;
231 * Sets the player on move
233 virtual void setTurn(int) = 0;
236 * \return the player that just moved
238 virtual int previousTurn() const = 0;
241 * Switch to the next player.
243 virtual void switchTurn() = 0;
246 * Check move legality. Set move fields as needed.
247 * Return whether the move is legal.
248 * This function should return immediately if \a m
249 * has already been tested.
251 virtual bool testMove(AbstractMove::Ptr m) const = 0;
254 * Execute move \a m. Assume that \a m is legal and tested.
256 virtual void move(AbstractMove::Ptr m) = 0;
259 * Create a deep copy of the position.
261 virtual AbstractPosition::Ptr clone() const = 0;
264 * Tests if two positions are equal.
266 virtual bool equal(AbstractPosition::Ptr p) const = 0;
269 * Return a move from an algebraic notation, or a null pointer.
271 virtual AbstractMove::Ptr getMove(const class AlgebraicNotation&) const = 0;
274 * Return a move from an algebraic notation, or a null pointer.
276 virtual AbstractMove::Ptr getMove(const QString&) const = 0;
279 * Return a string representing the current state of the position.
281 virtual QString state() const = 0;
284 * Return a FEN representation for the position, assuming
285 * @a halfmove as halfmove clock and @a fullmove as full move
286 * number.
288 virtual QString fen(int halfmove, int fullmove) const = 0;
291 * A piece somehow representing or related to the move
292 * which has to be drawn by the interface.
293 * Examples:
294 * * for one click moves, the piece that would
295 * appear on the square.
296 * * for promotions in chesslike variants, the promoted
297 * piece.
298 * @note Return a null pointer if the move has no valid
299 * piece hint defined.
301 virtual AbstractPiece::Ptr moveHint(AbstractMove::Ptr) const = 0;
304 * Variant introspection
306 virtual QString variant() const = 0;
309 * For debugging
311 virtual void dump() const = 0;
314 class AnimationGroup;
317 * @brief An abstract superclass for all animator classes.
319 * An animator is a class which is given a difference between
320 * a graphical and a logical position, and schedules an animation
321 * which graphically does an update.
322 * If the difference is due to a move, the animator tries to
323 * create a smooth animation which could possibly work for many
324 * chess-like variants, and then fills in the gaps with a direct
325 * update.
327 class AbstractAnimator {
328 public:
329 typedef boost::shared_ptr<AbstractAnimator> Ptr;
330 typedef boost::shared_ptr<AnimationGroup> AnimationPtr;
331 virtual ~AbstractAnimator() { }
334 * Sync the graphical position with the given position.
336 virtual AnimationPtr warp(AbstractPosition::Ptr) = 0;
339 * Animate forward syncing to the given position.
341 virtual AnimationPtr forward(AbstractPosition::Ptr, AbstractMove::Ptr) = 0;
344 * Animate back syncing to the given position.
346 virtual AnimationPtr back(AbstractPosition::Ptr, AbstractMove::Ptr) = 0;
350 class VariantInfo {
351 public:
352 virtual ~VariantInfo() { }
353 virtual AbstractPosition::Ptr createPosition() = 0;
354 virtual AbstractPosition::Ptr createCustomPosition(const OptList& l) = 0;
355 virtual AbstractPosition::Ptr createPositionFromFEN(const QString& fen) = 0;
356 virtual AbstractPosition::Ptr createChessboard(int turn, bool, bool, bool, bool, const Point&) = 0;
357 virtual void forallPieces(class PieceFunction&) = 0;
358 virtual int moveListLayout() const = 0;
359 virtual AbstractAnimator::Ptr createAnimator(GraphicalAPI* graphical_api) = 0;
360 virtual AbstractMove::Ptr createNormalMove(const NormalUserMove&) = 0;
361 virtual AbstractMove::Ptr createDropMove(const DropUserMove&) = 0;
362 virtual AbstractMove::Ptr getVerboseMove(int turn, const class VerboseNotation&) const = 0;
365 * \return if moves are done by just clicking
367 virtual bool simpleMoves() = 0;
370 * \return the name of the variant
372 virtual QString name() const = 0;
375 * \return the name of the theme proxy variant, ie the variant whose theme can be used
376 * for the current one (for instance crazyhouse can use chess themes).
378 virtual QString themeProxy() const = 0;
381 * \return the (subvariant) options that can be specified for position creation, such as board size, etc
383 virtual OptList positionOptions() const = 0;
386 #endif // LOWLEVEL_H