#pragma once #include #include #include #include "internal/circularbuffer.hpp" namespace ZShell::components { class SparklineContent : public QQuickPaintedItem { Q_OBJECT public: explicit SparklineContent(QQuickItem* parent = nullptr); void paint(QPainter* painter) override; void setLine1(internal::CircularBuffer* buffer); void setLine2(internal::CircularBuffer* buffer); void setLine1Color(const QColor& color); void setLine2Color(const QColor& color); void setLine1FillAlpha(qreal alpha); void setLine2FillAlpha(qreal alpha); void setMaxValue(qreal value); void setLineWidth(qreal width); void setCurveSmoothing(bool enabled); void setHistoryLength(int length); void setSliding(bool sliding); void setViewportSize(qreal viewportWidth, qreal viewportHeight); [[nodiscard]] qreal stepX() const; private: struct LineGeometry { QPainterPath stroke; QPainterPath fill; bool hasData = false; }; void invalidate(); void rebuildIfNeeded(); [[nodiscard]] LineGeometry buildGeometry( internal::CircularBuffer* buffer) const; void connectBuffer(internal::CircularBuffer* buffer); void applyGeometry(); internal::CircularBuffer* m_line1 = nullptr; internal::CircularBuffer* m_line2 = nullptr; QColor m_line1Color; QColor m_line2Color; qreal m_line1FillAlpha = 0.15; qreal m_line2FillAlpha = 0.2; qreal m_maxValue = 1024.0; qreal m_lineWidth = 2.0; bool m_curveSmoothing = false; int m_historyLength = 30; bool m_sliding = true; qreal m_viewportW = 0.0; qreal m_viewportH = 0.0; LineGeometry m_geom1; LineGeometry m_geom2; bool m_dirty = true; }; } // namespace ZShell::components