From 96b089f40180f224f833a73462561fe5edbe790d Mon Sep 17 00:00:00 2001 From: zach Date: Tue, 31 Mar 2026 01:35:51 +0200 Subject: [PATCH] test --- Plugins/ZShell/Internal/CMakeLists.txt | 1 + Plugins/ZShell/Internal/arcgauge.cpp | 119 +++++++++++++++++++++++++ Plugins/ZShell/Internal/arcgauge.hpp | 61 +++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 Plugins/ZShell/Internal/arcgauge.cpp create mode 100644 Plugins/ZShell/Internal/arcgauge.hpp diff --git a/Plugins/ZShell/Internal/CMakeLists.txt b/Plugins/ZShell/Internal/CMakeLists.txt index 007762d..d49d62f 100644 --- a/Plugins/ZShell/Internal/CMakeLists.txt +++ b/Plugins/ZShell/Internal/CMakeLists.txt @@ -7,6 +7,7 @@ qml_module(ZShell-internal circularindicatormanager.hpp circularindicatormanager.cpp circularbuffer.hpp circularbuffer.cpp sparklineitem.hpp sparklineitem.cpp + arcgauge.hpp arcgauge.cpp LIBRARIES Qt::Gui Qt::Quick diff --git a/Plugins/ZShell/Internal/arcgauge.cpp b/Plugins/ZShell/Internal/arcgauge.cpp new file mode 100644 index 0000000..1ef0fb7 --- /dev/null +++ b/Plugins/ZShell/Internal/arcgauge.cpp @@ -0,0 +1,119 @@ +#include "arcgauge.hpp" + +#include +#include +#include + +namespace caelestia::internal { + +ArcGauge::ArcGauge(QQuickItem* parent) + : QQuickPaintedItem(parent) { + setAntialiasing(true); +} + +void ArcGauge::paint(QPainter* painter) { + const qreal w = width(); + const qreal h = height(); + const qreal side = qMin(w, h); + const qreal radius = (side - m_lineWidth - 2.0) / 2.0; + const qreal cx = w / 2.0; + const qreal cy = h / 2.0; + + const QRectF arcRect(cx - radius, cy - radius, radius * 2.0, radius * 2.0); + + // Convert from Canvas convention (CW radians from 3 o'clock) to QPainter (CCW 1/16th degrees) + const int startAngle16 = qRound(-(m_startAngle * 180.0 / M_PI) * 16.0); + const int sweepAngle16 = qRound(-(m_sweepAngle * 180.0 / M_PI) * 16.0); + + painter->setRenderHint(QPainter::Antialiasing, true); + + // Draw track arc + QPen trackPen(m_trackColor, m_lineWidth); + trackPen.setCapStyle(Qt::RoundCap); + painter->setPen(trackPen); + painter->setBrush(Qt::NoBrush); + painter->drawArc(arcRect, startAngle16, sweepAngle16); + + // Draw value arc + if (m_percentage > 0.0) { + const int valueSweep16 = qRound(static_cast(sweepAngle16) * m_percentage); + QPen valuePen(m_accentColor, m_lineWidth); + valuePen.setCapStyle(Qt::RoundCap); + painter->setPen(valuePen); + painter->drawArc(arcRect, startAngle16, valueSweep16); + } +} + +qreal ArcGauge::percentage() const { + return m_percentage; +} + +void ArcGauge::setPercentage(qreal percentage) { + if (qFuzzyCompare(m_percentage, percentage)) + return; + m_percentage = percentage; + emit percentageChanged(); + update(); +} + +QColor ArcGauge::accentColor() const { + return m_accentColor; +} + +void ArcGauge::setAccentColor(const QColor& color) { + if (m_accentColor == color) + return; + m_accentColor = color; + emit accentColorChanged(); + update(); +} + +QColor ArcGauge::trackColor() const { + return m_trackColor; +} + +void ArcGauge::setTrackColor(const QColor& color) { + if (m_trackColor == color) + return; + m_trackColor = color; + emit trackColorChanged(); + update(); +} + +qreal ArcGauge::startAngle() const { + return m_startAngle; +} + +void ArcGauge::setStartAngle(qreal angle) { + if (qFuzzyCompare(m_startAngle, angle)) + return; + m_startAngle = angle; + emit startAngleChanged(); + update(); +} + +qreal ArcGauge::sweepAngle() const { + return m_sweepAngle; +} + +void ArcGauge::setSweepAngle(qreal angle) { + if (qFuzzyCompare(m_sweepAngle, angle)) + return; + m_sweepAngle = angle; + emit sweepAngleChanged(); + update(); +} + +qreal ArcGauge::lineWidth() const { + return m_lineWidth; +} + +void ArcGauge::setLineWidth(qreal width) { + if (qFuzzyCompare(m_lineWidth, width)) + return; + m_lineWidth = width; + emit lineWidthChanged(); + update(); +} + +} // namespace caelestia::internal diff --git a/Plugins/ZShell/Internal/arcgauge.hpp b/Plugins/ZShell/Internal/arcgauge.hpp new file mode 100644 index 0000000..efa6800 --- /dev/null +++ b/Plugins/ZShell/Internal/arcgauge.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include +#include +#include +#include + +namespace caelestia::internal { + +class ArcGauge : public QQuickPaintedItem { +Q_OBJECT +QML_ELEMENT + +Q_PROPERTY(qreal percentage READ percentage WRITE setPercentage NOTIFY percentageChanged) +Q_PROPERTY(QColor accentColor READ accentColor WRITE setAccentColor NOTIFY accentColorChanged) +Q_PROPERTY(QColor trackColor READ trackColor WRITE setTrackColor NOTIFY trackColorChanged) +Q_PROPERTY(qreal startAngle READ startAngle WRITE setStartAngle NOTIFY startAngleChanged) +Q_PROPERTY(qreal sweepAngle READ sweepAngle WRITE setSweepAngle NOTIFY sweepAngleChanged) +Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged) + +public: +explicit ArcGauge(QQuickItem* parent = nullptr); + +void paint(QPainter* painter) override; + +[[nodiscard]] qreal percentage() const; +void setPercentage(qreal percentage); + +[[nodiscard]] QColor accentColor() const; +void setAccentColor(const QColor& color); + +[[nodiscard]] QColor trackColor() const; +void setTrackColor(const QColor& color); + +[[nodiscard]] qreal startAngle() const; +void setStartAngle(qreal angle); + +[[nodiscard]] qreal sweepAngle() const; +void setSweepAngle(qreal angle); + +[[nodiscard]] qreal lineWidth() const; +void setLineWidth(qreal width); + +signals: +void percentageChanged(); +void accentColorChanged(); +void trackColorChanged(); +void startAngleChanged(); +void sweepAngleChanged(); +void lineWidthChanged(); + +private: +qreal m_percentage = 0.0; +QColor m_accentColor; +QColor m_trackColor; +qreal m_startAngle = 0.75 * M_PI; +qreal m_sweepAngle = 1.5 * M_PI; +qreal m_lineWidth = 10.0; +}; + +} // namespace caelestia::internal