Added connection display

This commit is contained in:
Borna Rajković committed 2022-05-18 00:14:33 +02:00
1 parent 281926cb8b
commit f11551fef6
9 files changed
+274 -38

No files matched your search

+84 -2
View File
@@ -61,10 +61,90 @@ public:
PinType pinType;
int x, y, w, h;
Pin(int x, int y, int w, int h): x(x), y(y), w(w), h(h) {}
Pin(int x, int y, int w, int h, Orientation orientation, PinType pinType): x(x), y(y), w(w), h(h), orientation(orientation), pinType(pinType) {}
void renderIn(QGraphicsItemGroup *group) {
QPolygon polygon;
switch (orientation) {
case Orientation::TOP:
polygon << QPoint(x, y) << QPoint(x, y+h) << QPoint(x+w, y+h) << QPoint(x+w, y) << QPoint(x+w/2, y+h/2);
break;
case Orientation::BOTTOM:
polygon << QPoint(x, y) << QPoint(x, y+h) << QPoint(x+w/2, y+h/2) << QPoint(x+w, y+h) << QPoint(x+w, y);
break;
case Orientation::LEFT:
polygon << QPoint(x, y) << QPoint(x+w/2, y+h/2) << QPoint(x, y+h) << QPoint(x+w, y+h) << QPoint(x+w, y);
break;
case Orientation::RIGHT:
polygon << QPoint(x, y) << QPoint(x, y+h) << QPoint(x+w, y+h) << QPoint(x+w/2, y+h/2) << QPoint(x+w, y);
break;
}
group->addToGroup(new QGraphicsPolygonItem(polygon));
}
void renderOut(QGraphicsItemGroup *group) {
QPolygon polygon;
switch (orientation) {
case Orientation::TOP:
polygon << QPoint(x, y+h/2) << QPoint(x, y+h) << QPoint(x+w, y+h) << QPoint(x+w, y+h/2) << QPoint(x+w/2, y);
break;
case Orientation::BOTTOM:
polygon << QPoint(x, y) << QPoint(x, y+h/2) << QPoint(x+w/2, y+h) << QPoint(x+w, y+h/2) << QPoint(x+w, y);
break;
case Orientation::LEFT:
polygon << QPoint(x+w, y) << QPoint(x+w/2, y) << QPoint(x, y+h/2) << QPoint(x+w/2, y+h) << QPoint(x+w, y+w);
break;
case Orientation::RIGHT:
polygon << QPoint(x, y) << QPoint(x, y+h) << QPoint(x+w/2, y+h) << QPoint(x+w, y+h/2) << QPoint(x+w/2, y);
break;
}
group->addToGroup(new QGraphicsPolygonItem(polygon));
}
void renderInOut(QGraphicsItemGroup *group) {
group->addToGroup(new QGraphicsRectItem(x, y ,w, h));
}
void render(QGraphicsItemGroup *group) {
group->addToGroup(new QGraphicsRectItem(x,y,w,h));
switch (pinType) {
case PinType::IN:
renderIn(group);
break;
case PinType::OUT:
renderOut(group);
break;
case PinType::IN_OUT:
renderInOut(group);
break;
}
}
int getConnectionX() {
switch (orientation) {
case ui::Orientation::TOP:
case ui::Orientation::BOTTOM:
return x+w/2;
case ui::Orientation::LEFT:
return x;
case ui::Orientation::RIGHT:
return x+w;
}
return 0;
}
int getConnectionY() {
switch (orientation) {
case ui::Orientation::LEFT:
case ui::Orientation::RIGHT:
return y+h/2;
case ui::Orientation::TOP:
return y;
case ui::Orientation::BOTTOM:
return y+h;
}
return 0;
}
};
@@ -109,6 +189,8 @@ public:
}
}
std::vector<ui::Item>& getItems() {return items;}
private:
std::vector<ui::Item> items;
};
+4 -4
View File
@@ -14,8 +14,8 @@ std::string PinConnection::getMessage() {
}
Pin::Pin(std::string name, PinType type, std::string tooltip, PinConnection connection, Display display, std::optional<std::vector<Value>> wires)
: name(name), type(type), tooltip(tooltip), connection(connection), display(display), wires(wires)
Pin::Pin(std::string name, PinType type, std::string tooltip, PinConnection connection, domain::ui::Pin pin, std::optional<std::vector<Value>> wires)
: name(name), type(type), tooltip(tooltip), connection(connection), displayPin(pin), wires(wires)
{}
std::string &Pin::getName() {
@@ -27,8 +27,8 @@ Pin::PinType Pin::getType() {
std::string Pin::getTooltip() {
return tooltip;
}
Display &Pin::getDisplay() {
return display;
ui::Pin &Pin::getDisplayPin() {
return displayPin;
}
PinConnection &Pin::getConnection() {
return connection;
+3 -3
View File
@@ -43,17 +43,17 @@ private:
PinType type;
std::string tooltip;
PinConnection connection;
Display display;
domain::ui::Pin displayPin;
std::optional<std::vector<Value>> wires;
public:
Pin(std::string name, PinType type, std::string tooltip, PinConnection connection, Display display, std::optional<std::vector<Value>> wires);
Pin(std::string name, PinType type, std::string tooltip, PinConnection connection, domain::ui::Pin pin, std::optional<std::vector<Value>> wires);
std::string &getName();
PinType getType();
std::string getTooltip();
Display &getDisplay();
ui::Pin &getDisplayPin();
PinConnection &getConnection();
std::optional<std::vector<Value>> &getWires();
};
+50 -26
View File
@@ -542,6 +542,12 @@ optional<Pin> SchemaCreator::loadPin(PinNode node)
if(!display) {
return nullopt;
}
if(display->getItems().size() != 1 || !display->getItems()[0].pin.has_value()) {
errors.emplace_back(node.span, "@display must contain only exactly one pin definition");
return nullopt;
}
ui::Pin displayPin = *display->getItems()[0].pin;
if(!node.connection) {
errors.emplace_back(node.span, "missing @connection");
@@ -565,16 +571,7 @@ optional<Pin> SchemaCreator::loadPin(PinNode node)
wiresOpt = wires;
}
return Pin(name, type, tooltip, connection, *display, wiresOpt);
}
int getIntProperty(DisplayItemNode &node, std::string property) {
for(auto& prop: node.values) {
if(prop.key.value == property) {
return prop.value.asInt();
}
}
throw std::exception();
return Pin(name, type, tooltip, connection, displayPin, wiresOpt);
}
std::optional<Display> SchemaCreator::loadDisplay(DisplayNode node)
@@ -584,26 +581,53 @@ std::optional<Display> SchemaCreator::loadDisplay(DisplayNode node)
ui::Item displayItem;
std::string type = item.type.value;
if(type == "rect") {
int x, y, w, h;
x = getIntProperty(item, "x");
y = getIntProperty(item, "y");
w = getIntProperty(item, "w");
h = getIntProperty(item, "h");
long long int x, y, w, h;
x = item.asInt(&errors, "x");
y = item.asInt(&errors, "y");
w = item.asInt(&errors, "w");
h = item.asInt(&errors, "h");
displayItem.rect = ui::Rect(x, y, w, h);
} else if(type == "line") {
int x1, y1, x2, y2;
x1 = getIntProperty(item, "x1");
y1 = getIntProperty(item, "y1");
x2 = getIntProperty(item, "x2");
y2 = getIntProperty(item, "y2");
long long int x1, y1, x2, y2;
x1 = item.asInt(&errors, "x1");
y1 = item.asInt(&errors, "y1");
x2 = item.asInt(&errors, "x2");
y2 = item.asInt(&errors, "y2");
displayItem.line = ui::Line(x1, y1, x2, y2);
} else if(type == "pin") {
int x, y, w, h;
x = getIntProperty(item, "x");
y = getIntProperty(item, "y");
w = getIntProperty(item, "w");
h = getIntProperty(item, "h");
displayItem.pin = ui::Pin(x, y, w, h);
long long int x, y, w, h;
x = item.asInt(&errors, "x");
y = item.asInt(&errors, "y");
w = item.asInt(&errors, "w");
h = item.asInt(&errors, "h");
std::string _orientation = item.asString(&errors, "orientation", "bottom");
std::string _pinType = item.asString(&errors, "type", "out");
ui::Orientation orientation;
if(_orientation == "left") {
orientation = ui::Orientation::LEFT;
} else if(_orientation == "right") {
orientation = ui::Orientation::RIGHT;
} else if(_orientation == "top") {
orientation = ui::Orientation::TOP;
} else if(_orientation == "bottom") {
orientation = ui::Orientation::BOTTOM;
} else {
errors.emplace_back(item.span, "unknown orientation type '" + _orientation + "'");
}
ui::PinType pinType;
if(_pinType == "in") {
pinType = ui::PinType::IN;
} else if(_pinType == "out") {
pinType = ui::PinType::OUT;
} else if(_pinType == "in_out") {
pinType = ui::PinType::IN_OUT;
} else {
errors.emplace_back(item.span, "unknown pin type '" + _pinType + "'");
}
displayItem.pin = ui::Pin(x, y, w, h, orientation, pinType);
} else {
errors.emplace_back(item.type.span, "unsupported display type");
}