diff options
Diffstat (limited to 'muse2/awl')
-rw-r--r-- | muse2/awl/posedit.cpp | 77 | ||||
-rw-r--r-- | muse2/awl/posedit.h | 13 |
2 files changed, 50 insertions, 40 deletions
diff --git a/muse2/awl/posedit.cpp b/muse2/awl/posedit.cpp index cc4062ef..7441a849 100644 --- a/muse2/awl/posedit.cpp +++ b/muse2/awl/posedit.cpp @@ -31,6 +31,7 @@ #include <QKeyEvent> #include <QLineEdit> #include <QStyle> +#include <QString> namespace MusEGlobal { extern int mtcType; @@ -48,6 +49,10 @@ namespace Awl { PosEdit::PosEdit(QWidget* parent) : QAbstractSpinBox(parent) { + _returnMode = false; + cur_minute = cur_sec = cur_frame = cur_subframe = 0; + cur_bar = cur_beat = cur_tick = 0; + validator = new QIntValidator(this); initialized = false; @@ -58,20 +63,6 @@ PosEdit::PosEdit(QWidget* parent) //connect(this, SIGNAL(returnPressed()), SLOT(enterPressed())); } -// What was this for? Tim. -/* -void* PosEdit::operator new(size_t n) - { - void* p = new char[n]; - memset(p, 0, n); - return p; - } -*/ - -PosEdit::~PosEdit() - { - } - QSize PosEdit::sizeHint() const { //QFontMetrics fm(font()); @@ -100,7 +91,11 @@ bool PosEdit::event(QEvent* event) { //printf("key press event Return\n"); //enterPressed(); - finishEdit(); + bool changed = finishEdit(); + if(changed || _returnMode) // Force valueChanged if return mode set, even if not modified. + { + emit valueChanged(_pos); + } emit returnPressed(); emit editingFinished(); return true; @@ -191,7 +186,8 @@ bool PosEdit::event(QEvent* event) { QFocusEvent* fe = static_cast<QFocusEvent*>(event); QAbstractSpinBox::focusOutEvent(fe); - finishEdit(); + if(finishEdit()) + emit valueChanged(_pos); emit lostFocus(); emit editingFinished(); return true; @@ -221,12 +217,29 @@ void PosEdit::setSmpte(bool f) //--------------------------------------------------------- void PosEdit::setValue(const MusECore::Pos& time) - { +{ if(_pos == time) - return; - _pos = time; - updateValue(); + { + // Must check whether actual values dependent on tempo or sig changed... + if (_smpte) { + int minute, sec, frame, subframe; + time.msf(&minute, &sec, &frame, &subframe); + if(minute != cur_minute || sec != cur_sec || frame != cur_frame || subframe != cur_subframe) + updateValue(); + } + else { + int bar, beat, tick; + time.mbt(&bar, &beat, &tick); + if(bar != cur_bar || beat != cur_beat || tick != cur_tick) + updateValue(); + } + } + else + { + _pos = time; + updateValue(); } +} void PosEdit::setValue(const QString& s) { @@ -248,15 +261,12 @@ void PosEdit::updateValue() { char buffer[64]; if (_smpte) { - int minute, sec, frame, subframe; - _pos.msf(&minute, &sec, &frame, &subframe); - sprintf(buffer, "%03d:%02d:%02d:%02d", minute, sec, frame, subframe); + _pos.msf(&cur_minute, &cur_sec, &cur_frame, &cur_subframe); + sprintf(buffer, "%03d:%02d:%02d:%02d", cur_minute, cur_sec, cur_frame, cur_subframe); } else { - int bar, beat; - int tick; - _pos.mbt(&bar, &beat, &tick); - sprintf(buffer, "%04d.%02d.%03d", bar+1, beat+1, tick); + _pos.mbt(&cur_bar, &cur_beat, &cur_tick); + sprintf(buffer, "%04d.%02d.%03d", cur_bar+1, cur_beat+1, cur_tick); } lineEdit()->setText(buffer); } @@ -653,9 +663,10 @@ void PosEdit::paintEvent(QPaintEvent* event) //--------------------------------------------------------- // finishEdit +// Return true if position changed. //--------------------------------------------------------- -void PosEdit::finishEdit() +bool PosEdit::finishEdit() { // If our validator did its job correctly, the entire line edit text should be valid now... @@ -666,7 +677,7 @@ void PosEdit::finishEdit() if(sl.size() != 4) { printf("finishEdit smpte string:%s sections:%d != 4\n", text().toLatin1().data(), sl.size()); - return; + return false; } MusECore::Pos newPos(sl[0].toInt(), sl[1].toInt(), sl[2].toInt(), sl[3].toInt()); @@ -681,7 +692,7 @@ void PosEdit::finishEdit() if(sl.size() != 3) { printf("finishEdit bbt string:%s sections:%d != 3\n", text().toLatin1().data(), sl.size()); - return; + return false; } MusECore::Pos newPos(sl[0].toInt() - 1, sl[1].toInt() - 1, sl[2].toInt()); @@ -692,11 +703,7 @@ void PosEdit::finishEdit() } } - if (changed) - { - //updateValue(); - emit valueChanged(_pos); - } + return changed; } diff --git a/muse2/awl/posedit.h b/muse2/awl/posedit.h index 65bc48de..b834be3c 100644 --- a/muse2/awl/posedit.h +++ b/muse2/awl/posedit.h @@ -44,7 +44,10 @@ class PosEdit : public QAbstractSpinBox bool _smpte; MusECore::Pos _pos; bool initialized; - + bool _returnMode; + int cur_minute, cur_sec, cur_frame, cur_subframe; + int cur_bar, cur_beat, cur_tick; + QIntValidator* validator; virtual void paintEvent(QPaintEvent* event); @@ -52,10 +55,9 @@ class PosEdit : public QAbstractSpinBox virtual StepEnabled stepEnabled() const; virtual void fixup(QString& input) const; virtual QValidator::State validate(QString&, int&) const; - void updateValue(); int curSegment() const; virtual bool event(QEvent*); - void finishEdit(); + bool finishEdit(); signals: void valueChanged(const MusECore::Pos&); @@ -74,13 +76,14 @@ class PosEdit : public QAbstractSpinBox public: PosEdit(QWidget* parent = 0); - ~PosEdit(); QSize sizeHint() const; MusECore::Pos pos() const { return _pos; } void setSmpte(bool); bool smpte() const { return _smpte; } - // void* operator new(size_t); // What was this for? Tim. + void setReturnMode(bool v) { _returnMode = v; } + bool returnMode() const { return _returnMode; } + void updateValue(); }; } |