|
- #include "toolbar_icon_factory.h"
-
- #include <QFont>
- #include <QPainter>
- #include <QPainterPath>
- #include <QPixmap>
-
- #include <array>
-
- 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<qreal>(size) / 24.0, static_cast<qreal>(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<int, 3> sizes{16, 24, 32};
- for (int size : sizes)
- {
- result.addPixmap(renderIcon(icon, size));
- }
- return result;
- }
|