/*
    QAD - Qt ADvanced

    Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef BLOCKBASE_H
#define BLOCKBASE_H

#include "qad_blockview_export.h"
#include "qad_types.h"

#include <QGraphicsEllipseItem>
#include <QGraphicsItem>
#include <QGraphicsObject>
#include <QGraphicsScene>
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <QStack>


static const int _blockitem_current_version_ = 1;


enum BlockviewItemData {
	bvidSelected = 1000,    // bool
	bvidType,               // BlockviewItemType
	bvidItemPos,            // QPointF
	bvidDecorText,          // QString  src text for QGraphicsSimpleTextItem
	bvidMoveParent,         // bool  flag for move parent
	bvidVisualizeSelection, // bool  flag for visualize selection
	bvidItemSelection,      // bool  BlockItem selection
	bvidTmpItem,            // bool  item is temporary, ignore
	bvidBlockDecor,         // bool  item is BlockItem decor
	bvidDTHandle,           // bool
	bvidCorrectMove,        // bool
	bvidDecorShowLogic,     // uint
};

enum BlockviewDecorShowLogic {
	bvdslAlways   = 0x0,
	bvdslEnabled  = 0x1,
	bvdslHovered  = 0x2,
	bvdslSelected = 0x4,
	bvdslInverse  = 0x8,
};

Q_DECLARE_FLAGS(BlockviewDecorShowLogics, BlockviewDecorShowLogic)

enum BlockviewItemType {
	bvitInvalid,
	bvitPin,
	bvitBus,
	bvitBlock,
	bvitDecor,
};

QAD_BLOCKVIEW_EXPORT QDataStream & operator<<(QDataStream & s, const QGraphicsItem * item);
QAD_BLOCKVIEW_EXPORT QDataStream & operator>>(QDataStream & s, QGraphicsItem *& item);


class QAD_BLOCKVIEW_EXPORT BlockItemBase: public QObject {
	Q_OBJECT
	Q_ENUMS(Action)

public:
	enum Action {
		BlockAdd = 1,
		BlockMove,
		BlockRemove,
		BlockCopy,
		BusAdd,
		BusRemove,
		BusPointAdd,
		BusPointMove,
		BusPointRemove,
		BusSegmentAdd,
		BusSegmentMove,
		BusSegmentRemove,
		Paste
	};
};

#endif // BLOCKBASE_H
