schema_editor/comdel/display/component_display.cpp

290 lines
12 KiB
C++
Raw Normal View History

2022-04-07 22:21:23 +00:00
#include "component_display.h"
2022-05-15 14:13:29 +00:00
#include "attribute_dialog.h"
#include "name_dialog.h"
2022-05-15 21:55:03 +00:00
#include "mainwindow.h"
#include "application.h"
2022-04-07 22:21:23 +00:00
2022-04-10 15:24:15 +00:00
#include <QMenu>
2022-05-25 05:39:45 +00:00
#include <QLine>
2022-04-10 15:24:15 +00:00
#include <QGraphicsSceneContextMenuEvent>
#include <set>
2022-04-10 15:24:15 +00:00
2022-04-07 22:21:23 +00:00
namespace display {
2022-05-27 06:18:17 +00:00
void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
menu.addAction("Izmjeni ime", [this]() {
std::set<std::string> names;
for(const auto &component: Application::instance()->getSchema()->componentInstances) {
names.insert(component->name);
}
auto dialog = new NameDialog(this->instance->name, names);
2022-05-27 06:18:17 +00:00
dialog->exec();
auto currentName = this->instance->name;
auto newName = dialog->getName();
Application::instance()->renameComponent(currentName, newName);
2022-05-15 14:13:29 +00:00
});
2022-05-27 06:18:17 +00:00
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,
Application::instance()->getSchema()->componentInstances);
2022-05-27 06:18:17 +00:00
dialog->exec();
} else {
auto dialog = new AttributeDialog(attr);
dialog->exec();
}
});
action->setEnabled(enabled);
}
menu.addSeparator();
menu.addAction(QString::fromStdString("Ukloni " + this->instance->name), [this]() {
Application::instance()->removeComponent(this->instance->name);
auto view = dynamic_cast<Schema *>(this->scene()->views()[0]);
view->refreshContent();
});
2022-05-27 06:18:17 +00:00
menu.exec(event->screenPos());
}
Component::Component(const std::shared_ptr<domain::ComponentInstance> &instance): instance(instance) {
setFlag(ItemSendsGeometryChanges, true);
instance->component.getDisplay().render(this);
}
void Pin::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
menu.addAction("Connect pin", [&]() {});
menu.exec(event->screenPos());
}
void Pin::mousePressEvent(QGraphicsSceneMouseEvent *event) {
2022-05-27 06:18:17 +00:00
if (event->button() == Qt::MouseButton::LeftButton) {
auto view = dynamic_cast<Schema *>(this->scene()->views()[0]);
view->state = Schema::CREATING_CONNECTION;
view->context.pin = this;
2022-05-27 06:18:17 +00:00
view->context.startingPoint = dynamic_cast<ComponentGroup *>(this->parentItem())->pos() +
QPointF(pin.getDisplayPin().getConnectionX(),
pin.getDisplayPin().getConnectionY());
2022-05-25 05:39:45 +00:00
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) {
2022-05-27 06:18:17 +00:00
auto view = dynamic_cast<Schema *>(this->scene()->views()[0]);
if (view->state == Schema::CREATING_CONNECTION) {
2022-05-25 05:39:45 +00:00
auto line = view->context.line->line();
line.setP2(event->scenePos());
view->context.line->setLine(line);
}
}
void Pin::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
2022-05-27 06:18:17 +00:00
if (event->button() == Qt::MouseButton::LeftButton) {
auto view = dynamic_cast<Schema *>(this->scene()->views()[0]);
view->state = Schema::DEFAULT;
2022-05-25 05:39:45 +00:00
this->scene()->removeItem(view->context.line);
delete view->context.line;
view->removeConnectable(event->scenePos());
}
}
2022-05-27 06:18:17 +00:00
domain::Pin &Pin::getPin() {
return pin;
}
domain::ComponentInstance *Pin::getComponentInstance() {
return componentInstance.get();
}
void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
2022-05-27 06:18:17 +00:00
QMenu menu;
menu.addAction("Izmjeni ime", [this]() {
std::set<std::string> names;
for(const auto &component: Application::instance()->getSchema()->busInstances) {
names.insert(component->name);
}
auto dialog = new NameDialog(this->busInstance->name, names);
2022-05-27 06:18:17 +00:00
dialog->exec();
auto currentName = this->busInstance->name;
auto newName = dialog->getName();
Application::instance()->renameBus(currentName, newName);
});
menu.addSeparator();
menu.addAction(QString::fromStdString("Ukloni " + this->busInstance->name), [this]() {
Application::instance()->removeBus(this->busInstance->name);
auto view = dynamic_cast<Schema *>(this->scene()->views()[0]);
view->refreshContent();
2022-05-27 06:18:17 +00:00
});
menu.exec(event->screenPos());
}
Bus::Bus(const std::shared_ptr<domain::BusInstance> &instance): busInstance(instance) {
instance->bus.getDisplayBus()->render(this, instance->size);
}
domain::BusInstance *Bus::getBusInstance() {
{ return busInstance.get(); }
}
2022-04-10 15:24:15 +00:00
2022-05-17 19:31:32 +00:00
QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPoint newPos = value.toPointF().toPoint();
2022-05-17 19:31:32 +00:00
busInstance->position.first = newPos.x();
busInstance->position.second = newPos.y();
2022-05-17 22:14:33 +00:00
2022-05-27 06:18:17 +00:00
auto view = dynamic_cast<Schema *>(scene()->views()[0]);
2022-05-17 22:14:33 +00:00
view->updateConnections();
2022-05-17 19:31:32 +00:00
}
return QGraphicsItem::itemChange(change, value);
}
2022-05-27 06:18:17 +00:00
BusGroup::BusGroup(const std::shared_ptr<domain::BusInstance> &instance) : busInstance(instance) {
2022-05-26 17:21:53 +00:00
setFlag(ItemIsMovable, true);
setFlag(ItemSendsGeometryChanges, true);
setHandlesChildEvents(false);
bus = new display::Bus(instance);
addToGroup(bus);
setPos(instance->position.first, instance->position.second);
2022-05-27 06:18:17 +00:00
}
2022-05-26 17:21:53 +00:00
2022-05-17 19:31:32 +00:00
QVariant ComponentGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPoint newPos = value.toPointF().toPoint();
2022-05-17 19:31:32 +00:00
componentInstance->position.first = newPos.x();
componentInstance->position.second = newPos.y();
2022-05-17 22:14:33 +00:00
2022-05-27 06:18:17 +00:00
auto view = dynamic_cast<Schema *>(scene()->views()[0]);
2022-05-17 22:14:33 +00:00
view->updateConnections();
2022-05-17 19:31:32 +00:00
}
return QGraphicsItem::itemChange(change, value);
}
2022-05-17 22:14:33 +00:00
2022-05-27 06:18:17 +00:00
std::shared_ptr<domain::ComponentInstance> ComponentGroup::getComponentInstance() {
return componentInstance;
}
std::vector<display::Pin *> &ComponentGroup::getPins() {
return pins;
}
ComponentGroup::ComponentGroup(const std::shared_ptr<domain::ComponentInstance> &instance): componentInstance(
instance) {
setFlag(ItemIsMovable, true);
setFlag(ItemSendsGeometryChanges, true);
setHandlesChildEvents(false);
addToGroup(new display::Component(instance));
for (auto &pin: instance->component.getPins()) {
pins.push_back(new display::Pin(pin, componentInstance));
addToGroup(pins.back());
}
setPos(instance->position.first, instance->position.second);
}
2022-05-17 22:14:33 +00:00
void BusConnection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
2022-05-27 06:18:17 +00:00
menu.addAction("Ukloni poveznicu", [this]() {});
2022-05-17 22:14:33 +00:00
menu.addSeparator();
2022-05-27 06:18:17 +00:00
for (int i = 0; i < this->connection->attributes.size(); i++) {
auto *attr = &this->connection->attributes[i];
2022-05-17 22:14:33 +00:00
bool enabled = attr->attribute.getPopup().has_value();
auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name),
[attr]() {
2022-05-27 06:18:17 +00:00
auto dialog = new AttributeDialog(attr);
dialog->exec();
2022-05-19 19:08:00 +00:00
});
action->setEnabled(enabled);
}
menu.exec(event->screenPos());
}
2022-05-27 06:18:17 +00:00
BusConnection::BusConnection(domain::BusConnectionInstance *connection, ComponentGroup *component, BusGroup *bus): connection(
connection), component(component), bus(bus) {
updateConnection();
setHandlesChildEvents(false);
}
void BusConnection::updateConnection() {
auto busPosition = bus->boundingRect();
auto pin = connection->instance->component.getPin(
connection->connection.getComponent().pin).getDisplayPin();
setLine(connection->instance->position.first + pin.getConnectionX(),
connection->instance->position.second + pin.getConnectionY(),
connection->bus->position.first + busPosition.width() / 2,
connection->bus->position.second + busPosition.height() / 2);
connection->start.first = connection->instance->position.first + pin.getConnectionX();
connection->start.second = connection->instance->position.second + pin.getConnectionY();
connection->end.first = connection->bus->position.first + busPosition.width() / 2;
connection->end.second = connection->bus->position.second + busPosition.height() / 2;
}
2022-05-19 19:08:00 +00:00
void DirectConnection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
2022-05-27 06:18:17 +00:00
menu.addAction("Ukloni poveznicu", [this]() {});
2022-05-19 19:08:00 +00:00
menu.addSeparator();
2022-05-27 06:18:17 +00:00
for (int i = 0; i < this->connection->attributes.size(); i++) {
auto *attr = &this->connection->attributes[i];
2022-05-19 19:08:00 +00:00
bool enabled = attr->attribute.getPopup().has_value();
auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name),
[attr]() {
auto dialog = new AttributeDialog(attr);
dialog->exec();
2022-05-17 22:14:33 +00:00
});
action->setEnabled(enabled);
}
menu.exec(event->screenPos());
}
2022-05-27 06:18:17 +00:00
DirectConnection::DirectConnection(domain::DirectConnectionInstance *connection, ComponentGroup *first,
ComponentGroup *second): connection(connection), first(first), second(second) {
updateConnection();
setHandlesChildEvents(false);
}
void DirectConnection::updateConnection() {
auto pin1 = connection->instance->component.getPin(
connection->connection.getComponent().pin).getDisplayPin();
auto pin2 = connection->secondInstance->component.getPin(
connection->connection.getSecondComponent()->pin).getDisplayPin();
setLine(connection->instance->position.first + pin1.getConnectionX(),
connection->instance->position.second + pin1.getConnectionY(),
connection->secondInstance->position.first + pin2.getConnectionX(),
connection->secondInstance->position.second + pin2.getConnectionY());
connection->start.first = connection->instance->position.first + pin1.getConnectionX();
connection->start.second = connection->instance->position.second + pin1.getConnectionY();
connection->end.first = connection->secondInstance->position.first + pin2.getConnectionX();
connection->end.second = connection->secondInstance->position.second + pin2.getConnectionY();
}
2022-04-07 22:21:23 +00:00
} // namespace display