Added display parsing

This commit is contained in:
Borna Rajkovic 2022-04-07 22:40:31 +02:00
parent e416743908
commit 3cdd126927
3 changed files with 116 additions and 7 deletions

View File

@ -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);
} }

View File

@ -2,9 +2,6 @@
namespace domain { namespace domain {
Display::Display() Display::Display(std::vector<ui::Item> items): items(items) {}
{
}
} // namespace domain } // namespace domain

View File

@ -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