annotate layer/LogColourScale.cpp @ 1548:bd6af89982d7

Permit getScaleProvidingLayerForUnit to return a dormant layer if there is no visible alternative. This is necessary to avoid the scale disappearing in Tony when the spectrogram is toggled off.
author Chris Cannam
date Thu, 17 Oct 2019 14:44:22 +0100
parents f2525e6cbdf1
children
rev   line source
Chris@699 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@699 2
Chris@699 3 /*
Chris@699 4 Sonic Visualiser
Chris@699 5 An audio file viewer and annotation editor.
Chris@699 6 Centre for Digital Music, Queen Mary, University of London.
Chris@699 7 This file copyright 2006-2013 Chris Cannam and QMUL.
Chris@699 8
Chris@699 9 This program is free software; you can redistribute it and/or
Chris@699 10 modify it under the terms of the GNU General Public License as
Chris@699 11 published by the Free Software Foundation; either version 2 of the
Chris@699 12 License, or (at your option) any later version. See the file
Chris@699 13 COPYING included with this distribution for more information.
Chris@699 14 */
Chris@699 15
Chris@699 16 #include "LogColourScale.h"
Chris@699 17 #include "ColourScaleLayer.h"
Chris@699 18
Chris@699 19 #include "base/LogRange.h"
Chris@699 20
Chris@699 21 #include <QPainter>
Chris@699 22
Chris@699 23 #include <cmath>
Chris@699 24
Chris@1077 25 #include "LayerGeometryProvider.h"
Chris@699 26
Chris@699 27 int
Chris@918 28 LogColourScale::getWidth(LayerGeometryProvider *,
Chris@1266 29 QPainter &paint)
Chris@699 30 {
Chris@1471 31 // Qt 5.13 deprecates QFontMetrics::width(), but its suggested
Chris@1471 32 // replacement (horizontalAdvance) was only added in Qt 5.11
Chris@1471 33 // which is too new for us
Chris@1471 34 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
Chris@1471 35
Chris@699 36 return paint.fontMetrics().width("-000.00") + 15;
Chris@699 37 }
Chris@699 38
Chris@699 39 void
Chris@918 40 LogColourScale::paintVertical(LayerGeometryProvider *v,
Chris@1266 41 const ColourScaleLayer *layer,
Chris@1266 42 QPainter &paint,
Chris@1266 43 int /* x0 */,
Chris@1266 44 double minlog,
Chris@1266 45 double maxlog)
Chris@699 46 {
Chris@918 47 int h = v->getPaintHeight();
Chris@699 48
Chris@699 49 int n = 10;
Chris@699 50
Chris@905 51 double val = minlog;
Chris@905 52 double inc = (maxlog - val) / n;
Chris@699 53
Chris@864 54 const int buflen = 40;
Chris@864 55 char buffer[buflen];
Chris@699 56
Chris@699 57 int boxx = 5, boxy = 5;
Chris@699 58 if (layer->getScaleUnits() != "") {
Chris@699 59 boxy += paint.fontMetrics().height();
Chris@699 60 }
Chris@699 61 int boxw = 10, boxh = h - boxy - 5;
Chris@699 62
Chris@699 63 int tx = 5 + boxx + boxw;
Chris@699 64 paint.drawRect(boxx, boxy, boxw, boxh);
Chris@699 65
Chris@699 66 paint.save();
Chris@699 67 for (int y = 0; y < boxh; ++y) {
Chris@1266 68 double val = ((boxh - y) * (maxlog - minlog)) / boxh + minlog;
Chris@1266 69 paint.setPen(layer->getColourForValue(v, LogRange::unmap(val)));
Chris@1266 70 paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1);
Chris@699 71 }
Chris@699 72 paint.restore();
Chris@699 73
Chris@699 74 int dp = 0;
Chris@699 75 if (inc > 0) {
Chris@905 76 int prec = int(trunc(log10(inc)));
Chris@699 77 prec -= 1;
Chris@699 78 if (prec < 0) dp = -prec;
Chris@699 79 }
Chris@699 80
Chris@699 81 for (int i = 0; i < n; ++i) {
Chris@699 82
Chris@1266 83 int y, ty;
Chris@699 84
Chris@1266 85 y = boxy + int(boxh - ((val - minlog) * boxh) / (maxlog - minlog));
Chris@699 86
Chris@1266 87 ty = y - paint.fontMetrics().height() +
Chris@1266 88 paint.fontMetrics().ascent() + 2;
Chris@699 89
Chris@1266 90 double dv = LogRange::unmap(val);
Chris@1266 91 int digits = int(trunc(log10(dv)));
Chris@1266 92 int sf = dp + (digits > 0 ? digits : 0);
Chris@1266 93 if (sf < 2) sf = 2;
Chris@1266 94 snprintf(buffer, buflen, "%.*g", sf, dv);
Chris@699 95
Chris@1266 96 QString label = QString(buffer);
Chris@699 97
Chris@1266 98 paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y);
Chris@1266 99 paint.drawText(tx, ty, label);
Chris@699 100
Chris@1266 101 val += inc;
Chris@699 102 }
Chris@699 103 }