#include "toolbar_icon_factory.h" #include #include #include #include #include namespace { const QColor kInk(QStringLiteral("#263842")); const QColor kAccent(QStringLiteral("#2f7d4a")); const QColor kAccentFill(QStringLiteral("#dcece3")); const QColor kWarning(QStringLiteral("#b87808")); const QColor kDanger(QStringLiteral("#a84545")); const QColor kPaper(QStringLiteral("#ffffff")); QPen iconPen(const QColor &color = kInk, qreal width = 1.7) { QPen pen(color, width); pen.setCapStyle(Qt::RoundCap); pen.setJoinStyle(Qt::RoundJoin); return pen; } void drawCenteredText( QPainter &painter, const QRectF &bounds, const QString &text, qreal point_size, const QColor &color = kInk) { QFont font = painter.font(); font.setFamily(QStringLiteral("Arial")); font.setPointSizeF(point_size); font.setBold(true); painter.setFont(font); painter.setPen(color); painter.drawText(bounds, Qt::AlignCenter, text); } void drawPlc(QPainter &painter) { painter.setPen(iconPen()); painter.setBrush(kPaper); painter.drawRoundedRect(QRectF(3, 4, 18, 16), 1.5, 1.5); painter.drawLine(QPointF(8, 4), QPointF(8, 20)); painter.setBrush(kAccent); painter.setPen(Qt::NoPen); painter.drawEllipse(QPointF(5.5, 8), 1.1, 1.1); painter.drawEllipse(QPointF(5.5, 12), 1.1, 1.1); painter.setPen(iconPen()); painter.drawLine(QPointF(11, 8), QPointF(18, 8)); painter.drawLine(QPointF(11, 12), QPointF(18, 12)); painter.drawLine(QPointF(11, 16), QPointF(16, 16)); } void drawSave(QPainter &painter) { painter.setPen(iconPen()); painter.setBrush(kPaper); painter.drawRoundedRect(QRectF(4, 3, 16, 18), 1.2, 1.2); painter.drawRect(QRectF(7, 3, 9, 6)); painter.drawRect(QRectF(7, 13, 10, 8)); } void drawContact(QPainter &painter, const QString &label, bool closed) { painter.setPen(iconPen()); painter.drawLine(QPointF(2, 12), QPointF(7, 12)); painter.drawLine(QPointF(17, 12), QPointF(22, 12)); painter.drawLine(QPointF(8, 7), QPointF(8, 17)); painter.drawLine(QPointF(16, 7), QPointF(16, 17)); if (closed) { painter.drawLine(QPointF(7, 17), QPointF(17, 7)); } if (!label.isEmpty()) { drawCenteredText(painter, QRectF(8, 7, 8, 10), label, 5.5); } } void drawCoil(QPainter &painter, const QString &label) { painter.setPen(iconPen()); painter.drawLine(QPointF(2, 12), QPointF(6, 12)); painter.drawLine(QPointF(18, 12), QPointF(22, 12)); QPainterPath left; left.moveTo(11, 5); left.cubicTo(5, 6, 5, 18, 11, 19); painter.drawPath(left); QPainterPath right; right.moveTo(13, 5); right.cubicTo(19, 6, 19, 18, 13, 19); painter.drawPath(right); if (!label.isEmpty()) { drawCenteredText(painter, QRectF(8, 7, 8, 10), label, 6.0); } } void drawInstructionBlock(QPainter &painter, const QString &label) { painter.setPen(iconPen()); painter.setBrush(kPaper); painter.drawRoundedRect(QRectF(2.5, 5, 19, 14), 1.5, 1.5); drawCenteredText(painter, QRectF(3, 5.5, 18, 13), label, 5.5); } QPixmap renderIcon(UiIcon icon, int size) { QPixmap pixmap(size, size); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHint(QPainter::Antialiasing, true); painter.scale(static_cast(size) / 24.0, static_cast(size) / 24.0); painter.setPen(iconPen()); painter.setBrush(Qt::NoBrush); switch (icon) { case UiIcon::Edit: { painter.drawLine(QPointF(5, 19), QPointF(16.5, 7.5)); painter.drawLine(QPointF(8, 20), QPointF(19.5, 8.5)); painter.drawLine(QPointF(16.5, 7.5), QPointF(19.5, 8.5)); painter.drawLine(QPointF(5, 19), QPointF(4, 21)); break; } case UiIcon::RunOffline: { QPainterPath path; path.moveTo(7, 4); path.lineTo(20, 12); path.lineTo(7, 20); path.closeSubpath(); painter.setPen(iconPen(kAccent)); painter.setBrush(kAccentFill); painter.drawPath(path); break; } case UiIcon::RunOnline: { drawPlc(painter); painter.setPen(Qt::NoPen); painter.setBrush(kAccent); QPainterPath path; path.moveTo(14, 10); path.lineTo(19, 13); path.lineTo(14, 16); path.closeSubpath(); painter.drawPath(path); break; } case UiIcon::NewDocument: { QPainterPath page; page.moveTo(5, 2); page.lineTo(15, 2); page.lineTo(20, 7); page.lineTo(20, 22); page.lineTo(5, 22); page.closeSubpath(); painter.setBrush(kPaper); painter.drawPath(page); painter.drawLine(QPointF(15, 2), QPointF(15, 7)); painter.drawLine(QPointF(15, 7), QPointF(20, 7)); painter.drawLine(QPointF(8, 15), QPointF(16, 15)); painter.drawLine(QPointF(12, 11), QPointF(12, 19)); break; } case UiIcon::Save: { drawSave(painter); break; } case UiIcon::SaveAs: { drawSave(painter); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(13, 19), QPointF(21, 11)); break; } case UiIcon::Open: { painter.setBrush(kPaper); QPainterPath folder; folder.moveTo(2, 7); folder.lineTo(9, 7); folder.lineTo(11, 10); folder.lineTo(22, 10); folder.lineTo(19, 20); folder.lineTo(3, 20); folder.closeSubpath(); painter.setBrush(kAccentFill); painter.drawPath(folder); break; } case UiIcon::Undo: case UiIcon::Redo: { const bool redo = icon == UiIcon::Redo; QPainterPath arrow; if (redo) { arrow.moveTo(5, 7); arrow.cubicTo(12, 3, 20, 7, 20, 15); arrow.lineTo(20, 19); painter.drawPath(arrow); painter.drawLine(QPointF(20, 19), QPointF(16, 15)); painter.drawLine(QPointF(20, 19), QPointF(23, 15)); } else { arrow.moveTo(19, 7); arrow.cubicTo(12, 3, 4, 7, 4, 15); arrow.lineTo(4, 19); painter.drawPath(arrow); painter.drawLine(QPointF(4, 19), QPointF(1, 15)); painter.drawLine(QPointF(4, 19), QPointF(8, 15)); } break; } case UiIcon::Exit: { painter.drawRect(QRectF(4, 3, 10, 18)); painter.drawLine(QPointF(10, 12), QPointF(22, 12)); painter.drawLine(QPointF(18, 8), QPointF(22, 12)); painter.drawLine(QPointF(18, 16), QPointF(22, 12)); break; } case UiIcon::PlcSettings: { drawPlc(painter); painter.setPen(iconPen(kAccent)); painter.drawEllipse(QPointF(17.5, 16.5), 3.0, 3.0); painter.drawLine(QPointF(17.5, 12), QPointF(17.5, 14)); painter.drawLine(QPointF(17.5, 19), QPointF(17.5, 21)); break; } case UiIcon::Disconnect: { painter.drawLine(QPointF(3, 12), QPointF(8, 12)); painter.drawRect(QRectF(8, 8, 4, 8)); painter.drawLine(QPointF(12, 10), QPointF(15, 10)); painter.drawLine(QPointF(12, 14), QPointF(15, 14)); painter.drawRect(QRectF(16, 8, 4, 8)); painter.drawLine(QPointF(20, 12), QPointF(23, 12)); painter.setPen(iconPen(kDanger, 2.0)); painter.drawLine(QPointF(6, 20), QPointF(19, 4)); break; } case UiIcon::RegisterComments: { painter.drawRoundedRect(QRectF(3, 3, 18, 18), 1.5, 1.5); drawCenteredText(painter, QRectF(4, 4, 8, 7), QStringLiteral("M"), 5.0); drawCenteredText(painter, QRectF(4, 12, 8, 7), QStringLiteral("D"), 5.0); painter.drawLine(QPointF(13, 8), QPointF(19, 8)); painter.drawLine(QPointF(13, 16), QPointF(19, 16)); break; } case UiIcon::HmiButton: { painter.setBrush(kAccentFill); painter.drawRoundedRect(QRectF(3, 5, 18, 14), 3, 3); painter.setBrush(kPaper); painter.drawEllipse(QPointF(12, 12), 4, 4); break; } case UiIcon::Indicator: { painter.setBrush(kAccentFill); painter.drawEllipse(QPointF(12, 12), 8.5, 8.5); painter.setBrush(kAccent); painter.setPen(Qt::NoPen); painter.drawEllipse(QPointF(12, 12), 4.5, 4.5); break; } case UiIcon::NumericDisplay: { painter.drawRoundedRect(QRectF(2, 5, 20, 14), 2, 2); drawCenteredText(painter, QRectF(3, 6, 18, 12), QStringLiteral("123"), 6.0); break; } case UiIcon::NumericInput: { painter.drawRoundedRect(QRectF(2, 5, 20, 14), 2, 2); drawCenteredText(painter, QRectF(3, 6, 13, 12), QStringLiteral("12"), 6.0); painter.drawLine(QPointF(18, 7), QPointF(18, 17)); break; } case UiIcon::Text: { painter.drawLine(QPointF(5, 5), QPointF(19, 5)); painter.drawLine(QPointF(12, 5), QPointF(12, 20)); drawCenteredText(painter, QRectF(7, 6, 10, 14), QStringLiteral("T"), 9.0); break; } case UiIcon::PageJump: { painter.drawRect(QRectF(3, 3, 14, 18)); painter.drawLine(QPointF(9, 12), QPointF(22, 12)); painter.drawLine(QPointF(18, 8), QPointF(22, 12)); painter.drawLine(QPointF(18, 16), QPointF(22, 12)); break; } case UiIcon::AlarmList: { QPainterPath triangle; triangle.moveTo(12, 3); triangle.lineTo(22, 21); triangle.lineTo(2, 21); triangle.closeSubpath(); painter.setPen(iconPen(kWarning)); painter.setBrush(QColor(QStringLiteral("#fff0d2"))); painter.drawPath(triangle); painter.drawLine(QPointF(12, 8), QPointF(12, 14)); painter.drawPoint(QPointF(12, 17)); break; } case UiIcon::AlarmSettings: { painter.setPen(iconPen(kWarning)); painter.drawArc(QRectF(4, 4, 12, 13), 0, 180 * 16); painter.drawLine(QPointF(4, 10), QPointF(4, 17)); painter.drawLine(QPointF(16, 10), QPointF(16, 17)); painter.drawLine(QPointF(3, 17), QPointF(17, 17)); painter.drawEllipse(QPointF(18, 17), 3.0, 3.0); painter.drawLine(QPointF(18, 12), QPointF(18, 14)); break; } case UiIcon::Delete: { painter.setPen(iconPen(kDanger)); painter.drawLine(QPointF(5, 7), QPointF(19, 7)); painter.drawLine(QPointF(9, 4), QPointF(15, 4)); painter.drawRoundedRect(QRectF(7, 7, 10, 14), 1, 1); painter.drawLine(QPointF(10, 10), QPointF(10, 18)); painter.drawLine(QPointF(14, 10), QPointF(14, 18)); break; } case UiIcon::AddRung: { painter.drawLine(QPointF(4, 3), QPointF(4, 21)); painter.drawLine(QPointF(20, 3), QPointF(20, 21)); painter.drawLine(QPointF(4, 12), QPointF(20, 12)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(12, 7), QPointF(12, 17)); painter.drawLine(QPointF(7, 12), QPointF(17, 12)); break; } case UiIcon::MouseDrawWire: { painter.drawLine(QPointF(3, 16), QPointF(18, 16)); painter.drawLine(QPointF(18, 16), QPointF(18, 6)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(6, 12), QPointF(6, 20)); painter.drawLine(QPointF(2, 16), QPointF(10, 16)); break; } case UiIcon::MouseEraseWire: { painter.drawLine(QPointF(3, 16), QPointF(21, 16)); painter.drawLine(QPointF(15, 16), QPointF(15, 6)); painter.setPen(iconPen(kDanger, 2.2)); painter.drawLine(QPointF(6, 20), QPointF(20, 5)); break; } case UiIcon::HorizontalWire: { painter.drawLine(QPointF(3, 12), QPointF(21, 12)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(9, 7), QPointF(15, 7)); painter.drawLine(QPointF(12, 4), QPointF(12, 10)); break; } case UiIcon::VerticalWire: { painter.drawLine(QPointF(5, 7), QPointF(19, 7)); painter.drawLine(QPointF(5, 17), QPointF(19, 17)); painter.drawLine(QPointF(12, 7), QPointF(12, 17)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(17, 9), QPointF(17, 15)); painter.drawLine(QPointF(14, 12), QPointF(20, 12)); break; } case UiIcon::ParallelBranch: { painter.drawLine(QPointF(2, 12), QPointF(6, 12)); painter.drawLine(QPointF(18, 12), QPointF(22, 12)); painter.drawLine(QPointF(6, 7), QPointF(6, 17)); painter.drawLine(QPointF(18, 7), QPointF(18, 17)); painter.drawLine(QPointF(6, 7), QPointF(18, 7)); painter.drawLine(QPointF(6, 17), QPointF(18, 17)); painter.setPen(iconPen(kAccent)); painter.drawLine(QPointF(12, 9), QPointF(12, 15)); painter.drawLine(QPointF(9, 12), QPointF(15, 12)); break; } case UiIcon::NormallyOpenContact: { drawContact(painter, {}, false); break; } case UiIcon::NormallyClosedContact: { drawContact(painter, {}, true); break; } case UiIcon::RisingEdgeContact: { drawContact(painter, QStringLiteral("P"), false); break; } case UiIcon::FallingEdgeContact: { drawContact(painter, QStringLiteral("N"), false); break; } case UiIcon::Coil: { drawCoil(painter, {}); break; } case UiIcon::SetCoil: { drawCoil(painter, QStringLiteral("S")); break; } case UiIcon::ResetCoil: { drawCoil(painter, QStringLiteral("R")); break; } case UiIcon::Move: { painter.drawRect(QRectF(2, 6, 6, 12)); painter.drawRect(QRectF(16, 6, 6, 12)); painter.drawLine(QPointF(8, 12), QPointF(16, 12)); painter.drawLine(QPointF(13, 9), QPointF(16, 12)); painter.drawLine(QPointF(13, 15), QPointF(16, 12)); break; } case UiIcon::Add: { drawInstructionBlock(painter, QStringLiteral("+")); break; } case UiIcon::Subtract: { drawInstructionBlock(painter, QStringLiteral("-")); break; } case UiIcon::Compare: { drawInstructionBlock(painter, QStringLiteral("<>")); break; } case UiIcon::Comment: { painter.drawRoundedRect(QRectF(3, 3, 18, 18), 1.5, 1.5); painter.drawLine(QPointF(7, 8), QPointF(17, 8)); painter.drawLine(QPointF(7, 12), QPointF(17, 12)); painter.drawLine(QPointF(7, 16), QPointF(13, 16)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(14, 19), QPointF(21, 12)); break; } case UiIcon::More: { painter.setPen(Qt::NoPen); painter.setBrush(kInk); painter.drawEllipse(QPointF(6, 12), 1.7, 1.7); painter.drawEllipse(QPointF(12, 12), 1.7, 1.7); painter.drawEllipse(QPointF(18, 12), 1.7, 1.7); break; } case UiIcon::SyntaxCheck: { painter.drawLine(QPointF(3, 3), QPointF(3, 21)); painter.drawLine(QPointF(3, 8), QPointF(13, 8)); painter.drawLine(QPointF(3, 16), QPointF(10, 16)); painter.setPen(iconPen(kAccent, 2.0)); painter.drawLine(QPointF(11, 15), QPointF(15, 19)); painter.drawLine(QPointF(15, 19), QPointF(22, 9)); break; } case UiIcon::HmiPage: { painter.drawRoundedRect(QRectF(2, 4, 20, 14), 1.5, 1.5); painter.drawLine(QPointF(8, 21), QPointF(16, 21)); painter.drawLine(QPointF(12, 18), QPointF(12, 21)); painter.setBrush(kAccentFill); painter.drawRoundedRect(QRectF(6, 8, 12, 6), 1, 1); break; } case UiIcon::Logic: { painter.drawLine(QPointF(3, 3), QPointF(3, 21)); painter.drawLine(QPointF(21, 3), QPointF(21, 21)); drawContact(painter, {}, false); break; } case UiIcon::Runtime: { painter.drawRoundedRect(QRectF(2, 4, 20, 16), 1.5, 1.5); QPainterPath pulse; pulse.moveTo(4, 13); pulse.lineTo(8, 13); pulse.lineTo(10, 8); pulse.lineTo(13, 17); pulse.lineTo(16, 11); pulse.lineTo(20, 11); painter.setPen(iconPen(kAccent)); painter.drawPath(pulse); break; } case UiIcon::ClearList: { painter.drawLine(QPointF(4, 6), QPointF(16, 6)); painter.drawLine(QPointF(4, 11), QPointF(13, 11)); painter.drawLine(QPointF(4, 16), QPointF(10, 16)); painter.setPen(iconPen(kDanger)); painter.drawLine(QPointF(14, 13), QPointF(21, 20)); painter.drawLine(QPointF(21, 13), QPointF(14, 20)); break; } } return pixmap; } } // namespace QIcon makeUiIcon(UiIcon icon) { QIcon result; constexpr std::array sizes{16, 24, 32}; for (int size : sizes) { result.addPixmap(renderIcon(icon, size)); } return result; }