176 lines
6.0 KiB
C++
176 lines
6.0 KiB
C++
#ifndef DISPLAY_COMPONENT_H
|
|
#define DISPLAY_COMPONENT_H
|
|
|
|
#include <comdel/domain/instance.h>
|
|
#include <comdel/domain/wireinstance.h>
|
|
|
|
#include <QGraphicsItemGroup>
|
|
#include <QGraphicsSceneMouseEvent>
|
|
#include <QGraphicsSceneMouseEvent>
|
|
#include "comdel/domain/connectioninstance.h"
|
|
|
|
namespace display {
|
|
|
|
class Pin: public QGraphicsItemGroup
|
|
{
|
|
private:
|
|
domain::Pin pin;
|
|
std::shared_ptr<domain::ComponentInstance> componentInstance;
|
|
|
|
public:
|
|
Pin(domain::Pin pin, std::shared_ptr<domain::ComponentInstance> 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<domain::ComponentInstance> instance;
|
|
public:
|
|
Component(const std::shared_ptr<domain::ComponentInstance>& instance): instance(instance) {
|
|
setFlag(ItemSendsGeometryChanges, true);
|
|
|
|
instance->component.getDisplay().render(this);
|
|
}
|
|
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
|
|
|
|
};
|
|
|
|
class Bus: public QGraphicsItemGroup
|
|
{
|
|
std::shared_ptr<domain::BusInstance> busInstance;
|
|
public:
|
|
Bus(const std::shared_ptr<domain::BusInstance>& 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<domain::ComponentInstance> componentInstance;
|
|
std::vector<display::Pin*> pins;
|
|
|
|
public:
|
|
|
|
std::shared_ptr<domain::ComponentInstance> getComponentInstance() { return componentInstance; }
|
|
std::vector<display::Pin*>& getPins() { return pins; }
|
|
|
|
explicit 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);
|
|
}
|
|
|
|
protected:
|
|
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
|
|
|
|
};
|
|
|
|
class BusGroup: public QGraphicsItemGroup
|
|
{
|
|
private:
|
|
std::shared_ptr<domain::BusInstance> busInstance;
|
|
display::Bus* bus;
|
|
|
|
public:
|
|
explicit BusGroup(const std::shared_ptr<domain::BusInstance>& 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
|