FlagsViewer.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "FlagsViewer.h"
  2. #include <QPainter>
  3. #include <QPaintEvent>
  4. FlagsViewer::FlagsViewer(QWidget* parent)
  5. : QFrame(parent)
  6. {
  7. flags = flagsChanged = 0; // avoid UMR
  8. setFrameStyle(WinPanel | Sunken);
  9. setFocusPolicy(Qt::StrongFocus);
  10. setBackgroundRole(QPalette::Base);
  11. setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
  12. frameR = frameL = frameT = frameB = frameWidth();
  13. }
  14. void FlagsViewer::resizeEvent(QResizeEvent* e)
  15. {
  16. QFrame::resizeEvent(e);
  17. }
  18. void FlagsViewer::paintEvent(QPaintEvent* e)
  19. {
  20. const char* const flagNames[8] =
  21. { "C" , "N", "P" , "", "H", "", "Z" , "S" };
  22. const char* const flagOn[8] =
  23. { "(C)" , "" , "(PE)", "", "", "", "(Z)" , "(M)" };
  24. const char* const flagOff[8] =
  25. { "(NC)", "" , "(PO)", "", "", "", "(NZ)", "(P)" };
  26. // call parent for drawing the actual frame
  27. QFrame::paintEvent(e);
  28. QPainter p(this);
  29. p.setPen(palette().color(QPalette::Text));
  30. // calc and set drawing bounds
  31. QRect r(e->rect());
  32. if (r.left() < frameL) r.setLeft(frameL);
  33. if (r.top() < frameT) r.setTop (frameT);
  34. if (r.right() > width() - frameR - 1) r.setRight (width() - frameR - 1);
  35. if (r.bottom() > height() - frameB - 1) r.setBottom(height() - frameB - 1);
  36. p.setClipRect(r);
  37. // redraw background
  38. p.fillRect(r, palette().color(QPalette::Base));
  39. int h = fontMetrics().height();
  40. int flagWidth = fontMetrics().width("ZW");
  41. int valWidth = fontMetrics().width("0 ");
  42. int d = fontMetrics().descent();
  43. int y = frameT + h - 1 - d;
  44. for (int flag = 7; flag >= 0; --flag) {
  45. int x = frameL + 4;
  46. p.drawText(x, y, flagNames[flag]);
  47. x += flagWidth;
  48. int bit = 1 << flag;
  49. drawValue(p, x, y, (flags & bit) ? "1" : "0", flagsChanged & bit);
  50. x += valWidth;
  51. p.drawText(x, y, (flags & bit) ? flagOn[flag] : flagOff[flag]);
  52. y += h;
  53. }
  54. }
  55. QSize FlagsViewer::sizeHint() const
  56. {
  57. return QSize(frameL + 4 + fontMetrics().width("ZW0 (PE) ") + 4 + frameR,
  58. frameT + 8 * fontMetrics().height() + frameB);
  59. }
  60. void FlagsViewer::drawValue(QPainter& p, int x, int y, const QString& str,
  61. bool changed)
  62. {
  63. if (changed) {
  64. p.setPen(Qt::red);
  65. }
  66. p.drawText(x, y, str);
  67. if (changed) {
  68. p.setPen(palette().color(QPalette::Text));
  69. }
  70. }
  71. void FlagsViewer::setFlags(quint8 newFlags)
  72. {
  73. flagsChanged = flags ^ newFlags;
  74. flags = newFlags;
  75. update();
  76. }