annotate widgets/ItemEditDialog.cpp @ 1127:9fb8dfd7ce4c spectrogram-minor-refactor

Fix threshold in spectrogram -- it wasn't working in the last release. There is a new protocol for this. Formerly the threshold parameter had a range from -50dB to 0 with the default at -50, and -50 treated internally as "no threshold". However, there was a hardcoded, hidden internal threshold for spectrogram colour mapping at -80dB with anything below this being rounded to zero. Now the threshold parameter has range -81 to -1 with the default at -80, -81 is treated internally as "no threshold", and there is no hidden internal threshold. So the default behaviour is the same as before, an effective -80dB threshold, but it is now possible to change this in both directions. Sessions reloaded from prior versions may look slightly different because, if the session says there should be no threshold, there will now actually be no threshold instead of having the hidden internal one. Still need to do something in the UI to make it apparent that the -81dB setting removes the threshold entirely. This is at least no worse than the previous, also obscured, magic -50dB setting.
author Chris Cannam
date Mon, 01 Aug 2016 16:21:01 +0100
parents 2564d0865feb
children c8a6fd3f9dff
rev   line source
Chris@70 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@70 2
Chris@70 3 /*
Chris@70 4 Sonic Visualiser
Chris@70 5 An audio file viewer and annotation editor.
Chris@70 6 Centre for Digital Music, Queen Mary, University of London.
Chris@70 7 This file copyright 2006 Chris Cannam.
Chris@70 8
Chris@70 9 This program is free software; you can redistribute it and/or
Chris@70 10 modify it under the terms of the GNU General Public License as
Chris@70 11 published by the Free Software Foundation; either version 2 of the
Chris@70 12 License, or (at your option) any later version. See the file
Chris@70 13 COPYING included with this distribution for more information.
Chris@70 14 */
Chris@70 15
Chris@70 16 #include "ItemEditDialog.h"
Chris@70 17
Chris@70 18 #include <QLineEdit>
Chris@70 19 #include <QDoubleSpinBox>
Chris@73 20 #include <QSpinBox>
Chris@70 21 #include <QGridLayout>
Chris@70 22 #include <QHBoxLayout>
Chris@70 23 #include <QLabel>
Chris@70 24 #include <QPushButton>
Chris@73 25 #include <QGroupBox>
Chris@282 26 #include <QDialogButtonBox>
Chris@70 27
Chris@73 28 #include <float.h> // for FLT_MIN/MAX
Chris@70 29
Chris@73 30
Chris@904 31 ItemEditDialog::ItemEditDialog(sv_samplerate_t sampleRate, int options,
Chris@73 32 QString valueUnits, QWidget *parent) :
Chris@70 33 QDialog(parent),
Chris@70 34 m_sampleRate(sampleRate),
Chris@857 35 m_defaultFrame(0),
Chris@857 36 m_defaultDuration(0),
Chris@857 37 m_defaultValue(0),
Chris@73 38 m_frameTimeSpinBox(0),
Chris@73 39 m_realTimeSecsSpinBox(0),
Chris@73 40 m_realTimeUSecsSpinBox(0),
Chris@73 41 m_frameDurationSpinBox(0),
Chris@73 42 m_realDurationSecsSpinBox(0),
Chris@73 43 m_realDurationUSecsSpinBox(0),
Chris@73 44 m_valueSpinBox(0),
Chris@73 45 m_textField(0)
Chris@70 46 {
Chris@70 47 QGridLayout *grid = new QGridLayout;
Chris@70 48 setLayout(grid);
Chris@70 49
Chris@73 50 QGroupBox *timeBox = 0;
Chris@73 51 QGroupBox *valueBox = 0;
Chris@73 52 QGridLayout *subgrid = 0;
Chris@70 53
Chris@73 54 int row = 0, subrow = 0;
Chris@70 55
Chris@807 56 int singleStep = RealTime::frame2RealTime(2, sampleRate).usec() - 1;
Chris@70 57
Chris@73 58 if ((options & ShowTime) || (options & ShowDuration)) {
Chris@70 59
Chris@73 60 timeBox = new QGroupBox;
Chris@73 61 timeBox->setTitle(tr("Timing"));
Chris@73 62 grid->addWidget(timeBox, row, 0);
Chris@70 63
Chris@73 64 subgrid = new QGridLayout;
Chris@73 65 timeBox->setLayout(subgrid);
Chris@70 66
Chris@70 67 ++row;
Chris@70 68 }
Chris@70 69
Chris@73 70 if (options & ShowTime) {
Chris@73 71
Chris@73 72 subgrid->addWidget(new QLabel(tr("Time:")), subrow, 0);
Chris@73 73
Chris@73 74 m_frameTimeSpinBox = new QSpinBox;
Chris@73 75 m_frameTimeSpinBox->setMaximum(INT_MAX);
Chris@73 76 m_frameTimeSpinBox->setSuffix(tr(" frames"));
Chris@73 77 subgrid->addWidget(m_frameTimeSpinBox, subrow, 1, 1, 2);
Chris@73 78 connect(m_frameTimeSpinBox, SIGNAL(valueChanged(int)),
Chris@938 79 this, SLOT(frameTimeChanged(int)));
Chris@73 80
Chris@73 81 ++subrow;
Chris@73 82
Chris@73 83 m_realTimeSecsSpinBox = new QSpinBox;
Chris@73 84 m_realTimeSecsSpinBox->setMaximum(999999);
Chris@73 85 m_realTimeSecsSpinBox->setSuffix(tr(" sec"));
Chris@73 86 subgrid->addWidget(m_realTimeSecsSpinBox, subrow, 1);
Chris@73 87 connect(m_realTimeSecsSpinBox, SIGNAL(valueChanged(int)),
Chris@73 88 this, SLOT(realTimeSecsChanged(int)));
Chris@73 89
Chris@73 90 m_realTimeUSecsSpinBox = new QSpinBox;
Chris@73 91 m_realTimeUSecsSpinBox->setMaximum(999999);
Chris@73 92 m_realTimeUSecsSpinBox->setSuffix(tr(" usec"));
Chris@73 93 m_realTimeUSecsSpinBox->setSingleStep(singleStep);
Chris@73 94 subgrid->addWidget(m_realTimeUSecsSpinBox, subrow, 2);
Chris@73 95 connect(m_realTimeUSecsSpinBox, SIGNAL(valueChanged(int)),
Chris@73 96 this, SLOT(realTimeUSecsChanged(int)));
Chris@73 97
Chris@73 98 ++subrow;
Chris@73 99 }
Chris@73 100
Chris@70 101 if (options & ShowDuration) {
Chris@70 102
Chris@73 103 subgrid->addWidget(new QLabel(tr("Duration:")), subrow, 0);
Chris@70 104
Chris@73 105 m_frameDurationSpinBox = new QSpinBox;
Chris@73 106 m_frameDurationSpinBox->setMaximum(INT_MAX);
Chris@73 107 m_frameDurationSpinBox->setSuffix(tr(" frames"));
Chris@73 108 subgrid->addWidget(m_frameDurationSpinBox, subrow, 1, 1, 2);
Chris@73 109 connect(m_frameDurationSpinBox, SIGNAL(valueChanged(int)),
Chris@938 110 this, SLOT(frameDurationChanged(int)));
Chris@70 111
Chris@73 112 ++subrow;
Chris@70 113
Chris@73 114 m_realDurationSecsSpinBox = new QSpinBox;
Chris@73 115 m_realDurationSecsSpinBox->setMaximum(999999);
Chris@73 116 m_realDurationSecsSpinBox->setSuffix(tr(" sec"));
Chris@73 117 subgrid->addWidget(m_realDurationSecsSpinBox, subrow, 1);
Chris@73 118 connect(m_realDurationSecsSpinBox, SIGNAL(valueChanged(int)),
Chris@73 119 this, SLOT(realDurationSecsChanged(int)));
Chris@70 120
Chris@73 121 m_realDurationUSecsSpinBox = new QSpinBox;
Chris@73 122 m_realDurationUSecsSpinBox->setMaximum(999999);
Chris@73 123 m_realDurationUSecsSpinBox->setSuffix(tr(" usec"));
Chris@73 124 m_realDurationUSecsSpinBox->setSingleStep(singleStep);
Chris@101 125 subgrid->addWidget(m_realDurationUSecsSpinBox, subrow, 2);
Chris@73 126 connect(m_realDurationUSecsSpinBox, SIGNAL(valueChanged(int)),
Chris@73 127 this, SLOT(realDurationUSecsChanged(int)));
Chris@70 128
Chris@73 129 ++subrow;
Chris@73 130 }
Chris@70 131
Chris@73 132 if ((options & ShowValue) || (options & ShowText)) {
Chris@70 133
Chris@73 134 valueBox = new QGroupBox;
Chris@73 135 valueBox->setTitle(tr("Properties"));
Chris@73 136 grid->addWidget(valueBox, row, 0);
Chris@73 137
Chris@73 138 subgrid = new QGridLayout;
Chris@73 139 valueBox->setLayout(subgrid);
Chris@70 140
Chris@70 141 ++row;
Chris@70 142 }
Chris@70 143
Chris@73 144 subrow = 0;
Chris@73 145
Chris@70 146 if (options & ShowValue) {
Chris@70 147
Chris@73 148 subgrid->addWidget(new QLabel(tr("Value:")), subrow, 0);
Chris@70 149
Chris@73 150 m_valueSpinBox = new QDoubleSpinBox;
Chris@73 151 m_valueSpinBox->setSuffix(QString(" %1").arg(valueUnits));
Chris@73 152 m_valueSpinBox->setDecimals(10);
Chris@685 153 m_valueSpinBox->setMinimum(-1e10);
Chris@685 154 m_valueSpinBox->setMaximum(1e10);
Chris@73 155 connect(m_valueSpinBox, SIGNAL(valueChanged(double)),
Chris@70 156 this, SLOT(valueChanged(double)));
Chris@73 157 subgrid->addWidget(m_valueSpinBox, subrow, 1);
Chris@70 158
Chris@73 159 ++subrow;
Chris@70 160 }
Chris@70 161
Chris@70 162 if (options & ShowText) {
Chris@70 163
Chris@73 164 subgrid->addWidget(new QLabel(tr("Text:")), subrow, 0);
Chris@70 165
Chris@73 166 m_textField = new QLineEdit;
Chris@73 167 connect(m_textField, SIGNAL(textChanged(QString)),
Chris@70 168 this, SLOT(textChanged(QString)));
Chris@73 169 subgrid->addWidget(m_textField, subrow, 1);
Chris@70 170
Chris@73 171 ++subrow;
Chris@73 172 }
Chris@73 173
Chris@73 174 if (options & ShowText) {
Chris@73 175 m_textField->setFocus(Qt::OtherFocusReason);
Chris@73 176 } else if (options & ShowValue) {
Chris@73 177 m_valueSpinBox->setFocus(Qt::OtherFocusReason);
Chris@70 178 }
Chris@282 179
Chris@282 180 QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal);
Chris@282 181 grid->addWidget(bb, row, 0, 1, 2);
Chris@70 182
Chris@70 183 QPushButton *ok = new QPushButton(tr("OK"));
Chris@73 184 m_resetButton = new QPushButton(tr("Reset"));
Chris@70 185 QPushButton *cancel = new QPushButton(tr("Cancel"));
Chris@282 186 bb->addButton(ok, QDialogButtonBox::AcceptRole);
Chris@282 187 bb->addButton(m_resetButton, QDialogButtonBox::ResetRole);
Chris@282 188 bb->addButton(cancel, QDialogButtonBox::RejectRole);
Chris@70 189 connect(ok, SIGNAL(clicked()), this, SLOT(accept()));
Chris@73 190 connect(m_resetButton, SIGNAL(clicked()), this, SLOT(reset()));
Chris@70 191 connect(cancel, SIGNAL(clicked()), this, SLOT(reject()));
Chris@73 192 m_resetButton->setEnabled(false);
Chris@70 193 }
Chris@70 194
Chris@70 195 void
Chris@904 196 ItemEditDialog::setFrameTime(sv_frame_t frame)
Chris@70 197 {
Chris@73 198 if (!m_frameTimeSpinBox) return;
Chris@73 199
Chris@73 200 RealTime rt(RealTime::frame2RealTime(frame, m_sampleRate));
Chris@73 201 m_realTimeSecsSpinBox->setValue(rt.sec);
Chris@73 202 m_realTimeUSecsSpinBox->setValue(rt.usec());
Chris@908 203 m_frameTimeSpinBox->setValue(int(frame));
Chris@73 204 m_defaultFrame = frame;
Chris@73 205 m_resetButton->setEnabled(false);
Chris@70 206 }
Chris@70 207
Chris@904 208 sv_frame_t
Chris@70 209 ItemEditDialog::getFrameTime() const
Chris@70 210 {
Chris@73 211 return m_frameTimeSpinBox->value();
Chris@70 212 }
Chris@70 213
Chris@70 214 void
Chris@70 215 ItemEditDialog::setRealTime(RealTime rt)
Chris@70 216 {
Chris@73 217 setFrameTime(RealTime::realTime2Frame(rt, m_sampleRate));
Chris@70 218 }
Chris@70 219
Chris@70 220 RealTime
Chris@70 221 ItemEditDialog::getRealTime() const
Chris@70 222 {
Chris@73 223 return RealTime::frame2RealTime(getFrameTime(), m_sampleRate);
Chris@70 224 }
Chris@70 225
Chris@70 226 void
Chris@904 227 ItemEditDialog::setFrameDuration(sv_frame_t duration)
Chris@70 228 {
Chris@73 229 if (!m_frameDurationSpinBox) return;
Chris@73 230
Chris@73 231 RealTime rt(RealTime::frame2RealTime(duration, m_sampleRate));
Chris@73 232 m_realDurationSecsSpinBox->setValue(rt.sec);
Chris@73 233 m_realDurationUSecsSpinBox->setValue(rt.usec());
Chris@908 234 m_frameDurationSpinBox->setValue(int(duration));
Chris@73 235 m_defaultDuration = duration;
Chris@73 236 m_resetButton->setEnabled(false);
Chris@70 237 }
Chris@70 238
Chris@904 239 sv_frame_t
Chris@70 240 ItemEditDialog::getFrameDuration() const
Chris@70 241 {
Chris@73 242 return m_frameDurationSpinBox->value();
Chris@70 243 }
Chris@70 244
Chris@70 245 void
Chris@70 246 ItemEditDialog::setRealDuration(RealTime rt)
Chris@70 247 {
Chris@73 248 setFrameDuration(RealTime::realTime2Frame(rt, m_sampleRate));
Chris@70 249 }
Chris@70 250
Chris@70 251 RealTime
Chris@70 252 ItemEditDialog::getRealDuration() const
Chris@70 253 {
Chris@73 254 return RealTime::frame2RealTime(getFrameDuration(), m_sampleRate);
Chris@70 255 }
Chris@70 256
Chris@70 257 void
Chris@70 258 ItemEditDialog::setValue(float v)
Chris@70 259 {
Chris@73 260 if (!m_valueSpinBox) return;
Chris@73 261
Chris@73 262 m_valueSpinBox->setValue(v);
Chris@73 263 m_defaultValue = v;
Chris@73 264 m_resetButton->setEnabled(false);
Chris@70 265 }
Chris@70 266
Chris@70 267 float
Chris@70 268 ItemEditDialog::getValue() const
Chris@70 269 {
Chris@908 270 return float(m_valueSpinBox->value());
Chris@70 271 }
Chris@70 272
Chris@70 273 void
Chris@70 274 ItemEditDialog::setText(QString text)
Chris@70 275 {
Chris@73 276 if (!m_textField) return;
Chris@73 277
Chris@73 278 m_textField->setText(text);
Chris@73 279 m_defaultText = text;
Chris@73 280 m_resetButton->setEnabled(false);
Chris@70 281 }
Chris@70 282
Chris@70 283 QString
Chris@70 284 ItemEditDialog::getText() const
Chris@70 285 {
Chris@73 286 return m_textField->text();
Chris@70 287 }
Chris@70 288
Chris@70 289 void
Chris@938 290 ItemEditDialog::frameTimeChanged(int i)
Chris@70 291 {
Chris@73 292 m_realTimeSecsSpinBox->blockSignals(true);
Chris@73 293 m_realTimeUSecsSpinBox->blockSignals(true);
Chris@73 294
Chris@73 295 RealTime rt(RealTime::frame2RealTime(i, m_sampleRate));
Chris@73 296 m_realTimeSecsSpinBox->setValue(rt.sec);
Chris@73 297 m_realTimeUSecsSpinBox->setValue(rt.usec());
Chris@73 298
Chris@73 299 m_realTimeSecsSpinBox->blockSignals(false);
Chris@73 300 m_realTimeUSecsSpinBox->blockSignals(false);
Chris@73 301 m_resetButton->setEnabled(true);
Chris@70 302 }
Chris@70 303
Chris@70 304 void
Chris@73 305 ItemEditDialog::realTimeSecsChanged(int i)
Chris@70 306 {
Chris@70 307 RealTime rt = getRealTime();
Chris@73 308 rt.sec = i;
Chris@904 309 sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate);
Chris@908 310 m_frameTimeSpinBox->setValue(int(frame));
Chris@73 311 m_resetButton->setEnabled(true);
Chris@70 312 }
Chris@70 313
Chris@70 314 void
Chris@73 315 ItemEditDialog::realTimeUSecsChanged(int i)
Chris@70 316 {
Chris@70 317 RealTime rt = getRealTime();
Chris@73 318 rt.nsec = i * 1000;
Chris@904 319 sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate);
Chris@908 320 m_frameTimeSpinBox->setValue(int(frame));
Chris@73 321 m_resetButton->setEnabled(true);
Chris@70 322 }
Chris@70 323
Chris@70 324 void
Chris@938 325 ItemEditDialog::frameDurationChanged(int i)
Chris@70 326 {
Chris@73 327 m_realDurationSecsSpinBox->blockSignals(true);
Chris@73 328 m_realDurationUSecsSpinBox->blockSignals(true);
Chris@73 329
Chris@73 330 RealTime rt(RealTime::frame2RealTime(i, m_sampleRate));
Chris@73 331 m_realDurationSecsSpinBox->setValue(rt.sec);
Chris@73 332 m_realDurationUSecsSpinBox->setValue(rt.usec());
Chris@73 333
Chris@73 334 m_realDurationSecsSpinBox->blockSignals(false);
Chris@73 335 m_realDurationUSecsSpinBox->blockSignals(false);
Chris@73 336 m_resetButton->setEnabled(true);
Chris@70 337 }
Chris@70 338
Chris@70 339 void
Chris@73 340 ItemEditDialog::realDurationSecsChanged(int i)
Chris@70 341 {
Chris@70 342 RealTime rt = getRealDuration();
Chris@73 343 rt.sec = i;
Chris@904 344 sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate);
Chris@908 345 m_frameDurationSpinBox->setValue(int(frame));
Chris@73 346 m_resetButton->setEnabled(true);
Chris@70 347 }
Chris@70 348
Chris@70 349 void
Chris@73 350 ItemEditDialog::realDurationUSecsChanged(int i)
Chris@70 351 {
Chris@70 352 RealTime rt = getRealDuration();
Chris@73 353 rt.nsec = i * 1000;
Chris@904 354 sv_frame_t frame = RealTime::realTime2Frame(rt, m_sampleRate);
Chris@908 355 m_frameDurationSpinBox->setValue(int(frame));
Chris@73 356 m_resetButton->setEnabled(true);
Chris@70 357 }
Chris@70 358
Chris@70 359 void
Chris@73 360 ItemEditDialog::valueChanged(double)
Chris@70 361 {
Chris@73 362 m_resetButton->setEnabled(true);
Chris@70 363 }
Chris@70 364
Chris@70 365 void
Chris@73 366 ItemEditDialog::textChanged(QString)
Chris@70 367 {
Chris@73 368 m_resetButton->setEnabled(true);
Chris@70 369 }
Chris@70 370
Chris@73 371 void
Chris@73 372 ItemEditDialog::reset()
Chris@73 373 {
Chris@73 374 setFrameTime(m_defaultFrame);
Chris@73 375 setFrameDuration(m_defaultDuration);
Chris@73 376 setValue(m_defaultValue);
Chris@73 377 setText(m_defaultText);
Chris@73 378 m_resetButton->setEnabled(false);
Chris@73 379 }
Chris@73 380