comparison layer/TimeValueLayer.cpp @ 706:97ea68f62c1f imaf_enc

Merge from default branch
author Chris Cannam
date Thu, 05 Dec 2013 09:47:02 +0000
parents 084f65094203
children ceb9a2992d96 88a16eed3338
comparison
equal deleted inserted replaced
678:26c5f7fd4807 706:97ea68f62c1f
26 #include "data/model/SparseTimeValueModel.h" 26 #include "data/model/SparseTimeValueModel.h"
27 #include "data/model/Labeller.h" 27 #include "data/model/Labeller.h"
28 28
29 #include "widgets/ItemEditDialog.h" 29 #include "widgets/ItemEditDialog.h"
30 #include "widgets/ListInputDialog.h" 30 #include "widgets/ListInputDialog.h"
31 #include "widgets/TextAbbrev.h"
31 32
32 #include "ColourMapper.h" 33 #include "ColourMapper.h"
34 #include "PianoScale.h"
35 #include "LinearNumericalScale.h"
36 #include "LogNumericalScale.h"
37 #include "LinearColourScale.h"
38 #include "LogColourScale.h"
33 39
34 #include <QPainter> 40 #include <QPainter>
35 #include <QPainterPath> 41 #include <QPainterPath>
36 #include <QMouseEvent> 42 #include <QMouseEvent>
37 #include <QRegExp> 43 #include <QRegExp>
79 if (m_model && m_model->getRDFTypeURI().endsWith("Change")) { 85 if (m_model && m_model->getRDFTypeURI().endsWith("Change")) {
80 setPlotStyle(PlotSegmentation); 86 setPlotStyle(PlotSegmentation);
81 } 87 }
82 88
83 #ifdef DEBUG_TIME_VALUE_LAYER 89 #ifdef DEBUG_TIME_VALUE_LAYER
84 std::cerr << "TimeValueLayer::setModel(" << model << ")" << std::endl; 90 cerr << "TimeValueLayer::setModel(" << model << ")" << endl;
85 #endif 91 #endif
86 92
87 emit modelReplaced(); 93 emit modelReplaced();
88 } 94 }
89 95
141 return tr("Plot Type"); 147 return tr("Plot Type");
142 } 148 }
143 return SingleColourLayer::getPropertyGroupName(name); 149 return SingleColourLayer::getPropertyGroupName(name);
144 } 150 }
145 151
152 QString
153 TimeValueLayer::getScaleUnits() const
154 {
155 if (m_model) return m_model->getScaleUnits();
156 else return "";
157 }
158
146 int 159 int
147 TimeValueLayer::getPropertyRangeAndValue(const PropertyName &name, 160 TimeValueLayer::getPropertyRangeAndValue(const PropertyName &name,
148 int *min, int *max, int *deflt) const 161 int *min, int *max, int *deflt) const
149 { 162 {
150 int val = 0; 163 int val = 0;
176 } else if (name == "Scale Units") { 189 } else if (name == "Scale Units") {
177 190
178 if (deflt) *deflt = 0; 191 if (deflt) *deflt = 0;
179 if (m_model) { 192 if (m_model) {
180 val = UnitDatabase::getInstance()->getUnitId 193 val = UnitDatabase::getInstance()->getUnitId
181 (m_model->getScaleUnits()); 194 (getScaleUnits());
182 } 195 }
183 196
184 } else if (name == "Draw Segment Division Lines") { 197 } else if (name == "Draw Segment Division Lines") {
185 198
186 if (min) *min = 0; 199 if (min) *min = 0;
324 min = m_model->getValueMinimum(); 337 min = m_model->getValueMinimum();
325 max = m_model->getValueMaximum(); 338 max = m_model->getValueMaximum();
326 339
327 logarithmic = (m_verticalScale == LogScale); 340 logarithmic = (m_verticalScale == LogScale);
328 341
329 unit = m_model->getScaleUnits(); 342 unit = getScaleUnits();
330 343
331 if (m_derivative) { 344 if (m_derivative) {
332 max = std::max(fabsf(min), fabsf(max)); 345 max = std::max(fabsf(min), fabsf(max));
333 min = -max; 346 min = -max;
334 } 347 }
335 348
336 #ifdef DEBUG_TIME_VALUE_LAYER 349 #ifdef DEBUG_TIME_VALUE_LAYER
337 std::cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << std::endl; 350 cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << endl;
338 #endif 351 #endif
339 352
340 if (!shouldAutoAlign() && !logarithmic && !m_derivative) { 353 if (!shouldAutoAlign() && !logarithmic && !m_derivative) {
341 354
342 if (max == min) { 355 if (max == min) {
347 max = max + margin; 360 max = max + margin;
348 min = min - margin; 361 min = min - margin;
349 } 362 }
350 363
351 #ifdef DEBUG_TIME_VALUE_LAYER 364 #ifdef DEBUG_TIME_VALUE_LAYER
352 std::cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << " (after adjustment)" << std::endl; 365 cerr << "TimeValueLayer::getValueExtents: min = " << min << ", max = " << max << " (after adjustment)" << endl;
353 #endif 366 #endif
354 } 367 }
355 368
356 return true; 369 return true;
357 } 370 }
374 max = std::max(fabsf(min), fabsf(max)); 387 max = std::max(fabsf(min), fabsf(max));
375 min = -max; 388 min = -max;
376 } 389 }
377 390
378 #ifdef DEBUG_TIME_VALUE_LAYER 391 #ifdef DEBUG_TIME_VALUE_LAYER
379 std::cerr << "TimeValueLayer::getDisplayExtents: min = " << min << ", max = " << max << std::endl; 392 cerr << "TimeValueLayer::getDisplayExtents: min = " << min << ", max = " << max << endl;
380 #endif 393 #endif
381 394
382 return true; 395 return true;
383 } 396 }
384 397
397 410
398 m_scaleMinimum = min; 411 m_scaleMinimum = min;
399 m_scaleMaximum = max; 412 m_scaleMaximum = max;
400 413
401 #ifdef DEBUG_TIME_VALUE_LAYER 414 #ifdef DEBUG_TIME_VALUE_LAYER
402 std::cerr << "TimeValueLayer::setDisplayExtents: min = " << min << ", max = " << max << std::endl; 415 cerr << "TimeValueLayer::setDisplayExtents: min = " << min << ", max = " << max << endl;
403 #endif 416 #endif
404 417
405 emit layerParametersChanged(); 418 emit layerParametersChanged();
406 return true; 419 return true;
407 } 420 }
429 getDisplayExtents(dmin, dmax); 442 getDisplayExtents(dmin, dmax);
430 443
431 int nr = mapper->getPositionForValue(dmax - dmin); 444 int nr = mapper->getPositionForValue(dmax - dmin);
432 445
433 #ifdef DEBUG_TIME_VALUE_LAYER 446 #ifdef DEBUG_TIME_VALUE_LAYER
434 std::cerr << "TimeValueLayer::getCurrentVerticalZoomStep: dmin = " << dmin << ", dmax = " << dmax << ", nr = " << nr << std::endl; 447 cerr << "TimeValueLayer::getCurrentVerticalZoomStep: dmin = " << dmin << ", dmax = " << dmax << ", nr = " << nr << endl;
435 #endif 448 #endif
436 449
437 delete mapper; 450 delete mapper;
438 451
439 return 100 - nr; 452 return 100 - nr;
466 479
467 newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2; 480 newmax = (newdist + sqrtf(newdist*newdist + 4*dmin*dmax)) / 2;
468 newmin = newmax - newdist; 481 newmin = newmax - newdist;
469 482
470 #ifdef DEBUG_TIME_VALUE_LAYER 483 #ifdef DEBUG_TIME_VALUE_LAYER
471 std::cerr << "newmin = " << newmin << ", newmax = " << newmax << std::endl; 484 cerr << "newmin = " << newmin << ", newmax = " << newmax << endl;
472 #endif 485 #endif
473 486
474 } else { 487 } else {
475 float dmid = (dmax + dmin) / 2; 488 float dmid = (dmax + dmin) / 2;
476 newmin = dmid - newdist / 2; 489 newmin = dmid - newdist / 2;
484 if (newmax > max) { 497 if (newmax > max) {
485 newmax = max; 498 newmax = max;
486 } 499 }
487 500
488 #ifdef DEBUG_TIME_VALUE_LAYER 501 #ifdef DEBUG_TIME_VALUE_LAYER
489 std::cerr << "TimeValueLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << std::endl; 502 cerr << "TimeValueLayer::setVerticalZoomStep: " << step << ": " << newmin << " -> " << newmax << " (range " << newdist << ")" << endl;
490 #endif 503 #endif
491 504
492 setDisplayExtents(newmin, newmax); 505 setDisplayExtents(newmin, newmax);
493 } 506 }
494 507
592 long useFrame = points.begin()->frame; 605 long useFrame = points.begin()->frame;
593 606
594 RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate()); 607 RealTime rt = RealTime::frame2RealTime(useFrame, m_model->getSampleRate());
595 608
596 QString text; 609 QString text;
597 QString unit = m_model->getScaleUnits(); 610 QString unit = getScaleUnits();
598 if (unit != "") unit = " " + unit; 611 if (unit != "") unit = " " + unit;
599 612
600 if (points.begin()->label == "") { 613 if (points.begin()->label == "") {
601 text = QString(tr("Time:\t%1\nValue:\t%2%3\nNo label")) 614 text = QString(tr("Time:\t%1\nValue:\t%2%3\nNo label"))
602 .arg(rt.toText(true).c_str()) 615 .arg(rt.toText(true).c_str())
767 max = 0.0; 780 max = 0.0;
768 log = false; 781 log = false;
769 782
770 if (shouldAutoAlign()) { 783 if (shouldAutoAlign()) {
771 784
772 if (!v->getValueExtents(m_model->getScaleUnits(), min, max, log)) { 785 if (!v->getValueExtents(getScaleUnits(), min, max, log)) {
773 min = m_model->getValueMinimum(); 786 min = m_model->getValueMinimum();
774 max = m_model->getValueMaximum(); 787 max = m_model->getValueMaximum();
775 } else if (log) { 788 } else if (log) {
776 LogRange::mapRange(min, max); 789 LogRange::mapRange(min, max);
777 } 790 }
790 log = true; 803 log = true;
791 } 804 }
792 } 805 }
793 806
794 #ifdef DEBUG_TIME_VALUE_LAYER 807 #ifdef DEBUG_TIME_VALUE_LAYER
795 std::cerr << "TimeValueLayer::getScaleExtents: min = " << min << ", max = " << max << std::endl; 808 cerr << "TimeValueLayer::getScaleExtents: min = " << min << ", max = " << max << endl;
796 #endif 809 #endif
797 } 810 }
798 811
799 int 812 int
800 TimeValueLayer::getYForValue(View *v, float val) const 813 TimeValueLayer::getYForValue(View *v, float val) const
804 int h = v->height(); 817 int h = v->height();
805 818
806 getScaleExtents(v, min, max, logarithmic); 819 getScaleExtents(v, min, max, logarithmic);
807 820
808 #ifdef DEBUG_TIME_VALUE_LAYER 821 #ifdef DEBUG_TIME_VALUE_LAYER
809 std::cerr << "getYForValue(" << val << "): min " << min << ", max " 822 cerr << "getYForValue(" << val << "): min " << min << ", max "
810 << max << ", log " << logarithmic << std::endl; 823 << max << ", log " << logarithmic << endl;
811 #endif 824 #endif
812 825
813 if (logarithmic) { 826 if (logarithmic) {
814 val = LogRange::map(val); 827 val = LogRange::map(val);
815 } 828 }
837 850
838 bool 851 bool
839 TimeValueLayer::shouldAutoAlign() const 852 TimeValueLayer::shouldAutoAlign() const
840 { 853 {
841 if (!m_model) return false; 854 if (!m_model) return false;
842 QString unit = m_model->getScaleUnits(); 855 QString unit = getScaleUnits();
843 return (m_verticalScale == AutoAlignScale && unit != ""); 856 return (m_verticalScale == AutoAlignScale && unit != "");
844 } 857 }
845 858
846 QColor 859 QColor
847 TimeValueLayer::getColourForValue(View *v, float val) const 860 TimeValueLayer::getColourForValue(View *v, float val) const
856 if (log) { 869 if (log) {
857 val = LogRange::map(val); 870 val = LogRange::map(val);
858 } 871 }
859 872
860 #ifdef DEBUG_TIME_VALUE_LAYER 873 #ifdef DEBUG_TIME_VALUE_LAYER
861 std::cerr << "TimeValueLayer::getColourForValue: min " << min << ", max " 874 cerr << "TimeValueLayer::getColourForValue: min " << min << ", max "
862 << max << ", log " << log << ", value " << val << std::endl; 875 << max << ", log " << log << ", value " << val << endl;
863 #endif 876 #endif
864 877
865 QColor solid = ColourMapper(m_colourMap, min, max).map(val); 878 QColor solid = ColourMapper(m_colourMap, min, max).map(val);
866 return QColor(solid.red(), solid.green(), solid.blue(), 120); 879 return QColor(solid.red(), solid.green(), solid.blue(), 120);
867 } 880 }
900 QColor brushColour(getBaseQColor()); 913 QColor brushColour(getBaseQColor());
901 brushColour.setAlpha(80); 914 brushColour.setAlpha(80);
902 paint.setBrush(brushColour); 915 paint.setBrush(brushColour);
903 916
904 #ifdef DEBUG_TIME_VALUE_LAYER 917 #ifdef DEBUG_TIME_VALUE_LAYER
905 std::cerr << "TimeValueLayer::paint: resolution is " 918 cerr << "TimeValueLayer::paint: resolution is "
906 << m_model->getResolution() << " frames" << std::endl; 919 << m_model->getResolution() << " frames" << endl;
907 #endif 920 #endif
908 921
909 float min = m_model->getValueMinimum(); 922 float min = m_model->getValueMinimum();
910 float max = m_model->getValueMaximum(); 923 float max = m_model->getValueMaximum();
911 if (max == min) max = min + 1.0; 924 if (max == min) max = min + 1.0;
918 931
919 if (v->shouldIlluminateLocalFeatures(this, localPos)) { 932 if (v->shouldIlluminateLocalFeatures(this, localPos)) {
920 SparseTimeValueModel::PointList localPoints = 933 SparseTimeValueModel::PointList localPoints =
921 getLocalPoints(v, localPos.x()); 934 getLocalPoints(v, localPos.x());
922 #ifdef DEBUG_TIME_VALUE_LAYER 935 #ifdef DEBUG_TIME_VALUE_LAYER
923 std::cerr << "TimeValueLayer: " << localPoints.size() << " local points" << std::endl; 936 cerr << "TimeValueLayer: " << localPoints.size() << " local points" << endl;
924 #endif 937 #endif
925 if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame; 938 if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame;
926 } 939 }
927 940
928 int w = 941 int w =
1002 nx = v->getXForFrame(nf); 1015 nx = v->getXForFrame(nf);
1003 ny = getYForValue(v, nvalue); 1016 ny = getYForValue(v, nvalue);
1004 haveNext = true; 1017 haveNext = true;
1005 } 1018 }
1006 1019
1007 // std::cout << "frame = " << p.frame << ", x = " << x << ", haveNext = " << haveNext 1020 // cout << "frame = " << p.frame << ", x = " << x << ", haveNext = " << haveNext
1008 // << ", nx = " << nx << std::endl; 1021 // << ", nx = " << nx << endl;
1009 1022
1010 if (m_plotStyle == PlotDiscreteCurves) { 1023 if (m_plotStyle == PlotDiscreteCurves) {
1011 paint.setPen(QPen(getBaseQColor(), 3)); 1024 paint.setPen(QPen(getBaseQColor(), 3));
1012 paint.setBrush(Qt::NoBrush); 1025 paint.setBrush(Qt::NoBrush);
1013 } else if (m_plotStyle == PlotSegmentation) { 1026 } else if (m_plotStyle == PlotSegmentation) {
1130 } 1143 }
1131 1144
1132 if (m_plotStyle == PlotSegmentation) { 1145 if (m_plotStyle == PlotSegmentation) {
1133 1146
1134 #ifdef DEBUG_TIME_VALUE_LAYER 1147 #ifdef DEBUG_TIME_VALUE_LAYER
1135 std::cerr << "drawing rect" << std::endl; 1148 cerr << "drawing rect" << endl;
1136 #endif 1149 #endif
1137 1150
1138 if (nx <= x) continue; 1151 if (nx <= x) continue;
1139 1152
1140 paint.setPen(QPen(getForegroundQColor(v), 2)); 1153 paint.setPen(QPen(getForegroundQColor(v), 2));
1177 1190
1178 prevFrame = p.frame; 1191 prevFrame = p.frame;
1179 ++pointCount; 1192 ++pointCount;
1180 } 1193 }
1181 1194
1182 if ((m_plotStyle == PlotCurve || m_plotStyle == PlotDiscreteCurves || 1195 if (m_plotStyle == PlotDiscreteCurves) {
1183 m_plotStyle == PlotLines) 1196 paint.setRenderHint(QPainter::Antialiasing, true);
1184 && !path.isEmpty()) { 1197 paint.drawPath(path);
1198 } else if ((m_plotStyle == PlotCurve || m_plotStyle == PlotLines)
1199 && !path.isEmpty()) {
1185 paint.setRenderHint(QPainter::Antialiasing, pointCount <= v->width()); 1200 paint.setRenderHint(QPainter::Antialiasing, pointCount <= v->width());
1186 paint.drawPath(path); 1201 paint.drawPath(path);
1187 } 1202 }
1188 1203
1189 paint.restore(); 1204 paint.restore();
1191 // looks like save/restore doesn't deal with this: 1206 // looks like save/restore doesn't deal with this:
1192 paint.setRenderHint(QPainter::Antialiasing, false); 1207 paint.setRenderHint(QPainter::Antialiasing, false);
1193 } 1208 }
1194 1209
1195 int 1210 int
1196 TimeValueLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const 1211 TimeValueLayer::getVerticalScaleWidth(View *v, bool, QPainter &paint) const
1197 { 1212 {
1198 int w = paint.fontMetrics().width("-000.000"); 1213 if (!m_model || shouldAutoAlign()) {
1199 if (m_plotStyle == PlotSegmentation) return w + 20; 1214 return 0;
1200 else return w + 10; 1215 } else if (m_plotStyle == PlotSegmentation) {
1216 if (m_verticalScale == LogScale) {
1217 return LogColourScale().getWidth(v, paint);
1218 } else {
1219 return LinearColourScale().getWidth(v, paint);
1220 }
1221 } else {
1222 if (m_verticalScale == LogScale) {
1223 return LogNumericalScale().getWidth(v, paint) + 10; // for piano
1224 } else {
1225 return LinearNumericalScale().getWidth(v, paint);
1226 }
1227 }
1201 } 1228 }
1202 1229
1203 void 1230 void
1204 TimeValueLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const 1231 TimeValueLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const
1205 { 1232 {
1206 if (!m_model) return; 1233 if (!m_model) return;
1207 1234
1208 int h = v->height(); 1235 QString unit;
1209
1210 int n = 10;
1211
1212 float min, max; 1236 float min, max;
1213 bool logarithmic; 1237 bool logarithmic;
1214 getScaleExtents(v, min, max, logarithmic); 1238
1239 int w = getVerticalScaleWidth(v, false, paint);
1240 int h = v->height();
1215 1241
1216 if (m_plotStyle == PlotSegmentation) { 1242 if (m_plotStyle == PlotSegmentation) {
1217 QString unit; 1243
1218 getValueExtents(min, max, logarithmic, unit); 1244 getValueExtents(min, max, logarithmic, unit);
1245
1219 if (logarithmic) { 1246 if (logarithmic) {
1220 LogRange::mapRange(min, max); 1247 LogRange::mapRange(min, max);
1221 } 1248 LogColourScale().paintVertical(v, this, paint, 0, min, max);
1222 }
1223
1224 float val = min;
1225 float inc = (max - val) / n;
1226
1227 char buffer[40];
1228
1229 int w = getVerticalScaleWidth(v, false, paint);
1230
1231 int tx = 5;
1232
1233 int boxx = 5, boxy = 5;
1234 if (m_model->getScaleUnits() != "") {
1235 boxy += paint.fontMetrics().height();
1236 }
1237 int boxw = 10, boxh = h - boxy - 5;
1238
1239 if (m_plotStyle == PlotSegmentation) {
1240 tx += boxx + boxw;
1241 paint.drawRect(boxx, boxy, boxw, boxh);
1242 }
1243
1244 if (m_plotStyle == PlotSegmentation) {
1245 paint.save();
1246 for (int y = 0; y < boxh; ++y) {
1247 float val = ((boxh - y) * (max - min)) / boxh + min;
1248 if (logarithmic) {
1249 paint.setPen(getColourForValue(v, LogRange::unmap(val)));
1250 } else {
1251 paint.setPen(getColourForValue(v, val));
1252 }
1253 paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1);
1254 }
1255 paint.restore();
1256 }
1257
1258 float round = 1.f;
1259 int dp = 0;
1260 if (inc > 0) {
1261 int prec = trunc(log10f(inc));
1262 prec -= 1;
1263 if (prec < 0) dp = -prec;
1264 round = powf(10.f, prec);
1265 #ifdef DEBUG_TIME_VALUE_LAYER
1266 std::cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << std::endl;
1267 #endif
1268 }
1269
1270 int prevy = -1;
1271
1272 for (int i = 0; i < n; ++i) {
1273
1274 int y, ty;
1275 bool drawText = true;
1276
1277 float dispval = val;
1278
1279 if (m_plotStyle == PlotSegmentation) {
1280 y = boxy + int(boxh - ((val - min) * boxh) / (max - min));
1281 ty = y;
1282 } else { 1249 } else {
1283 if (i == n-1 && 1250 LinearColourScale().paintVertical(v, this, paint, 0, min, max);
1284 v->height() < paint.fontMetrics().height() * (n*2)) { 1251 }
1285 if (m_model->getScaleUnits() != "") drawText = false; 1252
1286 } 1253 } else {
1287 dispval = lrintf(val / round) * round; 1254
1288 #ifdef DEBUG_TIME_VALUE_LAYER 1255 getScaleExtents(v, min, max, logarithmic);
1289 std::cerr << "val = " << val << ", dispval = " << dispval << std::endl;
1290 #endif
1291 if (logarithmic) {
1292 y = getYForValue(v, LogRange::unmap(dispval));
1293 } else {
1294 y = getYForValue(v, dispval);
1295 }
1296 ty = y - paint.fontMetrics().height() +
1297 paint.fontMetrics().ascent() + 2;
1298
1299 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
1300 val += inc;
1301 continue;
1302 }
1303 }
1304 1256
1305 if (logarithmic) { 1257 if (logarithmic) {
1306 double dv = LogRange::unmap(dispval); 1258 LogNumericalScale().paintVertical(v, this, paint, 0, min, max);
1307 int digits = trunc(log10f(dv));
1308 int sf = dp + (digits > 0 ? digits : 0);
1309 if (sf < 2) sf = 2;
1310 sprintf(buffer, "%.*g", sf, dv);
1311 } else { 1259 } else {
1312 sprintf(buffer, "%.*f", dp, dispval); 1260 LinearNumericalScale().paintVertical(v, this, paint, 0, min, max);
1313 } 1261 }
1314 QString label = QString(buffer); 1262
1315 1263 if (logarithmic && (getScaleUnits() == "Hz")) {
1316 if (m_plotStyle != PlotSegmentation) { 1264 PianoScale().paintPianoVertical
1317 paint.drawLine(w - 5, y, w, y); 1265 (v, paint, QRect(w - 10, 0, 10, h),
1318 } else { 1266 LogRange::unmap(min),
1319 paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y); 1267 LogRange::unmap(max));
1320 } 1268 paint.drawLine(w, 0, w, h);
1321 1269 }
1322 if (drawText) { 1270 }
1323 if (m_plotStyle != PlotSegmentation) { 1271
1324 paint.drawText(tx + w - paint.fontMetrics().width(label) - 8, 1272 if (getScaleUnits() != "") {
1325 ty, label); 1273 int mw = w - 5;
1326 } else { 1274 paint.drawText(5,
1327 paint.drawText(tx, ty, label); 1275 5 + paint.fontMetrics().ascent(),
1328 } 1276 TextAbbrev::abbreviate(getScaleUnits(),
1329 } 1277 paint.fontMetrics(),
1330 1278 mw));
1331 prevy = y;
1332 val += inc;
1333 }
1334
1335 if (m_model->getScaleUnits() != "") {
1336 paint.drawText(5, 5 + paint.fontMetrics().ascent(),
1337 m_model->getScaleUnits());
1338 } 1279 }
1339 } 1280 }
1340 1281
1341 void 1282 void
1342 TimeValueLayer::drawStart(View *v, QMouseEvent *e) 1283 TimeValueLayer::drawStart(View *v, QMouseEvent *e)
1343 { 1284 {
1344 #ifdef DEBUG_TIME_VALUE_LAYER 1285 #ifdef DEBUG_TIME_VALUE_LAYER
1345 std::cerr << "TimeValueLayer::drawStart(" << e->x() << "," << e->y() << ")" << std::endl; 1286 cerr << "TimeValueLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl;
1346 #endif 1287 #endif
1347 1288
1348 if (!m_model) return; 1289 if (!m_model) return;
1349 1290
1350 long frame = v->getFrameForX(e->x()); 1291 long frame = v->getFrameForX(e->x());
1360 if (!points.empty()) { 1301 if (!points.empty()) {
1361 for (SparseTimeValueModel::PointList::iterator i = points.begin(); 1302 for (SparseTimeValueModel::PointList::iterator i = points.begin();
1362 i != points.end(); ++i) { 1303 i != points.end(); ++i) {
1363 if (((i->frame / resolution) * resolution) != frame) { 1304 if (((i->frame / resolution) * resolution) != frame) {
1364 #ifdef DEBUG_TIME_VALUE_LAYER 1305 #ifdef DEBUG_TIME_VALUE_LAYER
1365 std::cerr << "ignoring out-of-range frame at " << i->frame << std::endl; 1306 cerr << "ignoring out-of-range frame at " << i->frame << endl;
1366 #endif 1307 #endif
1367 continue; 1308 continue;
1368 } 1309 }
1369 m_editingPoint = *i; 1310 m_editingPoint = *i;
1370 havePoint = true; 1311 havePoint = true;
1390 1331
1391 void 1332 void
1392 TimeValueLayer::drawDrag(View *v, QMouseEvent *e) 1333 TimeValueLayer::drawDrag(View *v, QMouseEvent *e)
1393 { 1334 {
1394 #ifdef DEBUG_TIME_VALUE_LAYER 1335 #ifdef DEBUG_TIME_VALUE_LAYER
1395 std::cerr << "TimeValueLayer::drawDrag(" << e->x() << "," << e->y() << ")" << std::endl; 1336 cerr << "TimeValueLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl;
1396 #endif 1337 #endif
1397 1338
1398 if (!m_model || !m_editing) return; 1339 if (!m_model || !m_editing) return;
1399 1340
1400 long frame = v->getFrameForX(e->x()); 1341 long frame = v->getFrameForX(e->x());
1405 float value = getValueForY(v, e->y()); 1346 float value = getValueForY(v, e->y());
1406 1347
1407 SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); 1348 SparseTimeValueModel::PointList points = getLocalPoints(v, e->x());
1408 1349
1409 #ifdef DEBUG_TIME_VALUE_LAYER 1350 #ifdef DEBUG_TIME_VALUE_LAYER
1410 std::cerr << points.size() << " points" << std::endl; 1351 cerr << points.size() << " points" << endl;
1411 #endif 1352 #endif
1412 1353
1413 bool havePoint = false; 1354 bool havePoint = false;
1414 1355
1415 if (!points.empty()) { 1356 if (!points.empty()) {
1416 for (SparseTimeValueModel::PointList::iterator i = points.begin(); 1357 for (SparseTimeValueModel::PointList::iterator i = points.begin();
1417 i != points.end(); ++i) { 1358 i != points.end(); ++i) {
1418 if (i->frame == m_editingPoint.frame && 1359 if (i->frame == m_editingPoint.frame &&
1419 i->value == m_editingPoint.value) { 1360 i->value == m_editingPoint.value) {
1420 #ifdef DEBUG_TIME_VALUE_LAYER 1361 #ifdef DEBUG_TIME_VALUE_LAYER
1421 std::cerr << "ignoring current editing point at " << i->frame << ", " << i->value << std::endl; 1362 cerr << "ignoring current editing point at " << i->frame << ", " << i->value << endl;
1422 #endif 1363 #endif
1423 continue; 1364 continue;
1424 } 1365 }
1425 if (((i->frame / resolution) * resolution) != frame) { 1366 if (((i->frame / resolution) * resolution) != frame) {
1426 #ifdef DEBUG_TIME_VALUE_LAYER 1367 #ifdef DEBUG_TIME_VALUE_LAYER
1427 std::cerr << "ignoring out-of-range frame at " << i->frame << std::endl; 1368 cerr << "ignoring out-of-range frame at " << i->frame << endl;
1428 #endif 1369 #endif
1429 continue; 1370 continue;
1430 } 1371 }
1431 #ifdef DEBUG_TIME_VALUE_LAYER 1372 #ifdef DEBUG_TIME_VALUE_LAYER
1432 std::cerr << "adjusting to new point at " << i->frame << ", " << i->value << std::endl; 1373 cerr << "adjusting to new point at " << i->frame << ", " << i->value << endl;
1433 #endif 1374 #endif
1434 m_editingPoint = *i; 1375 m_editingPoint = *i;
1435 m_originalPoint = m_editingPoint; 1376 m_originalPoint = m_editingPoint;
1436 m_editingCommand->deletePoint(m_editingPoint); 1377 m_editingCommand->deletePoint(m_editingPoint);
1437 havePoint = true; 1378 havePoint = true;
1452 1393
1453 void 1394 void
1454 TimeValueLayer::drawEnd(View *, QMouseEvent *) 1395 TimeValueLayer::drawEnd(View *, QMouseEvent *)
1455 { 1396 {
1456 #ifdef DEBUG_TIME_VALUE_LAYER 1397 #ifdef DEBUG_TIME_VALUE_LAYER
1457 std::cerr << "TimeValueLayer::drawEnd" << std::endl; 1398 cerr << "TimeValueLayer::drawEnd" << endl;
1458 #endif 1399 #endif
1459 if (!m_model || !m_editing) return; 1400 if (!m_model || !m_editing) return;
1460 finish(m_editingCommand); 1401 finish(m_editingCommand);
1461 m_editingCommand = 0; 1402 m_editingCommand = 0;
1462 m_editing = false; 1403 m_editing = false;
1509 1450
1510 void 1451 void
1511 TimeValueLayer::editStart(View *v, QMouseEvent *e) 1452 TimeValueLayer::editStart(View *v, QMouseEvent *e)
1512 { 1453 {
1513 #ifdef DEBUG_TIME_VALUE_LAYER 1454 #ifdef DEBUG_TIME_VALUE_LAYER
1514 std::cerr << "TimeValueLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl; 1455 cerr << "TimeValueLayer::editStart(" << e->x() << "," << e->y() << ")" << endl;
1515 #endif 1456 #endif
1516 1457
1517 if (!m_model) return; 1458 if (!m_model) return;
1518 1459
1519 SparseTimeValueModel::PointList points = getLocalPoints(v, e->x()); 1460 SparseTimeValueModel::PointList points = getLocalPoints(v, e->x());
1532 1473
1533 void 1474 void
1534 TimeValueLayer::editDrag(View *v, QMouseEvent *e) 1475 TimeValueLayer::editDrag(View *v, QMouseEvent *e)
1535 { 1476 {
1536 #ifdef DEBUG_TIME_VALUE_LAYER 1477 #ifdef DEBUG_TIME_VALUE_LAYER
1537 std::cerr << "TimeValueLayer::editDrag(" << e->x() << "," << e->y() << ")" << std::endl; 1478 cerr << "TimeValueLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl;
1538 #endif 1479 #endif
1539 1480
1540 if (!m_model || !m_editing) return; 1481 if (!m_model || !m_editing) return;
1541 1482
1542 long frame = v->getFrameForX(e->x()); 1483 long frame = v->getFrameForX(e->x());
1558 1499
1559 void 1500 void
1560 TimeValueLayer::editEnd(View *, QMouseEvent *) 1501 TimeValueLayer::editEnd(View *, QMouseEvent *)
1561 { 1502 {
1562 #ifdef DEBUG_TIME_VALUE_LAYER 1503 #ifdef DEBUG_TIME_VALUE_LAYER
1563 std::cerr << "TimeValueLayer::editEnd" << std::endl; 1504 cerr << "TimeValueLayer::editEnd" << endl;
1564 #endif 1505 #endif
1565 if (!m_model || !m_editing) return; 1506 if (!m_model || !m_editing) return;
1566 1507
1567 if (m_editingCommand) { 1508 if (m_editingCommand) {
1568 1509
1599 ItemEditDialog *dialog = new ItemEditDialog 1540 ItemEditDialog *dialog = new ItemEditDialog
1600 (m_model->getSampleRate(), 1541 (m_model->getSampleRate(),
1601 ItemEditDialog::ShowTime | 1542 ItemEditDialog::ShowTime |
1602 ItemEditDialog::ShowValue | 1543 ItemEditDialog::ShowValue |
1603 ItemEditDialog::ShowText, 1544 ItemEditDialog::ShowText,
1604 m_model->getScaleUnits()); 1545 getScaleUnits());
1605 1546
1606 dialog->setFrameTime(point.frame); 1547 dialog->setFrameTime(point.frame);
1607 dialog->setValue(point.value); 1548 dialog->setValue(point.value);
1608 dialog->setText(point.label); 1549 dialog->setText(point.label);
1609 1550
1898 1839
1899 if (i->haveValue()) { 1840 if (i->haveValue()) {
1900 newPoint.value = i->getValue(); 1841 newPoint.value = i->getValue();
1901 } else { 1842 } else {
1902 #ifdef DEBUG_TIME_VALUE_LAYER 1843 #ifdef DEBUG_TIME_VALUE_LAYER
1903 std::cerr << "Setting value on point at " << newPoint.frame << " from labeller"; 1844 cerr << "Setting value on point at " << newPoint.frame << " from labeller";
1904 if (i == points.begin()) { 1845 if (i == points.begin()) {
1905 std::cerr << ", no prev point" << std::endl; 1846 cerr << ", no prev point" << endl;
1906 } else { 1847 } else {
1907 std::cerr << ", prev point is at " << prevPoint.frame << std::endl; 1848 cerr << ", prev point is at " << prevPoint.frame << endl;
1908 } 1849 }
1909 #endif 1850 #endif
1910 labeller.setValue<SparseTimeValueModel::Point> 1851 labeller.setValue<SparseTimeValueModel::Point>
1911 (newPoint, (i == points.begin()) ? 0 : &prevPoint); 1852 (newPoint, (i == points.begin()) ? 0 : &prevPoint);
1912 #ifdef DEBUG_TIME_VALUE_LAYER 1853 #ifdef DEBUG_TIME_VALUE_LAYER
1913 std::cerr << "New point value = " << newPoint.value << std::endl; 1854 cerr << "New point value = " << newPoint.value << endl;
1914 #endif 1855 #endif
1915 if (labeller.actingOnPrevPoint() && i != points.begin()) { 1856 if (labeller.actingOnPrevPoint() && i != points.begin()) {
1916 usePrev = true; 1857 usePrev = true;
1917 } 1858 }
1918 } 1859 }
1971 setShowDerivative(derivative); 1912 setShowDerivative(derivative);
1972 1913
1973 float min = attributes.value("scaleMinimum").toFloat(&ok); 1914 float min = attributes.value("scaleMinimum").toFloat(&ok);
1974 float max = attributes.value("scaleMaximum").toFloat(&alsoOk); 1915 float max = attributes.value("scaleMaximum").toFloat(&alsoOk);
1975 #ifdef DEBUG_TIME_VALUE_LAYER 1916 #ifdef DEBUG_TIME_VALUE_LAYER
1976 std::cerr << "from properties: min = " << min << ", max = " << max << std::endl; 1917 cerr << "from properties: min = " << min << ", max = " << max << endl;
1977 #endif 1918 #endif
1978 if (ok && alsoOk && min != max) setDisplayExtents(min, max); 1919 if (ok && alsoOk && min != max) setDisplayExtents(min, max);
1979 } 1920 }
1980 1921