|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef SCHEMATICNODE_H
|
|
Toshihiro Shimizu |
890ddd |
#define SCHEMATICNODE_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qgraphicsitem></qgraphicsitem>
|
|
Toshihiro Shimizu |
890ddd |
#include "schematicviewer.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// forward declarations
|
|
Toshihiro Shimizu |
890ddd |
class SchematicPort;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// StageSchematicName.
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class SchematicName final : public QGraphicsTextItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Shinya Kitaoka |
120a6e |
double m_width;
|
|
Shinya Kitaoka |
120a6e |
double m_height;
|
|
justburner |
5053be |
bool m_refocus;
|
|
justburner |
5053be |
QString m_defName;
|
|
justburner |
5053be |
QString m_curName;
|
|
justburner |
5053be |
QMenu *popup;
|
|
justburner |
5053be |
QAction *actionCut;
|
|
justburner |
5053be |
QAction *actionCopy;
|
|
justburner |
5053be |
QAction *actionPaste;
|
|
justburner |
5053be |
QAction *actionDelete;
|
|
justburner |
5053be |
QAction *actionSelectAll;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicName(QGraphicsItem *parent, double width, double height);
|
|
Shinya Kitaoka |
120a6e |
~SchematicName();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
bool eventFilter(QObject *object, QEvent *event) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
57ba4e |
void setName(const QString &name); // Act as default name
|
|
justburner |
5053be |
void acceptName(const QString &name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void focusInEvent(QFocusEvent *fe) override;
|
|
Shinya Kitaoka |
473e70 |
void focusOutEvent(QFocusEvent *fe) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
void keyPressEvent(QKeyEvent *ke) override;
|
|
justburner |
2a0406 |
void contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void focusOut();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected slots:
|
|
Shinya Kitaoka |
120a6e |
void onContentsChanged();
|
|
justburner |
5053be |
void onPopupHide();
|
|
justburner |
5053be |
void onCut();
|
|
justburner |
5053be |
void onCopy();
|
|
justburner |
5053be |
void onPaste();
|
|
justburner |
5053be |
void onDelete();
|
|
justburner |
5053be |
void onSelectAll();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// SchematicThumbnailToggle
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class SchematicThumbnailToggle final : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
#ifndef MACOSX
|
|
Shinya Kitaoka |
120a6e |
Q_INTERFACES(QGraphicsItem)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool m_isDown;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicThumbnailToggle(SchematicNode *parent, bool isOpened);
|
|
Shinya Kitaoka |
120a6e |
~SchematicThumbnailToggle();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override;
|
|
Shinya Kitaoka |
120a6e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
473e70 |
QWidget *widget = 0) override;
|
|
Shinya Kitaoka |
120a6e |
void setIsDown(bool value);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void toggled(bool isOpened);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// SchematicToggle
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class SchematicToggle : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
#ifndef MACOSX
|
|
Shinya Kitaoka |
120a6e |
Q_INTERFACES(QGraphicsItem)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
manongjohn |
d6e3cc |
QIcon m_imageOn, m_imageOn2, m_imageOff;
|
|
manongjohn |
d6e3cc |
QColor m_colorOn, m_colorOff;
|
|
Shinya Kitaoka |
120a6e |
int m_state;
|
|
Shinya Kitaoka |
120a6e |
int m_flags;
|
|
Shinya Kitaoka |
120a6e |
int m_width, m_height;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
enum { eIsParentColumn = 0x01, eEnableNullState = 0x02 };
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
d6e3cc |
SchematicToggle(SchematicNode *parent, const QIcon &imageOn, QColor colorOn,
|
|
manongjohn |
d6e3cc |
int flags, bool isNormalIconView = true);
|
|
manongjohn |
d6e3cc |
|
|
manongjohn |
d6e3cc |
SchematicToggle(SchematicNode *parent, const QIcon &imageOn, QColor colorOn,
|
|
manongjohn |
d6e3cc |
const QIcon &imageOff, QColor colorOff, int flags,
|
|
manongjohn |
d6e3cc |
bool isNormalIconView = true);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! the schematic toggle can be a 3-state or a 2-state toggle!
|
|
manongjohn |
d6e3cc |
SchematicToggle(SchematicNode *parent, const QIcon &imageOn,
|
|
manongjohn |
d6e3cc |
const QIcon &imageOn2, QColor colorOn, int flags,
|
|
manongjohn |
d6e3cc |
bool isNormalIconView = true);
|
|
manongjohn |
d6e3cc |
|
|
manongjohn |
d6e3cc |
SchematicToggle(SchematicNode *parent, const QIcon &imageOn,
|
|
manongjohn |
d6e3cc |
const QIcon &imageOn2, QColor colorOn, const QIcon &imageOff,
|
|
manongjohn |
d6e3cc |
QColor colorOff, int flags, bool isNormalIconView = true);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
~SchematicToggle();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override;
|
|
Shinya Kitaoka |
120a6e |
// reimplemeted in SchematicToggle_SplineOptions
|
|
Shinya Kitaoka |
473e70 |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
38fd86 |
QWidget *widget = 0) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! this is used for a 2-state toggle;
|
|
Shinya Kitaoka |
120a6e |
void setIsActive(bool value) { m_state = value ? 1 : 0; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! this is used for a 3-state toggle;
|
|
Shinya Kitaoka |
120a6e |
void setState(int state) { m_state = state; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void setSize(int width, int height) {
|
|
Shinya Kitaoka |
120a6e |
m_width = width;
|
|
Shinya Kitaoka |
120a6e |
m_height = height;
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
// reimplemeted in SchematicToggle_SplineOptions
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) override;
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
//! this is triggered for a 2-state toggle;
|
|
Shinya Kitaoka |
120a6e |
void toggled(bool isChecked);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! this is triggered for a 3-state toggle;
|
|
Shinya Kitaoka |
120a6e |
void stateChanged(int state);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class SchematicToggle_SplineOptions final : public SchematicToggle {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
manongjohn |
7b18ae |
SchematicToggle_SplineOptions(SchematicNode *parent, const QIcon &imageIcon,
|
|
Shinya Kitaoka |
120a6e |
int flags)
|
|
manongjohn |
7b18ae |
: SchematicToggle(parent, imageIcon, QColor(0, 0, 0, 0), flags) {}
|
|
manongjohn |
7b18ae |
SchematicToggle_SplineOptions(SchematicNode *parent, const QIcon &imageIcon,
|
|
manongjohn |
7b18ae |
const QIcon &imageIcon2, int flags)
|
|
manongjohn |
7b18ae |
: SchematicToggle(parent, imageIcon, imageIcon2, QColor(0, 0, 0, 0),
|
|
manongjohn |
7b18ae |
flags) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
473e70 |
QWidget *widget = 0) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// SchematicHandleSpinBox
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class SchematicHandleSpinBox : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
#ifndef MACOSX
|
|
Shinya Kitaoka |
120a6e |
Q_INTERFACES(QGraphicsItem)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
Qt::MouseButton m_buttonState;
|
|
Shinya Kitaoka |
120a6e |
int m_delta;
|
|
Shinya Kitaoka |
120a6e |
QPixmap m_pixmap;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicHandleSpinBox(QGraphicsItem *parent);
|
|
Shinya Kitaoka |
120a6e |
~SchematicHandleSpinBox();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override;
|
|
Shinya Kitaoka |
120a6e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
473e70 |
QWidget *widget = 0) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void modifyHandle(int);
|
|
Shinya Kitaoka |
120a6e |
void changeStatus();
|
|
Shinya Kitaoka |
120a6e |
void sceneChanged();
|
|
Shinya Kitaoka |
120a6e |
void handleReleased();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mouseMoveEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseReleaseEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// class SchematicLink
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Shinya Kitaoka |
120a6e |
\brief The class provides method to draw links between two SchematicPort
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
A link can has a cubic shape or a line shape and is drawing calling the
|
|
Shinya Kitaoka |
120a6e |
updatePath() method. The class also provides
|
|
Shinya Kitaoka |
120a6e |
methods to retrieve the start SchematicPort and the end SchematicPort of
|
|
Shinya Kitaoka |
120a6e |
the link and a method to remove the
|
|
Shinya Kitaoka |
120a6e |
link from these two SchematicPort.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
\see SchematicPort, SchematicNode.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
class SchematicLink : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *m_startPort, *m_endPort;
|
|
Shinya Kitaoka |
120a6e |
QPainterPath m_path, m_hitPath;
|
|
Shinya Kitaoka |
120a6e |
bool m_lineShaped;
|
|
Shinya Kitaoka |
120a6e |
bool m_highlighted;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicLink(QGraphicsItem *parent, QGraphicsScene *scene);
|
|
Shinya Kitaoka |
120a6e |
~SchematicLink();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Reimplements the pure virtual QGraphicsItem::boundingRect() method.
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override;
|
|
Shinya Kitaoka |
120a6e |
//! Reimplements the virtual QGraphicsItem::shape() method.
|
|
Shinya Kitaoka |
473e70 |
QPainterPath shape() const override;
|
|
Shinya Kitaoka |
120a6e |
//! Reimplements the pure virtual QGraphicsItem::paint() method.
|
|
Shinya Kitaoka |
120a6e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
473e70 |
QWidget *widget = 0) override;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! Update the link path.\n
|
|
Shinya Kitaoka |
120a6e |
The link is has a cubic shape starting from \b startPos and ending to \b
|
|
Shinya Kitaoka |
120a6e |
endPos.
|
|
Shinya Kitaoka |
120a6e |
If a link path already exists, the path is updating otherwise a path is
|
|
Shinya Kitaoka |
120a6e |
created.*/
|
|
Shinya Kitaoka |
120a6e |
void updatePath(const QPointF &startPos, const QPointF &endPos);
|
|
Shinya Kitaoka |
120a6e |
//! Update the link path.\n
|
|
Shinya Kitaoka |
120a6e |
//! Call the updatePath(const QPointF &startPos, const QPointF &endPos)
|
|
Shinya Kitaoka |
120a6e |
//! method. The \b start pos and the \b endPos
|
|
Shinya Kitaoka |
120a6e |
//! are taken from the the given \b startPort and \b endPort.
|
|
Shinya Kitaoka |
120a6e |
void updatePath(SchematicPort *startPort, SchematicPort *endPort);
|
|
Shinya Kitaoka |
120a6e |
void updatePath() { updatePath(m_startPort, m_endPort); }
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
21e838 |
void updateEndPos(const QPointF &endPos);
|
|
shun-iwasawa |
21e838 |
|
|
Shinya Kitaoka |
120a6e |
//! Sets the start SchematicPort of the link to \b startPort.
|
|
Shinya Kitaoka |
120a6e |
void setStartPort(SchematicPort *startPort) { m_startPort = startPort; }
|
|
Shinya Kitaoka |
120a6e |
//! Sets the start SchematicPort of the link to \b startPort.
|
|
Shinya Kitaoka |
120a6e |
void setEndPort(SchematicPort *endPort) { m_endPort = endPort; }
|
|
Shinya Kitaoka |
120a6e |
//! Returns the start SchematicPort of the link.
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *getStartPort() const { return m_startPort; }
|
|
Shinya Kitaoka |
120a6e |
//! Returns the end SchematicPort of the link.
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *getEndPort() const { return m_endPort; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! Returns the other SchematicPort linked to the specified \b port.\n
|
|
luz paz |
6454c4 |
Returns 0 if \b port isn't neither the start SchematicPort either the end
|
|
Shinya Kitaoka |
120a6e |
SchematicPort of this link.*/
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *getOtherPort(const SchematicPort *port) const;
|
|
Shinya Kitaoka |
120a6e |
/*! Returns the other SchematicNode linked to the specified \b node.\n
|
|
Shinya Kitaoka |
120a6e |
Returns 0 if \b node isn't neither the parent node of the start
|
|
Shinya Kitaoka |
120a6e |
SchematicPort
|
|
luz paz |
6454c4 |
either the parent node of the end SchematicPort of the link.*/
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *getOtherNode(const SchematicNode *node) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Returns true if the link is line shaped.
|
|
Shinya Kitaoka |
120a6e |
bool isLineShaped() { return m_lineShaped; }
|
|
Shinya Kitaoka |
120a6e |
void setLineShaped(bool value) { m_lineShaped = value; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool isHighlighted() { return m_highlighted; }
|
|
Shinya Kitaoka |
120a6e |
void setHighlighted(bool value) { m_highlighted = value; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseReleaseEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// class SchematicPort
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Shinya Kitaoka |
120a6e |
\brief The class provides method to draw and andle a SchematicPort.
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
A SchematicPort is a child af a SchematicNode and is used to link a
|
|
Shinya Kitaoka |
120a6e |
parent node to other nodes. It can be an input port,
|
|
Shinya Kitaoka |
120a6e |
or better , a port used to accept link coming from other node. A port
|
|
Shinya Kitaoka |
120a6e |
that isn't an input port cannot accept
|
|
Shinya Kitaoka |
120a6e |
links but can begin to draw links.\n
|
|
Shinya Kitaoka |
120a6e |
A SchematicPort has got a hook thet is a position where links starts or
|
|
Shinya Kitaoka |
120a6e |
ends.\n
|
|
luz paz |
6454c4 |
A SchematicPort can be linked to an arbitrary number of links.
|
|
Shinya Kitaoka |
120a6e |
A SchematicPort handles a container of all links to retrieve all linked
|
|
Shinya Kitaoka |
120a6e |
node; each link is indexed using a
|
|
Shinya Kitaoka |
120a6e |
progressive number assigned when the link is inserted to the container.
|
|
Shinya Kitaoka |
120a6e |
\see SchematicNode, SchematicLink.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
class SchematicPort : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
#ifndef MACOSX
|
|
Shinya Kitaoka |
120a6e |
Q_INTERFACES(QGraphicsItem)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
Qt::MouseButton m_buttonState;
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *m_node;
|
|
Shinya Kitaoka |
120a6e |
QPointF m_hook;
|
|
Shinya Kitaoka |
120a6e |
bool m_highlighted;
|
|
shun-iwasawa |
21e838 |
QList<schematiclink *=""> m_ghostLinks;</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *m_linkingTo;
|
|
Shinya Kitaoka |
120a6e |
QList<schematiclink *=""> m_links;</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
int m_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicPort(QGraphicsItem *parent, SchematicNode *node, int type);
|
|
Shinya Kitaoka |
120a6e |
~SchematicPort();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *getNode() const { return m_node; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override { return QRectF(0, 0, 1, 1); };
|
|
Shinya Kitaoka |
473e70 |
|
|
Shinya Kitaoka |
473e70 |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
38fd86 |
QWidget *widget = 0) override{};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Add the \b link to the links container.
|
|
Shinya Kitaoka |
120a6e |
void addLink(SchematicLink *link) { m_links.push_back(link); }
|
|
Shinya Kitaoka |
120a6e |
//! Returns the number of the link contained in the links container or, it is
|
|
Shinya Kitaoka |
120a6e |
//! the same, the number of nodes
|
|
Shinya Kitaoka |
120a6e |
//! linked to this SchematicPort
|
|
Shinya Kitaoka |
120a6e |
int getLinkCount() const { return m_links.size(); }
|
|
Shinya Kitaoka |
120a6e |
//! Removes the link form the links container.\n
|
|
Shinya Kitaoka |
120a6e |
//! It doesn't remove the link from the scene and it doesn't delete the link!
|
|
Shinya Kitaoka |
120a6e |
void removeLink(SchematicLink *link);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Removes \b link from the scene and the m_links list; delete it .
|
|
Shinya Kitaoka |
120a6e |
void eraseLink(SchematicLink *link);
|
|
Shinya Kitaoka |
120a6e |
//! Removes all links from the scene and the m_links list; delete them .
|
|
Shinya Kitaoka |
120a6e |
void eraseAllLinks();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Returns the link indexed with \b index.\n
|
|
Shinya Kitaoka |
120a6e |
//!\note A link is indexed with a progressive number when is inserted in the
|
|
Shinya Kitaoka |
38fd86 |
//! container.
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *getLink(int index) const {
|
|
Shinya Kitaoka |
120a6e |
return (index < m_links.size() && index >= 0) ? m_links[index] : 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//! Returns the node linked with the link \b index.
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *getLinkedNode(int index) const {
|
|
Shinya Kitaoka |
120a6e |
return m_links[index] ? m_links[index]->getOtherNode(m_node) : 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Make a link from this port to the given port.
|
|
Shinya Kitaoka |
120a6e |
virtual SchematicLink *makeLink(SchematicPort *port);
|
|
Shinya Kitaoka |
120a6e |
//! Check and make a connection between the data Objects.
|
|
Shinya Kitaoka |
120a6e |
//! Returns true if it is possible to have a connection between the data
|
|
Shinya Kitaoka |
120a6e |
//! Object represented by this SchematicPort
|
|
Shinya Kitaoka |
120a6e |
//! and that represented by \b port. If check only is false no connections is
|
|
Shinya Kitaoka |
120a6e |
//! created!
|
|
Shinya Kitaoka |
120a6e |
//! \see TFxPort, TStageObject.
|
|
Shinya Kitaoka |
120a6e |
virtual bool linkTo(SchematicPort *port, bool checkOnly = false) = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// !Return the hook poeistion of the port.
|
|
Shinya Kitaoka |
120a6e |
QPointF getHook() const { return m_hook; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Returns true if this SchematicPort is linked to \b port. Otherwise returns
|
|
Shinya Kitaoka |
120a6e |
//! false.
|
|
Shinya Kitaoka |
120a6e |
bool isLinkedTo(SchematicPort *port) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void highLight(bool value) { m_highlighted = value; }
|
|
Shinya Kitaoka |
120a6e |
bool isHighlighted() const { return m_highlighted; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Updates all links of the ports.
|
|
Shinya Kitaoka |
120a6e |
void updateLinksGeometry();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Returns the scene position of the link end
|
|
Shinya Kitaoka |
120a6e |
QPointF getLinkEndPoint() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Returns the type of the port. \see eFxSchematicPortType,
|
|
Shinya Kitaoka |
120a6e |
//! eStageSchematicPortType
|
|
Shinya Kitaoka |
120a6e |
int getType() const { return m_type; }
|
|
Shinya Kitaoka |
120a6e |
//! Set the type of the port.
|
|
Shinya Kitaoka |
120a6e |
void setType(int type) { m_type = type; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mouseMoveEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseReleaseEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
virtual SchematicPort *searchPort(const QPointF &scenePos) = 0;
|
|
shun-iwasawa |
21e838 |
|
|
shun-iwasawa |
21e838 |
// linkingPort is used only for stage schematic port -
|
|
shun-iwasawa |
21e838 |
// in order to enable to connect from multiple node at the same time.
|
|
shun-iwasawa |
21e838 |
virtual void hideSnappedLinks(SchematicPort *linkingPort) = 0;
|
|
shun-iwasawa |
21e838 |
virtual void showSnappedLinks(SchematicPort *linkingPort) = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void isClicked();
|
|
Shinya Kitaoka |
120a6e |
void isReleased(const QPointF &);
|
|
Shinya Kitaoka |
120a6e |
void sceneChanged();
|
|
Shinya Kitaoka |
120a6e |
void xsheetChanged();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
// class SchematicNode
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class SchematicNode : public QObject, public QGraphicsItem {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT
|
|
Toshihiro Shimizu |
890ddd |
#ifndef MACOSX
|
|
Shinya Kitaoka |
120a6e |
Q_INTERFACES(QGraphicsItem)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
SchematicScene *m_scene;
|
|
Shinya Kitaoka |
120a6e |
qreal m_width, m_height;
|
|
Shinya Kitaoka |
120a6e |
Qt::MouseButton m_buttonState;
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" schematicport=""> m_ports;</int,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SchematicNode(SchematicScene *scene);
|
|
Shinya Kitaoka |
120a6e |
~SchematicNode();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
QRectF boundingRect() const override;
|
|
Shinya Kitaoka |
120a6e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
Shinya Kitaoka |
473e70 |
QWidget *widget = 0) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *addPort(int portId, SchematicPort *port);
|
|
Shinya Kitaoka |
120a6e |
void erasePort(int portId);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *getPort(int portId) const;
|
|
Shinya Kitaoka |
120a6e |
QList<schematicnode *=""> getLinkedNodes(int portId) const;</schematicnode>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual void setSchematicNodePos(const QPointF &pos) const = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual void setPosition(const QPointF &newPos) = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void updateLinksGeometry();
|
|
Shinya Kitaoka |
120a6e |
virtual void onClicked(){};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
473e70 |
void mouseMoveEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseReleaseEvent(QGraphicsSceneMouseEvent *me) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void sceneChanged();
|
|
Shinya Kitaoka |
120a6e |
void xsheetChanged();
|
|
manongjohn |
adae7d |
void nodeChangedSize();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
57ba4e |
//========================================================
|
|
shun-iwasawa |
57ba4e |
//
|
|
shun-iwasawa |
57ba4e |
// class SnapTargetItem
|
|
shun-iwasawa |
57ba4e |
//
|
|
shun-iwasawa |
57ba4e |
//========================================================
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
class SnapTargetItem : public QGraphicsItem {
|
|
shun-iwasawa |
57ba4e |
QRectF m_rect;
|
|
shun-iwasawa |
57ba4e |
QPointF m_theOtherEndPos, m_portEndOffset;
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
public:
|
|
shun-iwasawa |
57ba4e |
SnapTargetItem(const QPointF &pos, const QRectF &rect,
|
|
shun-iwasawa |
57ba4e |
const QPointF &theOtherEndPos, const QPointF &portEndOffset);
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
QRectF boundingRect() const override;
|
|
shun-iwasawa |
57ba4e |
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
|
shun-iwasawa |
57ba4e |
QWidget *widget = 0) override;
|
|
shun-iwasawa |
57ba4e |
};
|
|
shun-iwasawa |
57ba4e |
|
|
Shinya Kitaoka |
120a6e |
#endif // SCHEMATICNODE_H
|