Compare commits
	
		
			2 Commits
		
	
	
		
			f66fc1db26
			...
			6dfe86335d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6dfe86335d | ||
|  | 4d4cf136fb | 
| @ -288,6 +288,30 @@ bool Application::removeComponent(std::string componentName) { | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Application::removeConnection(domain::ConnectionInstance *connectionInstance) { | ||||||
|  |     if(auto directConnection = dynamic_cast<domain::DirectConnectionInstance*>(connectionInstance)) { | ||||||
|  |         schema->busInstances.erase( | ||||||
|  |                 std::remove_if( | ||||||
|  |                         schema->busInstances.begin(), | ||||||
|  |                         schema->busInstances.end(), | ||||||
|  |                         [directConnection](const std::shared_ptr<domain::BusInstance> &bus) { | ||||||
|  |                             return directConnection->bus == bus.get(); | ||||||
|  |                         }), | ||||||
|  |                 schema->busInstances.end() | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |     schema->connections.erase( | ||||||
|  |             std::remove_if( | ||||||
|  |                     schema->connections.begin(), | ||||||
|  |                     schema->connections.end(), | ||||||
|  |                     [connectionInstance](const std::shared_ptr<domain::ConnectionInstance> &conn) { | ||||||
|  |                         return connectionInstance == conn.get(); | ||||||
|  |                     }), | ||||||
|  |                     schema->connections.end() | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool Application::removeBus(std::string busName) { | bool Application::removeBus(std::string busName) { | ||||||
|     auto bus = findBusByName(busName); |     auto bus = findBusByName(busName); | ||||||
|     if (bus == nullptr) { |     if (bus == nullptr) { | ||||||
| @ -367,4 +391,4 @@ void Application::renameBus(std::string currentName, std::string newName) { | |||||||
|     if(bus) { |     if(bus) { | ||||||
|         bus->name = newName; |         bus->name = newName; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -52,6 +52,8 @@ public: | |||||||
|     void renameComponent(std::string currentName, std::string newName); |     void renameComponent(std::string currentName, std::string newName); | ||||||
| 
 | 
 | ||||||
|     void renameBus(std::string currentName, std::string newName); |     void renameBus(std::string currentName, std::string newName); | ||||||
|  | 
 | ||||||
|  |     void removeConnection(domain::ConnectionInstance *pInstance); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,59 +9,8 @@ | |||||||
| 
 | 
 | ||||||
| namespace display { | namespace display { | ||||||
| 
 | 
 | ||||||
|     void AttributeDialog::onUpdate() { |  | ||||||
|         auto oldValue = attributeValue->value; |  | ||||||
| 
 |  | ||||||
|         attributeValue->value = value; |  | ||||||
|         domain::ComdelValidator validator(domain::getSupportedValidators()); |  | ||||||
| 
 |  | ||||||
|         domain::ValidationContext context; |  | ||||||
| 
 |  | ||||||
|         for (auto &addressSpace: Application::instance()->getLibrary()->getAddressSpaces()) { |  | ||||||
|             context.addressSpaces.insert(std::make_pair(addressSpace.getName(), addressSpace)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         auto validationErrors = validator.validateAttribute(attributeValue, context); |  | ||||||
|         if (validationErrors.empty()) { |  | ||||||
|             accept(); |  | ||||||
|         } else { |  | ||||||
|             bool canAccept = true; |  | ||||||
| 
 |  | ||||||
|             std::vector<domain::ValidationError> errors; |  | ||||||
|             std::vector<domain::ValidationError> warnings; |  | ||||||
|             for (auto &err: validationErrors) { |  | ||||||
|                 if (err.type == domain::Action::ERROR) { |  | ||||||
|                     errors.push_back(err); |  | ||||||
|                 } else { |  | ||||||
|                     warnings.push_back(err); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (!errors.empty()) { |  | ||||||
|                 canAccept = false; |  | ||||||
|                 auto errorDialog = new ErrorDialog(errors); |  | ||||||
|                 errorDialog->exec(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             for (auto &warning: warnings) { |  | ||||||
|                 auto warningDialog = new WarningDialog(warning); |  | ||||||
|                 int response = warningDialog->exec(); |  | ||||||
|                 if (response == QDialog::Rejected) { |  | ||||||
|                     canAccept = false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (canAccept) { |  | ||||||
|                 accept(); |  | ||||||
|             } else { |  | ||||||
|                 attributeValue->value = oldValue; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     AttributeDialog::AttributeDialog(domain::InstanceAttribute *attribute, bool updating) { |     AttributeDialog::AttributeDialog(domain::InstanceAttribute *attribute, bool updating) { | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         setAttribute(Qt::WA_DeleteOnClose); |         setAttribute(Qt::WA_DeleteOnClose); | ||||||
| 
 | 
 | ||||||
|         attributeValue = attribute; |         attributeValue = attribute; | ||||||
| @ -142,10 +91,68 @@ namespace display { | |||||||
|             layout->addWidget(group); |             layout->addWidget(group); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         auto button = new QPushButton(updating ? "Ažuriraj" : "Postavi"); |  | ||||||
|         connect(button, &QPushButton::clicked, this, &AttributeDialog::onUpdate); |  | ||||||
| 
 | 
 | ||||||
|         layout->addWidget(button); |         auto buttonLayout = new QHBoxLayout(this); | ||||||
|  | 
 | ||||||
|  |         auto okButton = new QPushButton(updating ? "Ažuriraj" : "Postavi", this); | ||||||
|  |         auto cancelButton = new QPushButton("Odustani", this); | ||||||
|  | 
 | ||||||
|  |         connect(okButton, &QPushButton::clicked, this, &AttributeDialog::onUpdate); | ||||||
|  |         connect(cancelButton, &QPushButton::clicked, [this]() { reject(); }); | ||||||
|  | 
 | ||||||
|  |         buttonLayout->addWidget(okButton); | ||||||
|  |         buttonLayout->addWidget(cancelButton); | ||||||
|  | 
 | ||||||
|  |         layout->addLayout(buttonLayout); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     void AttributeDialog::onUpdate() { | ||||||
|  |         auto oldValue = attributeValue->value; | ||||||
|  | 
 | ||||||
|  |         attributeValue->value = value; | ||||||
|  |         domain::ComdelValidator validator(domain::getSupportedValidators()); | ||||||
|  | 
 | ||||||
|  |         domain::ValidationContext context; | ||||||
|  | 
 | ||||||
|  |         for (auto &addressSpace: Application::instance()->getLibrary()->getAddressSpaces()) { | ||||||
|  |             context.addressSpaces.insert(std::make_pair(addressSpace.getName(), addressSpace)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         auto validationErrors = validator.validateAttribute(attributeValue, context); | ||||||
|  |         if (validationErrors.empty()) { | ||||||
|  |             accept(); | ||||||
|  |         } else { | ||||||
|  |             bool canAccept = true; | ||||||
|  | 
 | ||||||
|  |             std::vector<domain::ValidationError> errors; | ||||||
|  |             std::vector<domain::ValidationError> warnings; | ||||||
|  |             for (auto &err: validationErrors) { | ||||||
|  |                 if (err.type == domain::Action::ERROR) { | ||||||
|  |                     errors.push_back(err); | ||||||
|  |                 } else { | ||||||
|  |                     warnings.push_back(err); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (!errors.empty()) { | ||||||
|  |                 canAccept = false; | ||||||
|  |                 auto errorDialog = new ErrorDialog(errors); | ||||||
|  |                 errorDialog->exec(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             for (auto &warning: warnings) { | ||||||
|  |                 auto warningDialog = new WarningDialog(warning); | ||||||
|  |                 int response = warningDialog->exec(); | ||||||
|  |                 if (response == QDialog::Rejected) { | ||||||
|  |                     canAccept = false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (canAccept) { | ||||||
|  |                 accept(); | ||||||
|  |             } else { | ||||||
|  |                 attributeValue->value = oldValue; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void AttributeDialog::onTextChanged(const QString &string) { |     void AttributeDialog::onTextChanged(const QString &string) { | ||||||
| @ -165,12 +172,6 @@ namespace display { | |||||||
|         value = attributeValue->attribute.getPopup()->getEnumeration()[index].getValue(); |         value = attributeValue->attribute.getPopup()->getEnumeration()[index].getValue(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     void MemoryDialog::onUpdate() { |  | ||||||
|         attributeValue->value = value; |  | ||||||
|         accept(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     MemoryDialog::MemoryDialog(domain::InstanceAttribute *attribute, |     MemoryDialog::MemoryDialog(domain::InstanceAttribute *attribute, | ||||||
|                                std::vector<std::shared_ptr<domain::ComponentInstance>> instances, bool updating) { |                                std::vector<std::shared_ptr<domain::ComponentInstance>> instances, bool updating) { | ||||||
|         memoryInstances = std::vector<std::string>(); |         memoryInstances = std::vector<std::string>(); | ||||||
| @ -216,10 +217,23 @@ namespace display { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         auto button = new QPushButton(updating ? "Ažuriraj" : "Postavi"); |         auto buttonLayout = new QHBoxLayout(this); | ||||||
|         connect(button, &QPushButton::clicked, this, &MemoryDialog::onUpdate); |  | ||||||
| 
 | 
 | ||||||
|         layout->addWidget(button); |         auto okButton = new QPushButton(updating ? "Ažuriraj" : "Postavi"); | ||||||
|  |         auto cancelButton = new QPushButton("Odustani", this); | ||||||
|  | 
 | ||||||
|  |         connect(okButton, &QPushButton::clicked, this, &MemoryDialog::onUpdate); | ||||||
|  |         connect(cancelButton, &QPushButton::clicked, [this]() { reject(); }); | ||||||
|  | 
 | ||||||
|  |         buttonLayout->addWidget(okButton); | ||||||
|  |         buttonLayout->addWidget(cancelButton); | ||||||
|  | 
 | ||||||
|  |         layout->addLayout(buttonLayout); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     void MemoryDialog::onUpdate() { | ||||||
|  |         attributeValue->value = value; | ||||||
|  |         accept(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void MemoryDialog::onMemoryChanged(int index) { |     void MemoryDialog::onMemoryChanged(int index) { | ||||||
| @ -264,6 +278,6 @@ namespace display { | |||||||
|         buttonLayout->addWidget(okButton); |         buttonLayout->addWidget(okButton); | ||||||
|         buttonLayout->addWidget(cancelButton); |         buttonLayout->addWidget(cancelButton); | ||||||
| 
 | 
 | ||||||
|         layout->addItem(buttonLayout); |         layout->addLayout(buttonLayout); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -16,6 +16,12 @@ namespace display { | |||||||
| 
 | 
 | ||||||
|     QPen connectionPen(QColor::fromRgb(150, 150, 250)); |     QPen connectionPen(QColor::fromRgb(150, 150, 250)); | ||||||
| 
 | 
 | ||||||
|  |     Component::Component(const std::shared_ptr<domain::ComponentInstance> &instance): instance(instance) { | ||||||
|  |         setFlag(ItemSendsGeometryChanges, true); | ||||||
|  |         setToolTip(QString::fromStdString(instance->name + "::" + instance->component.getName())); | ||||||
|  |         instance->component.getDisplay().render(this); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { |     void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { | ||||||
|         QMenu menu; |         QMenu menu; | ||||||
|         menu.addAction("Izmjeni ime", [this]() { |         menu.addAction("Izmjeni ime", [this]() { | ||||||
| @ -30,6 +36,7 @@ namespace display { | |||||||
|             auto newName = dialog->getName(); |             auto newName = dialog->getName(); | ||||||
| 
 | 
 | ||||||
|             Application::instance()->renameComponent(currentName, newName); |             Application::instance()->renameComponent(currentName, newName); | ||||||
|  |             setToolTip(QString::fromStdString(instance->name + "::" + instance->component.getName())); | ||||||
|         }); |         }); | ||||||
|         menu.addSeparator(); |         menu.addSeparator(); | ||||||
|         for (int i = 0; i < this->instance->attributes.size(); i++) { |         for (int i = 0; i < this->instance->attributes.size(); i++) { | ||||||
| @ -61,14 +68,57 @@ namespace display { | |||||||
|         menu.exec(event->screenPos()); |         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) { |     void Pin::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { | ||||||
|         QMenu menu; |         QMenu menu; | ||||||
|         menu.addAction("Poveži pin", [&]() {}); | 
 | ||||||
|  |         auto pinConnections = Application::instance()->getSchema()->getConnections(componentInstance->name, pin.getName()); | ||||||
|  | 
 | ||||||
|  |         if(isSingleAutomatic(pinConnections)) { | ||||||
|  |             auto *update = menu.addMenu("Izmjeni"); | ||||||
|  |             auto *remove = menu.addMenu("Ukloni"); | ||||||
|  |             for (auto pinConnection: pinConnections) { | ||||||
|  |                 // this always must be true as only directConnections can be connected multiple times
 | ||||||
|  |                 if (auto directConnection = dynamic_cast<domain::DirectConnectionInstance *>(pinConnection)) { | ||||||
|  |                     if (directConnection->bus->bus.getType() == domain::Bus::SINGLE_AUTOMATIC) { | ||||||
|  |                         auto connectionName = directConnection->attributes[0].value.stringify() + "-" + | ||||||
|  |                                               directConnection->attributes[1].value.stringify(); | ||||||
|  |                         update->addAction(QString::fromStdString("Izmjeni " + connectionName), [directConnection]() { | ||||||
|  |                             auto dialog = new SingleAutomaticDialog(directConnection->attributes); | ||||||
|  |                             dialog->exec(); | ||||||
|  |                         }); | ||||||
|  |                         remove->addAction(QString::fromStdString("Ukloni " + connectionName), | ||||||
|  |                                           [this, directConnection]() { | ||||||
|  |                                               Application::instance()->removeConnection(directConnection); | ||||||
|  |                                               auto view = dynamic_cast<Schema *>(this->scene()->views()[0]); | ||||||
|  |                                               view->refreshContent(); | ||||||
|  |                                           }); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             auto pinConnection = pinConnections[0]; | ||||||
|  |             if(auto busConnection = dynamic_cast<domain::BusConnectionInstance*>(pinConnection)) { | ||||||
|  |                 menu.addSection(QString::fromStdString(busConnection->bus->name)); | ||||||
|  |             } else if(auto directConnection = dynamic_cast<domain::DirectConnectionInstance*>(pinConnection)) { | ||||||
|  |                 if(directConnection->instance == componentInstance.get()) { | ||||||
|  |                     menu.addSection(QString::fromStdString(directConnection->secondInstance->name + "." + directConnection->connection.getSecondComponent()->pin)); | ||||||
|  |                 } else { | ||||||
|  |                     menu.addSection(QString::fromStdString(directConnection->instance->name + "." + directConnection->connection.getComponent().pin)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             for (int i = 0; i < pinConnection->attributes.size(); i++) { | ||||||
|  |                 auto *attr = &pinConnection->attributes[i]; | ||||||
|  |                 menu.addAction(QString::fromStdString("Izmjeni '" + attr->name + "'"),[attr]() { | ||||||
|  |                     auto dialog = new AttributeDialog(attr); | ||||||
|  |                     dialog->exec(); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |             menu.addAction("Ukloni poveznicu", [this, pinConnection]() { | ||||||
|  |                 Application::instance()->removeConnection(pinConnection); | ||||||
|  |                 auto view = dynamic_cast<Schema *>(this->scene()->views()[0]); | ||||||
|  |                 view->refreshContent(); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|         menu.exec(event->screenPos()); |         menu.exec(event->screenPos()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -116,6 +166,23 @@ namespace display { | |||||||
|         return componentInstance.get(); |         return componentInstance.get(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     bool Pin::isSingleAutomatic(std::vector<domain::ConnectionInstance *> pinConnections) { | ||||||
|  |         if(pinConnections.empty()) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         auto pinConnection = pinConnections[0]; | ||||||
|  |         if(auto directConnection = dynamic_cast<domain::DirectConnectionInstance*>(pinConnection)) { | ||||||
|  |             return directConnection->bus->bus.getType() == domain::Bus::SINGLE_AUTOMATIC; | ||||||
|  |         } else { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Bus::Bus(const std::shared_ptr<domain::BusInstance> &instance): busInstance(instance) { | ||||||
|  |         instance->bus.getDisplayBus()->render(this, instance->size); | ||||||
|  |         setToolTip(QString::fromStdString(busInstance->name + "::" + busInstance->bus.getName())); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { |     void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { | ||||||
|         QMenu menu; |         QMenu menu; | ||||||
|         menu.addAction("Izmjeni ime", [this]() { |         menu.addAction("Izmjeni ime", [this]() { | ||||||
| @ -130,6 +197,7 @@ namespace display { | |||||||
|             auto newName = dialog->getName(); |             auto newName = dialog->getName(); | ||||||
| 
 | 
 | ||||||
|             Application::instance()->renameBus(currentName, newName); |             Application::instance()->renameBus(currentName, newName); | ||||||
|  |             setToolTip(QString::fromStdString(busInstance->name + "::" + busInstance->bus.getName())); | ||||||
|         }); |         }); | ||||||
|         menu.addSeparator(); |         menu.addSeparator(); | ||||||
|         menu.addAction(QString::fromStdString("Ukloni " + this->busInstance->name), [this]() { |         menu.addAction(QString::fromStdString("Ukloni " + this->busInstance->name), [this]() { | ||||||
| @ -140,14 +208,6 @@ namespace display { | |||||||
|         menu.exec(event->screenPos()); |         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(); } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { |     QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { | ||||||
|         if (change == ItemPositionChange && scene()) { |         if (change == ItemPositionChange && scene()) { | ||||||
|             // value is the new position.
 |             // value is the new position.
 | ||||||
| @ -212,24 +272,6 @@ namespace display { | |||||||
|         setPos(instance->position.first, instance->position.second); |         setPos(instance->position.first, instance->position.second); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     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()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     BusConnection::BusConnection(domain::BusConnectionInstance *connection, ComponentGroup *component, BusGroup *bus): connection( |     BusConnection::BusConnection(domain::BusConnectionInstance *connection, ComponentGroup *component, BusGroup *bus): connection( | ||||||
|             connection), component(component), bus(bus) { |             connection), component(component), bus(bus) { | ||||||
|         updateConnection(); |         updateConnection(); | ||||||
| @ -254,36 +296,6 @@ namespace display { | |||||||
|         connection->end.second = connection->bus->position.second + busPosition.height() / 2; |         connection->end.second = connection->bus->position.second + busPosition.height() / 2; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     void DirectConnection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { |  | ||||||
|         QMenu menu; |  | ||||||
|         menu.addAction("Ukloni poveznicu", [this]() {}); |  | ||||||
|         menu.addSeparator(); |  | ||||||
| 
 |  | ||||||
|         if(connection->bus->bus.getType() == domain::Bus::SINGLE_AUTOMATIC) { |  | ||||||
|             auto &attributes = this->connection->attributes; |  | ||||||
|             menu.addAction(QString::fromStdString("Izmjeni poveznicu"), |  | ||||||
|                            [&attributes]() { |  | ||||||
|                                 auto dialog = new display::SingleAutomaticDialog(attributes); |  | ||||||
|                                 dialog->exec(); |  | ||||||
|             }); |  | ||||||
|         } else { |  | ||||||
|             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()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     DirectConnection::DirectConnection(domain::DirectConnectionInstance *connection, ComponentGroup *first, |     DirectConnection::DirectConnection(domain::DirectConnectionInstance *connection, ComponentGroup *first, | ||||||
|                                        ComponentGroup *second): connection(connection), first(first), second(second) { |                                        ComponentGroup *second): connection(connection), first(first), second(second) { | ||||||
|         updateConnection(); |         updateConnection(); | ||||||
|  | |||||||
| @ -17,9 +17,7 @@ namespace display { | |||||||
|         std::shared_ptr<domain::ComponentInstance> componentInstance; |         std::shared_ptr<domain::ComponentInstance> componentInstance; | ||||||
| 
 | 
 | ||||||
|     public: |     public: | ||||||
|         Pin(domain::Pin pin, std::shared_ptr<domain::ComponentInstance> componentInstance) : pin(pin), |         Pin(domain::Pin pin, std::shared_ptr<domain::ComponentInstance> componentInstance) : pin(pin), componentInstance(std::move(componentInstance)) { | ||||||
|                                                                                              componentInstance(std::move( |  | ||||||
|                                                                                                      componentInstance)) { |  | ||||||
|             pin.getDisplayPin().render(this); |             pin.getDisplayPin().render(this); | ||||||
|             this->setToolTip(QString::fromStdString(pin.getTooltip())); |             this->setToolTip(QString::fromStdString(pin.getTooltip())); | ||||||
|         } |         } | ||||||
| @ -35,6 +33,8 @@ namespace display { | |||||||
|         domain::Pin &getPin(); |         domain::Pin &getPin(); | ||||||
| 
 | 
 | ||||||
|         domain::ComponentInstance *getComponentInstance(); |         domain::ComponentInstance *getComponentInstance(); | ||||||
|  | 
 | ||||||
|  |         bool isSingleAutomatic(std::vector<domain::ConnectionInstance *> pinConnections); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     class Component : public QGraphicsItemGroup { |     class Component : public QGraphicsItemGroup { | ||||||
| @ -52,8 +52,6 @@ namespace display { | |||||||
|     public: |     public: | ||||||
|         explicit Bus(const std::shared_ptr<domain::BusInstance> &instance); |         explicit Bus(const std::shared_ptr<domain::BusInstance> &instance); | ||||||
| 
 | 
 | ||||||
|         domain::BusInstance *getBusInstance(); |  | ||||||
| 
 |  | ||||||
|         void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; |         void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| @ -97,8 +95,6 @@ namespace display { | |||||||
|         BusConnection(domain::BusConnectionInstance *connection, ComponentGroup *component, BusGroup *bus); |         BusConnection(domain::BusConnectionInstance *connection, ComponentGroup *component, BusGroup *bus); | ||||||
| 
 | 
 | ||||||
|         void updateConnection(); |         void updateConnection(); | ||||||
| 
 |  | ||||||
|         void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -112,8 +108,6 @@ namespace display { | |||||||
|         DirectConnection(domain::DirectConnectionInstance *connection, ComponentGroup *first, ComponentGroup *second); |         DirectConnection(domain::DirectConnectionInstance *connection, ComponentGroup *first, ComponentGroup *second); | ||||||
| 
 | 
 | ||||||
|         void updateConnection(); |         void updateConnection(); | ||||||
| 
 |  | ||||||
|         void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,10 +16,20 @@ display::NameDialog::NameDialog(std::string currentName, std::set<std::string> & | |||||||
|     connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate); |     connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate); | ||||||
|     layout->addWidget(edit); |     layout->addWidget(edit); | ||||||
|     setWindowTitle("Izmjeni ime"); |     setWindowTitle("Izmjeni ime"); | ||||||
|     button = new QPushButton("Ažuriraj", this); |  | ||||||
|     connect(button, &QPushButton::clicked, this, &NameDialog::onNameChange); |  | ||||||
|     layout->addWidget(button); |  | ||||||
|     setLayout(layout); |     setLayout(layout); | ||||||
|  | 
 | ||||||
|  |     auto buttonLayout = new QHBoxLayout(this); | ||||||
|  | 
 | ||||||
|  |     auto okButton = new QPushButton("Ažuriraj"); | ||||||
|  |     auto cancelButton = new QPushButton("Odustani", this); | ||||||
|  | 
 | ||||||
|  |     connect(okButton, &QPushButton::clicked, this, &NameDialog::onNameChange); | ||||||
|  |     connect(cancelButton, &QPushButton::clicked, [this]() { reject(); }); | ||||||
|  | 
 | ||||||
|  |     buttonLayout->addWidget(okButton); | ||||||
|  |     buttonLayout->addWidget(cancelButton); | ||||||
|  | 
 | ||||||
|  |     layout->addLayout(buttonLayout); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void display::NameDialog::onNameUpdate(const QString &text) { | void display::NameDialog::onNameUpdate(const QString &text) { | ||||||
|  | |||||||
| @ -29,9 +29,18 @@ namespace display { | |||||||
|         setupValues(firstLayout, values[0], &SingleAutomaticDialog::onFirstEnumerationChanged); |         setupValues(firstLayout, values[0], &SingleAutomaticDialog::onFirstEnumerationChanged); | ||||||
|         setupValues(secondLayout, values[1], &SingleAutomaticDialog::onSecondEnumerationChanged); |         setupValues(secondLayout, values[1], &SingleAutomaticDialog::onSecondEnumerationChanged); | ||||||
| 
 | 
 | ||||||
|         auto button = new QPushButton(updating ? "Ažuriraj" : "Postavi"); |         auto buttonLayout = new QHBoxLayout(this); | ||||||
|         connect(button, &QPushButton::clicked, this, &SingleAutomaticDialog::onUpdate); | 
 | ||||||
|         parentLayout->addWidget(button); |         auto okButton = new QPushButton("U redu", this); | ||||||
|  |         auto cancelButton = new QPushButton("Odustani", this); | ||||||
|  | 
 | ||||||
|  |         connect(okButton, &QPushButton::clicked, [this]() { accept(); }); | ||||||
|  |         connect(cancelButton, &QPushButton::clicked, [this]() { reject(); }); | ||||||
|  | 
 | ||||||
|  |         buttonLayout->addWidget(okButton); | ||||||
|  |         buttonLayout->addWidget(cancelButton); | ||||||
|  | 
 | ||||||
|  |         parentLayout->addLayout(buttonLayout); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void SingleAutomaticDialog::setupValues(QVBoxLayout *layout, domain::InstanceAttribute &attribute, void (display::SingleAutomaticDialog::* handler)(int)) { |     void SingleAutomaticDialog::setupValues(QVBoxLayout *layout, domain::InstanceAttribute &attribute, void (display::SingleAutomaticDialog::* handler)(int)) { | ||||||
|  | |||||||
| @ -37,12 +37,12 @@ namespace domain { | |||||||
| 
 | 
 | ||||||
|             if (count < comp.getCount().first) { |             if (count < comp.getCount().first) { | ||||||
|                 auto message = populateMessage( |                 auto message = populateMessage( | ||||||
|                         "Not enough instances of component '{componentName}' required at least {min}, found {count}", |                         "Nedovoljno instanci komponente '{componentName}' potrebno barem {min}, pronađeno {count}", | ||||||
|                         context); |                         context); | ||||||
|                 errors.emplace_back(Action::ERROR, message); |                 errors.emplace_back(Action::ERROR, message); | ||||||
|             } else if (count > comp.getCount().second) { |             } else if (count > comp.getCount().second) { | ||||||
|                 auto message = populateMessage( |                 auto message = populateMessage( | ||||||
|                         "To many instances of component '{componentName}' allow at most {max}, found {count}", context); |                         "Previše insanci komponente '{componentName}' dozvoljeno najviše {max}, pronađeno {count}", context); | ||||||
|                 errors.emplace_back(Action::ERROR, message); |                 errors.emplace_back(Action::ERROR, message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -64,11 +64,11 @@ namespace domain { | |||||||
| 
 | 
 | ||||||
|             if (count < bus.getCount().first) { |             if (count < bus.getCount().first) { | ||||||
|                 auto message = populateMessage( |                 auto message = populateMessage( | ||||||
|                         "Not enough instances of bus '{busName}' required at least {min}, found {count}", context); |                         "Nedovoljno instanci sabirnice '{busName}' potrebna barem jedna {min}, pronađeno {count}", context); | ||||||
|                 errors.emplace_back(Action::ERROR, message); |                 errors.emplace_back(Action::ERROR, message); | ||||||
|             } else if (count > bus.getCount().second) { |             } else if (count > bus.getCount().second) { | ||||||
|                 auto message = populateMessage( |                 auto message = populateMessage( | ||||||
|                         "To many instances of bus '{busName}' allow at most {max}, found {count}", context); |                         "Previše instanci sabirnice '{busName}' dozvoljeno najviše {max}, pronašeno {count}", context); | ||||||
|                 errors.emplace_back(Action::ERROR, message); |                 errors.emplace_back(Action::ERROR, message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -193,7 +193,7 @@ namespace domain { | |||||||
|             if(names.find(component->name) != names.end()) { |             if(names.find(component->name) != names.end()) { | ||||||
|                 context.attributes["componentName"] = Value::fromString(component->name); |                 context.attributes["componentName"] = Value::fromString(component->name); | ||||||
|                 auto message = populateMessage( |                 auto message = populateMessage( | ||||||
|                         "There are multiple component instances named '{componentName}'", context); |                         "Pronađeno više instanci sa imenom '{componentName}'", context); | ||||||
|                 errors.emplace_back(Action::ERROR, message); |                 errors.emplace_back(Action::ERROR, message); | ||||||
|             } |             } | ||||||
|             names.insert(component->name); |             names.insert(component->name); | ||||||
| @ -234,11 +234,11 @@ namespace domain { | |||||||
|             auto directConnection = dynamic_cast<DirectConnectionInstance *>(conn.get()); |             auto directConnection = dynamic_cast<DirectConnectionInstance *>(conn.get()); | ||||||
|             if (directConnection != nullptr) { |             if (directConnection != nullptr) { | ||||||
|                 if (directConnection->instance->name == component->name && |                 if (directConnection->instance->name == component->name && | ||||||
|                     busConnection->connection.getComponent().pin == pin.getName()) { |                     directConnection->connection.getComponent().pin == pin.getName()) { | ||||||
|                     return true; |                     return true; | ||||||
|                 } |                 } | ||||||
|                 if (directConnection->secondInstance->name == component->name && |                 if (directConnection->secondInstance->name == component->name && | ||||||
|                     busConnection->connection.getSecondComponent()->pin == pin.getName()) { |                     directConnection->connection.getSecondComponent()->pin == pin.getName()) { | ||||||
|                     return true; |                     return true; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -7,18 +7,28 @@ namespace domain { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ConnectionInstance *Schema::getConnection(string &component, string &pin) { |     ConnectionInstance *Schema::getConnection(string &component, string &pin) { | ||||||
|  |         auto pinConnections = getConnections(component, pin); | ||||||
|  |         if(pinConnections.empty()) { | ||||||
|  |             return nullptr; | ||||||
|  |         } else { | ||||||
|  |             return pinConnections[0]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     std::vector<ConnectionInstance*> Schema::getConnections(string &component, string &pin) { | ||||||
|  |         std::vector<ConnectionInstance*> pinConnections; | ||||||
|         for (auto &conn: connections) { |         for (auto &conn: connections) { | ||||||
|             if (conn->instance->name == component && conn->connection.getComponent().pin == pin) { |             if (conn->instance->name == component && conn->connection.getComponent().pin == pin) { | ||||||
|                 return conn.get(); |                 pinConnections.push_back(conn.get()); | ||||||
|             } |             } | ||||||
|             auto dirConn = dynamic_cast<DirectConnectionInstance *>(conn.get()); |             auto dirConn = dynamic_cast<DirectConnectionInstance *>(conn.get()); | ||||||
|             if (dirConn != nullptr) { |             if (dirConn != nullptr) { | ||||||
|                 if (dirConn->secondInstance->name == component && conn->connection.getSecondComponent()->pin == pin) { |                 if (dirConn->secondInstance->name == component && conn->connection.getSecondComponent()->pin == pin) { | ||||||
|                     return dirConn; |                     pinConnections.push_back(conn.get()); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return nullptr; |         return pinConnections; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     BusInstance *Schema::getBusInstance(string &name) { |     BusInstance *Schema::getBusInstance(string &name) { | ||||||
|  | |||||||
| @ -42,6 +42,8 @@ namespace domain { | |||||||
|         ConnectionInstance *getConnection(string &component, string &pin); |         ConnectionInstance *getConnection(string &component, string &pin); | ||||||
| 
 | 
 | ||||||
|         std::vector<ConnectionEntry> availableConnections(std::string instance, std::string pin, bool onlyConnectable); |         std::vector<ConnectionEntry> availableConnections(std::string instance, std::string pin, bool onlyConnectable); | ||||||
|  | 
 | ||||||
|  |         vector<ConnectionInstance *> getConnections(string &component, string &pin); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| } // namespace domain
 | } // namespace domain
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user