1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Charts module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30#include <private/barchartitem_p.h>
31#include <private/bar_p.h>
32#include <private/qabstractbarseries_p.h>
33#include <QtCharts/QBarSet>
34#include <private/qbarset_p.h>
35
36QT_CHARTS_BEGIN_NAMESPACE
37
38BarChartItem::BarChartItem(QAbstractBarSeries *series, QGraphicsItem* item) :
39 AbstractBarChartItem(series, item)
40{
41 m_orientation = Qt::Vertical;
42 connect(sender: series, SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)),
43 receiver: this, SLOT(handleLabelsPositionChanged()));
44 connect(sender: series, SIGNAL(labelsFormatChanged(QString)), receiver: this, SLOT(positionLabels()));
45}
46
47void BarChartItem::initializeLayout(int set, int category, int layoutIndex, bool resetAnimation)
48{
49 QRectF rect;
50
51 if (set > 0) {
52 QBarSet *barSet = m_series->barSets().at(i: set - 1);
53 Bar *bar = m_indexForBarMap.value(akey: barSet).value(akey: category);
54 rect = m_layout.at(i: bar->layoutIndex());
55 qreal oldRight = rect.right();
56 if (resetAnimation)
57 rect.setRight(oldRight + rect.width());
58 rect.setLeft(oldRight);
59 rect.setTop(rect.bottom());
60 } else {
61 QPointF topLeft;
62 QPointF bottomRight;
63 const int setCount = m_series->count();
64 const qreal barWidth = m_series->d_func()->barWidth() * m_seriesWidth;
65 if (domain()->type() == AbstractDomain::XLogYDomain
66 || domain()->type() == AbstractDomain::LogXLogYDomain) {
67 topLeft = topLeftPoint(set, setCount, category, barWidth, value: domain()->minY());
68 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: domain()->minY());
69 } else {
70 topLeft = topLeftPoint(set, setCount, category, barWidth, value: 0.0);
71 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: 0.0);
72 }
73
74 if (m_validData) {
75 rect.setTopLeft(topLeft);
76 rect.setBottomRight(bottomRight);
77 }
78 }
79 m_layout[layoutIndex] = rect.normalized();
80}
81
82QPointF BarChartItem::topLeftPoint(int set, int setCount, int category,
83 qreal barWidth, qreal value)
84{
85 return domain()->calculateGeometryPoint(
86 point: QPointF(m_seriesPosAdjustment + category - (barWidth / 2.0)
87 + (qreal(set)/setCount) * barWidth,
88 value), ok&: m_validData);
89}
90
91QPointF BarChartItem::bottomRightPoint(int set, int setCount,
92 int category, qreal barWidth, qreal value)
93{
94 return domain()->calculateGeometryPoint(
95 point: QPointF(m_seriesPosAdjustment + category - (barWidth / 2.0)
96 + (qreal(set + 1)/setCount) * barWidth,
97 value), ok&: m_validData);
98}
99
100QVector<QRectF> BarChartItem::calculateLayout()
101{
102 QVector<QRectF> layout;
103 layout.resize(asize: m_layout.size());
104
105 const int setCount = m_series->count();
106 const qreal barWidth = m_series->d_func()->barWidth() * m_seriesWidth;
107
108 for (int set = 0; set < setCount; set++) {
109 QBarSet *barSet = m_series->barSets().at(i: set);
110 const QList<Bar *> bars = m_barMap.value(akey: barSet);
111 for (int i = 0; i < m_categoryCount; i++) {
112 Bar *bar = bars.at(i);
113 const int category = bar->index();
114 qreal value = barSet->at(index: category);
115 QRectF rect;
116 QPointF topLeft = topLeftPoint(set, setCount, category, barWidth, value);
117 QPointF bottomRight;
118 if (domain()->type() == AbstractDomain::XLogYDomain
119 || domain()->type() == AbstractDomain::LogXLogYDomain) {
120 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: domain()->minY());
121 } else {
122 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: 0.0);
123 }
124
125 rect.setTopLeft(topLeft);
126 rect.setBottomRight(bottomRight);
127 layout[bar->layoutIndex()] = rect.normalized();
128 }
129 }
130
131 return layout;
132}
133
134void BarChartItem::handleLabelsPositionChanged()
135{
136 positionLabels();
137}
138
139void BarChartItem::positionLabels()
140{
141 positionLabelsVertical();
142}
143
144QT_CHARTS_END_NAMESPACE
145
146#include "moc_barchartitem_p.cpp"
147

source code of qtcharts/src/charts/barchart/vertical/bar/barchartitem.cpp