Skip to content

File AxisTickPainter.hpp

File List > axis > AxisTickPainter.hpp

Go to the documentation of this file

//
// SPDX-FileCopyrightText: 2026 Michal Grabarczyk
// SPDX-License-Identifier: GPL-3.0-only WITH Universal-FOSS-exception-1.0
//
// This file is also available under a separate commercial license.
// See COMMERCIAL-LICENSING.md for contact information.
//
#pragma once

#include "QAccelPlot/axis/Axis.hpp"
#include "QAccelPlot/axis/AxisTicker.hpp"
#include "QAccelPlot/axis/AxisTicks.hpp"

#include <QColor>
#include <QRectF>
#include <QSizeF>

#include <functional>

QT_FORWARD_DECLARE_CLASS(QFontMetricsF)
QT_FORWARD_DECLARE_CLASS(QPainter)

namespace QAccelPlot {

class AxisTickPainter {
public:
    struct Params {
        Qt::Orientation orientation{Qt::Horizontal}; 
        Axis::Side side{Axis::Left};                 
        bool hovered{false};                         
        const AxisTicker* ticker{nullptr};           
        QColor hoverColor;                           
        QColor defaultSubtickColor;                  
        bool clampEdgeLabels{false};                 
        qreal labelOverflow{0.0};                    
    };

    using MapToPosition = std::function<qreal(qreal value, qreal length)>;

    struct PaintContext {
        QPainter* painter; 
        QRectF rect;       
        qreal axisX;       
        qreal axisY;       
    };

    static AxisTicks computeTicks(qreal viewportMin, qreal viewportMax, bool logScale, const AxisTicker* ticker);

    static AxisTickValues computeTickValues(qreal viewportMin, qreal viewportMax, bool logScale, const AxisTicker* ticker);

    static void paintTicks(
        QPainter* painter, const QRectF& rect, qreal axisX, qreal axisY, const Params& params, const AxisTicks& ticks, const MapToPosition& mapToPosition);

    static qreal computeNiceStep(qreal viewportMin, qreal viewportMax, int tickCount);

    static QSizeF tickLabelSize(const QFontMetricsF& metrics, const QString& label);

private:
    static AxisTickValues computeLogScaleTickValues(qreal viewportLow, qreal viewportHigh, const AxisTicker& ticker);
    static AxisTickValues computeLinearTickValues(qreal viewportLow, qreal viewportHigh, const AxisTicker& ticker);
    static void paintTick(const PaintContext& ctx, const AxisTick& tick, const Params& params, const MapToPosition& mapToPosition);
    static void paintSubtick(const PaintContext& ctx, qreal value, const Params& params, const MapToPosition& mapToPosition);
    static void drawTickLabel(QPainter* painter, const QRectF& labelRect, int alignment, const QString& label, qreal rotation);
};

} // namespace QAccelPlot