##// END OF EJS Templates
Fixed scatter marker colors
Tero Ahola -
r514:9113e8ad2b3e
parent child
Show More
@@ -1,356 +1,353
1 #include "charttheme_p.h"
1 #include "charttheme_p.h"
2 #include "qchart.h"
2 #include "qchart.h"
3 #include "qchartaxis.h"
3 #include "qchartaxis.h"
4 #include <QTime>
4 #include <QTime>
5
5
6 //series
6 //series
7 #include "qbarset.h"
7 #include "qbarset.h"
8 #include "qbarseries.h"
8 #include "qbarseries.h"
9 #include "qstackedbarseries.h"
9 #include "qstackedbarseries.h"
10 #include "qpercentbarseries.h"
10 #include "qpercentbarseries.h"
11 #include "qlineseries.h"
11 #include "qlineseries.h"
12 #include "qareaseries.h"
12 #include "qareaseries.h"
13 #include "qscatterseries.h"
13 #include "qscatterseries.h"
14 #include "qpieseries.h"
14 #include "qpieseries.h"
15 #include "qpieslice.h"
15 #include "qpieslice.h"
16 #include "qsplineseries.h"
16 #include "qsplineseries.h"
17
17
18 //items
18 //items
19 #include "axisitem_p.h"
19 #include "axisitem_p.h"
20 #include "barpresenter_p.h"
20 #include "barpresenter_p.h"
21 #include "stackedbarpresenter_p.h"
21 #include "stackedbarpresenter_p.h"
22 #include "percentbarpresenter_p.h"
22 #include "percentbarpresenter_p.h"
23 #include "linechartitem_p.h"
23 #include "linechartitem_p.h"
24 #include "areachartitem_p.h"
24 #include "areachartitem_p.h"
25 #include "scatterchartitem_p.h"
25 #include "scatterchartitem_p.h"
26 #include "piepresenter_p.h"
26 #include "piepresenter_p.h"
27 #include "splinechartitem_p.h"
27 #include "splinechartitem_p.h"
28
28
29 //themes
29 //themes
30 #include "chartthemedefault_p.h"
30 #include "chartthemedefault_p.h"
31 #include "chartthemevanilla_p.h"
31 #include "chartthemevanilla_p.h"
32 #include "chartthemeicy_p.h"
32 #include "chartthemeicy_p.h"
33 #include "chartthemegrayscale_p.h"
33 #include "chartthemegrayscale_p.h"
34 #include "chartthemescientific_p.h"
34 #include "chartthemescientific_p.h"
35
35
36
36
37 QTCOMMERCIALCHART_BEGIN_NAMESPACE
37 QTCOMMERCIALCHART_BEGIN_NAMESPACE
38
38
39 ChartTheme::ChartTheme(QChart::ChartTheme id)
39 ChartTheme::ChartTheme(QChart::ChartTheme id)
40 {
40 {
41 m_id = id;
41 m_id = id;
42 qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
42 qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
43 }
43 }
44
44
45
45
46 ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme)
46 ChartTheme* ChartTheme::createTheme(QChart::ChartTheme theme)
47 {
47 {
48 switch(theme) {
48 switch(theme) {
49 case QChart::ChartThemeVanilla:
49 case QChart::ChartThemeVanilla:
50 return new ChartThemeVanilla();
50 return new ChartThemeVanilla();
51 case QChart::ChartThemeIcy:
51 case QChart::ChartThemeIcy:
52 return new ChartThemeIcy();
52 return new ChartThemeIcy();
53 case QChart::ChartThemeGrayscale:
53 case QChart::ChartThemeGrayscale:
54 return new ChartThemeGrayscale();
54 return new ChartThemeGrayscale();
55 case QChart::ChartThemeScientific:
55 case QChart::ChartThemeScientific:
56 return new ChartThemeScientific();
56 return new ChartThemeScientific();
57 default:
57 default:
58 return new ChartThemeDefault();
58 return new ChartThemeDefault();
59 }
59 }
60 }
60 }
61
61
62 void ChartTheme::decorate(QChart* chart)
62 void ChartTheme::decorate(QChart* chart)
63 {
63 {
64 chart->setChartBackgroundBrush(m_backgroundGradient);
64 chart->setChartBackgroundBrush(m_backgroundGradient);
65 }
65 }
66 //TODO helper to by removed later
66 //TODO helper to by removed later
67 void ChartTheme::decorate(ChartItem* item, QSeries* series,int count)
67 void ChartTheme::decorate(ChartItem* item, QSeries* series,int count)
68 {
68 {
69 switch(series->type())
69 switch(series->type())
70 {
70 {
71 case QSeries::SeriesTypeLine: {
71 case QSeries::SeriesTypeLine: {
72 QLineSeries* s = static_cast<QLineSeries*>(series);
72 QLineSeries* s = static_cast<QLineSeries*>(series);
73 LineChartItem* i = static_cast<LineChartItem*>(item);
73 LineChartItem* i = static_cast<LineChartItem*>(item);
74 decorate(i,s,count);
74 decorate(i,s,count);
75 break;
75 break;
76 }
76 }
77 case QSeries::SeriesTypeArea: {
77 case QSeries::SeriesTypeArea: {
78 QAreaSeries* s = static_cast<QAreaSeries*>(series);
78 QAreaSeries* s = static_cast<QAreaSeries*>(series);
79 AreaChartItem* i = static_cast<AreaChartItem*>(item);
79 AreaChartItem* i = static_cast<AreaChartItem*>(item);
80 decorate(i,s,count);
80 decorate(i,s,count);
81 break;
81 break;
82 }
82 }
83 case QSeries::SeriesTypeBar: {
83 case QSeries::SeriesTypeBar: {
84 QBarSeries* b = static_cast<QBarSeries*>(series);
84 QBarSeries* b = static_cast<QBarSeries*>(series);
85 BarPresenter* i = static_cast<BarPresenter*>(item);
85 BarPresenter* i = static_cast<BarPresenter*>(item);
86 decorate(i,b,count);
86 decorate(i,b,count);
87 break;
87 break;
88 }
88 }
89 case QSeries::SeriesTypeStackedBar: {
89 case QSeries::SeriesTypeStackedBar: {
90 QStackedBarSeries* s = static_cast<QStackedBarSeries*>(series);
90 QStackedBarSeries* s = static_cast<QStackedBarSeries*>(series);
91 StackedBarPresenter* i = static_cast<StackedBarPresenter*>(item);
91 StackedBarPresenter* i = static_cast<StackedBarPresenter*>(item);
92 decorate(i,s,count);
92 decorate(i,s,count);
93 break;
93 break;
94 }
94 }
95 case QSeries::SeriesTypePercentBar: {
95 case QSeries::SeriesTypePercentBar: {
96 QPercentBarSeries* s = static_cast<QPercentBarSeries*>(series);
96 QPercentBarSeries* s = static_cast<QPercentBarSeries*>(series);
97 PercentBarPresenter* i = static_cast<PercentBarPresenter*>(item);
97 PercentBarPresenter* i = static_cast<PercentBarPresenter*>(item);
98 decorate(i,s,count);
98 decorate(i,s,count);
99 break;
99 break;
100 }
100 }
101 case QSeries::SeriesTypeScatter: {
101 case QSeries::SeriesTypeScatter: {
102 QScatterSeries* s = qobject_cast<QScatterSeries*>(series);
102 QScatterSeries* s = qobject_cast<QScatterSeries*>(series);
103 Q_ASSERT(s);
103 Q_ASSERT(s);
104 ScatterChartItem* i = static_cast<ScatterChartItem*>(item);
104 ScatterChartItem* i = static_cast<ScatterChartItem*>(item);
105 Q_ASSERT(i);
105 Q_ASSERT(i);
106 decorate(i, s, count);
106 decorate(i, s, count);
107 break;
107 break;
108 }
108 }
109 case QSeries::SeriesTypePie: {
109 case QSeries::SeriesTypePie: {
110 QPieSeries* s = static_cast<QPieSeries*>(series);
110 QPieSeries* s = static_cast<QPieSeries*>(series);
111 PiePresenter* i = static_cast<PiePresenter*>(item);
111 PiePresenter* i = static_cast<PiePresenter*>(item);
112 decorate(i,s,count);
112 decorate(i,s,count);
113 break;
113 break;
114 }
114 }
115 default:
115 default:
116 qDebug()<<"Wrong item to be decorated by theme";
116 qDebug()<<"Wrong item to be decorated by theme";
117 break;
117 break;
118 }
118 }
119
119
120 }
120 }
121
121
122 void ChartTheme::decorate(AreaChartItem* item, QAreaSeries* series,int count)
122 void ChartTheme::decorate(AreaChartItem* item, QAreaSeries* series,int count)
123 {
123 {
124 QPen pen;
124 QPen pen;
125 QBrush brush;
125 QBrush brush;
126
126
127 if(pen != series->pen()){
127 if(pen != series->pen()){
128 item->setPen(series->pen());
128 item->setPen(series->pen());
129 }else{
129 }else{
130 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
130 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
131 pen.setWidthF(2);
131 pen.setWidthF(2);
132 item->setPen(pen);
132 item->setPen(pen);
133 }
133 }
134
134
135 if(brush != series->brush()){
135 if(brush != series->brush()){
136 item->setBrush(series->brush());
136 item->setBrush(series->brush());
137 }else{
137 }else{
138 QBrush brush(m_seriesColors.at(count%m_seriesColors.size()));
138 QBrush brush(m_seriesColors.at(count%m_seriesColors.size()));
139 item->setBrush(brush);
139 item->setBrush(brush);
140 }
140 }
141 }
141 }
142
142
143
143
144 void ChartTheme::decorate(LineChartItem* item, QLineSeries* series,int count)
144 void ChartTheme::decorate(LineChartItem* item, QLineSeries* series,int count)
145 {
145 {
146 QPen pen;
146 QPen pen;
147 if(pen != series->pen()){
147 if(pen != series->pen()){
148 item->setLinePen(series->pen());
148 item->setLinePen(series->pen());
149 return;
149 return;
150 }
150 }
151 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
151 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
152 pen.setWidthF(2);
152 pen.setWidthF(2);
153 item->setLinePen(pen);
153 item->setLinePen(pen);
154 }
154 }
155
155
156 void ChartTheme::decorate(BarPresenter* item, QBarSeries* series,int count)
156 void ChartTheme::decorate(BarPresenter* item, QBarSeries* series,int count)
157 {
157 {
158 QList<QBarSet*> sets = series->barSets();
158 QList<QBarSet*> sets = series->barSets();
159 for (int i=0; i<sets.count(); i++) {
159 for (int i=0; i<sets.count(); i++) {
160 qreal pos = (qreal) i / (qreal) sets.count();
160 qreal pos = (qreal) i / (qreal) sets.count();
161 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
161 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
162 sets.at(i)->setBrush(QBrush(c));
162 sets.at(i)->setBrush(QBrush(c));
163
163
164 // Pick label color as far as possible from bar color (within gradient).
164 // Pick label color as far as possible from bar color (within gradient).
165 // 0.3 is magic number that was picked as value that gave enough contrast with icy theme gradient :)
165 // 0.3 is magic number that was picked as value that gave enough contrast with icy theme gradient :)
166 // TODO: better picking of label color?
166 // TODO: better picking of label color?
167 if (pos < 0.3) {
167 if (pos < 0.3) {
168 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
168 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
169 } else {
169 } else {
170 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
170 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
171 }
171 }
172 sets.at(i)->setFloatingValuePen(QPen(c));
172 sets.at(i)->setFloatingValuePen(QPen(c));
173 }
173 }
174 }
174 }
175
175
176 void ChartTheme::decorate(StackedBarPresenter* item, QStackedBarSeries* series,int count)
176 void ChartTheme::decorate(StackedBarPresenter* item, QStackedBarSeries* series,int count)
177 {
177 {
178 QList<QBarSet*> sets = series->barSets();
178 QList<QBarSet*> sets = series->barSets();
179 for (int i=0; i<sets.count(); i++) {
179 for (int i=0; i<sets.count(); i++) {
180 qreal pos = (qreal) i / (qreal) sets.count();
180 qreal pos = (qreal) i / (qreal) sets.count();
181 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
181 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
182 sets.at(i)->setBrush(QBrush(c));
182 sets.at(i)->setBrush(QBrush(c));
183
183
184 if (pos < 0.3) {
184 if (pos < 0.3) {
185 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
185 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
186 } else {
186 } else {
187 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
187 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
188 }
188 }
189 sets.at(i)->setFloatingValuePen(QPen(c));
189 sets.at(i)->setFloatingValuePen(QPen(c));
190 }
190 }
191 }
191 }
192
192
193 void ChartTheme::decorate(PercentBarPresenter* item, QPercentBarSeries* series,int count)
193 void ChartTheme::decorate(PercentBarPresenter* item, QPercentBarSeries* series,int count)
194 {
194 {
195 QList<QBarSet*> sets = series->barSets();
195 QList<QBarSet*> sets = series->barSets();
196 for (int i=0; i<sets.count(); i++) {
196 for (int i=0; i<sets.count(); i++) {
197 qreal pos = (qreal) i / (qreal) sets.count();
197 qreal pos = (qreal) i / (qreal) sets.count();
198 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
198 QColor c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
199 sets.at(i)->setBrush(QBrush(c));
199 sets.at(i)->setBrush(QBrush(c));
200
200
201 if (pos < 0.3) {
201 if (pos < 0.3) {
202 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
202 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 1);
203 } else {
203 } else {
204 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
204 c = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0);
205 }
205 }
206 sets.at(i)->setFloatingValuePen(QPen(c));
206 sets.at(i)->setFloatingValuePen(QPen(c));
207 }
207 }
208 }
208 }
209
209
210 void ChartTheme::decorate(ScatterChartItem* item, QScatterSeries* series, int count)
210 void ChartTheme::decorate(ScatterChartItem* item, QScatterSeries* series, int count)
211 {
211 {
212 Q_ASSERT(item);
212 Q_ASSERT(item);
213 Q_ASSERT(series);
213 Q_ASSERT(series);
214
214
215 QColor color = m_seriesColors.at(count % m_seriesColors.size());
215 // Use a base color for brush
216 // TODO: define alpha in the theme? or in the series?
216 item->setBrush(m_seriesColors.at(count % m_seriesColors.size()));
217 //color.setAlpha(120);
218
219 QBrush brush(color, Qt::SolidPattern);
220 item->setBrush(Qt::blue);
221
217
222 QPen pen(brush, 3);
218 // Take pen near from gradient start, effectively using a lighter color for outline
223 pen.setColor(color);
219 QPen pen(QBrush(Qt::SolidPattern), 3);
220 pen.setColor(colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0.1));
224 item->setPen(pen);
221 item->setPen(pen);
225 }
222 }
226
223
227 void ChartTheme::decorate(PiePresenter* item, QPieSeries* series, int count)
224 void ChartTheme::decorate(PiePresenter* item, QPieSeries* series, int count)
228 {
225 {
229 // Get color for a slice from a gradient linearly, beginning from the start of the gradient
226 // Get color for a slice from a gradient linearly, beginning from the start of the gradient
230 for (int i(0); i < series->slices().count(); i++) {
227 for (int i(0); i < series->slices().count(); i++) {
231 qreal pos = (qreal) i / (qreal) series->count();
228 qreal pos = (qreal) i / (qreal) series->count();
232 QColor penColor = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0.1);
229 QColor penColor = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), 0.1);
233 series->slices().at(i)->setSlicePen(penColor);
230 series->slices().at(i)->setSlicePen(penColor);
234 QColor brushColor = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
231 QColor brushColor = colorAt(m_seriesGradients.at(count % m_seriesGradients.size()), pos);
235 series->slices().at(i)->setSliceBrush(brushColor);
232 series->slices().at(i)->setSliceBrush(brushColor);
236 }
233 }
237 }
234 }
238
235
239
236
240 void ChartTheme::decorate(QChartAxis* axis, AxisItem* item)
237 void ChartTheme::decorate(QChartAxis* axis, AxisItem* item)
241 {
238 {
242 //TODO: dummy defults for now
239 //TODO: dummy defults for now
243 axis->setLabelsBrush(Qt::black);
240 axis->setLabelsBrush(Qt::black);
244 axis->setLabelsPen(Qt::NoPen);
241 axis->setLabelsPen(Qt::NoPen);
245 axis->setShadesPen(Qt::NoPen);
242 axis->setShadesPen(Qt::NoPen);
246 axis->setShadesOpacity(0.5);
243 axis->setShadesOpacity(0.5);
247 }
244 }
248
245
249 void ChartTheme::decorate(SplineChartItem* item, QSplineSeries* series, int count)
246 void ChartTheme::decorate(SplineChartItem* item, QSplineSeries* series, int count)
250 {
247 {
251 Q_ASSERT(item);
248 Q_ASSERT(item);
252 Q_ASSERT(series);
249 Q_ASSERT(series);
253
250
254 QPen pen;
251 QPen pen;
255
252
256 if(pen != series->pen()){
253 if(pen != series->pen()){
257 item->setLinePen(series->pen());
254 item->setLinePen(series->pen());
258 }else{
255 }else{
259 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
256 pen.setColor(m_seriesColors.at(count%m_seriesColors.size()));
260 pen.setWidthF(series->pen().widthF());
257 pen.setWidthF(series->pen().widthF());
261 item->setLinePen(series->pen());
258 item->setLinePen(series->pen());
262 }
259 }
263
260
264 // QColor color = m_seriesColors.at(count % m_seriesColors.size());
261 // QColor color = m_seriesColors.at(count % m_seriesColors.size());
265 // TODO: define alpha in the theme? or in the series?
262 // TODO: define alpha in the theme? or in the series?
266 //color.setAlpha(120);
263 //color.setAlpha(120);
267
264
268 // QBrush brush(color, Qt::SolidPattern);
265 // QBrush brush(color, Qt::SolidPattern);
269 // presenter->m_markerBrush = brush;
266 // presenter->m_markerBrush = brush;
270
267
271 // QPen pen(brush, 3);
268 // QPen pen(brush, 3);
272 // pen.setColor(color);
269 // pen.setColor(color);
273 // presenter->m_markerPen = pen;
270 // presenter->m_markerPen = pen;
274 }
271 }
275
272
276 void ChartTheme::generateSeriesGradients()
273 void ChartTheme::generateSeriesGradients()
277 {
274 {
278 // Generate gradients in HSV color space
275 // Generate gradients in HSV color space
279 foreach (QColor color, m_seriesColors) {
276 foreach (QColor color, m_seriesColors) {
280 QLinearGradient g;
277 QLinearGradient g;
281 qreal h = color.hsvHueF();
278 qreal h = color.hsvHueF();
282 qreal s = color.hsvSaturationF();
279 qreal s = color.hsvSaturationF();
283
280
284 // TODO: tune the algorithm to give nice results with most base colors defined in
281 // TODO: tune the algorithm to give nice results with most base colors defined in
285 // most themes. The rest of the gradients we can define manually in theme specific
282 // most themes. The rest of the gradients we can define manually in theme specific
286 // implementation.
283 // implementation.
287 QColor start = color;
284 QColor start = color;
288 start.setHsvF(h, 0.05, 0.95);
285 start.setHsvF(h, 0.05, 0.95);
289 g.setColorAt(0.0, start);
286 g.setColorAt(0.0, start);
290
287
291 g.setColorAt(0.5, color);
288 g.setColorAt(0.5, color);
292
289
293 QColor end = color;
290 QColor end = color;
294 end.setHsvF(h, s, 0.25);
291 end.setHsvF(h, s, 0.25);
295 g.setColorAt(1.0, end);
292 g.setColorAt(1.0, end);
296
293
297 m_seriesGradients << g;
294 m_seriesGradients << g;
298 }
295 }
299 }
296 }
300
297
301
298
302 QColor ChartTheme::colorAt(const QColor &start, const QColor &end, qreal pos)
299 QColor ChartTheme::colorAt(const QColor &start, const QColor &end, qreal pos)
303 {
300 {
304 Q_ASSERT(pos >=0.0 && pos <= 1.0);
301 Q_ASSERT(pos >=0.0 && pos <= 1.0);
305 qreal r = start.redF() + ((end.redF() - start.redF()) * pos);
302 qreal r = start.redF() + ((end.redF() - start.redF()) * pos);
306 qreal g = start.greenF() + ((end.greenF() - start.greenF()) * pos);
303 qreal g = start.greenF() + ((end.greenF() - start.greenF()) * pos);
307 qreal b = start.blueF() + ((end.blueF() - start.blueF()) * pos);
304 qreal b = start.blueF() + ((end.blueF() - start.blueF()) * pos);
308 QColor c;
305 QColor c;
309 c.setRgbF(r, g, b);
306 c.setRgbF(r, g, b);
310 return c;
307 return c;
311 }
308 }
312
309
313 QColor ChartTheme::colorAt(const QGradient &gradient, qreal pos)
310 QColor ChartTheme::colorAt(const QGradient &gradient, qreal pos)
314 {
311 {
315 Q_ASSERT(pos >=0 && pos <= 1.0);
312 Q_ASSERT(pos >=0 && pos <= 1.0);
316
313
317 // another possibility:
314 // another possibility:
318 // http://stackoverflow.com/questions/3306786/get-intermediate-color-from-a-gradient
315 // http://stackoverflow.com/questions/3306786/get-intermediate-color-from-a-gradient
319
316
320 QGradientStops stops = gradient.stops();
317 QGradientStops stops = gradient.stops();
321 int count = stops.count();
318 int count = stops.count();
322
319
323 // find previous stop relative to position
320 // find previous stop relative to position
324 QGradientStop prev = stops.first();
321 QGradientStop prev = stops.first();
325 for (int i=0; i<count; i++) {
322 for (int i=0; i<count; i++) {
326 QGradientStop stop = stops.at(i);
323 QGradientStop stop = stops.at(i);
327 if (pos > stop.first)
324 if (pos > stop.first)
328 prev = stop;
325 prev = stop;
329
326
330 // given position is actually a stop position?
327 // given position is actually a stop position?
331 if (pos == stop.first) {
328 if (pos == stop.first) {
332 //qDebug() << "stop color" << pos;
329 //qDebug() << "stop color" << pos;
333 return stop.second;
330 return stop.second;
334 }
331 }
335 }
332 }
336
333
337 // find next stop relative to position
334 // find next stop relative to position
338 QGradientStop next = stops.last();
335 QGradientStop next = stops.last();
339 for (int i=count-1; i>=0; i--) {
336 for (int i=count-1; i>=0; i--) {
340 QGradientStop stop = stops.at(i);
337 QGradientStop stop = stops.at(i);
341 if (pos < stop.first)
338 if (pos < stop.first)
342 next = stop;
339 next = stop;
343 }
340 }
344
341
345 //qDebug() << "prev" << prev.first << "pos" << pos << "next" << next.first;
342 //qDebug() << "prev" << prev.first << "pos" << pos << "next" << next.first;
346
343
347 qreal range = next.first - prev.first;
344 qreal range = next.first - prev.first;
348 qreal posDelta = pos - prev.first;
345 qreal posDelta = pos - prev.first;
349 qreal relativePos = posDelta / range;
346 qreal relativePos = posDelta / range;
350
347
351 //qDebug() << "range" << range << "posDelta" << posDelta << "relativePos" << relativePos;
348 //qDebug() << "range" << range << "posDelta" << posDelta << "relativePos" << relativePos;
352
349
353 return colorAt(prev.second, next.second, relativePos);
350 return colorAt(prev.second, next.second, relativePos);
354 }
351 }
355
352
356 QTCOMMERCIALCHART_END_NAMESPACE
353 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now