Mercurial > hg > svgui
comparison layer/LinearNumericalScale.cpp @ 1258:0cc6ab236b0d scale-ticks
Make use of ScaleTickIntervals in linear numerical scale (not log yet)
author | Chris Cannam |
---|---|
date | Thu, 04 May 2017 10:24:23 +0100 |
parents | 5144d7185fb5 |
children | 4d7e566092a7 |
comparison
equal
deleted
inserted
replaced
1257:14dcdc596baf | 1258:0cc6ab236b0d |
---|---|
20 | 20 |
21 #include <cmath> | 21 #include <cmath> |
22 | 22 |
23 #include "LayerGeometryProvider.h" | 23 #include "LayerGeometryProvider.h" |
24 | 24 |
25 #include "base/ScaleTickIntervals.h" | |
26 | |
25 int | 27 int |
26 LinearNumericalScale::getWidth(LayerGeometryProvider *, | 28 LinearNumericalScale::getWidth(LayerGeometryProvider *, |
27 QPainter &paint) | 29 QPainter &paint) |
28 { | 30 { |
29 return paint.fontMetrics().width("-000.00") + 10; | 31 return paint.fontMetrics().width("-000.00") + 10; |
37 double minf, | 39 double minf, |
38 double maxf) | 40 double maxf) |
39 { | 41 { |
40 int n = 10; | 42 int n = 10; |
41 | 43 |
42 double val = minf; | 44 auto ticks = ScaleTickIntervals::linear({ minf, maxf, n }); |
43 double inc = (maxf - val) / n; | |
44 | |
45 const int buflen = 40; | |
46 char buffer[buflen]; | |
47 | 45 |
48 int w = getWidth(v, paint) + x0; | 46 int w = getWidth(v, paint) + x0; |
49 | 47 |
50 double round = 1.0; | |
51 int dp = 0; | |
52 if (inc > 0) { | |
53 int prec = int(trunc(log10(inc))); | |
54 prec -= 1; | |
55 if (prec < 0) dp = -prec; | |
56 round = pow(10.0, prec); | |
57 #ifdef DEBUG_TIME_VALUE_LAYER | |
58 cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl; | |
59 #endif | |
60 } | |
61 | |
62 int prevy = -1; | 48 int prevy = -1; |
63 | 49 |
64 for (int i = 0; i < n; ++i) { | 50 for (int i = 0; i < int(ticks.ticks.size()); ++i) { |
65 | 51 |
66 int y, ty; | 52 int y, ty; |
67 bool drawText = true; | 53 bool drawText = true; |
68 | |
69 double dispval = val; | |
70 | 54 |
71 if (i == n-1 && | 55 if (i == n-1 && |
72 v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) { | 56 v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) { |
73 if (layer->getScaleUnits() != "") drawText = false; | 57 if (layer->getScaleUnits() != "") drawText = false; |
74 } | 58 } |
75 dispval = int(rint(val / round) * round); | |
76 | 59 |
77 #ifdef DEBUG_TIME_VALUE_LAYER | 60 double val = ticks.ticks[i].value; |
78 cerr << "val = " << val << ", dispval = " << dispval << endl; | 61 QString label = QString::fromStdString(ticks.ticks[i].label); |
79 #endif | 62 |
80 | 63 y = layer->getYForValue(v, val); |
81 y = layer->getYForValue(v, dispval); | |
82 | 64 |
83 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; | 65 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2; |
84 | 66 |
85 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { | 67 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) { |
86 val += inc; | |
87 continue; | 68 continue; |
88 } | 69 } |
89 | |
90 snprintf(buffer, buflen, "%.*f", dp, dispval); | |
91 | |
92 QString label = QString(buffer); | |
93 | 70 |
94 paint.drawLine(w - 5, y, w, y); | 71 paint.drawLine(w - 5, y, w, y); |
95 | 72 |
96 if (drawText) { | 73 if (drawText) { |
97 paint.drawText(w - paint.fontMetrics().width(label) - 6, | 74 paint.drawText(w - paint.fontMetrics().width(label) - 6, |
98 ty, label); | 75 ty, label); |
99 } | 76 } |
100 | 77 |
101 prevy = y; | 78 prevy = y; |
102 val += inc; | |
103 } | 79 } |
104 } | 80 } |