Added display parsing
This commit is contained in:
parent
e416743908
commit
3cdd126927
|
@ -190,7 +190,7 @@ std::optional<Bus> ComdelGenerator::loadBus(BusNode node)
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<Display> display;
|
optional<Display> display;
|
||||||
if(Bus::REGULAR) {
|
if(type == Bus::REGULAR) {
|
||||||
display = loadDisplay(*node.display);
|
display = loadDisplay(*node.display);
|
||||||
if(!display) {
|
if(!display) {
|
||||||
return nullopt;
|
return nullopt;
|
||||||
|
@ -395,10 +395,47 @@ optional<Pin> ComdelGenerator::loadPin(PinNode node)
|
||||||
return Pin(name, type, tooltip, connection, *display);
|
return Pin(name, type, tooltip, connection, *display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getIntProperty(DisplayItemNode &node, std::string property) {
|
||||||
|
for(auto prop: node.values) {
|
||||||
|
if(prop.key.value == property) {
|
||||||
|
return prop.value.asInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<Display> ComdelGenerator::loadDisplay(DisplayNode node)
|
std::optional<Display> ComdelGenerator::loadDisplay(DisplayNode node)
|
||||||
{
|
{
|
||||||
return Display();
|
std::vector<ui::Item> items;
|
||||||
|
for(auto &item: node.items) {
|
||||||
|
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");
|
||||||
|
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");
|
||||||
|
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);
|
||||||
|
} else {
|
||||||
|
errors.push_back(SourceError{item.type.span, "unsuported display type"});
|
||||||
|
}
|
||||||
|
items.push_back(displayItem);
|
||||||
|
}
|
||||||
|
return Display(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,6 @@
|
||||||
|
|
||||||
namespace domain {
|
namespace domain {
|
||||||
|
|
||||||
Display::Display()
|
Display::Display(std::vector<ui::Item> items): items(items) {}
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace domain
|
} // namespace domain
|
||||||
|
|
|
@ -1,13 +1,88 @@
|
||||||
#ifndef DOMAIN_DISPLAY_H
|
#ifndef DOMAIN_DISPLAY_H
|
||||||
#define DOMAIN_DISPLAY_H
|
#define DOMAIN_DISPLAY_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
namespace domain {
|
namespace domain {
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
class Rect {
|
||||||
|
public:
|
||||||
|
int x, y, w, h;
|
||||||
|
|
||||||
|
Rect(int x, int y, int w, int h): x(x), y(y), w(w), h(h) {}
|
||||||
|
|
||||||
|
void render(QGraphicsItemGroup *group) {
|
||||||
|
group->addToGroup(new QGraphicsRectItem(x,y,w,h));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Line {
|
||||||
|
public:
|
||||||
|
int x1, y1, x2, y2;
|
||||||
|
|
||||||
|
Line(int x1, int y1, int x2, int y2): x1(x1), y1(y1), x2(x2), y2(y2) {}
|
||||||
|
|
||||||
|
void render(QGraphicsItemGroup *group) {
|
||||||
|
group->addToGroup(new QGraphicsLineItem(x1, y1, x2, y2));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Orientation {
|
||||||
|
LEFT, RIGHT, TOP, BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
|
enum PinType {
|
||||||
|
IN, OUT, IN_OUT
|
||||||
|
};
|
||||||
|
|
||||||
|
class Pin {
|
||||||
|
public:
|
||||||
|
Orientation orientation;
|
||||||
|
PinType pinType;
|
||||||
|
int x, y, w, h;
|
||||||
|
|
||||||
|
Pin(int x, int y, int w, int h): x(x), y(y), w(w), h(h) {}
|
||||||
|
|
||||||
|
void render(QGraphicsItemGroup *group) {
|
||||||
|
group->addToGroup(new QGraphicsRectItem(x,y,w,h));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Item {
|
||||||
|
public:
|
||||||
|
Item(): rect(std::nullopt), line(std::nullopt), pin(std::nullopt) {}
|
||||||
|
|
||||||
|
void render(QGraphicsItemGroup *group) {
|
||||||
|
if(rect) rect->render(group);
|
||||||
|
if(line) line->render(group);
|
||||||
|
if(pin) pin->render(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<Rect> rect = std::nullopt;
|
||||||
|
std::optional<Line> line = std::nullopt;
|
||||||
|
std::optional<Pin> pin = std::nullopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
class Display
|
class Display
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Display();
|
|
||||||
|
Display(std::vector<ui::Item> items);
|
||||||
|
|
||||||
|
void render(QGraphicsItemGroup *group) {
|
||||||
|
for(auto &item: items) {
|
||||||
|
item.render(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<ui::Item> items;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace domain
|
} // namespace domain
|
||||||
|
|
Loading…
Reference in New Issue