Almost all of the classes hold more members than are mentioned here,
but those are implementation details and would only obscure the
overall picture.  This file is only to give a helicopter view of the
program, not to serve as detailed documentation.


Classes
=======

Class Diagram (See details below)
-------------

KReversiMainWindow-----------------------------------+
  |       |   +---------------------+                |
          |                         |                |
  |       +-------------+           |                V
  V                     V           |             Widgets
KReversiGame<-------KReversiView    |    (Status bar, Action bar...)
     |                  I           V
     |                  I       Highscores
     |                  I
     V                  V
   Engine      +======*Table*======+
               V                   V
            *Popup*             *Board*
                                   I
                                   V
                                *Cell*
                                   I
                                   V
                             *ReversiChip*

Legend:
========>  Contains
-------->  Ownership pointer
- - - - >  Reference pointer
*Name*     QML class


Details
-------

KReversiMainWindow
    Main window of game, contains option controls, move history
    and KReversiView.


KReversiGame
    KReversiGame incapsulates all of the game logic.
    Whenever the board state changes it emits corresponding signals.
    The idea is also to abstract from any graphic representation of the game process

    KReversiGame is supposed to be driven by someone from outside.
    I.e. it receives commands and emits events when it's internal state changes
    due to this commands dispatching.
    The main commands are:
    startNextTurn() and  makePlayerMove()


Engine
    Can generate a move, given a ReversiPosition.


KReversiView
    This class provides graphical representation of KReversiGame
    using QML for graphics display.
    It displays the reversi board in its current state,
    receives a mouse events, translates them so KReversiGame can understand,
    sends them to it,
    receives board-changed notifications, nicely animates them.
    It also drives the gameflow, i.e. it tells KReversiGame when to make
    the next move.

    FIXME: Enhance the view with timing information, clock, etc.


*Table*
    Contains table background, *Board* and *Popup*.


*Popup*
    Used to show in-game messages. Looks like KGamePopupItem.

    FIXME: It should load kde-theme-specific values for rendering.
           Now default values are hardcoded.


*Board*
    Draws board with labels, when needed. Contains 8X8 *Cell* matrix.


*Cell*
    Used to draw single cell of a board with *ReversiChip*.
    Can show hint and legal markers.


*ReversiChip*
    Used to draw single chip with animations. Can show hint.


KReversiPos
    Holds information about Reversi move: row, column, color.


Highscores
    Used to access KDE highscore statistics for games.


EngineView (status: PLANNED)
    View of the internal thought processes of an Engine (trace, etc).


Some notes
----------

* KReversi follows the Model/View principle strictly.
