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(); | 
