diff options
-rw-r--r-- | muse/ChangeLog | 2 | ||||
-rw-r--r-- | muse/muse/liste/ieventdialog.cpp | 28 | ||||
-rw-r--r-- | muse/muse/liste/ieventdialog.h | 4 | ||||
-rw-r--r-- | muse/muse/liste/partlistedit.cpp | 216 | ||||
-rw-r--r-- | muse/muse/liste/partlistedit.h | 6 |
5 files changed, 197 insertions, 59 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog index c63ea87d..372d2a53 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,5 @@ +02.02 (ng) + - updated partlistedit, direct editing of time & parameters on list edit 01.02 (ng) - changed PanDelay, time delay is calculated with BPM and beat ratio 27.01 diff --git a/muse/muse/liste/ieventdialog.cpp b/muse/muse/liste/ieventdialog.cpp index da830cd9..a2914ffc 100644 --- a/muse/muse/liste/ieventdialog.cpp +++ b/muse/muse/liste/ieventdialog.cpp @@ -22,7 +22,7 @@ #include <QDialogButtonBox> #include "ieventdialog.h" -InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, +InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, Event* ev, QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { setWindowTitle("Insert Event Dialog"); @@ -54,7 +54,7 @@ InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, _pitchSpinBox = new QSpinBox(_typeWidget[i]); _pitchSpinBox->setMaximum(127); _pitchSpinBox->setMinimum(0); - _pitchSpinBox->setValue(72); //C4 + _pitchSpinBox->setValue(ev && ev->type()==Note?ev->pitch():72/*C4*/); tLayout->addWidget(_pitchSpinBox, 0, 1); //Velocity QLabel* velocityLabel = new QLabel("Velocity", _typeWidget[i]); @@ -62,7 +62,7 @@ InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, _velocitySpinBox = new QSpinBox(_typeWidget[i]); _velocitySpinBox->setMaximum(127); _velocitySpinBox->setMinimum(0); - _velocitySpinBox->setValue(70); + _velocitySpinBox->setValue(ev && ev->type()==Note?ev->velo():70); tLayout->addWidget(_velocitySpinBox, 1, 1); //Velocity Off /*QLabel* veloOffLabel = new QLabel("Velocity Off", _typeWidget[i]); @@ -78,7 +78,7 @@ InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, _lengthSpinBox = new QSpinBox(_typeWidget[i]); _lengthSpinBox->setMaximum(32768); _lengthSpinBox->setMinimum(1); - _lengthSpinBox->setValue(384); + _lengthSpinBox->setValue(ev && ev->type()==Note?ev->lenTick():384); tLayout->addWidget(_lengthSpinBox, 2, 1); } else if(i == IED_ProgramChange) { @@ -126,15 +126,21 @@ InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, //length QLabel* lengthLabel = new QLabel("Length", _typeWidget[i]); tLayout->addWidget(lengthLabel, 4, 0); - _lengthIntLabel = new QLabel("0", _typeWidget[i]); + _lengthIntLabel = new QLabel(ev && ev->type()==Sysex? + QString::number(ev->dataLen()):"0", + _typeWidget[i]); tLayout->addWidget(_lengthIntLabel, 4, 1); //text edit _sysexTextEdit = new QTextEdit(_typeWidget[i]); _sysexCursorPos = 0; - QByteArray ba; - _dataSysex.push_back(QByteArray(ba)); + _dataSysex.push_back(ev && ev->type()==Sysex? + QByteArray((const char*)ev->data(), ev->dataLen()) + :QByteArray()); _lengthIntLabel->setText(QString::number(sysexLength())); - _dataSysexStr.push_back(QString("F0 F7")); + _dataSysexStr.push_back(ev && ev->type()==Sysex? + charArray2Str((const char*)ev->data(), + ev->dataLen()): + "F0 F7"); tLayout->addWidget(_sysexTextEdit, 5, 0, 3, 2); setSysexTextEdit(); QString HEX = "(?!F7)([A-F]|\\d){1,2}"; @@ -158,6 +164,12 @@ InsertEventDialog::InsertEventDialog(const Pos& time, Part* part, Qt::Horizontal, parent); _mainLayout->addWidget(OkCancelBox, 3, 0, 1, 2); + if(ev) + if(ev->type()==Note) _eventTypeComboBox->setCurrentIndex(IED_Note); + else if(ev->type()==Sysex) _eventTypeComboBox->setCurrentIndex(IED_Sysex); + else _eventTypeComboBox->setCurrentIndex(IED_Note); + else _eventTypeComboBox->setCurrentIndex(IED_Note); + updateType(_eventTypeComboBox->currentIndex()); setLayout(_mainLayout); diff --git a/muse/muse/liste/ieventdialog.h b/muse/muse/liste/ieventdialog.h index 68ec92cd..7906f6c9 100644 --- a/muse/muse/liste/ieventdialog.h +++ b/muse/muse/liste/ieventdialog.h @@ -93,13 +93,13 @@ class InsertEventDialog : public QDialog { void setSysexTextEdit(); //set the display of sysexTextEdit public: - InsertEventDialog(const Pos& time, Part* part, + InsertEventDialog(const Pos& time, Part* part, Event* ev = NULL, QWidget* parent = 0, Qt::WindowFlags f = 0); ~InsertEventDialog(); EventList* elResult(); - static QString charArray2Str(const char* s, int length); + static QString charArray2Str(const char* s, int length); //add F0 and F7 static QString ByteArray2Str(const QByteArray& ba); //add F0 and F7 static QByteArray Str2ByteArray(const QString& s); //skip F0 and F7 static char* Str2CharArray(const QString& s); diff --git a/muse/muse/liste/partlistedit.cpp b/muse/muse/liste/partlistedit.cpp index 50fbc5f3..d3db4de2 100644 --- a/muse/muse/liste/partlistedit.cpp +++ b/muse/muse/liste/partlistedit.cpp @@ -33,6 +33,8 @@ PartListEditor::PartListEditor(ListEdit* e, QWidget* parent) : ListWidget(parent) { listEdit = e; + updateListDisabled = false; + curEvent = NULL; QWidget* cew = new QWidget; le.setupUi(cew); QVBoxLayout* layout = new QVBoxLayout; @@ -48,6 +50,13 @@ PartListEditor::PartListEditor(ListEdit* e, QWidget* parent) part = 0; + connect(le.eventList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), + SLOT(itemActivated(QTreeWidgetItem*,int))); + connect(le.eventList, SIGNAL(itemChanged(QTreeWidgetItem*, int)), + SLOT(itemChanged(QTreeWidgetItem*, int))); + connect(le.eventList, + SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), + SLOT(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(le.insertButton, SIGNAL(clicked()), SLOT(insertClicked())); connect(le.deleteButton, SIGNAL(clicked()), SLOT(deleteClicked())); } @@ -76,32 +85,162 @@ void PartListEditor::setup(const ListType& lt) // updateList //--------------------------------------------------------- -void PartListEditor::updateList() - { - EventList* el = part->events(); - int idx = 0; - le.eventList->clear(); - for (iEvent i = el->begin(); i != el->end(); ++i, ++idx) { - Event e = i->second; - QTreeWidgetItem* item = new QTreeWidgetItem; - item->setData(TICK_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter)); - item->setData(TIME_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter)); - item->setData(TICK_COL, Qt::DisplayRole, e.tick() + part->tick()); - item->setData(TIME_COL, Qt::DisplayRole, e.tick() + part->tick()); - item->setData(TYPE_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter)); - item->setData(TYPE_COL, Qt::DisplayRole, e.eventTypeName()); - item->setData(A_COL, Qt::TextAlignmentRole, int(Qt::AlignHCenter | Qt::AlignVCenter)); - item->setData(A_COL, Qt::DisplayRole, e.dataA()); - item->setData(B_COL, Qt::TextAlignmentRole, int(Qt::AlignHCenter | Qt::AlignVCenter)); - item->setData(B_COL, Qt::DisplayRole, e.dataB()); - item->setData(C_COL, Qt::TextAlignmentRole, int(Qt::AlignHCenter | Qt::AlignVCenter)); - item->setData(C_COL, Qt::DisplayRole, e.dataC()); - item->setData(LEN_COL, Qt::TextAlignmentRole, int(Qt::AlignHCenter | Qt::AlignVCenter)); - item->setData(LEN_COL, Qt::DisplayRole, (e.type()==Sysex?e.dataLen():e.lenTick())); - item->setText(DATA_COL, (e.type()==Sysex?InsertEventDialog::charArray2Str((const char*)e.data(), e.dataLen()):"")); - le.eventList->insertTopLevelItem(idx, item); - } +void PartListEditor::updateList() { + if(updateListDisabled) { + updateListDisabled = false; + return; + } + EventList* el = part->events(); + int idx = 0; + le.eventList->clear(); + for (iEvent i = el->begin(); i != el->end(); ++i, ++idx) { + Event e = i->second; + QTreeWidgetItem* item = new QTreeWidgetItem; + item->setData(TICK_COL, Qt::TextAlignmentRole, + int(Qt::AlignRight | Qt::AlignVCenter)); + item->setData(TIME_COL, Qt::TextAlignmentRole, + int(Qt::AlignRight | Qt::AlignVCenter)); + item->setData(TICK_COL, Qt::DisplayRole, e.tick() + part->tick()); + item->setData(TIME_COL, Qt::DisplayRole, e.tick() + part->tick()); + item->setData(TYPE_COL, Qt::TextAlignmentRole, + int(Qt::AlignRight | Qt::AlignVCenter)); + item->setData(TYPE_COL, Qt::DisplayRole, e.eventTypeName()); + item->setData(A_COL, Qt::TextAlignmentRole, + int(Qt::AlignHCenter | Qt::AlignVCenter)); + if(e.type()!=Sysex) item->setData(A_COL, Qt::DisplayRole, e.dataA()); + item->setData(B_COL, Qt::TextAlignmentRole, + int(Qt::AlignHCenter | Qt::AlignVCenter)); + if(e.type()!=Sysex) item->setData(B_COL, Qt::DisplayRole, e.dataB()); + item->setData(C_COL, Qt::TextAlignmentRole, + int(Qt::AlignHCenter | Qt::AlignVCenter)); + if(e.type()!=Sysex) item->setData(C_COL, Qt::DisplayRole, e.dataC()); + item->setData(LEN_COL, Qt::TextAlignmentRole, + int(Qt::AlignHCenter | Qt::AlignVCenter)); + item->setData(LEN_COL, Qt::DisplayRole, + (e.type()==Sysex?e.dataLen():e.lenTick())); + QString dataStr; + if(e.type()==Sysex) + dataStr = InsertEventDialog::charArray2Str((const char*)e.data(), + e.dataLen()); + else dataStr = QString(""); + item->setText(DATA_COL, dataStr); + le.eventList->insertTopLevelItem(idx, item); + } +} + +//--------------------------------------------------------- +// item2Event +//--------------------------------------------------------- + +Event* PartListEditor::item2Event(QTreeWidgetItem* item, int time_col) { + if(item) { + int tick; + if(time_col == TICK_COL) + tick = item->data(TICK_COL, Qt::DisplayRole).toInt(); + else tick = item->data(TIME_COL, Qt::DisplayRole).toInt(); + int evTick = (unsigned)IED_MAX(0, (int)tick - (int)part->tick()); + QString type = item->text(TYPE_COL); + if(type == "Note") { + Event* ev = new Event(Note); + int pitch = item->data(A_COL, Qt::DisplayRole).toInt(); + int velo = item->data(B_COL, Qt::DisplayRole).toInt(); + int len = item->data(LEN_COL, Qt::DisplayRole).toInt(); + ev->setTick(evTick); + ev->setPitch(pitch); + ev->setVelo(velo); + ev->setLenTick(len); + return ev; + } + else if(type == "Sysex") { + Event* ev = new Event(Sysex); + QString dataStr = item->text(DATA_COL); + char* data = InsertEventDialog::Str2CharArray(dataStr); + int len = item->data(LEN_COL, Qt::DisplayRole).toInt(); + ev->setTick(evTick); + ev->setData((const unsigned char*)data, len); + return ev; + } + else return NULL; + } + else return NULL; +} + +//--------------------------------------------------------- +// itemActivated +//--------------------------------------------------------- + +void PartListEditor::itemActivated(QTreeWidgetItem* item, int column) { + AL::Pos time; + int tick = item->data(TIME_COL, Qt::DisplayRole).toInt(); + time.setTick(tick); + Event* ev = item2Event(item); + EventList* el; + + if(column == TYPE_COL) { + InsertEventDialog dialog(time, part, ev, this); + if(dialog.exec() == QDialog::Accepted) { + el = dialog.elResult(); + if(el) { + if(ev) song->deleteEvent(*ev, part); + for(iEvent ie = el->begin(); ie != el->end(); ie++) { + Event e = ie->second; + song->addEvent(e, part); + } } + } + } + else if((column==A_COL || column==B_COL || column==C_COL || column==LEN_COL) + && ev && ev->type()==Sysex) { + //DO NOTHING + } + else if(column == DATA_COL) { + if(ev && ev->type()==Sysex) { + InsertEventDialog dialog(time, part, ev, this); + if(dialog.exec() == QDialog::Accepted) { + el = dialog.elResult(); + if(el) { + if(ev) song->deleteEvent(*ev, part); + for(iEvent ie = el->begin(); ie != el->end(); ie++) { + Event e = ie->second; + song->addEvent(e, part); + } + } + } + } + } + else le.eventList->openPersistentEditor(item, column); +} + +//--------------------------------------------------------- +// itemChanged +//--------------------------------------------------------- + +void PartListEditor::itemChanged(QTreeWidgetItem* item, int column) { + updateListDisabled = (column != TICK_COL && column != TIME_COL); + if(item) { + Event* newEvent = item2Event(item, column); + song->changeEvent(*curEvent, *newEvent, part); + } +} + +//--------------------------------------------------------- +// currentItemChanged +//--------------------------------------------------------- + +void PartListEditor::currentItemChanged(QTreeWidgetItem* cur, + QTreeWidgetItem* pre) { + if(pre) { + le.eventList->closePersistentEditor(pre, TICK_COL); + le.eventList->closePersistentEditor(pre, TIME_COL); + le.eventList->closePersistentEditor(pre, A_COL); + le.eventList->closePersistentEditor(pre, B_COL); + le.eventList->closePersistentEditor(pre, C_COL); + le.eventList->closePersistentEditor(pre, LEN_COL); + } + if(cur) { + curEvent = item2Event(cur); + } +} //--------------------------------------------------------- // insertClicked @@ -119,7 +258,7 @@ void PartListEditor::insertClicked() EventList* el; - InsertEventDialog dialog(time, part, this); + InsertEventDialog dialog(time, part, NULL, this); if(dialog.exec() == QDialog::Accepted) { el = dialog.elResult(); if(el) { @@ -140,29 +279,8 @@ void PartListEditor::deleteClicked() QTreeWidgetItem* cur = le.eventList->currentItem(); if (cur == 0) return; - int tick = cur->data(TICK_COL, Qt::DisplayRole).toInt(); - int evTick = (unsigned)IED_MAX(0, (int)tick - (int)part->tick()); - QString type = cur->text(TYPE_COL); - if(type == "Note") { - Event ev(Note); - int pitch = cur->data(A_COL, Qt::DisplayRole).toInt(); - int velo = cur->data(B_COL, Qt::DisplayRole).toInt(); - int len = cur->data(LEN_COL, Qt::DisplayRole).toInt(); - ev.setTick(evTick); - ev.setPitch(pitch); - ev.setVelo(velo); - ev.setLenTick(len); - song->deleteEvent(ev, part); - } - else if(type == "Sysex") { - Event ev(Sysex); - QString dataStr = cur->text(DATA_COL); - char* data = InsertEventDialog::Str2CharArray(dataStr); - int len = cur->data(LEN_COL, Qt::DisplayRole).toInt(); - ev.setTick(evTick); - ev.setData((const unsigned char*)data, len); - song->deleteEvent(ev, part); - } + Event* ev = item2Event(cur); + song->deleteEvent(*ev, part); } //--------------------------------------------------------- diff --git a/muse/muse/liste/partlistedit.h b/muse/muse/liste/partlistedit.h index 6a39457c..10eda46a 100644 --- a/muse/muse/liste/partlistedit.h +++ b/muse/muse/liste/partlistedit.h @@ -55,10 +55,16 @@ class PartListEditor : public ListWidget { ListEdit* listEdit; Ui::PartListEdit le; Part* part; + Event* curEvent; + bool updateListDisabled; void updateList(); + Event* item2Event(QTreeWidgetItem* item, int time_col = TICK_COL); private slots: + void itemActivated(QTreeWidgetItem* item, int column); + void itemChanged(QTreeWidgetItem* item, int column); + void currentItemChanged(QTreeWidgetItem* cur, QTreeWidgetItem* pre); void insertClicked(); void deleteClicked(); |