annotate layer/LinearNumericalScale.cpp @ 1551:e79731086b0f

Fixes to NoteLayer, particularly to calculation of vertical scale when model unit is not Hz. To avoid inconsistency we now behave as if the unit is always Hz from the point of view of the external API and display, converting at the point where we obtain values from the events themselves. Also various fixes to editing.
author Chris Cannam
date Thu, 21 Nov 2019 14:02:57 +0000
parents f2525e6cbdf1
children
rev   line source
Chris@696 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@696 2
Chris@696 3 /*
Chris@696 4 Sonic Visualiser
Chris@696 5 An audio file viewer and annotation editor.
Chris@696 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1281 7 This file copyright 2006-2018 Chris Cannam and QMUL.
Chris@696 8
Chris@696 9 This program is free software; you can redistribute it and/or
Chris@696 10 modify it under the terms of the GNU General Public License as
Chris@696 11 published by the Free Software Foundation; either version 2 of the
Chris@696 12 License, or (at your option) any later version. See the file
Chris@696 13 COPYING included with this distribution for more information.
Chris@696 14 */
Chris@696 15
Chris@696 16 #include "LinearNumericalScale.h"
Chris@696 17 #include "VerticalScaleLayer.h"
Chris@1281 18 #include "LayerGeometryProvider.h"
Chris@696 19
Chris@696 20 #include <QPainter>
Chris@696 21
Chris@696 22 #include <cmath>
Chris@696 23
Chris@1258 24 #include "base/ScaleTickIntervals.h"
Chris@1258 25
Chris@696 26 int
Chris@918 27 LinearNumericalScale::getWidth(LayerGeometryProvider *,
Chris@1281 28 QPainter &paint)
Chris@696 29 {
Chris@1471 30 // Qt 5.13 deprecates QFontMetrics::width(), but its suggested
Chris@1471 31 // replacement (horizontalAdvance) was only added in Qt 5.11
Chris@1471 32 // which is too new for us
Chris@1471 33 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
Chris@1471 34
Chris@1281 35 return paint.fontMetrics().width("-000.00") + 10;
Chris@696 36 }
Chris@696 37
Chris@696 38 void
Chris@918 39 LinearNumericalScale::paintVertical(LayerGeometryProvider *v,
Chris@1266 40 const VerticalScaleLayer *layer,
Chris@1266 41 QPainter &paint,
Chris@1266 42 int x0,
Chris@1266 43 double minf,
Chris@1266 44 double maxf)
Chris@696 45 {
Chris@696 46 int n = 10;
Chris@1258 47 auto ticks = ScaleTickIntervals::linear({ minf, maxf, n });
Chris@1260 48 n = int(ticks.size());
Chris@696 49
Chris@696 50 int w = getWidth(v, paint) + x0;
Chris@696 51
Chris@696 52 int prevy = -1;
Chris@1260 53
Chris@1260 54 for (int i = 0; i < n; ++i) {
Chris@696 55
Chris@1266 56 int y, ty;
Chris@696 57 bool drawText = true;
Chris@696 58
Chris@1266 59 if (i == n-1 &&
Chris@1266 60 v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) {
Chris@1266 61 if (layer->getScaleUnits() != "") drawText = false;
Chris@1266 62 }
Chris@696 63
Chris@1259 64 double val = ticks[i].value;
Chris@1259 65 QString label = QString::fromStdString(ticks[i].label);
Chris@1258 66
Chris@1266 67 y = layer->getYForValue(v, val);
Chris@696 68
Chris@1266 69 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
Chris@1266 70
Chris@1266 71 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
Chris@1266 72 continue;
Chris@696 73 }
Chris@696 74
Chris@1266 75 paint.drawLine(w - 5, y, w, y);
Chris@696 76
Chris@696 77 if (drawText) {
Chris@1266 78 paint.drawText(w - paint.fontMetrics().width(label) - 6,
Chris@1266 79 ty, label);
Chris@696 80 }
Chris@696 81
Chris@696 82 prevy = y;
Chris@696 83 }
Chris@696 84 }