lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "ItemEditDialog.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include // for FLT_MIN/MAX lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: ItemEditDialog::ItemEditDialog(size_t sampleRate, int options, lbajardsilogic@0: QString valueUnits, QWidget *parent) : lbajardsilogic@0: QDialog(parent), lbajardsilogic@0: m_sampleRate(sampleRate), lbajardsilogic@0: m_frameTimeSpinBox(0), lbajardsilogic@0: m_realTimeSecsSpinBox(0), lbajardsilogic@0: m_realTimeUSecsSpinBox(0), lbajardsilogic@0: m_frameDurationSpinBox(0), lbajardsilogic@0: m_realDurationSecsSpinBox(0), lbajardsilogic@0: m_realDurationUSecsSpinBox(0), lbajardsilogic@0: m_valueSpinBox(0), lbajardsilogic@0: m_textField(0) lbajardsilogic@0: { lbajardsilogic@0: QGridLayout *grid = new QGridLayout; lbajardsilogic@0: setLayout(grid); lbajardsilogic@0: lbajardsilogic@0: QGroupBox *timeBox = 0; lbajardsilogic@0: QGroupBox *valueBox = 0; lbajardsilogic@0: QGridLayout *subgrid = 0; lbajardsilogic@0: lbajardsilogic@0: int row = 0, subrow = 0; lbajardsilogic@0: lbajardsilogic@0: size_t singleStep = RealTime::frame2RealTime(2, sampleRate).usec() - 1; lbajardsilogic@0: lbajardsilogic@0: if ((options & ShowTime) || (options & ShowDuration)) { lbajardsilogic@0: lbajardsilogic@0: timeBox = new QGroupBox; lbajardsilogic@0: timeBox->setTitle(tr("Timing")); lbajardsilogic@0: grid->addWidget(timeBox, row, 0); lbajardsilogic@0: lbajardsilogic@0: subgrid = new QGridLayout; lbajardsilogic@0: timeBox->setLayout(subgrid); lbajardsilogic@0: lbajardsilogic@0: ++row; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (options & ShowTime) { lbajardsilogic@0: lbajardsilogic@0: subgrid->addWidget(new QLabel(tr("Time:")), subrow, 0); lbajardsilogic@0: lbajardsilogic@0: m_frameTimeSpinBox = new QSpinBox; lbajardsilogic@0: m_frameTimeSpinBox->setMaximum(INT_MAX); lbajardsilogic@0: m_frameTimeSpinBox->setSuffix(tr(" frames")); lbajardsilogic@0: subgrid->addWidget(m_frameTimeSpinBox, subrow, 1, 1, 2); lbajardsilogic@0: connect(m_frameTimeSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(frameTimeChanged(int))); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: lbajardsilogic@0: m_realTimeSecsSpinBox = new QSpinBox; lbajardsilogic@0: m_realTimeSecsSpinBox->setMaximum(999999); lbajardsilogic@0: m_realTimeSecsSpinBox->setSuffix(tr(" sec")); lbajardsilogic@0: subgrid->addWidget(m_realTimeSecsSpinBox, subrow, 1); lbajardsilogic@0: connect(m_realTimeSecsSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(realTimeSecsChanged(int))); lbajardsilogic@0: lbajardsilogic@0: m_realTimeUSecsSpinBox = new QSpinBox; lbajardsilogic@0: m_realTimeUSecsSpinBox->setMaximum(999999); lbajardsilogic@0: m_realTimeUSecsSpinBox->setSuffix(tr(" usec")); lbajardsilogic@0: m_realTimeUSecsSpinBox->setSingleStep(singleStep); lbajardsilogic@0: subgrid->addWidget(m_realTimeUSecsSpinBox, subrow, 2); lbajardsilogic@0: connect(m_realTimeUSecsSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(realTimeUSecsChanged(int))); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (options & ShowDuration) { lbajardsilogic@0: lbajardsilogic@0: subgrid->addWidget(new QLabel(tr("Duration:")), subrow, 0); lbajardsilogic@0: lbajardsilogic@0: m_frameDurationSpinBox = new QSpinBox; lbajardsilogic@0: m_frameDurationSpinBox->setMaximum(INT_MAX); lbajardsilogic@0: m_frameDurationSpinBox->setSuffix(tr(" frames")); lbajardsilogic@0: subgrid->addWidget(m_frameDurationSpinBox, subrow, 1, 1, 2); lbajardsilogic@0: connect(m_frameDurationSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(frameDurationChanged(int))); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: lbajardsilogic@0: m_realDurationSecsSpinBox = new QSpinBox; lbajardsilogic@0: m_realDurationSecsSpinBox->setMaximum(999999); lbajardsilogic@0: m_realDurationSecsSpinBox->setSuffix(tr(" sec")); lbajardsilogic@0: subgrid->addWidget(m_realDurationSecsSpinBox, subrow, 1); lbajardsilogic@0: connect(m_realDurationSecsSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(realDurationSecsChanged(int))); lbajardsilogic@0: lbajardsilogic@0: m_realDurationUSecsSpinBox = new QSpinBox; lbajardsilogic@0: m_realDurationUSecsSpinBox->setMaximum(999999); lbajardsilogic@0: m_realDurationUSecsSpinBox->setSuffix(tr(" usec")); lbajardsilogic@0: m_realDurationUSecsSpinBox->setSingleStep(singleStep); lbajardsilogic@0: subgrid->addWidget(m_realDurationUSecsSpinBox, subrow, 2); lbajardsilogic@0: connect(m_realDurationUSecsSpinBox, SIGNAL(valueChanged(int)), lbajardsilogic@0: this, SLOT(realDurationUSecsChanged(int))); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if ((options & ShowValue) || (options & ShowText)) { lbajardsilogic@0: lbajardsilogic@0: valueBox = new QGroupBox; lbajardsilogic@0: valueBox->setTitle(tr("Properties")); lbajardsilogic@0: grid->addWidget(valueBox, row, 0); lbajardsilogic@0: lbajardsilogic@0: subgrid = new QGridLayout; lbajardsilogic@0: valueBox->setLayout(subgrid); lbajardsilogic@0: lbajardsilogic@0: ++row; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: subrow = 0; lbajardsilogic@0: lbajardsilogic@0: if (options & ShowValue) { lbajardsilogic@0: lbajardsilogic@0: subgrid->addWidget(new QLabel(tr("Value:")), subrow, 0); lbajardsilogic@0: lbajardsilogic@0: m_valueSpinBox = new QDoubleSpinBox; lbajardsilogic@0: m_valueSpinBox->setSuffix(QString(" %1").arg(valueUnits)); lbajardsilogic@0: m_valueSpinBox->setDecimals(10); lbajardsilogic@0: m_valueSpinBox->setMinimum(-1e100); lbajardsilogic@0: m_valueSpinBox->setMaximum(1e100); lbajardsilogic@0: connect(m_valueSpinBox, SIGNAL(valueChanged(double)), lbajardsilogic@0: this, SLOT(valueChanged(double))); lbajardsilogic@0: subgrid->addWidget(m_valueSpinBox, subrow, 1); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (options & ShowText) { lbajardsilogic@0: lbajardsilogic@0: subgrid->addWidget(new QLabel(tr("Text:")), subrow, 0); lbajardsilogic@0: lbajardsilogic@0: m_textField = new QLineEdit; lbajardsilogic@0: connect(m_textField, SIGNAL(textChanged(QString)), lbajardsilogic@0: this, SLOT(textChanged(QString))); lbajardsilogic@0: subgrid->addWidget(m_textField, subrow, 1); lbajardsilogic@0: lbajardsilogic@0: ++subrow; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (options & ShowText) { lbajardsilogic@0: m_textField->setFocus(Qt::OtherFocusReason); lbajardsilogic@0: } else if (options & ShowValue) { lbajardsilogic@0: m_valueSpinBox->setFocus(Qt::OtherFocusReason); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QHBoxLayout *hbox = new QHBoxLayout; lbajardsilogic@0: grid->addLayout(hbox, row, 0, 1, 2); lbajardsilogic@0: lbajardsilogic@0: QPushButton *ok = new QPushButton(tr("OK")); lbajardsilogic@0: m_resetButton = new QPushButton(tr("Reset")); lbajardsilogic@0: QPushButton *cancel = new QPushButton(tr("Cancel")); lbajardsilogic@0: hbox->addStretch(10); lbajardsilogic@0: hbox->addWidget(ok); lbajardsilogic@0: hbox->addWidget(m_resetButton); lbajardsilogic@0: hbox->addWidget(cancel); lbajardsilogic@0: ok->setDefault(true); lbajardsilogic@0: connect(ok, SIGNAL(clicked()), this, SLOT(accept())); lbajardsilogic@0: connect(m_resetButton, SIGNAL(clicked()), this, SLOT(reset())); lbajardsilogic@0: connect(cancel, SIGNAL(clicked()), this, SLOT(reject())); lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setFrameTime(long frame) lbajardsilogic@0: { lbajardsilogic@0: if (!m_frameTimeSpinBox) return; lbajardsilogic@0: lbajardsilogic@0: RealTime rt(RealTime::frame2RealTime(frame, m_sampleRate)); lbajardsilogic@0: m_realTimeSecsSpinBox->setValue(rt.sec); lbajardsilogic@0: m_realTimeUSecsSpinBox->setValue(rt.usec()); lbajardsilogic@0: m_frameTimeSpinBox->setValue(frame); lbajardsilogic@0: m_defaultFrame = frame; lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: long lbajardsilogic@0: ItemEditDialog::getFrameTime() const lbajardsilogic@0: { lbajardsilogic@0: return m_frameTimeSpinBox->value(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setRealTime(RealTime rt) lbajardsilogic@0: { lbajardsilogic@0: setFrameTime(RealTime::realTime2Frame(rt, m_sampleRate)); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: RealTime lbajardsilogic@0: ItemEditDialog::getRealTime() const lbajardsilogic@0: { lbajardsilogic@0: return RealTime::frame2RealTime(getFrameTime(), m_sampleRate); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setFrameDuration(long duration) lbajardsilogic@0: { lbajardsilogic@0: if (!m_frameDurationSpinBox) return; lbajardsilogic@0: lbajardsilogic@0: RealTime rt(RealTime::frame2RealTime(duration, m_sampleRate)); lbajardsilogic@0: m_realDurationSecsSpinBox->setValue(rt.sec); lbajardsilogic@0: m_realDurationUSecsSpinBox->setValue(rt.usec()); lbajardsilogic@0: m_frameDurationSpinBox->setValue(duration); lbajardsilogic@0: m_defaultDuration = duration; lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: long lbajardsilogic@0: ItemEditDialog::getFrameDuration() const lbajardsilogic@0: { lbajardsilogic@0: return m_frameDurationSpinBox->value(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setRealDuration(RealTime rt) lbajardsilogic@0: { lbajardsilogic@0: setFrameDuration(RealTime::realTime2Frame(rt, m_sampleRate)); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: RealTime lbajardsilogic@0: ItemEditDialog::getRealDuration() const lbajardsilogic@0: { lbajardsilogic@0: return RealTime::frame2RealTime(getFrameDuration(), m_sampleRate); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setValue(float v) lbajardsilogic@0: { lbajardsilogic@0: if (!m_valueSpinBox) return; lbajardsilogic@0: lbajardsilogic@0: m_valueSpinBox->setValue(v); lbajardsilogic@0: m_defaultValue = v; lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: ItemEditDialog::getValue() const lbajardsilogic@0: { lbajardsilogic@0: return m_valueSpinBox->value(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::setText(QString text) lbajardsilogic@0: { lbajardsilogic@0: if (!m_textField) return; lbajardsilogic@0: lbajardsilogic@0: m_textField->setText(text); lbajardsilogic@0: m_defaultText = text; lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: ItemEditDialog::getText() const lbajardsilogic@0: { lbajardsilogic@0: return m_textField->text(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::frameTimeChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: m_realTimeSecsSpinBox->blockSignals(true); lbajardsilogic@0: m_realTimeUSecsSpinBox->blockSignals(true); lbajardsilogic@0: lbajardsilogic@0: RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); lbajardsilogic@0: m_realTimeSecsSpinBox->setValue(rt.sec); lbajardsilogic@0: m_realTimeUSecsSpinBox->setValue(rt.usec()); lbajardsilogic@0: lbajardsilogic@0: m_realTimeSecsSpinBox->blockSignals(false); lbajardsilogic@0: m_realTimeUSecsSpinBox->blockSignals(false); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::realTimeSecsChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: RealTime rt = getRealTime(); lbajardsilogic@0: rt.sec = i; lbajardsilogic@0: size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); lbajardsilogic@0: m_frameTimeSpinBox->setValue(frame); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::realTimeUSecsChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: RealTime rt = getRealTime(); lbajardsilogic@0: rt.nsec = i * 1000; lbajardsilogic@0: size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); lbajardsilogic@0: m_frameTimeSpinBox->setValue(frame); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::frameDurationChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: m_realDurationSecsSpinBox->blockSignals(true); lbajardsilogic@0: m_realDurationUSecsSpinBox->blockSignals(true); lbajardsilogic@0: lbajardsilogic@0: RealTime rt(RealTime::frame2RealTime(i, m_sampleRate)); lbajardsilogic@0: m_realDurationSecsSpinBox->setValue(rt.sec); lbajardsilogic@0: m_realDurationUSecsSpinBox->setValue(rt.usec()); lbajardsilogic@0: lbajardsilogic@0: m_realDurationSecsSpinBox->blockSignals(false); lbajardsilogic@0: m_realDurationUSecsSpinBox->blockSignals(false); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::realDurationSecsChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: RealTime rt = getRealDuration(); lbajardsilogic@0: rt.sec = i; lbajardsilogic@0: size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); lbajardsilogic@0: m_frameDurationSpinBox->setValue(frame); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::realDurationUSecsChanged(int i) lbajardsilogic@0: { lbajardsilogic@0: RealTime rt = getRealDuration(); lbajardsilogic@0: rt.nsec = i * 1000; lbajardsilogic@0: size_t frame = RealTime::realTime2Frame(rt, m_sampleRate); lbajardsilogic@0: m_frameDurationSpinBox->setValue(frame); lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::valueChanged(double) lbajardsilogic@0: { lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::textChanged(QString) lbajardsilogic@0: { lbajardsilogic@0: m_resetButton->setEnabled(true); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: ItemEditDialog::reset() lbajardsilogic@0: { lbajardsilogic@0: setFrameTime(m_defaultFrame); lbajardsilogic@0: setFrameDuration(m_defaultDuration); lbajardsilogic@0: setValue(m_defaultValue); lbajardsilogic@0: setText(m_defaultText); lbajardsilogic@0: m_resetButton->setEnabled(false); lbajardsilogic@0: } lbajardsilogic@0: