summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse/all.h2
-rw-r--r--muse/muse/ctrl.cpp10
-rw-r--r--muse/muse/ctrl.h1
-rw-r--r--muse/muse/liste/ctrllistedit.cpp360
-rw-r--r--muse/muse/liste/ctrllistedit.h55
-rw-r--r--muse/muse/liste/ctrllistedit.ui198
-rw-r--r--muse/muse/liste/listedit.cpp20
-rw-r--r--muse/muse/liste/listedit.h7
-rw-r--r--muse/muse/song.h1
-rw-r--r--muse/muse/track.cpp10
-rw-r--r--muse/muse/track.h1
-rw-r--r--muse/muse/undo.cpp11
-rw-r--r--muse/muse/undo.h6
13 files changed, 618 insertions, 64 deletions
diff --git a/muse/all.h b/muse/all.h
index c074560c..f93135c4 100644
--- a/muse/all.h
+++ b/muse/all.h
@@ -115,7 +115,7 @@
#include <QtGui/QStyleFactory>
#include <QtGui/QDockWidget>
#include <QtGui/QDesktopServices>
+#include <QtGui/QItemDelegate>
#include <QtSvg/QSvgRenderer>
-
#endif
diff --git a/muse/muse/ctrl.cpp b/muse/muse/ctrl.cpp
index 2e40f297..c2198d77 100644
--- a/muse/muse/ctrl.cpp
+++ b/muse/muse/ctrl.cpp
@@ -427,3 +427,13 @@ void Ctrl::setRange(int _min, int _max)
max.i = _max;
}
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void Ctrl::setRange(CVal mi, CVal ma)
+ {
+ min = mi;
+ max = ma;
+ }
+
diff --git a/muse/muse/ctrl.h b/muse/muse/ctrl.h
index 3a45bc97..6426f5e8 100644
--- a/muse/muse/ctrl.h
+++ b/muse/muse/ctrl.h
@@ -197,6 +197,7 @@ class Ctrl : public CTRL {
bool touched() const { return _touched; }
void setRange(double min, double max);
void setRange(int min, int max);
+ void setRange(CVal, CVal);
CVal minVal() const { return min; }
CVal maxVal() const { return max; }
void read(QDomNode node, bool midi);
diff --git a/muse/muse/liste/ctrllistedit.cpp b/muse/muse/liste/ctrllistedit.cpp
index 8fcc34fe..472e02f4 100644
--- a/muse/muse/liste/ctrllistedit.cpp
+++ b/muse/muse/liste/ctrllistedit.cpp
@@ -20,14 +20,20 @@
#include "ctrllistedit.h"
#include "ctrl.h"
+#include "track.h"
+#include "song.h"
+#include "al/pos.h"
+#include "awl/posedit.h"
//---------------------------------------------------------
// CtrlListEditor
//---------------------------------------------------------
-CtrlListEditor::CtrlListEditor(QWidget* parent)
+CtrlListEditor::CtrlListEditor(ListEdit* e, QWidget* parent)
: ListWidget(parent)
{
+ listEdit = e;
+ updateListDisabled = false;
QWidget* cew = new QWidget;
le.setupUi(cew);
QVBoxLayout* layout = new QVBoxLayout;
@@ -39,6 +45,43 @@ CtrlListEditor::CtrlListEditor(QWidget* parent)
le.minValue->setSingleStep(1.0);
le.maxValue->setSingleStep(1.0);
le.defaultValue->setSingleStep(1.0);
+
+ le.ctrlList->setColumnWidth(TICK_COL, 60);
+ le.ctrlList->setColumnWidth(TIME_COL, 120);
+ MidiTimeDelegate* midiTimeDelegate = new MidiTimeDelegate(this);
+ le.ctrlList->setItemDelegate(midiTimeDelegate);
+
+ track = 0;
+ connect(le.ctrlList, SIGNAL(itemActivated(QTreeWidgetItem*, int)),
+ SLOT(itemDoubleClicked(QTreeWidgetItem*,int)));
+ connect(le.ctrlList, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
+ SLOT(itemChanged(QTreeWidgetItem*, int)));
+ connect(le.ctrlList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
+ SLOT(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
+ connect(le.insertButton, SIGNAL(clicked()), SLOT(insertClicked()));
+ connect(le.deleteButton, SIGNAL(clicked()), SLOT(deleteClicked()));
+ connect(le.controllerName, SIGNAL(textEdited(const QString&)),
+ SLOT(nameEdited(const QString&)));
+ connect(le.minValue, SIGNAL(valueChanged(double)), SLOT(minValChanged(double)));
+ connect(le.maxValue, SIGNAL(valueChanged(double)), SLOT(maxValChanged(double)));
+ connect(le.defaultValue, SIGNAL(valueChanged(double)), SLOT(defaultValChanged(double)));
+ EscapeFilter* ef = new EscapeFilter(this);
+ installEventFilter(ef);
+ }
+
+//---------------------------------------------------------
+// eventFilter
+//---------------------------------------------------------
+
+bool EscapeFilter::eventFilter(QObject* obj, QEvent* event)
+ {
+ if (event->type() == QEvent::KeyPress) {
+ if (((QKeyEvent*)event)->key() == Qt::Key_Escape) {
+ ((CtrlListEditor*)parent())->sendEscape();
+ return true;
+ }
+ }
+ return QObject::eventFilter(obj, event);
}
//---------------------------------------------------------
@@ -47,11 +90,17 @@ CtrlListEditor::CtrlListEditor(QWidget* parent)
void CtrlListEditor::setup(const ListType& lt)
{
- Ctrl* c = lt.ctrl;
+ if (track)
+ disconnect(track, SIGNAL(controllerChanged(int)), this, SLOT(controllerChanged(int)));
+ track = lt.track;
+ connect(track, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+
+ c = lt.ctrl;
le.controllerName->setText(c->name());
le.discreteCheckBox->setChecked(c->type() & Ctrl::DISCRETE);
le.logarithmicCheckBox->setChecked(c->type() & Ctrl::LOG);
le.floatCheckBox->setChecked(!(c->type() & Ctrl::INT));
+ le.ctrlId->setValue(c->id());
if (c->type() & Ctrl::INT) {
le.minValue->setDecimals(0);
le.minValue->setValue(c->minVal().i);
@@ -68,18 +117,317 @@ void CtrlListEditor::setup(const ListType& lt)
le.defaultValue->setDecimals(1);
le.defaultValue->setValue(c->getDefault().f);
}
+ updateList();
+ }
+
+//---------------------------------------------------------
+// updateList
+//---------------------------------------------------------
+
+void CtrlListEditor::updateList()
+ {
+ if (updateListDisabled)
+ return;
le.ctrlList->clear();
int idx = 0;
+ bool curItemSet = false;
for (iCtrlVal i = c->begin(); i != c->end(); ++i, ++idx) {
CVal v = i.value();
QTreeWidgetItem* item = new QTreeWidgetItem;
- item->setText(0, QString("%1").arg(i.key()));
- item->setText(1, QString("%1").arg(i.key()));
+ item->setData(TICK_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter));
+ item->setData(TIME_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter));
+ item->setData(VAL_COL, Qt::TextAlignmentRole, int(Qt::AlignRight | Qt::AlignVCenter));
+// item->setItemDelegate(TIME_COL, midiTimeDelegate);
+
+ item->setData(TICK_COL, Qt::DisplayRole, i.key());
+ item->setData(TIME_COL, Qt::DisplayRole, i.key());
if (c->type() & Ctrl::INT)
- item->setText(2, QString("%1").arg(v.i));
+ item->setData(VAL_COL, Qt::DisplayRole, v.i);
else
- item->setText(2, QString("%1").arg(v.f));
+ item->setData(VAL_COL, Qt::DisplayRole, v.f);
le.ctrlList->insertTopLevelItem(idx, item);
+ if (!curItemSet && (i.key() >= listEdit->pos().tick())) {
+ le.ctrlList->setCurrentItem(item);
+ curItemSet = true;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::controllerChanged(int id)
+ {
+ if (id != c->id())
+ return;
+ updateList();
+ }
+
+//---------------------------------------------------------
+// itemDoubleClicked
+//---------------------------------------------------------
+
+void CtrlListEditor::itemDoubleClicked(QTreeWidgetItem* item, int column)
+ {
+ le.ctrlList->openPersistentEditor(item, column);
+ }
+
+//---------------------------------------------------------
+// itemChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::itemChanged(QTreeWidgetItem* item, int column)
+ {
+ if (column != VAL_COL) {
+ printf("time change not implemented\n");
+ return;
+ }
+
+ CVal val;
+ if (c->type() & Ctrl::INT) {
+ val.i = item->data(VAL_COL, Qt::DisplayRole).toInt();
+ bool updateData = false;
+ if (val.i < c->minVal().i) {
+ val.i = c->minVal().i;
+ updateData = true;
+ }
+ else if (val.i > c->maxVal().i) {
+ val.i = c->maxVal().i;
+ updateData = true;
+ }
+ if (updateData)
+ item->setData(VAL_COL, Qt::DisplayRole, val.i);
+ }
+ else {
+ val.f = item->data(VAL_COL, Qt::DisplayRole).toDouble();
+ bool updateData = false;
+ if (val.f < c->minVal().f) {
+ val.f = c->minVal().f;
+ updateData = true;
+ }
+ else if (val.f > c->maxVal().f) {
+ val.f = c->maxVal().f;
+ updateData = true;
+ }
+ if (updateData)
+ item->setData(VAL_COL, Qt::DisplayRole, val.f);
+ }
+ le.ctrlList->closePersistentEditor(item, TICK_COL);
+ le.ctrlList->closePersistentEditor(item, TIME_COL);
+ le.ctrlList->closePersistentEditor(item, VAL_COL);
+ updateListDisabled = true;
+ song->addControllerVal(track, c, listEdit->pos(), val);
+ updateListDisabled = false;
+ }
+
+//---------------------------------------------------------
+// sendEscape
+//---------------------------------------------------------
+
+void CtrlListEditor::sendEscape()
+ {
+ QTreeWidgetItem* cur = le.ctrlList->currentItem();
+ if (cur == 0)
+ return;
+ le.ctrlList->closePersistentEditor(cur, TICK_COL);
+ le.ctrlList->closePersistentEditor(cur, TIME_COL);
+ le.ctrlList->closePersistentEditor(cur, VAL_COL);
+ }
+
+//---------------------------------------------------------
+// currentItemChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::currentItemChanged(QTreeWidgetItem* cur, QTreeWidgetItem* prev)
+ {
+ if (prev) {
+ le.ctrlList->closePersistentEditor(prev, TICK_COL);
+ le.ctrlList->closePersistentEditor(prev, TIME_COL);
+ le.ctrlList->closePersistentEditor(prev, VAL_COL);
+ }
+ if (cur)
+ listEdit->pos().setTick(cur->data(TICK_COL, Qt::DisplayRole).toInt());
+ le.deleteButton->setEnabled(cur);
+ }
+
+//---------------------------------------------------------
+// insertClicked
+// insert one tick before current value
+//---------------------------------------------------------
+
+void CtrlListEditor::insertClicked()
+ {
+ CVal val = c->minVal();
+ QTreeWidgetItem* cur = le.ctrlList->currentItem();
+ if (cur) {
+ int tick = cur->data(TICK_COL, Qt::DisplayRole).toInt();
+ if (tick == 0) // cannot insert value at position < 0
+ return;
+ listEdit->pos().setTick(tick - 1);
+ if (c->type() & Ctrl::INT)
+ val.i = cur->data(VAL_COL, Qt::DisplayRole).toInt();
+ else
+ val.f = cur->data(VAL_COL, Qt::DisplayRole).toDouble();
+ }
+ song->addControllerVal(track, c, listEdit->pos(), val);
+ }
+
+//---------------------------------------------------------
+// deleteClicked
+//---------------------------------------------------------
+
+void CtrlListEditor::deleteClicked()
+ {
+ QTreeWidgetItem* cur = le.ctrlList->currentItem();
+ if (cur == 0)
+ return;
+ int tick = cur->data(TICK_COL, Qt::DisplayRole).toInt();
+ song->removeControllerVal(track, c->id(), tick);
+ }
+
+//---------------------------------------------------------
+// nameEdited
+//---------------------------------------------------------
+
+void CtrlListEditor::nameEdited(const QString& s)
+ {
+ track->changeCtrlName(c, s);
+ }
+
+//---------------------------------------------------------
+// minValChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::minValChanged(double v)
+ {
+ CVal val;
+ if (c->type() & Ctrl::INT)
+ val.i = int(v);
+ else
+ val.f = v;
+ c->setRange(val, c->maxVal());
+ }
+
+//---------------------------------------------------------
+// maxValChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::maxValChanged(double v)
+ {
+ CVal val;
+ if (c->type() & Ctrl::INT)
+ val.i = int(v);
+ else
+ val.f = v;
+ c->setRange(c->minVal(), val);
+ }
+
+//---------------------------------------------------------
+// defaultValChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::defaultValChanged(double v)
+ {
+ CVal val;
+ if (c->type() & Ctrl::INT)
+ val.i = int(v);
+ else
+ val.f = v;
+ c->setDefault(val);
+ }
+
+//---------------------------------------------------------
+// MidiTimeDelegate
+//---------------------------------------------------------
+
+MidiTimeDelegate::MidiTimeDelegate(QObject* parent)
+ : QItemDelegate(parent)
+ {
+ }
+
+//---------------------------------------------------------
+// createEditor
+//---------------------------------------------------------
+
+QWidget* MidiTimeDelegate::createEditor(QWidget* parent,
+ const QStyleOptionViewItem& option, const QModelIndex& index) const
+ {
+ if (index.column() != CtrlListEditor::TIME_COL)
+ return QItemDelegate::createEditor(parent, option, index);
+
+ Awl::PosEdit* pe = new Awl::PosEdit(parent);
+ return pe;
+ }
+
+//---------------------------------------------------------
+// setEditorData
+//---------------------------------------------------------
+
+void MidiTimeDelegate::setEditorData(QWidget* editor,
+ const QModelIndex& index) const
+ {
+ if (index.column() != CtrlListEditor::TIME_COL) {
+ QItemDelegate::setEditorData(editor, index);
+ return;
+ }
+ Awl::PosEdit* pe = (Awl::PosEdit*)editor;
+ pe->setValue(AL::Pos(index.data().toInt()));
+ }
+
+//---------------------------------------------------------
+// setModelData
+//---------------------------------------------------------
+
+void MidiTimeDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
+ const QModelIndex& index) const
+ {
+ if (index.column() != CtrlListEditor::TIME_COL) {
+ QItemDelegate::setModelData(editor, model, index);
+ return;
+ }
+ Awl::PosEdit* pe = (Awl::PosEdit*)editor;
+ model->setData(index, pe->pos().tick(), Qt::DisplayRole);
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void MidiTimeDelegate::paint(QPainter* painter,
+ const QStyleOptionViewItem& option, const QModelIndex& index) const
+ {
+ if (index.column() != CtrlListEditor::TIME_COL) {
+ QItemDelegate::paint(painter, option, index);
+ return;
+ }
+ AL::Pos pos(index.data().toInt());
+ int measure, beat, tick;
+ pos.mbt(&measure, &beat, &tick);
+ QString text;
+ text.sprintf("%04d.%02d.%03u", measure+1, beat+1, tick);
+
+ QStyleOptionViewItemV2 opt = setOptions(index, option);
+ const QStyleOptionViewItemV2 *v2 = qstyleoption_cast<const QStyleOptionViewItemV2 *>(&option);
+ opt.features = v2 ? v2->features : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None);
+
+ painter->save();
+ QVariant value;
+ QRect displayRect;
+ displayRect = option.rect; // textRectangle(painter, d->textLayoutBounds(opt), opt.font, text);
+
+ QRect checkRect;
+ Qt::CheckState checkState = Qt::Unchecked;
+ value = index.data(Qt::CheckStateRole);
+ if (value.isValid()) {
+ checkState = static_cast<Qt::CheckState>(value.toInt());
+ checkRect = check(opt, opt.rect, value);
}
+
+ drawBackground(painter, opt, index);
+ drawCheck(painter, opt, checkRect, checkState);
+ drawDisplay(painter, opt, displayRect, text);
+ drawFocus(painter, opt, text.isEmpty() ? QRect() : displayRect);
+ painter->restore();
}
diff --git a/muse/muse/liste/ctrllistedit.h b/muse/muse/liste/ctrllistedit.h
index 57fd5eac..842ba7eb 100644
--- a/muse/muse/liste/ctrllistedit.h
+++ b/muse/muse/liste/ctrllistedit.h
@@ -21,10 +21,41 @@
#ifndef __CTRLLISTEDIT_H__
#define __CTRLLISTEDIT_H__
+#include "al/pos.h"
#include "listedit.h"
#include "ui_ctrllistedit.h"
//---------------------------------------------------------
+// MidiTimeDelegate
+//---------------------------------------------------------
+
+class MidiTimeDelegate : public QItemDelegate {
+
+ virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem&,
+ const QModelIndex& index) const;
+ virtual void setEditorData(QWidget* editor, const QModelIndex&) const;
+ virtual void setModelData(QWidget* editor, QAbstractItemModel*,
+ const QModelIndex&) const;
+ void paint(QPainter*, const QStyleOptionViewItem&,
+ const QModelIndex&) const;
+
+ public:
+ MidiTimeDelegate(QObject* parent = 0);
+ };
+
+//---------------------------------------------------------
+// EscapeFilter
+//---------------------------------------------------------
+
+class EscapeFilter : public QObject {
+ Q_OBJECT
+ protected:
+ bool eventFilter(QObject*, QEvent*);
+ public:
+ EscapeFilter(QObject* parent = 0): QObject(parent) {}
+ };
+
+//---------------------------------------------------------
// CtrlListEditor
//---------------------------------------------------------
@@ -32,12 +63,32 @@ class CtrlListEditor : public ListWidget {
Q_OBJECT
Ui::CtrlListEdit le;
+ Track* track;
+ Ctrl* c;
+ bool updateListDisabled;
+ ListEdit* listEdit;
+ MidiTimeDelegate* midiTimeDelegate;
+
+ void updateList();
+
+ private slots:
+ void controllerChanged(int id);
+ void itemDoubleClicked(QTreeWidgetItem*,int);
+ void itemChanged(QTreeWidgetItem*,int);
+ void currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*);
+ void insertClicked();
+ void deleteClicked();
+ void nameEdited(const QString&);
+ void minValChanged(double);
+ void maxValChanged(double);
+ void defaultValChanged(double);
public:
- CtrlListEditor(QWidget* parent = 0);
+ CtrlListEditor(ListEdit*, QWidget* parent = 0);
virtual void setup(const ListType&);
+ void sendEscape();
+ enum { TICK_COL, TIME_COL, VAL_COL };
};
-
#endif
diff --git a/muse/muse/liste/ctrllistedit.ui b/muse/muse/liste/ctrllistedit.ui
index 4f0c3b9d..88f850d9 100644
--- a/muse/muse/liste/ctrllistedit.ui
+++ b/muse/muse/liste/ctrllistedit.ui
@@ -6,7 +6,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
- <height>300</height>
+ <height>341</height>
</rect>
</property>
<property name="windowTitle" >
@@ -14,10 +14,10 @@
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
- <number>9</number>
+ <number>0</number>
</property>
<property name="spacing" >
- <number>6</number>
+ <number>3</number>
</property>
<item>
<layout class="QHBoxLayout" >
@@ -29,6 +29,14 @@
</property>
<item>
<widget class="QLabel" name="label" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="font" >
<font>
<weight>75</weight>
@@ -41,29 +49,29 @@
</widget>
</item>
<item>
- <widget class="QLabel" name="controllerName" >
- <property name="sizePolicy" >
- <sizepolicy>
- <hsizetype>7</hsizetype>
- <vsizetype>5</vsizetype>
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="lineWidth" >
- <number>2</number>
- </property>
+ <widget class="QLineEdit" name="controllerName" />
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_3" >
<property name="text" >
- <string>Volume</string>
+ <string>Id:</string>
</property>
- <property name="textFormat" >
- <enum>Qt::PlainText</enum>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="ctrlId" >
+ <property name="readOnly" >
+ <bool>true</bool>
</property>
</widget>
</item>
@@ -79,6 +87,17 @@
</property>
<item>
<widget class="QCheckBox" name="discreteCheckBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>discrete</string>
</property>
@@ -86,6 +105,17 @@
</item>
<item>
<widget class="QCheckBox" name="logarithmicCheckBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>logarithmic</string>
</property>
@@ -93,6 +123,17 @@
</item>
<item>
<widget class="QCheckBox" name="floatCheckBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>float</string>
</property>
@@ -110,6 +151,14 @@
</property>
<item>
<widget class="QLabel" name="label_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>min:</string>
</property>
@@ -119,10 +168,27 @@
</widget>
</item>
<item>
- <widget class="QDoubleSpinBox" name="minValue" />
+ <widget class="QDoubleSpinBox" name="minValue" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
</item>
<item>
<widget class="QLabel" name="l2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>max:</string>
</property>
@@ -132,10 +198,27 @@
</widget>
</item>
<item>
- <widget class="QDoubleSpinBox" name="maxValue" />
+ <widget class="QDoubleSpinBox" name="maxValue" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
</item>
<item>
<widget class="QLabel" name="l3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text" >
<string>default:</string>
</property>
@@ -145,12 +228,36 @@
</widget>
</item>
<item>
- <widget class="QDoubleSpinBox" name="defaultValue" />
+ <widget class="QDoubleSpinBox" name="defaultValue" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
</item>
</layout>
</item>
<item>
<widget class="QTreeWidget" name="ctrlList" >
+ <property name="alternatingRowColors" >
+ <bool>true</bool>
+ </property>
+ <property name="indentation" >
+ <number>0</number>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights" >
+ <bool>true</bool>
+ </property>
+ <property name="itemsExpandable" >
+ <bool>false</bool>
+ </property>
<column>
<property name="text" >
<string>Tick</string>
@@ -168,6 +275,43 @@
</column>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="deleteButton" >
+ <property name="text" >
+ <string>Delete</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="insertButton" >
+ <property name="text" >
+ <string>Insert</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>231</width>
+ <height>29</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<resources/>
diff --git a/muse/muse/liste/listedit.cpp b/muse/muse/liste/listedit.cpp
index 52d8a757..09e2ed86 100644
--- a/muse/muse/liste/listedit.cpp
+++ b/muse/muse/liste/listedit.cpp
@@ -19,12 +19,15 @@
//=============================================================================
#include "listedit.h"
-#include "al/pos.h"
#include "ctrllistedit.h"
#include "song.h"
#include "part.h"
#include "ctrl.h"
+//---------------------------------------------------------
+// operator==
+//---------------------------------------------------------
+
bool ListType::operator==(const ListType& t) const
{
return id == t.id && track == t.track
@@ -57,7 +60,7 @@ ListEdit::ListEdit(QWidget*)
stack = new QStackedWidget;
split->addWidget(stack);
- ctrlPanel = new CtrlListEditor;
+ ctrlPanel = new CtrlListEditor(this);
stack->addWidget(ctrlPanel);
connect(list, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
@@ -89,9 +92,9 @@ void ListEdit::itemChanged(QTreeWidgetItem* i, QTreeWidgetItem*)
lt = i->data(0, Qt::UserRole).value<ListType>();
switch(lt.id) {
case LIST_TRACK:
- break;
+ return;
case LIST_PART:
- break;
+ return;
case LIST_CTRL:
ew = ctrlPanel;
break;
@@ -171,8 +174,9 @@ QTreeWidgetItem* ListEdit::findItem(const ListType& lt, QTreeWidgetItem* item)
// selectItem
//---------------------------------------------------------
-void ListEdit::selectItem(const AL::Pos&, Track* track, Part* part, Ctrl* ctrl)
+void ListEdit::selectItem(const AL::Pos& p, Track* track, Part* part, Ctrl* ctrl)
{
+ _pos = p;
stack->setCurrentWidget(ctrlPanel);
if (ctrl)
lt.id = LIST_CTRL;
@@ -190,6 +194,7 @@ void ListEdit::selectItem(const AL::Pos&, Track* track, Part* part, Ctrl* ctrl)
void ListEdit::selectItem(const ListType& l)
{
+ lt = l;
stack->setCurrentWidget(ctrlPanel);
buildList();
for (int i = 0;; ++i) {
@@ -228,6 +233,8 @@ void ListEdit::read(QDomNode node)
printf("MusE::ListEdit::read: track not found\n");
}
}
+ else if (tag == "Pos")
+ _pos.read(node);
else if (tag == "Ctrl") {
int ctrlId = e.text().toInt();
ctrl = track->getController(ctrlId);
@@ -240,7 +247,7 @@ void ListEdit::read(QDomNode node)
else
AL::readProperties(this, node);
}
- selectItem(AL::Pos(), track, part, ctrl);
+ selectItem(_pos, track, part, ctrl);
}
//---------------------------------------------------------
@@ -255,6 +262,7 @@ void ListEdit::write(Xml& xml) const
xml.strTag("Track", lt.track->name());
if (lt.ctrl) {
xml.intTag("Ctrl", lt.ctrl->id());
+ _pos.write(xml, "Pos");
}
xml.etag(metaObject()->className());
}
diff --git a/muse/muse/liste/listedit.h b/muse/muse/liste/listedit.h
index e386f49b..2c33cdab 100644
--- a/muse/muse/liste/listedit.h
+++ b/muse/muse/liste/listedit.h
@@ -21,12 +21,9 @@
#ifndef __LISTEDIT_H__
#define __LISTEDIT_H__
+#include "al/pos.h"
#include "cobject.h"
-namespace AL {
- class Pos;
- };
-
class Track;
class Part;
class Ctrl;
@@ -70,6 +67,7 @@ class ListEdit : public TopWin {
Q_OBJECT;
ListType lt;
+ AL::Pos _pos;
QStackedWidget* stack;
QTreeWidget* list;
@@ -88,6 +86,7 @@ class ListEdit : public TopWin {
void selectItem(const AL::Pos&, Track*, Part*, Ctrl*);
virtual void read(QDomNode);
virtual void write(Xml& xml) const;
+ AL::Pos& pos() { return _pos; }
};
#endif
diff --git a/muse/muse/song.h b/muse/muse/song.h
index 29a5a433..610b0eec 100644
--- a/muse/muse/song.h
+++ b/muse/muse/song.h
@@ -344,7 +344,6 @@ class Song : public QObject {
void undoOp(UndoOp::UndoType, Part*);
void undoOp(UndoOp::UndoType, Event& oevent, Event& nevent, Part*);
void undoOp(UndoOp::UndoType, SigEvent* oevent, SigEvent* nevent);
- void undoOp(UndoOp::UndoType, int channel, int ctrl, int oval, int nval);
void undoOp(UndoOp::UndoType, Part* oPart, Part* nPart);
void undoOp(UndoOp::UndoType, Track*, int, unsigned, CVal, CVal);
void undoOp(UndoOp::UndoType, Track*, const QString&, const QString&);
diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp
index 6e0e4a99..14189c61 100644
--- a/muse/muse/track.cpp
+++ b/muse/muse/track.cpp
@@ -397,6 +397,16 @@ void Track::removeController(int id)
}
//---------------------------------------------------------
+// changeCtrlName
+//---------------------------------------------------------
+
+void Track::changeCtrlName(Ctrl* c, const QString& s)
+ {
+ c->setName(s);
+ emit clChanged();
+ }
+
+//---------------------------------------------------------
// addControllerVal
// return true if new controller value added
//---------------------------------------------------------
diff --git a/muse/muse/track.h b/muse/muse/track.h
index 84afe3df..7ffb76a6 100644
--- a/muse/muse/track.h
+++ b/muse/muse/track.h
@@ -210,6 +210,7 @@ class Track : public QObject {
// signal interface:
virtual void emitControllerChanged(int id) { emit controllerChanged(id); }
void updateController();
+ void changeCtrlName(Ctrl* c, const QString& s);
// automation
void startAutoRecord(int);
diff --git a/muse/muse/undo.cpp b/muse/muse/undo.cpp
index b65269f4..1303ed79 100644
--- a/muse/muse/undo.cpp
+++ b/muse/muse/undo.cpp
@@ -345,17 +345,6 @@ void Song::undoOp(UndoOp::UndoType type, Part* oPart, Part* nPart)
addUndo(i);
}
-void Song::undoOp(UndoOp::UndoType type, int c, int ctrl, int ov, int nv)
- {
- UndoOp i;
- i.type = type;
- i.channel = c;
- i.ctrl = ctrl;
- i.oVal = ov;
- i.nVal = nv;
- addUndo(i);
- }
-
void Song::undoOp(UndoOp::UndoType type, SigEvent* oevent, SigEvent* nevent)
{
UndoOp i;
diff --git a/muse/muse/undo.h b/muse/muse/undo.h
index 5e9976c8..ac9222c2 100644
--- a/muse/muse/undo.h
+++ b/muse/muse/undo.h
@@ -65,12 +65,6 @@ struct UndoOp {
SigEvent* oSignature;
};
struct {
- int channel;
- int ctrl;
- int oVal;
- int nVal;
- };
- struct {
int startframe; //!< Start frame of changed data
int endframe; //!< End frame of changed data
const char* filename; //!< The file that is changed