1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include <private/horizontalbarchartitem_p.h>
5#include <private/qabstractbarseries_p.h>
6#include <private/qbarset_p.h>
7#include <private/bar_p.h>
8
9QT_BEGIN_NAMESPACE
10
11HorizontalBarChartItem::HorizontalBarChartItem(QAbstractBarSeries *series, QGraphicsItem* item)
12 : AbstractBarChartItem(series, item)
13{
14}
15
16void HorizontalBarChartItem::initializeLayout(int set, int category,
17 int layoutIndex, bool resetAnimation)
18{
19 QRectF rect;
20
21 if (set > 0) {
22 QBarSet *barSet = m_series->barSets().at(i: set - 1);
23 Bar *bar = m_indexForBarMap.value(key: barSet).value(key: category);
24 rect = m_layout.at(i: bar->layoutIndex());
25 qreal oldTop = rect.top();
26 if (resetAnimation)
27 rect.setTop(oldTop - rect.height());
28 rect.setBottom(oldTop);
29 rect.setRight(rect.left());
30 } else {
31 QPointF topLeft;
32 QPointF bottomRight;
33 const qreal barWidth = m_series->d_func()->barWidth() * m_seriesWidth;
34 const int setCount = m_series->count();
35 if (domain()->type() == AbstractDomain::LogXYDomain
36 || domain()->type() == AbstractDomain::LogXLogYDomain) {
37 topLeft = topLeftPoint(set, setCount, category, barWidth, value: domain()->minX());
38 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: domain()->minX());
39 } else {
40 topLeft = topLeftPoint(set, setCount, category, barWidth, value: 0.0);
41 bottomRight = bottomRightPoint(set, setCount, category, barWidth, value: 0.0);
42 }
43
44 if (m_validData) {
45 rect.setTopLeft(topLeft);
46 rect.setBottomRight(bottomRight);
47 }
48 }
49 m_layout[layoutIndex] = rect.normalized();
50}
51
52QPointF HorizontalBarChartItem::topLeftPoint(int set, int setCount, int category,
53 qreal barWidth, qreal value)
54{
55 return domain()->calculateGeometryPoint(
56 point: QPointF(value, m_seriesPosAdjustment + category - (barWidth / 2.0)
57 + (qreal(set)/setCount) * barWidth),
58 ok&: m_validData);
59}
60
61QPointF HorizontalBarChartItem::bottomRightPoint(int set, int setCount, int category,
62 qreal barWidth, qreal value)
63{
64 return domain()->calculateGeometryPoint(
65 point: QPointF(value, m_seriesPosAdjustment + category - (barWidth / 2.0)
66 + (qreal(set + 1)/setCount) * barWidth),
67 ok&: m_validData);
68}
69
70QList<QRectF> HorizontalBarChartItem::calculateLayout()
71{
72 QList<QRectF> layout;
73 layout.resize(size: m_layout.size());
74
75 const int setCount = m_series->count();
76 const qreal barWidth = m_series->d_func()->barWidth() * m_seriesWidth;
77
78 for (int set = 0; set < setCount; set++) {
79 QBarSet *barSet = m_series->barSets().at(i: set);
80 const QList<Bar *> bars = m_barMap.value(key: barSet);
81 for (int i = 0; i < m_categoryCount; i++) {
82 Bar *bar = bars.at(i);
83 const int category = bar->index();
84 qreal value = barSet->at(index: category);
85 QRectF rect;
86 QPointF topLeft;
87 if (domain()->type() == AbstractDomain::LogXYDomain
88 || domain()->type() == AbstractDomain::LogXLogYDomain) {
89 topLeft = topLeftPoint(set, setCount, category, barWidth, value: domain()->minX());
90 } else {
91 topLeft = topLeftPoint(set, setCount, category, barWidth, value: 0.0);
92 }
93
94 QPointF bottomRight = bottomRightPoint(set, setCount, category, barWidth, value);
95 rect.setTopLeft(topLeft);
96 rect.setBottomRight(bottomRight);
97 layout[bar->layoutIndex()] = rect.normalized();
98 }
99 }
100 return layout;
101}
102
103QT_END_NAMESPACE
104
105#include "moc_horizontalbarchartitem_p.cpp"
106

source code of qtcharts/src/charts/barchart/horizontal/bar/horizontalbarchartitem.cpp