75 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
76 qWarning(
"MNELayout::read - Cannot open %s", qPrintable(path));
82 bool haveExtent =
false;
83 QTextStream in(&file);
84 static const QRegularExpression whitespace(QStringLiteral(
"\\s+"));
86 const QString line = in.readLine().trimmed();
87 if (line.isEmpty() || line.startsWith(
'#')) {
90 QStringList fields = line.split(whitespace);
93 const double v[4] = {fields.value(0).toDouble(&ok[0]), fields.value(1).toDouble(&ok[1]), fields.value(2).toDouble(&ok[2]), fields.value(3).toDouble(&ok[3])};
94 if (!(ok[0] && ok[1] && ok[2] && ok[3])) {
95 qWarning(
"MNELayout::read - Illegal extent in %s", qPrintable(path));
98 layout.m_extent = QRectF(QPointF(v[0], v[2]), QPointF(v[1], v[3]));
104 port.
portno = fields.value(0).toInt(&ok[0]);
105 const double x0 = fields.value(1).toDouble(&ok[1]);
106 const double y0 = fields.value(2).toDouble(&ok[2]);
107 const double w = fields.value(3).toDouble(&ok[3]);
108 const double h = fields.value(4).toDouble(&ok[4]);
109 if (fields.size() < 5 || !(ok[0] && ok[1] && ok[2] && ok[3] && ok[4])) {
110 qWarning(
"MNELayout::read - Bad layout item in %s: %s", qPrintable(path), qPrintable(line));
113 port.
xmin =
static_cast<float>(x0);
114 port.
xmax =
static_cast<float>(x0 + std::fabs(w));
115 port.
ymin =
static_cast<float>(y0);
116 port.
ymax =
static_cast<float>(y0 + std::fabs(h));
119 port.
label = line.section(whitespace, 5).trimmed();
120 for (
const QString& name : port.
label.split(
':', Qt::SkipEmptyParts)) {
123 layout.
ports.push_back(port);
126 qWarning(
"MNELayout::read - No extent in %s", qPrintable(path));
129 layout.m_visible = layout.m_extent;
195 const QRectF requested = area.normalized();
199 if (isInside(port, requested)) {
200 covered = nmatch == 0 ? port.
rect() : covered.united(port.
rect());
205 const double margin = 0.01 * covered.width();
206 m_visible = covered.adjusted(-margin, -margin, margin, margin);