97 QPainter painter(
this);
98 const QPointF center(width() / 2.0, height() / 2.0);
99 const qreal minSide = std::min(center.x(), center.y());
100 const qreal radius = minSide * 0.9;
101 const qreal lineMarkerRadius = minSide * 0.1;
102 const qreal angleInRadians =
m_d->angle *
M_PI / 180.0;
104 center.x() + std::cos(angleInRadians) * radius,
106 ? center.y() - std::sin(angleInRadians) * radius
107 : center.y() + std::sin(angleInRadians) * radius
110 painter.setRenderHint(QPainter::Antialiasing,
true);
112 QColor backgroundColor, circleColor, axesColor, angleLineColor, angleLineMarkerColor;
113 if (
palette().color(QPalette::Window).lightness() < 128) {
114 circleColor =
palette().color(QPalette::Light);
115 axesColor =
palette().color(QPalette::Light);
116 axesColor.setAlpha(200);
118 backgroundColor =
palette().color(QPalette::Dark);
119 angleLineColor = QColor(255, 255, 255, 128);
120 angleLineMarkerColor = QColor(255, 255, 255, 200);
122 backgroundColor =
palette().color(QPalette::Window);
123 angleLineColor =
palette().color(QPalette::Light);
124 angleLineMarkerColor =
palette().color(QPalette::Light);
127 circleColor =
palette().color(QPalette::Dark);
128 axesColor =
palette().color(QPalette::Dark);
129 axesColor.setAlpha(200);
131 backgroundColor =
palette().color(QPalette::Light);
132 angleLineColor = QColor(0, 0, 0, 128);
133 angleLineMarkerColor = QColor(0, 0, 0, 200);
135 backgroundColor =
palette().color(QPalette::Window);
136 angleLineColor =
palette().color(QPalette::Dark);
137 angleLineMarkerColor =
palette().color(QPalette::Dark);
142 painter.setPen(Qt::transparent);
143 painter.setBrush(backgroundColor);
144 painter.drawEllipse(center, radius, radius);
147 painter.setPen(QPen(axesColor, 1.0, Qt::DotLine));
148 painter.drawLine(center.x(), center.y() - radius + 1.0, center.x(), center.y() + radius - 1.0);
149 painter.drawLine(center.x() - radius + 1.0, center.y(), center.x() + radius - 1.0, center.y());
152 if (this->hasFocus()) {
153 painter.setPen(QPen(
palette().color(QPalette::Highlight), 2.0));
155 if (
m_d->isMouseHover && isEnabled()) {
156 painter.setPen(QPen(
palette().color(QPalette::Highlight), 1.0));
158 painter.setPen(QPen(circleColor, 1.0));
161 painter.setBrush(Qt::transparent);
162 painter.drawEllipse(center, radius, radius);
165 painter.setPen(QPen(angleLineColor, 1.0));
166 painter.drawLine(center, d);
169 painter.setPen(Qt::transparent);
170 painter.setBrush(angleLineMarkerColor);
171 painter.drawEllipse(center, lineMarkerRadius, lineMarkerRadius);
174 painter.setBrush(angleLineMarkerColor);
175 painter.drawEllipse(d, lineMarkerRadius, lineMarkerRadius);
182 if (e->button() != Qt::LeftButton) {
187 const QPointF center(width() / 2.0, height() / 2.0);
188 const qreal radius = std::min(center.x(), center.y());
189 const qreal radiusSquared = radius * radius;
190 const QPointF delta(e->x() - center.x(), e->y() - center.y());
191 const qreal distanceSquared = delta.x() * delta.x() + delta.y() * delta.y();
193 if (distanceSquared > radiusSquared) {
204 if (e->modifiers() & Qt::ControlModifier) {
205 const qreal sa =
m_d->snapAngle *
M_PI / 180.0;
211 m_d->isPressed =
true;
228 if (!(e->buttons() & Qt::LeftButton) || !
m_d->isPressed) {
233 const QPointF center(width() / 2.0, height() / 2.0);
234 const qreal radius = std::min(center.x(), center.y());
235 const qreal radiusSquared = radius * radius;
236 const QPointF delta(e->x() - center.x(), e->y() - center.y());
237 const qreal distanceSquared = delta.x() * delta.x() + delta.y() * delta.y();
244 const qreal snapDistance = qMax(
m_d->minimumSnapDistance *
m_d->minimumSnapDistance, radiusSquared * 4.0);
245 const bool controlPressed = e->modifiers() & Qt::ControlModifier;
246 const bool shiftPressed = e->modifiers() & Qt::ShiftModifier;
248 if (controlPressed && shiftPressed) {
250 }
else if (!shiftPressed && (controlPressed || distanceSquared < snapDistance)) {