Added connection display
This commit is contained in:
1 parent
281926cb8b
commit
f11551fef6
9 files changed
+274
-38
No files matched your search
@@ -51,6 +51,9 @@ void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
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);
|
||||
}
|
||||
@@ -62,7 +65,33 @@ void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
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]() {
|
||||
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());
|
||||
}
|
||||
} // namespace display
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <comdel/domain/wireinstance.h>
|
||||
|
||||
#include <QGraphicsItemGroup>
|
||||
#include "comdel/domain/connectioninstance.h"
|
||||
|
||||
namespace display {
|
||||
|
||||
@@ -14,7 +15,7 @@ private:
|
||||
domain::Pin pin;
|
||||
public:
|
||||
Pin(domain::Pin pin): pin(pin) {
|
||||
pin.getDisplay().render(this);
|
||||
pin.getDisplayPin().render(this);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -90,6 +91,29 @@ protected:
|
||||
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
|
||||
};
|
||||
|
||||
class BusConnection: public QGraphicsLineItem
|
||||
{
|
||||
private:
|
||||
domain::BusConnectionInstance* connection;
|
||||
ComponentGroup* component;
|
||||
BusGroup* bus;
|
||||
|
||||
public:
|
||||
BusConnection(domain::BusConnectionInstance* connection, ComponentGroup *component, BusGroup *bus): connection(connection), component(component), bus(bus) {
|
||||
updateConnection();
|
||||
|
||||
setHandlesChildEvents(false);
|
||||
}
|
||||
|
||||
void 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);
|
||||
}
|
||||
|
||||
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
|
||||
};
|
||||
|
||||
|
||||
} // namespace display
|
||||
|
||||
@@ -11,18 +11,42 @@ Schema::Schema()
|
||||
|
||||
void Schema::setSchema(domain::Schema* _schema)
|
||||
{
|
||||
std::map<std::string, display::ComponentGroup*> components;
|
||||
std::map<std::string, display::BusGroup*> buses;
|
||||
|
||||
scene.clear();
|
||||
connections.clear();
|
||||
this->schema = _schema;
|
||||
if(schema != nullptr) {
|
||||
for(auto &instance: schema->componentInstances) {
|
||||
scene.addItem(new display::ComponentGroup(instance));
|
||||
auto group = new display::ComponentGroup(instance);
|
||||
components.insert(std::make_pair(instance->name, group));
|
||||
scene.addItem(group);
|
||||
}
|
||||
for(auto &instance: schema->busInstances) {
|
||||
if(instance->bus.getDisplay().has_value()) {
|
||||
scene.addItem(new display::BusGroup(instance));
|
||||
auto group = new display::BusGroup(instance);
|
||||
buses.insert(std::make_pair(instance->name, group));
|
||||
scene.addItem(group);
|
||||
}
|
||||
}
|
||||
for(auto &connection: schema->connections) {
|
||||
auto busInstance = dynamic_cast<domain::BusConnectionInstance*>(connection.get());
|
||||
if(busInstance != nullptr) {
|
||||
auto con = new display::BusConnection(busInstance, components[busInstance->instance->name], buses[busInstance->bus->name]);
|
||||
connections.push_back(con);
|
||||
scene.addItem(con);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Schema::updateConnections() {
|
||||
if(schema != nullptr) {
|
||||
for(auto conn: connections) {
|
||||
conn->updateConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace display
|
||||
@@ -9,13 +9,19 @@
|
||||
|
||||
namespace display {
|
||||
|
||||
class BusConnection;
|
||||
|
||||
class Schema: public QGraphicsView
|
||||
{
|
||||
public:
|
||||
Schema();
|
||||
|
||||
std::vector<BusConnection*> connections;
|
||||
|
||||
void setSchema(domain::Schema* schema);
|
||||
|
||||
void updateConnections();
|
||||
|
||||
private:
|
||||
QGraphicsScene scene;
|
||||
|
||||
|
||||
Reference in new issue
Block a user