summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/axisrendercache_p.h
blob: 9fb048377bfce1978bf51b0a97dd1c7c76a37a9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the QtDataVisualization module.
**
** Licensees holding valid Qt Enterprise licenses may use this file in
** accordance with the Qt Enterprise License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
**
****************************************************************************/

//
//  W A R N I N G
//  -------------
//
// This file is not part of the QtDataVisualization API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.

#ifndef AXISRENDERCACHE_P_H
#define AXISRENDERCACHE_P_H

#include "datavisualizationglobal_p.h"
#include "drawer_p.h"
#include <QtCore/QPointer>

QT_BEGIN_NAMESPACE_DATAVISUALIZATION

class AxisRenderCache : public QObject
{
    Q_OBJECT
public:
    AxisRenderCache();
    virtual ~AxisRenderCache();

    void setDrawer(Drawer *drawer);

    void setType(QAbstract3DAxis::AxisType type);
    inline QAbstract3DAxis::AxisType type() const { return m_type; }
    void setTitle(const QString &title);
    inline const QString &title() const { return m_title; }
    void setLabels(const QStringList &labels);
    inline const QStringList &labels() const { return m_labels; }
    inline void setMin(float min) { m_min = min; }
    inline float min() const { return m_min; }
    inline void setMax(float max) { m_max = max; }
    inline float max() const { return m_max; }
    inline void setSegmentCount(int count) { m_segmentCount = count; m_positionsDirty = true; }
    inline int segmentCount() const { return m_segmentCount; }
    inline void setSubSegmentCount(int count) { m_subSegmentCount = count; m_positionsDirty = true; }
    inline int subSegmentCount() const { return m_subSegmentCount; }
    inline void setLabelFormat(const QString &format) { m_labelFormat = format; }
    inline const QString &labelFormat() const { return m_labelFormat; }
    inline void setReversed(bool enable) { m_reversed = enable; m_positionsDirty = true; }
    inline bool reversed() const { return m_reversed; }
    inline void setFormatter(QValue3DAxisFormatter *formatter)
    {
        m_formatter = formatter; m_positionsDirty = true;
    }
    inline QValue3DAxisFormatter *formatter() const { return m_formatter; }
    inline void setCtrlFormatter(QValue3DAxisFormatter *formatter)
    {
        m_ctrlFormatter = formatter;
    }
    inline QValue3DAxisFormatter *ctrlFormatter() const { return m_ctrlFormatter; }

    inline LabelItem &titleItem() { return m_titleItem; }
    inline QList<LabelItem *> &labelItems() { return m_labelItems; }
    inline float gridLinePosition(int index) { return m_adjustedGridLinePositions.at(index); }
    inline int gridLineCount() { return m_adjustedGridLinePositions.size(); }
    inline float labelPosition(int index) { return m_adjustedLabelPositions.at(index); }
    inline int labelCount() {
        // Some value axis formatters may opt to not show all labels,
        // so use positions array for determining count in that case.
        if (m_type == QAbstract3DAxis::AxisTypeValue)
            return m_adjustedLabelPositions.size();
        else
            return m_labels.size();
    }
    void updateAllPositions();
    inline bool positionsDirty() const { return m_positionsDirty; }
    inline void markPositionsDirty() { m_positionsDirty = true; }
    inline void setTranslate(float translate) { m_translate = translate; m_positionsDirty = true; }
    inline float translate() { return m_translate; }
    inline void setScale(float scale) { m_scale = scale; m_positionsDirty = true; }
    inline float scale() { return m_scale; }
    inline float positionAt(float value)
    {
        if (m_reversed)
            return (1.0f - m_formatter->positionAt(value)) * m_scale + m_translate;
        else
            return m_formatter->positionAt(value) * m_scale + m_translate;
    }
    inline float labelAutoRotation() const { return m_labelAutoRotation; }
    inline void setLabelAutoRotation(float angle) { m_labelAutoRotation = angle; }
    inline bool isTitleVisible() const { return m_titleVisible; }
    inline void setTitleVisible(bool visible) { m_titleVisible = visible; }
    inline bool isTitleFixed() const { return m_titleFixed; }
    inline void setTitleFixed(bool fixed) { m_titleFixed = fixed; }

    void updateTextures();

private:
    int maxLabelWidth(const QStringList &labels) const;

    // Cached axis values
    QAbstract3DAxis::AxisType m_type;
    QString m_title;
    QStringList m_labels;
    float m_min;
    float m_max;
    int m_segmentCount;
    int m_subSegmentCount;
    QString m_labelFormat;
    bool m_reversed;
    QFont m_font;
    QValue3DAxisFormatter *m_formatter;
    QPointer<QValue3DAxisFormatter> m_ctrlFormatter;

    // Renderer items
    Drawer *m_drawer; // Not owned
    LabelItem m_titleItem;
    QList<LabelItem *> m_labelItems;
    QVector<float> m_adjustedGridLinePositions;
    QVector<float> m_adjustedLabelPositions;
    bool m_positionsDirty;
    float m_translate;
    float m_scale;
    float m_labelAutoRotation;
    bool m_titleVisible;
    bool m_titleFixed;

    Q_DISABLE_COPY(AxisRenderCache)
};

QT_END_NAMESPACE_DATAVISUALIZATION

#endif