Engauge Digitizer  2
CursorFactory.cpp
1 #include "CursorFactory.h"
2 #include "CursorSize.h"
3 #include "DocumentModelDigitizeCurve.h"
4 #include <QBitmap>
5 #include <QPainter>
6 #include <QPixmap>
7 
9 {
10 }
11 
12 QCursor CursorFactory::generate (const DocumentModelDigitizeCurve &modelDigitizeCurve) const
13 {
14  // To prevent hideous drawing errors when the line is thicker, we
15  // leave a padding region around the outside equal in size to the line width
16  int innerRadius = modelDigitizeCurve.cursorInnerRadius();
17  int size = CursorSizeToPixels (modelDigitizeCurve.cursorSize());
18  int halfSize = size / 2;
19  int lineWidth = modelDigitizeCurve.cursorLineWidth();
20  int halfLineWidth = lineWidth / 2;
21 
22  if (modelDigitizeCurve.cursorStandardCross()) {
23 
24  // Standard cursor
25  return QCursor (Qt::CrossCursor);
26 
27  } else {
28 
29  // Custom cursor
30  const int BACKGROUND_COLOR = Qt::white, FOREGROUND_COLOR = Qt::black;
31 
32  // Cursor is created with pic image (which has nontrivial pen) masked by picMask image
33  // (which has single color pen)
34  QPixmap picMask (size,
35  size);
36  QPainter picMaskPaint (&picMask);
37  picMask.fill (QColor (BACKGROUND_COLOR));
38 
39  QPen pen (QBrush (FOREGROUND_COLOR),
40  modelDigitizeCurve.cursorLineWidth());
41  picMaskPaint.setPen (pen);
42 
43  picMaskPaint.drawLine (QPointF (halfSize,
44  halfSize - innerRadius - halfLineWidth),
45  QPointF (halfSize,
46  lineWidth)); // Up
47  picMaskPaint.drawLine (QPointF (halfSize - innerRadius - halfLineWidth,
48  halfSize),
49  QPointF (lineWidth,
50  halfSize)); // Left
51  picMaskPaint.drawLine (QPointF (halfSize,
52  halfSize + innerRadius + halfLineWidth),
53  QPointF (halfSize,
54  size - 1 - lineWidth)); // Down
55  picMaskPaint.drawLine (QPointF (halfSize + innerRadius + halfLineWidth,
56  halfSize),
57  QPointF (size - 1 - lineWidth,
58  halfSize)); // Right
59 
60  QPixmap pic (size,
61  size);
62  pic.fill (QColor (FOREGROUND_COLOR));
63 
64  return QCursor (pic.createMaskFromColor(QColor (BACKGROUND_COLOR)),
65  picMask.createMaskFromColor(QColor (BACKGROUND_COLOR)));
66  }
67 }
int cursorLineWidth() const
Get method for cursor line width.
CursorFactory()
Single constructor.
bool cursorStandardCross() const
Get method for cursor type.
Model for DlgSettingsDigitizeCurve and CmdSettingsDigitizeCurve.
int cursorInnerRadius() const
Get method for cursor inner radius.
CursorSize cursorSize() const
Get method for cursor size.
QCursor generate(const DocumentModelDigitizeCurve &modelDigitizeCurve) const
Factory method to generate standard or custom cursor.