/* palette.h */

#ifndef MYPALETTE_H
#define MYPALETTE_H

#include "area.hpp"

#include <QTabWidget>
#include <QToolBar>
#include <QToolButton>
#include <QDrag>
#include <QMimeData>

/* ---------------------------------------------------------------------- */

class MyPalette;
class MyPalettePage;
class MyPaletteItem;

/* ---------------------------------------------------------------------- */

class MyPalette : public QTabWidget
{
   public:
       explicit MyPalette (QWidget * parent = 0);
       // virtual ~ MyPalette ();

       void addPage (QString name, MyPalettePage * page);
};

class MyPalettePage : public QToolBar
{
   public:
      void addItem (QString name, MyPaletteItem * item);
};

class MyPaletteItem : public QToolButton
{
   public:
      void mousePressEvent (QMouseEvent * event);
      // void mouseMoveEvent (QMouseEvent * event);

   protected:
      virtual void setupMimeData (QMimeData * data) { }
      virtual void setupPixmap (QDrag * drag) { }

   private:
      // QPoint dragStartPosition;
};

/* ---------------------------------------------------------------------- */

class ColorPaletteItem : public MyPaletteItem
{
   public:
      ColorPaletteItem () { }
      ColorPaletteItem (QString s);
      // ColorPaletteItem (QColor c) { setColor (c); }

      QColor color () { return value; }
      void setColor (QColor c) { value = c; setup (); }

   protected:
      virtual void setupMimeData (QMimeData * data);
      virtual void setupPixmap (QDrag * drag);

   private:
      QColor value;

      void setup ();
};

/* ---------------------------------------------------------------------- */

class ShapePaletteItem : public MyPaletteItem
{
   protected:
      virtual void setupMimeData (QMimeData * data);

   public:
      virtual QGraphicsItem * createShape () = 0;
};

template <class T>
class ShapePaletteTemplate : public ShapePaletteItem
{
   public:
      virtual QGraphicsItem * createShape () { return new T; }
};

/* ---------------------------------------------------------------------- */

class AreaPaletteItem : public MyPaletteItem
{
   protected:
      virtual void setupMimeData (QMimeData * data);

   public:
      virtual Area * createArea () = 0;
};

template <class T>
class AreaPaletteTemplate : public AreaPaletteItem
{
   public:
      virtual Area * createArea () { return new T; }
};

/* ---------------------------------------------------------------------- */

class FieldPaletteItem : public MyPaletteItem
{
   protected:
      virtual void setupMimeData (QMimeData * data);

   public:
      virtual Field * createField () = 0;
};

template <class T>
class FieldPaletteTemplate : public FieldPaletteItem
{
   public:
      virtual Field * createField () { return new T; }
};

/* ---------------------------------------------------------------------- */

#endif // MYPALETTE_H