#ifndef DISPLAY_COMPONENT_H #define DISPLAY_COMPONENT_H #include #include #include #include #include #include "comdel/domain/connectioninstance.h" namespace display { class Pin: public QGraphicsItemGroup { private: domain::Pin pin; std::shared_ptr componentInstance; public: Pin(domain::Pin pin, std::shared_ptr componentInstance): pin(pin), componentInstance(componentInstance) { pin.getDisplayPin().render(this); } void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; domain::Pin& getPin() { return pin; } domain::ComponentInstance* getComponentInstance() { return componentInstance.get(); } }; class Component: public QGraphicsItemGroup { private: std::shared_ptr instance; public: Component(const std::shared_ptr& instance): instance(instance) { setFlag(ItemSendsGeometryChanges, true); instance->component.getDisplay().render(this); } void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; }; class Bus: public QGraphicsItemGroup { std::shared_ptr busInstance; public: Bus(const std::shared_ptr& instance): busInstance(instance) { instance->bus.getDisplayBus()->render(this, instance->size); } domain::BusInstance *getBusInstance() { return busInstance.get(); } void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; }; class ComponentGroup: public QGraphicsItemGroup { private: std::shared_ptr componentInstance; std::vector pins; public: std::shared_ptr getComponentInstance() { return componentInstance; } std::vector& getPins() { return pins; } explicit ComponentGroup(const std::shared_ptr& 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); } protected: virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); }; class BusGroup: public QGraphicsItemGroup { private: std::shared_ptr busInstance; display::Bus* bus; public: explicit BusGroup(const std::shared_ptr& instance); display::Bus* getBus() { return bus; } 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); 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; } void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; }; class DirectConnection: public QGraphicsLineItem { private: domain::DirectConnectionInstance* connection; ComponentGroup* first; ComponentGroup* second; public: DirectConnection(domain::DirectConnectionInstance* connection, ComponentGroup *first, ComponentGroup *second): connection(connection), first(first), second(second) { updateConnection(); setHandlesChildEvents(false); } void 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(); } void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; }; } // namespace display #endif // DISPLAY_COMPONENT_H