annotate layer/LinearColourScale.cpp @ 1269:f2894944c6b8

Make the overlays at either end translucent, so they don't completely crop out any underlying text or necessary info (e.g. selection extents)
author Chris Cannam
date Thu, 19 Apr 2018 14:35:59 +0100
parents a34a2a25907c
children f2525e6cbdf1
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 "LinearColourScale.h"
Chris@699 17 #include "ColourScaleLayer.h"
Chris@699 18
Chris@699 19 #include <QPainter>
Chris@699 20
Chris@699 21 #include <cmath>
Chris@699 22
Chris@1077 23 #include "LayerGeometryProvider.h"
Chris@699 24
Chris@699 25 int
Chris@918 26 LinearColourScale::getWidth(LayerGeometryProvider *,
Chris@1266 27 QPainter &paint)
Chris@699 28 {
Chris@699 29 return paint.fontMetrics().width("-000.00") + 15;
Chris@699 30 }
Chris@699 31
Chris@699 32 void
Chris@918 33 LinearColourScale::paintVertical(LayerGeometryProvider *v,
Chris@1266 34 const ColourScaleLayer *layer,
Chris@1266 35 QPainter &paint,
Chris@1266 36 int /* x0 */,
Chris@1266 37 double min,
Chris@1266 38 double max)
Chris@699 39 {
Chris@918 40 int h = v->getPaintHeight();
Chris@699 41
Chris@699 42 int n = 10;
Chris@699 43
Chris@905 44 double val = min;
Chris@905 45 double inc = (max - val) / n;
Chris@864 46
Chris@864 47 const int buflen = 40;
Chris@864 48 char buffer[buflen];
Chris@699 49
Chris@699 50 int boxx = 5, boxy = 5;
Chris@699 51 if (layer->getScaleUnits() != "") {
Chris@699 52 boxy += paint.fontMetrics().height();
Chris@699 53 }
Chris@699 54 int boxw = 10, boxh = h - boxy - 5;
Chris@699 55
Chris@699 56 int tx = 5 + boxx + boxw;
Chris@699 57 paint.drawRect(boxx, boxy, boxw, boxh);
Chris@699 58
Chris@699 59 paint.save();
Chris@699 60 for (int y = 0; y < boxh; ++y) {
Chris@1266 61 double val = ((boxh - y) * (max - min)) / boxh + min;
Chris@1266 62 paint.setPen(layer->getColourForValue(v, val));
Chris@1266 63 paint.drawLine(boxx + 1, y + boxy + 1, boxx + boxw, y + boxy + 1);
Chris@699 64 }
Chris@699 65 paint.restore();
Chris@699 66
Chris@905 67 // double round = 1.f;
Chris@699 68 int dp = 0;
Chris@699 69 if (inc > 0) {
Chris@905 70 int prec = int(trunc(log10(inc)));
Chris@699 71 prec -= 1;
Chris@699 72 if (prec < 0) dp = -prec;
Chris@805 73 // round = powf(10.f, prec);
Chris@805 74 //#ifdef DEBUG_TIME_VALUE_LAYER
Chris@805 75 // cerr << "inc = " << inc << ", round = " << round << ", dp = " << dp << endl;
Chris@805 76 //#endif
Chris@699 77 }
Chris@699 78
Chris@699 79 for (int i = 0; i < n; ++i) {
Chris@699 80
Chris@1266 81 int y, ty;
Chris@699 82
Chris@1266 83 y = boxy + int(boxh - ((val - min) * boxh) / (max - min));
Chris@699 84
Chris@1266 85 ty = y - paint.fontMetrics().height() +
Chris@1266 86 paint.fontMetrics().ascent() + 2;
Chris@699 87
Chris@1266 88 snprintf(buffer, buflen, "%.*f", dp, val);
Chris@1266 89 QString label = QString(buffer);
Chris@699 90
Chris@1266 91 paint.drawLine(boxx + boxw - boxw/3, y, boxx + boxw, y);
Chris@1266 92 paint.drawText(tx, ty, label);
Chris@699 93
Chris@1266 94 val += inc;
Chris@699 95 }
Chris@699 96 }