#ifndef BLOCKBUSITEM_H #define BLOCKBUSITEM_H #include "blockitem.h" /// data: /// 1002 - flag for move parent (true) /// 1003 - flag for visualize selection (true) /// 1004 - BlockItemPin ("pin") /// 1005 - BlockBusItem ("connection") /// 1006 - BlockItem ("item") /// 1007 - BlockItem selection ("item_selection") /// 1008 - item is NOT decor, ignore for function decors() (true) /// 1009 - item is scene decor ("decor") /// 1010 - BlockItem decor (src text for QGraphicsSimpleTextItem) /// 1011 - item is BlockItem decor ("decor") /// 1100 - flag for correct move (true) class BlockBusItem: public QGraphicsObject, public PropertyStorage { Q_OBJECT Q_INTERFACES(QGraphicsItem) Q_PROPERTY(double pointSize READ pointSize WRITE setPointSize DESIGNABLE false SCRIPTABLE false) friend class BlockView; public: BlockBusItem(bool temp = false); BlockBusItem(const BlockBusItem & other); ~BlockBusItem() {;} void setGridStep(double gs) {grid_step = gs;} void setEndpointsNumber(int num) {max_ep = num;} void setImages(const QImage & bus, const QImage & end = QImage()) {im_bus = bus; im_end = end; update();} void setBusImageScale(double s) {im_bus_scale = s; update();} void setEndpointImageScale(double s) {im_end_scale = s; update();} void setBusType(int type_) {bus_type = type_;} void setBusName(const QString & name) {bus_name = name;} int busType() const {return bus_type;} QString busName() const {return bus_name;} double busImageScale() const {return im_bus_scale;} double endpointImageScale() const {return im_end_scale;} void appendPoint(const QPointF & p); void appendPoint(qreal x, qreal y); void testPoint(QPointF pos, int * sel_point, int * sel_segment); void clear(); /*void setStart(const QPointF & p) {pol[0] = p; scene()->update();} void setStart(qreal x, qreal y) {setStart(QPointF(x, y));} void setFinish(const QPointF & p) {pol[pol.size() - 1] = p; scene()->update();} void setFinish(qreal x, qreal y) {setFinish(QPointF(x, y));} void setPoint(int index, const QPointF & p) {pol[index] = p; scene()->update();} void setPoint(int index, qreal x, qreal y) {setPoint(index, QPointF(x, y));}*/ void setPen(const QPen & p) {p_ = p; update();} QPen pen() const {return p_;} void setBrush(const QBrush & b) {b_ = b; update();} QBrush brush() const {return b_;} //void disconnectBrick() {BrickBase::disconnect(brickFrom, portFrom, brickTo, portTo);} void movePolyline(const QPointF & dp); void movePoint(int index, const QPointF & dp); double width() const {return pen_width;} void setWidth(const double & w); void setColor(const QColor & c); int addPoint(const QPointF & point, bool update = true); int segmentPointPair(int point, int * seg = 0) const; void removePoint(int index); void removeSegment(int index); void markAsInput(); void markAsOutput(); void unmark(); void simplify(bool full = true); void adjustLine(); int endpointCount() const; bool isBusSelected() const {return selSegment >= 0 || selPoint >= 0;} QList connectedBlocks() const; QList connectedPins() const; void setBusState(bool state); bool busState() const {return state_ > 0;} void clearBusState(); QByteArray save() const; void load(const QByteArray & data); BlockBusItem * copy() const; void saveState(); void restoreState(); enum {Type = UserType + 2}; protected: void _init(); void reconnect(); void updateGeometry(); bool checkDelete(); void emitAction(BlockItemBase::Action a); QVector endpoints() const; QVector endpointLine(int ep, double angle) const; int pointSegmentsCount(int point, QList * segs = 0) const; int neighborSegmentPoint(int point, int * seg) const; int type() const {return Type;} QRectF boundingRect() const; bool sceneEvent(QEvent * e); void hoverEnterEvent(QGraphicsSceneHoverEvent * e); void hoverMoveEvent(QGraphicsSceneHoverEvent * e); void hoverLeaveEvent(QGraphicsSceneHoverEvent * e); void mousePressEvent(QGraphicsSceneMouseEvent * e); void mouseMoveEvent(QGraphicsSceneMouseEvent * e); void mouseReleaseEvent(QGraphicsSceneMouseEvent * e); void paint(QPainter * p, const QStyleOptionGraphicsItem * o, QWidget * w = 0); QPointF lp, new_start, new_end, press_pos, qp; QPen p_, ph, pu, pa, pr, pn; QBrush b_, bh, bu, ba, br; QString tt, bus_name; QList > segments, ends_ind, segments_s, ends_ind_s; QMap connections_; QVector ends, ends_s; QImage im_bus, im_end; QPolygonF pol, bpol, pol_s; Qt::KeyboardModifiers mm_mods; bool temp_; double pen_width, grid_step, im_bus_scale, im_end_scale; int selPoint, selSegment, max_ep, bus_type, state_; bool moved, deleted, mark_in, mark_out, new_segment, mm_cancel, lm_point; private: double pointSize() const {return point_size;} void setPointSize(double s); double point_size; QPropertyAnimation anim_point_size; }; inline QDataStream & operator <<(QDataStream & s, const BlockBusItem * b) {s << b->save(); return s;} inline QDataStream & operator >>(QDataStream & s, BlockBusItem *& b) { QByteArray ba; s >> ba; b = new BlockBusItem(); b->load(ba); return s; } #endif // BLOCKBUSITEM_H