annotate layer/LogNumericalScale.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 b4cb11ca8233
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@696 7 This file copyright 2006-2013 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 "LogNumericalScale.h"
Chris@696 17 #include "VerticalScaleLayer.h"
Chris@696 18
Chris@696 19 #include "base/LogRange.h"
Chris@696 20
Chris@696 21 #include <QPainter>
Chris@696 22
Chris@696 23 #include <cmath>
Chris@696 24
Chris@1077 25 #include "LayerGeometryProvider.h"
Chris@696 26
Chris@1260 27 #include "base/ScaleTickIntervals.h"
Chris@696 28
Chris@696 29 int
Chris@918 30 LogNumericalScale::getWidth(LayerGeometryProvider *,
Chris@1266 31 QPainter &paint)
Chris@696 32 {
Chris@699 33 return paint.fontMetrics().width("-000.00") + 10;
Chris@696 34 }
Chris@696 35
Chris@696 36 void
Chris@918 37 LogNumericalScale::paintVertical(LayerGeometryProvider *v,
Chris@1266 38 const VerticalScaleLayer *layer,
Chris@1266 39 QPainter &paint,
Chris@1266 40 int x0,
Chris@1266 41 double minlog,
Chris@1266 42 double maxlog)
Chris@696 43 {
Chris@1260 44 int n = 10;
Chris@1260 45 auto ticks = ScaleTickIntervals::logarithmicAlready({ minlog, maxlog, n });
Chris@1260 46 n = int(ticks.size());
Chris@1260 47
Chris@696 48 int w = getWidth(v, paint) + x0;
Chris@696 49
Chris@696 50 int prevy = -1;
Chris@696 51
Chris@696 52 for (int i = 0; i < n; ++i) {
Chris@696 53
Chris@1266 54 int y, ty;
Chris@696 55 bool drawText = true;
Chris@696 56
Chris@1266 57 if (i == n-1 &&
Chris@1266 58 v->getPaintHeight() < paint.fontMetrics().height() * (n*2)) {
Chris@1266 59 if (layer->getScaleUnits() != "") drawText = false;
Chris@1266 60 }
Chris@696 61
Chris@1260 62 double val = ticks[i].value;
Chris@1260 63 QString label = QString::fromStdString(ticks[i].label);
Chris@696 64
Chris@1266 65 y = layer->getYForValue(v, val);
Chris@696 66
Chris@1266 67 ty = y - paint.fontMetrics().height() + paint.fontMetrics().ascent() + 2;
Chris@1266 68
Chris@1266 69 if (prevy >= 0 && (prevy - y) < paint.fontMetrics().height()) {
Chris@1266 70 continue;
Chris@696 71 }
Chris@696 72
Chris@1266 73 paint.drawLine(w - 5, y, w, y);
Chris@696 74
Chris@696 75 if (drawText) {
Chris@1266 76 paint.drawText(w - paint.fontMetrics().width(label) - 6,
Chris@1266 77 ty, label);
Chris@696 78 }
Chris@696 79
Chris@696 80 prevy = y;
Chris@696 81 }
Chris@696 82 }