annotate layer/HorizontalFrequencyScale.cpp @ 1363:bbeffb29bf09

Fix inconsistency between centre frame actually set and centre frame notified as set, which caused the start frame location to creep out of place gradually as you page through
author Chris Cannam
date Tue, 30 Oct 2018 14:00:20 +0000
parents fc9d9f1103fa
children f2525e6cbdf1
rev   line source
Chris@1281 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1281 2
Chris@1281 3 /*
Chris@1281 4 Sonic Visualiser
Chris@1281 5 An audio file viewer and annotation editor.
Chris@1281 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1281 7 This file copyright 2006-2018 Chris Cannam and QMUL.
Chris@1281 8
Chris@1281 9 This program is free software; you can redistribute it and/or
Chris@1281 10 modify it under the terms of the GNU General Public License as
Chris@1281 11 published by the Free Software Foundation; either version 2 of the
Chris@1281 12 License, or (at your option) any later version. See the file
Chris@1281 13 COPYING included with this distribution for more information.
Chris@1281 14 */
Chris@1281 15
Chris@1281 16 #include "HorizontalFrequencyScale.h"
Chris@1281 17 #include "HorizontalScaleProvider.h"
Chris@1281 18 #include "LayerGeometryProvider.h"
Chris@1281 19
Chris@1281 20 #include "base/ScaleTickIntervals.h"
Chris@1281 21
Chris@1281 22 #include <QPainter>
Chris@1281 23
Chris@1281 24 #include <cmath>
Chris@1281 25
Chris@1281 26 int
Chris@1281 27 HorizontalFrequencyScale::getHeight(LayerGeometryProvider *,
Chris@1281 28 QPainter &paint)
Chris@1281 29 {
Chris@1281 30 return paint.fontMetrics().height() + 10;
Chris@1281 31 }
Chris@1281 32
Chris@1281 33 void
Chris@1281 34 HorizontalFrequencyScale::paintScale(LayerGeometryProvider *v,
Chris@1281 35 const HorizontalScaleProvider *p,
Chris@1281 36 QPainter &paint,
Chris@1281 37 QRect r,
Chris@1281 38 bool logarithmic)
Chris@1281 39 {
Chris@1281 40 int x0 = r.x(), y0 = r.y(), x1 = r.x() + r.width(), y1 = r.y() + r.height();
Chris@1281 41
Chris@1281 42 paint.drawLine(x0, y0, x1, y0);
Chris@1281 43
Chris@1281 44 double f0 = p->getFrequencyForX(v, x0 ? x0 : 1);
Chris@1281 45 double f1 = p->getFrequencyForX(v, x1);
Chris@1281 46
Chris@1281 47 int n = 20;
Chris@1281 48
Chris@1281 49 auto ticks =
Chris@1281 50 logarithmic ?
Chris@1281 51 ScaleTickIntervals::logarithmic({ f0, f1, n }) :
Chris@1281 52 ScaleTickIntervals::linear({ f0, f1, n });
Chris@1281 53
Chris@1281 54 n = int(ticks.size());
Chris@1281 55
Chris@1281 56 int marginx = -1;
Chris@1281 57
Chris@1281 58 for (int i = 0; i < n; ++i) {
Chris@1281 59
Chris@1281 60 double val = ticks[i].value;
Chris@1281 61 QString label = QString::fromStdString(ticks[i].label);
Chris@1281 62 int tw = paint.fontMetrics().width(label);
Chris@1281 63
Chris@1281 64 int x = int(round(p->getXForFrequency(v, val)));
Chris@1281 65
Chris@1281 66 if (x < marginx) continue;
Chris@1281 67
Chris@1281 68 //!!! todo: pixel scaling (here & elsewhere in these classes)
Chris@1281 69
Chris@1281 70 paint.drawLine(x, y0, x, y1);
Chris@1281 71
Chris@1281 72 paint.drawText(x + 5, y0 + paint.fontMetrics().ascent() + 5, label);
Chris@1281 73
Chris@1281 74 marginx = x + tw + 10;
Chris@1281 75 }
Chris@1281 76 }
Chris@1281 77