Updated component and bus generation logic + bugfixes

This commit is contained in:
Borna Rajković committed 2022-05-31 01:05:08 +02:00
1 parent 86b8861533
commit f93a2afa63
14 files changed
+208 -68

No files matched your search

+15 -4
View File
@@ -7,13 +7,19 @@
#include <QMenu>
#include <QLine>
#include <QGraphicsSceneContextMenuEvent>
#include <set>
namespace display {
void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
menu.addAction("Izmjeni ime", [this]() {
auto dialog = new NameDialog(this->instance.get());
std::set<std::string> names;
for(const auto &component: Application::instance()->getSchema()->componentInstances) {
names.insert(component->name);
}
auto dialog = new NameDialog(this->instance.get(), names);
dialog->exec();
});
menu.addSeparator();
@@ -93,7 +99,12 @@ namespace display {
void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
QMenu menu;
menu.addAction("Izmjeni ime", [this]() {
auto dialog = new NameDialog(this->busInstance.get());
std::set<std::string> names;
for(const auto &component: Application::instance()->getSchema()->busInstances) {
names.insert(component->name);
}
auto dialog = new NameDialog(this->busInstance.get(), names);
dialog->exec();
});
menu.exec(event->screenPos());
@@ -110,7 +121,7 @@ namespace display {
QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QPoint newPos = value.toPointF().toPoint();
busInstance->position.first = newPos.x();
busInstance->position.second = newPos.y();
@@ -136,7 +147,7 @@ namespace display {
QVariant ComponentGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QPoint newPos = value.toPointF().toPoint();
componentInstance->position.first = newPos.x();
componentInstance->position.second = newPos.y();
+21 -4
View File
@@ -2,37 +2,54 @@
// Created by bbr on 18. 04. 2022..
//
#include <set>
#include "name_dialog.h"
display::NameDialog::NameDialog(domain::ComponentInstance *instance) : componentInstance(instance) {
display::NameDialog::NameDialog(domain::ComponentInstance *instance, std::set<std::string>& names) : componentInstance(instance), usedNames(names) {
usedNames.erase(instance->name);
auto *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel("Izmjeni ime", this));
edit = new QLineEdit(this);
edit->insert(instance->name.c_str());
connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate);
layout->addWidget(edit);
this->setWindowTitle("Izmjeni ime");
auto *button = new QPushButton("Ažuriraj", this);
button = new QPushButton("Ažuriraj", this);
connect(button, &QPushButton::clicked, this, &NameDialog::onNameChange);
layout->addWidget(button);
this->setLayout(layout);
}
display::NameDialog::NameDialog(domain::BusInstance *instance): busInstance(instance) {
display::NameDialog::NameDialog(domain::BusInstance *instance, std::set<std::string>& names): busInstance(instance), usedNames(names) {
usedNames.erase(instance->name);
auto *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel("Izmjeni ime", this));
edit = new QLineEdit(this);
edit->insert(instance->name.c_str());
connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate);
layout->addWidget(edit);
this->setWindowTitle("Izmjeni ime");
auto *button = new QPushButton("Ažuriraj", this);
button = new QPushButton("Ažuriraj", this);
connect(button, &QPushButton::clicked, this, &NameDialog::onNameChange);
layout->addWidget(button);
this->setLayout(layout);
}
void display::NameDialog::onNameUpdate(const QString &text) {
if(usedNames.find(text.toStdString()) == usedNames.end()) {
button->setDisabled(false);
} else {
button->setDisabled(true);
}
}
void display::NameDialog::onNameChange() {
if (componentInstance != nullptr) {
componentInstance->name = this->edit->text().toStdString();
} else if (busInstance != nullptr) {
+7 -3
View File
@@ -7,24 +7,28 @@
#include <QLineEdit>
#include <QPushButton>
#include <set>
#include <comdel/domain/instance.h>
namespace display {
class NameDialog : public QDialog {
std::set<std::string> usedNames;
QLineEdit *edit = nullptr;
domain::ComponentInstance *componentInstance = nullptr;
domain::BusInstance *busInstance = nullptr;
QPushButton *button;
public:
NameDialog(domain::ComponentInstance *instance);
NameDialog(domain::ComponentInstance *instance, std::set<std::string>& names);
NameDialog(domain::BusInstance *instance);
NameDialog(domain::BusInstance *instance, std::set<std::string>& names);
public slots:
void onNameUpdate(const QString& text);
void onNameChange();
};
+25 -10
View File
@@ -1,5 +1,7 @@
#include "component_display.h"
#include "schema_display.h"
#include "application.h"
#include "attribute_dialog.h"
#include <QDrag>
#include <QDragEnterEvent>
@@ -86,15 +88,30 @@ namespace display {
auto attributes = std::vector<domain::InstanceAttribute>();
for (auto attr: component.getAttributes()) {
attributes.emplace_back(attr.getName(), attr.getDefault(), attr);
domain::InstanceAttribute attribute(attr.getName(), attr.getDefault(), attr);
if(attr.getPopup().has_value() && attr.getPopup()->getType() == domain::Popup::AUTOMATIC) {
if(attr.getDefault().isType(domain::Value::MEMORY_REFERENCE)) {
auto dialog = new MemoryDialog(&attribute, schema->componentInstances);
if(dialog->exec() == QDialog::Rejected) {
// if any dialog isn't set, whole creation is rejected
event->ignore();
return;
}
} else {
auto dialog = new AttributeDialog(&attribute);
if(dialog->exec() == QDialog::Rejected) {
// if any dialog isn't set, whole creation is rejected
event->ignore();
return;
}
}
}
attributes.push_back(attribute);
}
auto currentPos = this->mapToScene(event->pos());
auto currentPos = this->mapToScene(event->pos()).toPoint();
auto instance = std::make_shared<domain::ComponentInstance>(component.getInstanceName(), attributes,
std::make_pair(currentPos.x(), currentPos.y()),
component);
schema->componentInstances.push_back(instance);
auto instance = Application::instance()->addComponent(component, attributes, currentPos.x(), currentPos.y());
auto group = new display::ComponentGroup(instance);
scene.addItem(group);
@@ -111,11 +128,9 @@ namespace display {
if (event->mimeData()->hasFormat("comdel/bus")) {
auto bus = library->getBus(event->mimeData()->data("comdel/bus").toStdString());
auto currentPos = this->mapToScene(event->pos());
auto currentPos = this->mapToScene(event->pos()).toPoint();
auto instance = std::make_shared<domain::BusInstance>(bus.getName(),
std::make_pair(currentPos.x(), currentPos.y()), bus);
schema->busInstances.push_back(instance);
auto instance = Application::instance()->addBus(bus, currentPos.x(), currentPos.y());
auto group = new display::BusGroup(instance);
scene.addItem(group);
+7 -3
View File
@@ -10,6 +10,11 @@ namespace domain {
return name;
}
std::string Bus::getInstanceName() {
return instanceName;
}
int Wire::getWidth() {
return width;
}
@@ -30,9 +35,9 @@ namespace domain {
return type;
}
Bus::Bus(std::string name, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
Bus::Bus(std::string name, std::string instanceName, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
std::optional<ui::Bus> displayBus)
: name(name), tooltip(tooltip), type(type), count(count), wires(wires), displayBus(displayBus) {}
: name(name), instanceName(instanceName), tooltip(tooltip), type(type), count(count), wires(wires), displayBus(displayBus) {}
std::string Bus::getName() {
return name;
@@ -57,5 +62,4 @@ namespace domain {
std::optional<ui::Bus> Bus::getDisplayBus() {
return displayBus;
}
} // namespace domain
+4 -1
View File
@@ -54,6 +54,7 @@ namespace domain {
};
private:
std::string name;
std::string instanceName;
std::string tooltip;
BusType type;
@@ -62,11 +63,13 @@ namespace domain {
std::vector<Wire> wires;
public:
Bus(std::string name, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
Bus(std::string name, std::string instanceName, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
std::optional<ui::Bus> display = std::nullopt);
std::string getName();
std::string getInstanceName();
std::string getTooltip();
BusType getType();
+23 -7
View File
@@ -167,8 +167,7 @@ namespace domain {
}
for (auto &comp: node.components) {
std::optional<Component> component;
component = loadComponent(comp);
auto component = loadComponent(comp);
if (component) {
components.push_back(*component);
}
@@ -196,13 +195,24 @@ namespace domain {
}
}
return Library(name, libraryInfo, header, componentDirectory, componentHeader, addressSpaces, components, buses,
connections, messages);
if(errors.empty()) {
return Library(name, libraryInfo, header, componentDirectory, componentHeader, addressSpaces, components, buses,
connections, messages);
} else {
return nullopt;
}
}
std::optional<Bus> SchemaCreator::loadBus(BusNode node) {
std::string busName = node.name.value;
if (!node.instanceName) {
errors.emplace_back(node.span, "missing @instanceName");
return nullopt;
}
std::string instanceName = node.instanceName->value;
auto count = std::make_pair<int, int>(1, 1);
if (node.count) {
count = std::make_pair<int, int>(node.count->first.value, node.count->second.value);
@@ -259,7 +269,7 @@ namespace domain {
return nullopt;
}
return Bus(busName, tooltip, type, count, wires, displayBus);
return Bus(busName, instanceName, tooltip, type, count, wires, displayBus);
}
@@ -497,7 +507,7 @@ namespace domain {
pop();
return nullopt;
}
std::string instanceName = node.instanceName->asString();
std::string instanceName = node.instanceName->value;
auto count = std::make_pair<int, int>(1, 1);
if (node.count) {
@@ -950,7 +960,13 @@ namespace domain {
}
}
return schema;
if(errors.empty()) {
return schema;
} else {
delete schema;
return nullptr;
}
}
shared_ptr<ComponentInstance> SchemaCreator::loadComponentInstance(InstanceNode instance, Library &library) {
+2 -1
View File
@@ -309,7 +309,7 @@ struct ComponentNode : public AstNode {
std::optional<StringNode> source;
EnumNode<ComponentType> type;
std::vector<RuleNode> rules;
std::optional<StringNode> instanceName;
std::optional<IdentifierNode> instanceName;
std::optional<CountNode> count;
std::optional<DisplayNode> display;
std::vector<PinNode> pins;
@@ -325,6 +325,7 @@ struct BusNode : public AstNode {
EnumNode<BusType> type;
IdentifierNode name;
std::optional<IdentifierNode> instanceName;
std::optional<StringNode> tooltip;
std::optional<CountNode> count;
std::optional<DisplayNode> display;
+18 -10
View File
@@ -438,7 +438,7 @@ PResult<ComponentNode> ComdelParser::parseComponent() {
PResult<poly<AstNode>> err;
if (check(TokenType::KW_INSTANCE_NAME)) {
bump();
ASSIGN_OR_SET_ERR(component.instanceName, parseString());
ASSIGN_OR_SET_ERR(component.instanceName, parseIdentifier());
} else if (check(TokenType::KW_TOOLTIP)) {
bump();
ASSIGN_OR_SET_ERR(component.tooltip, parseString());
@@ -554,22 +554,30 @@ PResult<BusNode> ComdelParser::parseBus() {
PResult<poly<AstNode>> err;
if (check(TokenType::KW_TOOLTIP)) {
bump();
ASSIGN_OR_RETURN_IF_ERR(bus.tooltip, parseString());
ASSIGN_OR_SET_ERR(bus.tooltip, parseString());
} else if (check(TokenType::KW_INSTANCE_NAME)) {
bump();
ASSIGN_OR_SET_ERR(bus.instanceName, parseIdentifier());
} else if (check(TokenType::KW_COUNT)) {
ASSIGN_OR_RETURN_IF_ERR(bus.count, parseCount());
ASSIGN_OR_SET_ERR(bus.count, parseCount());
} else if (check(TokenType::KW_DISPLAY)) {
ASSIGN_OR_RETURN_IF_ERR(bus.display, parseDisplay());
ASSIGN_OR_SET_ERR(bus.display, parseDisplay());
} else if (check(TokenType::KW_WIRES)) {
bump();
RETURN_IF_NOT_TOKEN(TokenType::LBRACE);
while (check(TokenType::IDENTIFIER)) {
APPEND_OR_RETURN_IF_ERR(bus.wires, parseWire());
if(consume(TokenType::LBRACE)) {
while (check(TokenType::IDENTIFIER)) {
APPEND_OR_RETURN_IF_ERR(bus.wires, parseWire());
if (check(TokenType::COMMA)) {
RETURN_IF_NOT_TOKEN(TokenType::COMMA);
if (check(TokenType::COMMA)) {
RETURN_IF_NOT_TOKEN(TokenType::COMMA);
}
}
} else {
err = unexpected();
}
if(!consume(TokenType::RBRACE)) {
err = unexpected();
}
RETURN_IF_NOT_TOKEN(TokenType::RBRACE);
} else {
err = unexpected();
bump();