#ifndef VYMMODEL_H
#define VYMMODEL_H

#include <QGraphicsScene>

#include "mapcenterobj.h"
#include "mapeditor.h"


/*! \brief This will later be divided into Model/View
*/

class VymModel : public QObject{
	Q_OBJECT

public:
	VymModel();
	~VymModel ();
    void clear();
    void init();
	void setMapEditor(MapEditor *me);	// FIXME should not be necessary in Model/View
	MapEditor* getMapEditor();
	void setVersion(const  QString &);
	void setAuthor  (const QString &);
	QString getAuthor ();
	void setComment (const QString &);
	QString getComment ();
	QString getDate();
	void setScene(QGraphicsScene *s);
	QGraphicsScene *getScene();
	MapCenterObj* addMapCenter();
	MapCenterObj* addMapCenter(QPointF absPos);
	MapCenterObj* removeMapCenter(MapCenterObj *mco);

	BranchObj* first();					// FIXME replaced by ModelIndex later
	BranchObj* next(BranchObj *bo);		// FIXME replaced by ModelIndex later

    LinkableMapObj* findMapObj(QPointF,LinkableMapObj*);	// find MapObj 
    LinkableMapObj* findObjBySelect (const QString &s);		// find MapObj by select string
    LinkableMapObj* findID (const QString &s);				// find MapObj by previously set ID
	QString saveToDir (const QString&,const QString&,int, const QPointF&);// Save data recursivly to tempdir


////////////////////////////////////////// View related
    // void updateLink();  FIXME needed?
    void updateRelPositions();

	QRectF getTotalBBox();
	void reposition();					//!< Call reposition for all MCOs
	void setHideTmp (HideTmpMode mode);	
	QPolygonF shape(BranchObj *bo);		//!< Returns arbitrary shape of subtree
	void moveAway (LinkableMapObj *lmo);//!< Autolayout: Move all out of the way

	// Animation  **experimental**
private slots:
	void animate();						//!< Called by timer to animate stuff
public:
	void startAnimation (const QPointF &start, const QPointF &dest);
	void stopAnimation  (MapObj *mo);
private:	
	QTimer *animationTimer;
	bool animationUse;
	uint animationTicks;
	uint animationInterval;
	int timerId;				// animation timer
	QList <MapObj*> animObjList;// list with animated objects

////////////////////////////////////////// Selection related 
public:
	LinkableMapObj* getSelection();
	BranchObj* getSelectedBranch();
	bool select (const QString &s);
	QString getSelectString (LinkableMapObj *lmo);

private:
	QGraphicsScene *mapScene;
	MapEditor *mapEditor;
	QList <MapCenterObj*> mapCenters;
	QString version;	//!< version string saved in vym file
	QString author;
	QString comment;
	QDate date;
};


#endif
