fix: ignore stale coordinate data for panels + convert wavyline to use new qt 6.12 canvas painter api
This commit is contained in:
@@ -1,12 +1,10 @@
|
||||
#include "wavyline.hpp"
|
||||
|
||||
#include <qpainter.h>
|
||||
#include <qpainterpath.h>
|
||||
#include "wavylinerenderer.hpp"
|
||||
|
||||
namespace ZShell::controls {
|
||||
|
||||
WavyLine::WavyLine(QQuickItem* parent)
|
||||
: QQuickPaintedItem(parent)
|
||||
: QCanvasPainterItem(parent)
|
||||
, m_lineWidth(4)
|
||||
, m_amplitudeMultiplier(0.5)
|
||||
, m_frequency(6)
|
||||
@@ -18,10 +16,13 @@ WavyLine::WavyLine(QQuickItem* parent)
|
||||
, m_startAngle(0)
|
||||
, m_fullAngle(360)
|
||||
, m_radius(-1)
|
||||
, m_value(1)
|
||||
, m_startAngleRad(0)
|
||||
, m_fullAngleRad(2 * M_PI) {
|
||||
setAntialiasing(true);
|
||||
, m_value(1) {
|
||||
setFillColor(Qt::transparent);
|
||||
setAlphaBlending(true);
|
||||
}
|
||||
|
||||
QCanvasPainterItemRenderer* WavyLine::createItemRenderer() const {
|
||||
return new WavyLineRenderer;
|
||||
}
|
||||
|
||||
int WavyLine::lineWidth() const {
|
||||
@@ -127,7 +128,6 @@ qreal WavyLine::startAngle() const {
|
||||
void WavyLine::setStartAngle(qreal startAngle) {
|
||||
if (!qFuzzyCompare(m_startAngle + 1.0, startAngle + 1.0)) {
|
||||
m_startAngle = startAngle;
|
||||
m_startAngleRad = startAngle * M_PI / 180.0;
|
||||
emit startAngleChanged();
|
||||
update();
|
||||
}
|
||||
@@ -140,7 +140,6 @@ qreal WavyLine::fullAngle() const {
|
||||
void WavyLine::setFullAngle(qreal fullAngle) {
|
||||
if (!qFuzzyCompare(m_fullAngle + 1.0, fullAngle + 1.0)) {
|
||||
m_fullAngle = fullAngle;
|
||||
m_fullAngleRad = fullAngle * M_PI / 180.0;
|
||||
emit fullAngleChanged();
|
||||
update();
|
||||
}
|
||||
@@ -170,90 +169,4 @@ void WavyLine::setValue(qreal value) {
|
||||
}
|
||||
}
|
||||
|
||||
void WavyLine::paint(QPainter* painter) {
|
||||
painter->setRenderHint(QPainter::Antialiasing);
|
||||
painter->setPen(QPen(m_color, m_lineWidth, Qt::SolidLine, Qt::RoundCap));
|
||||
|
||||
if (m_pathType == Arc) {
|
||||
paintArc(painter);
|
||||
} else {
|
||||
paintLinear(painter);
|
||||
}
|
||||
}
|
||||
|
||||
void WavyLine::paintLinear(QPainter* painter) {
|
||||
const auto amplitude = m_lineWidth * m_amplitudeMultiplier;
|
||||
const auto phase = m_waveProgress * 2 * M_PI;
|
||||
const auto centerY = height() / 2;
|
||||
const auto len = m_fullLength > 0 ? m_fullLength : 1;
|
||||
const auto start = m_lineWidth / 2.0;
|
||||
const auto fullEnd = width() - m_lineWidth / 2.0;
|
||||
const auto drawEnd = start + (fullEnd - start) * m_value;
|
||||
|
||||
QPainterPath path;
|
||||
bool first = true;
|
||||
|
||||
for (int x = m_lineWidth / 2; x <= drawEnd; ++x) {
|
||||
const auto theta =
|
||||
m_frequency * 2 * M_PI * (x + m_startX) / len + phase;
|
||||
const auto waveY = centerY + amplitude * qSin(theta);
|
||||
if (first) {
|
||||
path.moveTo(x, waveY);
|
||||
first = false;
|
||||
} else {
|
||||
path.lineTo(x, waveY);
|
||||
}
|
||||
}
|
||||
|
||||
painter->drawPath(path);
|
||||
}
|
||||
|
||||
void WavyLine::paintArc(QPainter* painter) {
|
||||
if (m_fullAngleRad <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto amplitude = m_lineWidth * m_amplitudeMultiplier;
|
||||
const auto cx = width() / 2.0;
|
||||
const auto cy = height() / 2.0;
|
||||
const auto radius =
|
||||
m_radius > 0
|
||||
? m_radius
|
||||
: (qMin(width(), height()) - m_lineWidth - 2 * amplitude) / 2.0;
|
||||
|
||||
if (radius <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto phase = m_waveProgress * 2 * M_PI;
|
||||
const auto arcLen = radius * m_fullAngleRad;
|
||||
const auto len = m_fullLength > 0 ? m_fullLength : arcLen;
|
||||
const auto drawAngleRad = m_fullAngleRad * m_value;
|
||||
|
||||
if (drawAngleRad <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto N = qMax(64, qCeil(radius * drawAngleRad));
|
||||
const auto dTheta = drawAngleRad / N;
|
||||
|
||||
QPainterPath path;
|
||||
|
||||
for (int i = 0; i <= N; ++i) {
|
||||
const auto theta = m_startAngleRad + i * dTheta;
|
||||
const auto s = i * dTheta * radius;
|
||||
const auto phi = m_frequency * 2 * M_PI * (s + m_startX) / len + phase;
|
||||
const auto r = radius + amplitude * qSin(phi);
|
||||
const auto px = cx + r * qCos(theta);
|
||||
const auto py = cy + r * qSin(theta);
|
||||
if (i == 0) {
|
||||
path.moveTo(px, py);
|
||||
} else {
|
||||
path.lineTo(px, py);
|
||||
}
|
||||
}
|
||||
|
||||
painter->drawPath(path);
|
||||
}
|
||||
|
||||
} // namespace ZShell::controls
|
||||
|
||||
Reference in New Issue
Block a user