#include "component_display.h" #include "attribute_dialog.h" #include "name_dialog.h" #include "mainwindow.h" #include #include #include namespace display { void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; menu.addAction("Izmjeni ime", [this](){ auto dialog = new NameDialog(this->instance.get()); dialog->exec(); }); menu.addSeparator(); for(int i=0; iinstance->attributes.size(); i++) { auto* attr = &this->instance->attributes[i]; bool enabled = attr->attribute.getPopup().has_value(); auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name), [attr]() { if(attr->value.getType() == domain::Value::MEMORY_REFERENCE) { auto dialog = new MemoryDialog(attr, MainWindow::getSchema()->componentInstances); dialog->exec(); } else { auto dialog = new AttributeDialog(attr); dialog->exec(); } }); action->setEnabled(enabled); } menu.exec(event->screenPos()); } void Pin::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; menu.addAction("Connect pin", [&]() {}); menu.exec(event->screenPos()); } void Pin::mousePressEvent(QGraphicsSceneMouseEvent *event) { if(event->button() == Qt::MouseButton::LeftButton) { auto view = dynamic_cast(this->scene()->views()[0]); view->state = Schema::CREATING_CONNECTION; view->context.pin = this; view->context.startingPoint = dynamic_cast(this->parentItem())->pos() + QPointF(pin.getDisplayPin().getConnectionX(), pin.getDisplayPin().getConnectionY()); view->context.line = new QGraphicsLineItem(QLineF(view->context.startingPoint, event->scenePos())); this->scene()->addItem(view->context.line); view->showConnectable(this); } } void Pin::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { auto view = dynamic_cast(this->scene()->views()[0]); if(view->state == Schema::CREATING_CONNECTION) { auto line = view->context.line->line(); line.setP2(event->scenePos()); view->context.line->setLine(line); } } void Pin::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if(event->button() == Qt::MouseButton::LeftButton) { auto view = dynamic_cast(this->scene()->views()[0]); view->state = Schema::DEFAULT; this->scene()->removeItem(view->context.line); delete view->context.line; view->removeConnectable(event->scenePos()); } } void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; menu.addAction("Izmjeni ime", [this](){ auto dialog = new NameDialog(this->busInstance.get()); dialog->exec(); }); menu.exec(event->screenPos()); } QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == ItemPositionChange && scene()) { // value is the new position. QPointF newPos = value.toPointF(); busInstance->position.first = newPos.x(); busInstance->position.second = newPos.y(); auto view = dynamic_cast(scene()->views()[0]); view->updateConnections(); } return QGraphicsItem::itemChange(change, value); } BusGroup::BusGroup(const std::shared_ptr &instance): busInstance(instance) { setFlag(ItemIsMovable, true); setFlag(ItemSendsGeometryChanges, true); setHandlesChildEvents(false); bus = new display::Bus(instance); addToGroup(bus); setPos(instance->position.first, instance->position.second); } QVariant ComponentGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == ItemPositionChange && scene()) { // value is the new position. QPointF newPos = value.toPointF(); componentInstance->position.first = newPos.x(); componentInstance->position.second = newPos.y(); auto view = dynamic_cast(scene()->views()[0]); view->updateConnections(); } return QGraphicsItem::itemChange(change, value); } void BusConnection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; menu.addAction("Ukloni poveznicu", [this](){}); menu.addSeparator(); for(int i=0; iconnection->attributes.size(); i++) { auto* attr = &this->connection->attributes[i]; bool enabled = attr->attribute.getPopup().has_value(); auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name), [attr]() { auto dialog = new AttributeDialog(attr); dialog->exec(); }); action->setEnabled(enabled); } menu.exec(event->screenPos()); } void DirectConnection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; menu.addAction("Ukloni poveznicu", [this](){}); menu.addSeparator(); for(int i=0; iconnection->attributes.size(); i++) { auto* attr = &this->connection->attributes[i]; bool enabled = attr->attribute.getPopup().has_value(); auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name), [attr]() { auto dialog = new AttributeDialog(attr); dialog->exec(); }); action->setEnabled(enabled); } menu.exec(event->screenPos()); } } // namespace display