综合平台编程器项目的远程存储
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

546 строки
17 KiB

  1. #include "toolbar_icon_factory.h"
  2. #include <QFont>
  3. #include <QPainter>
  4. #include <QPainterPath>
  5. #include <QPixmap>
  6. #include <array>
  7. namespace {
  8. const QColor kInk(QStringLiteral("#263842"));
  9. const QColor kAccent(QStringLiteral("#2f7d4a"));
  10. const QColor kAccentFill(QStringLiteral("#dcece3"));
  11. const QColor kWarning(QStringLiteral("#b87808"));
  12. const QColor kDanger(QStringLiteral("#a84545"));
  13. const QColor kPaper(QStringLiteral("#ffffff"));
  14. QPen iconPen(const QColor &color = kInk, qreal width = 1.7)
  15. {
  16. QPen pen(color, width);
  17. pen.setCapStyle(Qt::RoundCap);
  18. pen.setJoinStyle(Qt::RoundJoin);
  19. return pen;
  20. }
  21. void drawCenteredText(
  22. QPainter &painter,
  23. const QRectF &bounds,
  24. const QString &text,
  25. qreal point_size,
  26. const QColor &color = kInk)
  27. {
  28. QFont font = painter.font();
  29. font.setFamily(QStringLiteral("Arial"));
  30. font.setPointSizeF(point_size);
  31. font.setBold(true);
  32. painter.setFont(font);
  33. painter.setPen(color);
  34. painter.drawText(bounds, Qt::AlignCenter, text);
  35. }
  36. void drawPlc(QPainter &painter)
  37. {
  38. painter.setPen(iconPen());
  39. painter.setBrush(kPaper);
  40. painter.drawRoundedRect(QRectF(3, 4, 18, 16), 1.5, 1.5);
  41. painter.drawLine(QPointF(8, 4), QPointF(8, 20));
  42. painter.setBrush(kAccent);
  43. painter.setPen(Qt::NoPen);
  44. painter.drawEllipse(QPointF(5.5, 8), 1.1, 1.1);
  45. painter.drawEllipse(QPointF(5.5, 12), 1.1, 1.1);
  46. painter.setPen(iconPen());
  47. painter.drawLine(QPointF(11, 8), QPointF(18, 8));
  48. painter.drawLine(QPointF(11, 12), QPointF(18, 12));
  49. painter.drawLine(QPointF(11, 16), QPointF(16, 16));
  50. }
  51. void drawSave(QPainter &painter)
  52. {
  53. painter.setPen(iconPen());
  54. painter.setBrush(kPaper);
  55. painter.drawRoundedRect(QRectF(4, 3, 16, 18), 1.2, 1.2);
  56. painter.drawRect(QRectF(7, 3, 9, 6));
  57. painter.drawRect(QRectF(7, 13, 10, 8));
  58. }
  59. void drawContact(QPainter &painter, const QString &label, bool closed)
  60. {
  61. painter.setPen(iconPen());
  62. painter.drawLine(QPointF(2, 12), QPointF(7, 12));
  63. painter.drawLine(QPointF(17, 12), QPointF(22, 12));
  64. painter.drawLine(QPointF(8, 7), QPointF(8, 17));
  65. painter.drawLine(QPointF(16, 7), QPointF(16, 17));
  66. if (closed)
  67. {
  68. painter.drawLine(QPointF(7, 17), QPointF(17, 7));
  69. }
  70. if (!label.isEmpty())
  71. {
  72. drawCenteredText(painter, QRectF(8, 7, 8, 10), label, 5.5);
  73. }
  74. }
  75. void drawCoil(QPainter &painter, const QString &label)
  76. {
  77. painter.setPen(iconPen());
  78. painter.drawLine(QPointF(2, 12), QPointF(6, 12));
  79. painter.drawLine(QPointF(18, 12), QPointF(22, 12));
  80. QPainterPath left;
  81. left.moveTo(11, 5);
  82. left.cubicTo(5, 6, 5, 18, 11, 19);
  83. painter.drawPath(left);
  84. QPainterPath right;
  85. right.moveTo(13, 5);
  86. right.cubicTo(19, 6, 19, 18, 13, 19);
  87. painter.drawPath(right);
  88. if (!label.isEmpty())
  89. {
  90. drawCenteredText(painter, QRectF(8, 7, 8, 10), label, 6.0);
  91. }
  92. }
  93. void drawInstructionBlock(QPainter &painter, const QString &label)
  94. {
  95. painter.setPen(iconPen());
  96. painter.setBrush(kPaper);
  97. painter.drawRoundedRect(QRectF(2.5, 5, 19, 14), 1.5, 1.5);
  98. drawCenteredText(painter, QRectF(3, 5.5, 18, 13), label, 5.5);
  99. }
  100. QPixmap renderIcon(UiIcon icon, int size)
  101. {
  102. QPixmap pixmap(size, size);
  103. pixmap.fill(Qt::transparent);
  104. QPainter painter(&pixmap);
  105. painter.setRenderHint(QPainter::Antialiasing, true);
  106. painter.scale(static_cast<qreal>(size) / 24.0, static_cast<qreal>(size) / 24.0);
  107. painter.setPen(iconPen());
  108. painter.setBrush(Qt::NoBrush);
  109. switch (icon)
  110. {
  111. case UiIcon::Edit:
  112. {
  113. painter.drawLine(QPointF(5, 19), QPointF(16.5, 7.5));
  114. painter.drawLine(QPointF(8, 20), QPointF(19.5, 8.5));
  115. painter.drawLine(QPointF(16.5, 7.5), QPointF(19.5, 8.5));
  116. painter.drawLine(QPointF(5, 19), QPointF(4, 21));
  117. break;
  118. }
  119. case UiIcon::RunOffline:
  120. {
  121. QPainterPath path;
  122. path.moveTo(7, 4);
  123. path.lineTo(20, 12);
  124. path.lineTo(7, 20);
  125. path.closeSubpath();
  126. painter.setPen(iconPen(kAccent));
  127. painter.setBrush(kAccentFill);
  128. painter.drawPath(path);
  129. break;
  130. }
  131. case UiIcon::RunOnline:
  132. {
  133. drawPlc(painter);
  134. painter.setPen(Qt::NoPen);
  135. painter.setBrush(kAccent);
  136. QPainterPath path;
  137. path.moveTo(14, 10);
  138. path.lineTo(19, 13);
  139. path.lineTo(14, 16);
  140. path.closeSubpath();
  141. painter.drawPath(path);
  142. break;
  143. }
  144. case UiIcon::NewDocument:
  145. {
  146. QPainterPath page;
  147. page.moveTo(5, 2);
  148. page.lineTo(15, 2);
  149. page.lineTo(20, 7);
  150. page.lineTo(20, 22);
  151. page.lineTo(5, 22);
  152. page.closeSubpath();
  153. painter.setBrush(kPaper);
  154. painter.drawPath(page);
  155. painter.drawLine(QPointF(15, 2), QPointF(15, 7));
  156. painter.drawLine(QPointF(15, 7), QPointF(20, 7));
  157. painter.drawLine(QPointF(8, 15), QPointF(16, 15));
  158. painter.drawLine(QPointF(12, 11), QPointF(12, 19));
  159. break;
  160. }
  161. case UiIcon::Save:
  162. {
  163. drawSave(painter);
  164. break;
  165. }
  166. case UiIcon::SaveAs:
  167. {
  168. drawSave(painter);
  169. painter.setPen(iconPen(kAccent, 2.0));
  170. painter.drawLine(QPointF(13, 19), QPointF(21, 11));
  171. break;
  172. }
  173. case UiIcon::Open:
  174. {
  175. painter.setBrush(kPaper);
  176. QPainterPath folder;
  177. folder.moveTo(2, 7);
  178. folder.lineTo(9, 7);
  179. folder.lineTo(11, 10);
  180. folder.lineTo(22, 10);
  181. folder.lineTo(19, 20);
  182. folder.lineTo(3, 20);
  183. folder.closeSubpath();
  184. painter.setBrush(kAccentFill);
  185. painter.drawPath(folder);
  186. break;
  187. }
  188. case UiIcon::Undo:
  189. case UiIcon::Redo:
  190. {
  191. const bool redo = icon == UiIcon::Redo;
  192. QPainterPath arrow;
  193. if (redo)
  194. {
  195. arrow.moveTo(5, 7);
  196. arrow.cubicTo(12, 3, 20, 7, 20, 15);
  197. arrow.lineTo(20, 19);
  198. painter.drawPath(arrow);
  199. painter.drawLine(QPointF(20, 19), QPointF(16, 15));
  200. painter.drawLine(QPointF(20, 19), QPointF(23, 15));
  201. }
  202. else
  203. {
  204. arrow.moveTo(19, 7);
  205. arrow.cubicTo(12, 3, 4, 7, 4, 15);
  206. arrow.lineTo(4, 19);
  207. painter.drawPath(arrow);
  208. painter.drawLine(QPointF(4, 19), QPointF(1, 15));
  209. painter.drawLine(QPointF(4, 19), QPointF(8, 15));
  210. }
  211. break;
  212. }
  213. case UiIcon::Exit:
  214. {
  215. painter.drawRect(QRectF(4, 3, 10, 18));
  216. painter.drawLine(QPointF(10, 12), QPointF(22, 12));
  217. painter.drawLine(QPointF(18, 8), QPointF(22, 12));
  218. painter.drawLine(QPointF(18, 16), QPointF(22, 12));
  219. break;
  220. }
  221. case UiIcon::PlcSettings:
  222. {
  223. drawPlc(painter);
  224. painter.setPen(iconPen(kAccent));
  225. painter.drawEllipse(QPointF(17.5, 16.5), 3.0, 3.0);
  226. painter.drawLine(QPointF(17.5, 12), QPointF(17.5, 14));
  227. painter.drawLine(QPointF(17.5, 19), QPointF(17.5, 21));
  228. break;
  229. }
  230. case UiIcon::Disconnect:
  231. {
  232. painter.drawLine(QPointF(3, 12), QPointF(8, 12));
  233. painter.drawRect(QRectF(8, 8, 4, 8));
  234. painter.drawLine(QPointF(12, 10), QPointF(15, 10));
  235. painter.drawLine(QPointF(12, 14), QPointF(15, 14));
  236. painter.drawRect(QRectF(16, 8, 4, 8));
  237. painter.drawLine(QPointF(20, 12), QPointF(23, 12));
  238. painter.setPen(iconPen(kDanger, 2.0));
  239. painter.drawLine(QPointF(6, 20), QPointF(19, 4));
  240. break;
  241. }
  242. case UiIcon::RegisterComments:
  243. {
  244. painter.drawRoundedRect(QRectF(3, 3, 18, 18), 1.5, 1.5);
  245. drawCenteredText(painter, QRectF(4, 4, 8, 7), QStringLiteral("M"), 5.0);
  246. drawCenteredText(painter, QRectF(4, 12, 8, 7), QStringLiteral("D"), 5.0);
  247. painter.drawLine(QPointF(13, 8), QPointF(19, 8));
  248. painter.drawLine(QPointF(13, 16), QPointF(19, 16));
  249. break;
  250. }
  251. case UiIcon::HmiButton:
  252. {
  253. painter.setBrush(kAccentFill);
  254. painter.drawRoundedRect(QRectF(3, 5, 18, 14), 3, 3);
  255. painter.setBrush(kPaper);
  256. painter.drawEllipse(QPointF(12, 12), 4, 4);
  257. break;
  258. }
  259. case UiIcon::Indicator:
  260. {
  261. painter.setBrush(kAccentFill);
  262. painter.drawEllipse(QPointF(12, 12), 8.5, 8.5);
  263. painter.setBrush(kAccent);
  264. painter.setPen(Qt::NoPen);
  265. painter.drawEllipse(QPointF(12, 12), 4.5, 4.5);
  266. break;
  267. }
  268. case UiIcon::NumericDisplay:
  269. {
  270. painter.drawRoundedRect(QRectF(2, 5, 20, 14), 2, 2);
  271. drawCenteredText(painter, QRectF(3, 6, 18, 12), QStringLiteral("123"), 6.0);
  272. break;
  273. }
  274. case UiIcon::NumericInput:
  275. {
  276. painter.drawRoundedRect(QRectF(2, 5, 20, 14), 2, 2);
  277. drawCenteredText(painter, QRectF(3, 6, 13, 12), QStringLiteral("12"), 6.0);
  278. painter.drawLine(QPointF(18, 7), QPointF(18, 17));
  279. break;
  280. }
  281. case UiIcon::Text:
  282. {
  283. painter.drawLine(QPointF(5, 5), QPointF(19, 5));
  284. painter.drawLine(QPointF(12, 5), QPointF(12, 20));
  285. drawCenteredText(painter, QRectF(7, 6, 10, 14), QStringLiteral("T"), 9.0);
  286. break;
  287. }
  288. case UiIcon::PageJump:
  289. {
  290. painter.drawRect(QRectF(3, 3, 14, 18));
  291. painter.drawLine(QPointF(9, 12), QPointF(22, 12));
  292. painter.drawLine(QPointF(18, 8), QPointF(22, 12));
  293. painter.drawLine(QPointF(18, 16), QPointF(22, 12));
  294. break;
  295. }
  296. case UiIcon::AlarmList:
  297. {
  298. QPainterPath triangle;
  299. triangle.moveTo(12, 3);
  300. triangle.lineTo(22, 21);
  301. triangle.lineTo(2, 21);
  302. triangle.closeSubpath();
  303. painter.setPen(iconPen(kWarning));
  304. painter.setBrush(QColor(QStringLiteral("#fff0d2")));
  305. painter.drawPath(triangle);
  306. painter.drawLine(QPointF(12, 8), QPointF(12, 14));
  307. painter.drawPoint(QPointF(12, 17));
  308. break;
  309. }
  310. case UiIcon::AlarmSettings:
  311. {
  312. painter.setPen(iconPen(kWarning));
  313. painter.drawArc(QRectF(4, 4, 12, 13), 0, 180 * 16);
  314. painter.drawLine(QPointF(4, 10), QPointF(4, 17));
  315. painter.drawLine(QPointF(16, 10), QPointF(16, 17));
  316. painter.drawLine(QPointF(3, 17), QPointF(17, 17));
  317. painter.drawEllipse(QPointF(18, 17), 3.0, 3.0);
  318. painter.drawLine(QPointF(18, 12), QPointF(18, 14));
  319. break;
  320. }
  321. case UiIcon::Delete:
  322. {
  323. painter.setPen(iconPen(kDanger));
  324. painter.drawLine(QPointF(5, 7), QPointF(19, 7));
  325. painter.drawLine(QPointF(9, 4), QPointF(15, 4));
  326. painter.drawRoundedRect(QRectF(7, 7, 10, 14), 1, 1);
  327. painter.drawLine(QPointF(10, 10), QPointF(10, 18));
  328. painter.drawLine(QPointF(14, 10), QPointF(14, 18));
  329. break;
  330. }
  331. case UiIcon::AddRung:
  332. {
  333. painter.drawLine(QPointF(4, 3), QPointF(4, 21));
  334. painter.drawLine(QPointF(20, 3), QPointF(20, 21));
  335. painter.drawLine(QPointF(4, 12), QPointF(20, 12));
  336. painter.setPen(iconPen(kAccent, 2.0));
  337. painter.drawLine(QPointF(12, 7), QPointF(12, 17));
  338. painter.drawLine(QPointF(7, 12), QPointF(17, 12));
  339. break;
  340. }
  341. case UiIcon::MouseDrawWire:
  342. {
  343. painter.drawLine(QPointF(3, 16), QPointF(18, 16));
  344. painter.drawLine(QPointF(18, 16), QPointF(18, 6));
  345. painter.setPen(iconPen(kAccent, 2.0));
  346. painter.drawLine(QPointF(6, 12), QPointF(6, 20));
  347. painter.drawLine(QPointF(2, 16), QPointF(10, 16));
  348. break;
  349. }
  350. case UiIcon::MouseEraseWire:
  351. {
  352. painter.drawLine(QPointF(3, 16), QPointF(21, 16));
  353. painter.drawLine(QPointF(15, 16), QPointF(15, 6));
  354. painter.setPen(iconPen(kDanger, 2.2));
  355. painter.drawLine(QPointF(6, 20), QPointF(20, 5));
  356. break;
  357. }
  358. case UiIcon::HorizontalWire:
  359. {
  360. painter.drawLine(QPointF(3, 12), QPointF(21, 12));
  361. painter.setPen(iconPen(kAccent, 2.0));
  362. painter.drawLine(QPointF(9, 7), QPointF(15, 7));
  363. painter.drawLine(QPointF(12, 4), QPointF(12, 10));
  364. break;
  365. }
  366. case UiIcon::VerticalWire:
  367. {
  368. painter.drawLine(QPointF(5, 7), QPointF(19, 7));
  369. painter.drawLine(QPointF(5, 17), QPointF(19, 17));
  370. painter.drawLine(QPointF(12, 7), QPointF(12, 17));
  371. painter.setPen(iconPen(kAccent, 2.0));
  372. painter.drawLine(QPointF(17, 9), QPointF(17, 15));
  373. painter.drawLine(QPointF(14, 12), QPointF(20, 12));
  374. break;
  375. }
  376. case UiIcon::ParallelBranch:
  377. {
  378. painter.drawLine(QPointF(2, 12), QPointF(6, 12));
  379. painter.drawLine(QPointF(18, 12), QPointF(22, 12));
  380. painter.drawLine(QPointF(6, 7), QPointF(6, 17));
  381. painter.drawLine(QPointF(18, 7), QPointF(18, 17));
  382. painter.drawLine(QPointF(6, 7), QPointF(18, 7));
  383. painter.drawLine(QPointF(6, 17), QPointF(18, 17));
  384. painter.setPen(iconPen(kAccent));
  385. painter.drawLine(QPointF(12, 9), QPointF(12, 15));
  386. painter.drawLine(QPointF(9, 12), QPointF(15, 12));
  387. break;
  388. }
  389. case UiIcon::NormallyOpenContact:
  390. {
  391. drawContact(painter, {}, false);
  392. break;
  393. }
  394. case UiIcon::NormallyClosedContact:
  395. {
  396. drawContact(painter, {}, true);
  397. break;
  398. }
  399. case UiIcon::RisingEdgeContact:
  400. {
  401. drawContact(painter, QStringLiteral("P"), false);
  402. break;
  403. }
  404. case UiIcon::FallingEdgeContact:
  405. {
  406. drawContact(painter, QStringLiteral("N"), false);
  407. break;
  408. }
  409. case UiIcon::Coil:
  410. {
  411. drawCoil(painter, {});
  412. break;
  413. }
  414. case UiIcon::SetCoil:
  415. {
  416. drawCoil(painter, QStringLiteral("S"));
  417. break;
  418. }
  419. case UiIcon::ResetCoil:
  420. {
  421. drawCoil(painter, QStringLiteral("R"));
  422. break;
  423. }
  424. case UiIcon::Move:
  425. {
  426. painter.drawRect(QRectF(2, 6, 6, 12));
  427. painter.drawRect(QRectF(16, 6, 6, 12));
  428. painter.drawLine(QPointF(8, 12), QPointF(16, 12));
  429. painter.drawLine(QPointF(13, 9), QPointF(16, 12));
  430. painter.drawLine(QPointF(13, 15), QPointF(16, 12));
  431. break;
  432. }
  433. case UiIcon::Add:
  434. {
  435. drawInstructionBlock(painter, QStringLiteral("+"));
  436. break;
  437. }
  438. case UiIcon::Subtract:
  439. {
  440. drawInstructionBlock(painter, QStringLiteral("-"));
  441. break;
  442. }
  443. case UiIcon::Compare:
  444. {
  445. drawInstructionBlock(painter, QStringLiteral("<>"));
  446. break;
  447. }
  448. case UiIcon::Comment:
  449. {
  450. painter.drawRoundedRect(QRectF(3, 3, 18, 18), 1.5, 1.5);
  451. painter.drawLine(QPointF(7, 8), QPointF(17, 8));
  452. painter.drawLine(QPointF(7, 12), QPointF(17, 12));
  453. painter.drawLine(QPointF(7, 16), QPointF(13, 16));
  454. painter.setPen(iconPen(kAccent, 2.0));
  455. painter.drawLine(QPointF(14, 19), QPointF(21, 12));
  456. break;
  457. }
  458. case UiIcon::More:
  459. {
  460. painter.setPen(Qt::NoPen);
  461. painter.setBrush(kInk);
  462. painter.drawEllipse(QPointF(6, 12), 1.7, 1.7);
  463. painter.drawEllipse(QPointF(12, 12), 1.7, 1.7);
  464. painter.drawEllipse(QPointF(18, 12), 1.7, 1.7);
  465. break;
  466. }
  467. case UiIcon::SyntaxCheck:
  468. {
  469. painter.drawLine(QPointF(3, 3), QPointF(3, 21));
  470. painter.drawLine(QPointF(3, 8), QPointF(13, 8));
  471. painter.drawLine(QPointF(3, 16), QPointF(10, 16));
  472. painter.setPen(iconPen(kAccent, 2.0));
  473. painter.drawLine(QPointF(11, 15), QPointF(15, 19));
  474. painter.drawLine(QPointF(15, 19), QPointF(22, 9));
  475. break;
  476. }
  477. case UiIcon::HmiPage:
  478. {
  479. painter.drawRoundedRect(QRectF(2, 4, 20, 14), 1.5, 1.5);
  480. painter.drawLine(QPointF(8, 21), QPointF(16, 21));
  481. painter.drawLine(QPointF(12, 18), QPointF(12, 21));
  482. painter.setBrush(kAccentFill);
  483. painter.drawRoundedRect(QRectF(6, 8, 12, 6), 1, 1);
  484. break;
  485. }
  486. case UiIcon::Logic:
  487. {
  488. painter.drawLine(QPointF(3, 3), QPointF(3, 21));
  489. painter.drawLine(QPointF(21, 3), QPointF(21, 21));
  490. drawContact(painter, {}, false);
  491. break;
  492. }
  493. case UiIcon::Runtime:
  494. {
  495. painter.drawRoundedRect(QRectF(2, 4, 20, 16), 1.5, 1.5);
  496. QPainterPath pulse;
  497. pulse.moveTo(4, 13);
  498. pulse.lineTo(8, 13);
  499. pulse.lineTo(10, 8);
  500. pulse.lineTo(13, 17);
  501. pulse.lineTo(16, 11);
  502. pulse.lineTo(20, 11);
  503. painter.setPen(iconPen(kAccent));
  504. painter.drawPath(pulse);
  505. break;
  506. }
  507. case UiIcon::ClearList:
  508. {
  509. painter.drawLine(QPointF(4, 6), QPointF(16, 6));
  510. painter.drawLine(QPointF(4, 11), QPointF(13, 11));
  511. painter.drawLine(QPointF(4, 16), QPointF(10, 16));
  512. painter.setPen(iconPen(kDanger));
  513. painter.drawLine(QPointF(14, 13), QPointF(21, 20));
  514. painter.drawLine(QPointF(21, 13), QPointF(14, 20));
  515. break;
  516. }
  517. }
  518. return pixmap;
  519. }
  520. } // namespace
  521. QIcon makeUiIcon(UiIcon icon)
  522. {
  523. QIcon result;
  524. constexpr std::array<int, 3> sizes{16, 24, 32};
  525. for (int size : sizes)
  526. {
  527. result.addPixmap(renderIcon(icon, size));
  528. }
  529. return result;
  530. }