#include "component_display.h" #include #include #include #include #include "dialogmanager.h" namespace display { ComponentWrapper *ComponentWrapper::ofWire(domain::WireInstance *wire) { auto component = new ComponentWrapper(); component->wireInstance = wire; component->redraw(); return component; } ComponentWrapper *ComponentWrapper::ofComponent(domain::ComponentInstance *instance) { auto component = new ComponentWrapper(); component->componentInstance = instance; component->setFlag(QGraphicsItem::ItemIsMovable, true); component->componentItem = new ComponentItem(instance, component); for(auto& pin: instance->component.getPins()) { component->pinItems.push_back(new PinItem(pin, component)); } component->redraw(); return component; } ComponentWrapper *ComponentWrapper::ofBus(domain::BusInstance *instance) { auto component = new ComponentWrapper(); component->busInstance = instance; component->setFlag(QGraphicsItem::ItemIsMovable, true); component->redraw(); return component; } void ComponentWrapper::clear() { for(auto item: childItems()) { this->removeFromGroup(item); item->scene()->removeItem(item); delete item; } if(componentInstance) { componentItem->clear(); for(auto pinItem: pinItems) { pinItem->clear(); } } } void ComponentWrapper::redraw() { if(componentInstance) { addToGroup(componentItem); componentItem->redraw(); for(auto pinItem: pinItems) { addToGroup(pinItem); pinItem->redraw(); } this->addToGroup(new QGraphicsSimpleTextItem(QString::fromStdString(componentInstance->name))); } if(busInstance && busInstance->bus.getDisplay()) { busInstance->bus.getDisplay()->render(this); this->addToGroup(new QGraphicsSimpleTextItem(QString::fromStdString(busInstance->name))); } if(wireInstance) { wireInstance->display.render(this); this->addToGroup(new QGraphicsSimpleTextItem(QString::fromStdString(wireInstance->name))); } } ComponentItem::ComponentItem(domain::ComponentInstance *instance, QGraphicsItem *parent): componentInstance(instance) { setParentItem(parent); redraw(); setToolTip(QString::fromStdString(this->componentInstance->component.getTooltip())); } void ComponentItem::redraw() { componentInstance->component.getDisplay().render(this); } void ComponentItem::clear() { for(auto item: childItems()) { this->removeFromGroup(item); item->scene()->removeItem(item); delete item; } } void ComponentItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; auto instance = this->componentInstance; menu.addAction("Izmjeni ime", [instance, this](){ DialogManager::updateName(instance); auto *wrapper = static_cast(this->parentItem()); wrapper->clear(); wrapper->redraw(); }); menu.addSeparator(); for(auto attr: componentInstance->attributes) { bool enabled = attr->attribute.getPopup().has_value(); auto action = menu.addAction(QString::fromStdString("Izmjeni " + attr->name), [attr, this]() { DialogManager::updateAttribute(attr); this->redraw(); }); action->setEnabled(enabled); } menu.exec(event->screenPos()); } PinItem::PinItem(domain::Pin pin, QGraphicsItem *parent): pin(pin) { setParentItem(parent); redraw(); setToolTip(QString::fromStdString(pin.getTooltip())); } void PinItem::redraw() { pin.getDisplay().render(this); } void PinItem::clear() { for(auto item: childItems()) { this->removeFromGroup(item); item->scene()->removeItem(item); delete item; } } } // namespace display