summaryrefslogtreecommitdiffstats
path: root/src/qgraphicsheader_p.h
blob: 59559ffc175c31db9ea30eed90be859a607bbdbc (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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the Itemviews NG project on Trolltech Labs.
**
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/

#ifndef QTGRAPHICSHEADER_P_H
#define QTGRAPHICSHEADER_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt 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.
//

#include <qpair.h>

#include "qsectionspans_p.h"

QT_BEGIN_NAMESPACE

class QStyle;
class QEvent;
class QKeyEvent;
class QInputMethodEvent;
class QMouseEvent;
class QDragEnterEvent;
class QDragLeaveEvent;
class QDragMoveEvent;
class QDropEvent;
class QHoverEvent;
class QtGraphicsHeaderDataProvider;

/*
  Notes To The Maintainer
  -----------------------

  1. The span data structure.

  We store section sizes in a list of spans. A size span consists of the section size
  of the span and the number of sections this span represents.

  The total size of the span is then the number of sections multiplied by the section
  size.

  The position of a specific section is found by accumulating the span sizes until we
  find the correct span. We can the find the position of the section within the span
  and add that to the accumulated size of the preceding spans.

  The the reasoning behind this approach is that there will be relatively few sections
  with different sizes, and many adjacent sections with the same size.

  If all sections in the header are the same size, we will only have one span.

  2. Coordinate system.

  The header has to deal with two coordinate systems; external and internal coordinates.
  This is because the header has an offset and a firstVisualIndex that affects the
  position of the sections relative to the external coordinates.
  Use the mapToInternal function to map external to the internal coordinates.

  3. Visual and logical indexes.

  The header operates with two kinds of indexes:
  - The visual index refers to the order in which the section appears in the view.
  - The logical index refers to the order in which the section appears in the model.

  Initially the visual and logical indexes are the same. But if sections are moved,
  the visual and logical indexes become different.

  To map between the visual and logical indexes, we have two vectors visualToLogical
  and logicalToVisual:

  logicalIndex == visualToLogical[visualIndex]
  visualIndex == logicalToVisual[logicalIndex]

  Note that the code always works on visual indexes internally.

  4. Hidden sections. ### may change ###

  Hidden sections are simply sections with no size.
  This means that they can not be interacted with, and are not
  painted. It is possible to show a hidden section by changing
  its size.
*/

class QtGraphicsHeaderPrivate
{
    Q_DECLARE_PUBLIC(QtGraphicsHeader);
public:
    QtGraphicsHeaderPrivate();
    ~QtGraphicsHeaderPrivate();

    qreal mapToInternal(const QPointF &pos, const QTransform &transform) const;
    
    bool mousePressEvent(QMouseEvent *event, const QTransform &transform);
    bool mouseMoveEvent(QMouseEvent *event, const QTransform &transform);
    bool mouseReleaseEvent(QMouseEvent *event, const QTransform &transform);
    bool mouseDoubleClickEvent(QMouseEvent *event, const QTransform &transform);
    bool dragEnterEvent(QDragEnterEvent *event, const QTransform &transform);
    bool dragLeaveEvent(QDragLeaveEvent *event, const QTransform &transform);
    bool dragMoveEvent(QDragMoveEvent *event, const QTransform &transform);
    bool dropEvent(QDropEvent *event, const QTransform &transform);
    bool hoverEnterEvent(QHoverEvent *event, const QTransform &transform);
    bool hoverMoveEvent(QHoverEvent *event, const QTransform &transform);
    bool hoverLeaveEvent(QHoverEvent *event, const QTransform &transform);
    bool resizeEvent(QResizeEvent *event, const QTransform &transform);

    void insertSections(int visualIndex, int count);
    void removeSections(int visualIndex, int count);

    bool isSectionCurrent(int visualIndex) const;
    bool isSectionSelected(int visualIndex) const;
    bool isSectionHighlighted(int visualIndex) const;
    bool isSectionUnderMouse(int visualIndex) const;
    bool isSectionPressed(int visualIndex) const;
    bool isSectionHidden(int visualIndex) const;
    bool isSectionClickable(int visualIndex) const;
    bool isSectionMovable(int visualIndex) const;
    bool isSortIndicatorShown(int visualIndex) const;

    Qt::SortOrder sortIndicatorOrder(int visualIndex) const;
    qreal contentSize() const;
    int sectionAt(qreal position, QPair<qreal,qreal> *geometry = 0) const;
    int sectionHandleAt(qreal position, int visualIndex = -1) const;

    QPair<qreal, qreal> sectionGeometry(int visualIndex) const;
    qreal sectionSize(int visualIndex) const;
    uint sectionMode(int visualIndex) const;

    void setSectionCount(int count);
    void setSectionSize(int visualIndex, qreal size);
    void setSectionMode(int visualIndex, uint mode); // ###

    //void resizeSectionsCascading();
    //void resizeSectionsStretch();
    //void resizeSections();

    QVariant data(int logicalIndex, const QByteArray &role) const;

    QtGraphicsHeaderDataProvider *dataProvider;
    mutable QHash<QByteArray,QVariant> cachedDataHash;
    mutable int cachedDataIndex;

    Qt::Orientation orientation;
    qreal offset;

    int firstVisualIndex;
    int sectionCount;

    QVector<int> logicalToVisual;
    QVector<int> visualToLogical;

    // section spans

    QtSectionSpans<qreal> sectionSizeSpans;
    QtSectionSpans<uint> sectionModeSpans;
    QtSectionSpans<bool> sectionMovableSpans;
    QtSectionSpans<bool> sectionClickableSpans;
    QtSectionSpans<bool> sectionSelectedSpans;

    // internal state

    enum State {
        Idle,
        PressingSection,
        ResizingSection,
        MovingSection,
        SelectingSections
    } state;

    // mouse positions

    qreal mousePressPosition;

    // resizing

    int resizingVisualIndex;
    qreal resizingOriginalSize;

    // moving

    int movingVisualIndex;
    qreal movingSectionSize;
    qreal movingCursorPosition;
    qreal movingCursorOffset;
    int movingCursorVisualIndex;

    // selecting

    int selectingVisualIndex;

    // other

    QtGraphicsHeader *q_ptr;
};

QT_END_NAMESPACE

#endif//QTGRAPHICSHEADER_P_H