161 lines
6.1 KiB
C++
161 lines
6.1 KiB
C++
#include "component_display.h"
|
|
#include "attribute_dialog.h"
|
|
#include "name_dialog.h"
|
|
#include "mainwindow.h"
|
|
|
|
#include <QMenu>
|
|
#include <QLine>
|
|
#include <QGraphicsSceneContextMenuEvent>
|
|
|
|
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; i<this->instance->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<Schema*>(this->scene()->views()[0]);
|
|
view->state = Schema::CREATING_CONNECTION;
|
|
view->context.pin = this;
|
|
view->context.startingPoint = dynamic_cast<ComponentGroup*>(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<Schema*>(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<Schema*>(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<Schema*>(scene()->views()[0]);
|
|
view->updateConnections();
|
|
}
|
|
return QGraphicsItem::itemChange(change, value);
|
|
}
|
|
|
|
BusGroup::BusGroup(const std::shared_ptr<domain::BusInstance> &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<Schema*>(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; i<this->connection->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; i<this->connection->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
|