You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.9 KiB
133 lines
2.9 KiB
#include "Connector.h" |
|
|
|
#include <QPainter> |
|
#include "Part.h" |
|
#include "MainWindow.h" |
|
#include "Wire.h" |
|
#include "eConnectorType.h" |
|
#include "Scene.h" |
|
#include "Label.h" |
|
|
|
|
|
// PUBLIC |
|
Connector::Connector(Scene* scene, Part *parentPart, ConnectorType::ConnectorType side) |
|
:m_scene(scene), m_connectorType(side) |
|
{ |
|
setParentItem(parentPart); |
|
|
|
setFlag(QGraphicsItem::ItemSendsScenePositionChanges); |
|
} |
|
|
|
Part* Connector::parentPart() |
|
{ |
|
return (Part*)parentItem(); |
|
} |
|
|
|
void Connector::setLabel(const QString& text) |
|
{ |
|
if(m_label == nullptr) |
|
{ |
|
m_label = new Label(this); |
|
// If this Connector is on the left side of a Part |
|
if(m_connectorType == ConnectorType::Input) |
|
m_label->alignText(QPointF(0, 0), mkAlignMode(AlignMode::Left, AlignMode::VCenter)); |
|
// If this Connector is on the right side of a Part |
|
else |
|
m_label->alignText(QPointF(0, 0), mkAlignMode(AlignMode::Right, AlignMode::VCenter)); |
|
} |
|
m_label->setText(text); |
|
} |
|
|
|
QString Connector::label() const |
|
{ |
|
if(m_label == nullptr) |
|
return QString(); |
|
else |
|
return m_label->text(); |
|
} |
|
|
|
|
|
QRectF Connector::boundingRect() const |
|
{ |
|
if(m_connectorType == ConnectorType::Output) |
|
return QRectF(-1, -4, 15, 8); |
|
else |
|
return QRectF(-14, -4, 15, 8); |
|
} |
|
|
|
QPainterPath Connector::shape() const |
|
{ |
|
QPainterPath path; |
|
if(m_connectorType == ConnectorType::Output) |
|
path.addRect(-1, -4, 15, 8); |
|
else |
|
path.addRect(-14, -4, 15, 8); |
|
return path; |
|
} |
|
|
|
void Connector::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
{ |
|
Q_UNUSED(option) |
|
Q_UNUSED(widget) |
|
|
|
QPen pen = painter->pen(); |
|
pen.setWidth(2); |
|
if(parentItem()->isSelected()) |
|
pen.setColor(((Part*)parentItem())->m_penColorSelected); |
|
else |
|
pen.setColor(((Part*)parentItem())->m_penColorNormal); |
|
painter->setPen(pen); |
|
QBrush brush = painter->brush(); |
|
if(m_selected) |
|
{ |
|
brush.setStyle(Qt::BrushStyle::SolidPattern); |
|
brush.setColor(Qt::green); |
|
} |
|
painter->setBrush(brush); |
|
if(m_connectorType == ConnectorType::Output) |
|
{ |
|
painter->drawLine(2, 0, 6, 0); |
|
painter->drawEllipse(7, -3, 6, 6); |
|
} |
|
else |
|
{ |
|
painter->drawLine(-6, 0, -2, 0); |
|
painter->drawEllipse(-13, -3, 6, 6); |
|
} |
|
} |
|
|
|
void Connector::mousePressEvent(QGraphicsSceneMouseEvent *event) |
|
{ |
|
Q_UNUSED(event) |
|
m_scene->connectorClicked(this); |
|
} |
|
|
|
QVariant Connector::itemChange(GraphicsItemChange change, const QVariant &value) |
|
{ |
|
if(change == ItemScenePositionHasChanged) |
|
{ |
|
// Update wires |
|
for(auto i : m_wires) |
|
i->updateLine(); |
|
} |
|
|
|
return value; |
|
} |
|
|
|
ConnectorType::ConnectorType Connector::connectorType() |
|
{ |
|
return m_connectorType; |
|
} |
|
|
|
// PRIVATE |
|
void Connector::select() |
|
{ |
|
m_selected = true; |
|
update(); |
|
} |
|
|
|
void Connector::unselect() |
|
{ |
|
m_selected = false; |
|
update(); |
|
}
|
|
|