Added connection display
This commit is contained in:
1 parent
281926cb8b
commit
f11551fef6
9 files changed
+274
-38
No files matched your search
+84
-2
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user