summaryrefslogtreecommitdiff
path: root/attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp')
-rw-r--r--attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp569
1 files changed, 569 insertions, 0 deletions
diff --git a/attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp b/attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp
new file mode 100644
index 00000000..ab9e66e3
--- /dev/null
+++ b/attic/muse_qt4_evolution/muse/liste/ctrllistedit.cpp
@@ -0,0 +1,569 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "ctrllistedit.h"
+#include "ctrl.h"
+#include "track.h"
+#include "song.h"
+#include "al/pos.h"
+#include "awl/posedit.h"
+
+//---------------------------------------------------------
+// CtrlListEditor
+//---------------------------------------------------------
+
+CtrlListEditor::CtrlListEditor(ListEdit* e, QWidget* parent)
+ : ListWidget(parent)
+ {
+ listEdit = e;
+ updateListDisabled = false;
+ QWidget* cew = new QWidget;
+ le.setupUi(cew);
+ QVBoxLayout* layout = new QVBoxLayout;
+ layout->addWidget(cew);
+ setLayout(layout);
+ le.minValue->setRange(-10000000.0, 100000000.0);
+ le.maxValue->setRange(-10000000.0, 100000000.0);
+ le.defaultValue->setRange(-10000000.0, 100000000.0);
+ le.minValue->setSingleStep(1.0);
+ le.maxValue->setSingleStep(1.0);
+ le.defaultValue->setSingleStep(1.0);
+
+ QFontMetrics fm(le.ctrlList->font());
+ int zW = fm.width("0");
+ le.ctrlList->setColumnWidth(TICK_COL, zW * 8);
+ le.ctrlList->setColumnWidth(TIME_COL, zW * 14);
+ CtrlDelegate* ctrlDelegate = new CtrlDelegate(this);
+ le.ctrlList->setItemDelegate(ctrlDelegate);
+
+ track = 0;
+ connect(le.ctrlList, SIGNAL(itemActivated(QTreeWidgetItem*, int)),
+ SLOT(itemActivated(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);
+ }
+
+//---------------------------------------------------------
+// setup
+//---------------------------------------------------------
+
+void CtrlListEditor::setup(const ListType& lt)
+ {
+ 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);
+ le.maxValue->setDecimals(0);
+ le.maxValue->setValue(c->maxVal().i);
+ le.defaultValue->setDecimals(0);
+ le.defaultValue->setValue(c->getDefault().i);
+ }
+ else {
+ if (c->type() & Ctrl::LOG) {
+ le.minValue->setDecimals(0);
+ le.minValue->setValue(c->minVal().f * 20.0);
+ le.minValue->setSuffix(tr("dB"));
+ le.maxValue->setDecimals(0);
+ le.maxValue->setValue(c->maxVal().f * 20.0);
+ le.maxValue->setSuffix(tr("dB"));
+ le.defaultValue->setDecimals(0);
+ le.defaultValue->setValue(c->getDefault().f * 20.0);
+ le.defaultValue->setSuffix(tr("dB"));
+ }
+ else {
+ le.minValue->setDecimals(1);
+ le.minValue->setValue(c->minVal().f);
+ le.maxValue->setDecimals(1);
+ le.maxValue->setValue(c->maxVal().f);
+ 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->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::AlignHCenter | Qt::AlignVCenter));
+
+ item->setData(TICK_COL, Qt::DisplayRole, i.key());
+ item->setData(TIME_COL, Qt::DisplayRole, i.key());
+ if (c->type() & Ctrl::INT)
+ item->setData(VAL_COL, Qt::DisplayRole, v.i);
+ else
+ 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();
+ }
+
+//---------------------------------------------------------
+// itemActivated
+//---------------------------------------------------------
+
+void CtrlListEditor::itemActivated(QTreeWidgetItem* item, int column)
+ {
+ le.ctrlList->openPersistentEditor(item, column);
+ }
+
+//---------------------------------------------------------
+// itemChanged
+//---------------------------------------------------------
+
+void CtrlListEditor::itemChanged(QTreeWidgetItem* item, int column)
+ {
+ 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;
+ switch(column) {
+ case TICK_COL:
+ {
+ int otick = item->data(TIME_COL, Qt::DisplayRole).toInt();
+ int tick = item->data(TICK_COL, Qt::DisplayRole).toInt();
+ item->setData(TIME_COL, Qt::DisplayRole, tick);
+ song->cmdRemoveControllerVal(track, c->id(), otick);
+ song->cmdAddControllerVal(track, c, tick, val);
+ }
+ break;
+ case TIME_COL:
+ {
+ int otick = item->data(TICK_COL, Qt::DisplayRole).toInt();
+ int tick = item->data(TIME_COL, Qt::DisplayRole).toInt();
+ item->setData(TICK_COL, Qt::DisplayRole, tick);
+ song->cmdRemoveControllerVal(track, c->id(), otick);
+ song->cmdAddControllerVal(track, c, tick, val);
+ }
+ break;
+ case VAL_COL:
+ song->cmdAddControllerVal(track, c, listEdit->pos(), val);
+ break;
+ }
+ 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) {
+ Pos pos(cur->data(TICK_COL, Qt::DisplayRole).toInt(), track->timeType());
+ listEdit->pos() = pos;
+ }
+ 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->cmdAddControllerVal(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->cmdRemoveControllerVal(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 {
+ if (c->type() & Ctrl::LOG)
+ v /= 20.0;
+ 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 {
+ if (c->type() & Ctrl::LOG)
+ v /= 20.0;
+ 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);
+ }
+
+//---------------------------------------------------------
+// CtrlDelegate
+//---------------------------------------------------------
+
+CtrlDelegate::CtrlDelegate(QObject* parent)
+ : QItemDelegate(parent)
+ {
+ }
+
+//---------------------------------------------------------
+// createEditor
+//---------------------------------------------------------
+
+QWidget* CtrlDelegate::createEditor(QWidget* pw,
+ const QStyleOptionViewItem& option, const QModelIndex& index) const
+ {
+ switch(index.column()) {
+ case CtrlListEditor::TICK_COL:
+ break;
+ case CtrlListEditor::TIME_COL:
+ return new Awl::PosEdit(pw);
+ case CtrlListEditor::VAL_COL:
+ {
+ CtrlListEditor* ce = static_cast<CtrlListEditor*>(parent());
+ Ctrl* c = ce->ctrl();
+ if (c->type() & Ctrl::INT) {
+ QSpinBox* w = new QSpinBox(pw);
+ w->setRange(c->minVal().i, c->maxVal().i);
+ w->installEventFilter(const_cast<CtrlDelegate*>(this));
+ return w;
+ }
+ QDoubleSpinBox* w = new QDoubleSpinBox(pw);
+ if (c->type() & Ctrl::LOG)
+ w->setSuffix(tr("dB"));
+// w->setRange(c->minVal().f, c->maxVal().f);
+ w->installEventFilter(const_cast<CtrlDelegate*>(this));
+ return w;
+ }
+ }
+ return QItemDelegate::createEditor(pw, option, index);
+ }
+
+//---------------------------------------------------------
+// setEditorData
+//---------------------------------------------------------
+
+void CtrlDelegate::setEditorData(QWidget* editor,
+ const QModelIndex& index) const
+ {
+ switch(index.column()) {
+ case CtrlListEditor::TICK_COL:
+ break;
+ case CtrlListEditor::TIME_COL:
+ {
+ Awl::PosEdit* pe = static_cast<Awl::PosEdit*>(editor);
+ pe->setValue(AL::Pos(index.data().toInt()));
+ }
+ return;
+ case CtrlListEditor::VAL_COL:
+ {
+ CtrlListEditor* ce = static_cast<CtrlListEditor*>(parent());
+ Ctrl* c = ce->ctrl();
+ if (c->type() & Ctrl::INT) {
+ QSpinBox* w = static_cast<QSpinBox*>(editor);
+ w->setValue(index.data().toInt());
+ }
+ else {
+ QDoubleSpinBox* w = static_cast<QDoubleSpinBox*>(editor);
+ double v = index.data().toDouble();
+printf("type %x\n", c->type());
+ if (c->type() & Ctrl::LOG)
+ v *= 20.0;
+ w->setValue(v);
+ }
+ }
+ return;
+ }
+ QItemDelegate::setEditorData(editor, index);
+ }
+
+//---------------------------------------------------------
+// setModelData
+//---------------------------------------------------------
+
+void CtrlDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
+ const QModelIndex& index) const
+ {
+ switch(index.column()) {
+ case CtrlListEditor::TICK_COL:
+ break;
+ case CtrlListEditor::TIME_COL:
+ {
+ Awl::PosEdit* pe = static_cast<Awl::PosEdit*>(editor);
+ model->setData(index, pe->pos().tick(), Qt::DisplayRole);
+ }
+ return;
+ case CtrlListEditor::VAL_COL:
+ {
+ CtrlListEditor* ce = static_cast<CtrlListEditor*>(parent());
+ Ctrl* c = ce->ctrl();
+ if (c->type() & Ctrl::INT) {
+ QSpinBox* w = static_cast<QSpinBox*>(editor);
+ model->setData(index, w->value(), Qt::DisplayRole);
+ }
+ else {
+ QDoubleSpinBox* w = static_cast<QDoubleSpinBox*>(editor);
+ double v = w->value();
+ if (c->type() & Ctrl::LOG)
+ v /= 20.0;
+ model->setData(index, v, Qt::DisplayRole);
+ }
+ }
+ break;
+ }
+ QItemDelegate::setModelData(editor, model, index);
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void CtrlDelegate::paint(QPainter* painter,
+ const QStyleOptionViewItem& option, const QModelIndex& index) const
+ {
+ QString text;
+ CtrlListEditor* ce = static_cast<CtrlListEditor*>(parent());
+
+ switch(index.column()) {
+ case CtrlListEditor::TICK_COL:
+ {
+ Track* track = ce->getTrack();
+ AL::Pos pos(index.data().toInt(), track->timeType());
+ text = QString("%1").arg(pos.tick());
+ }
+ break;
+ case CtrlListEditor::TIME_COL:
+ {
+ Track* track = ce->getTrack();
+ AL::Pos pos(index.data().toInt(), track->timeType());
+ int measure, beat, tick;
+ pos.mbt(&measure, &beat, &tick);
+ text.sprintf("%04d.%02d.%03u", measure+1, beat+1, tick);
+ }
+ break;
+ case CtrlListEditor::VAL_COL:
+ {
+ Ctrl* c = ce->ctrl();
+ if (c->type() & Ctrl::INT) {
+ text = QString("%1").arg(index.data().toInt());
+ }
+ else {
+ if (c->type() & Ctrl::LOG) {
+ double f = index.data().toDouble();
+ if (f <= -1000.0f)
+ text = tr("off");
+ else
+ text = QString("%1 dB").arg(f * 20.0);
+ }
+ else {
+ text = QString("%1").arg(index.data().toDouble());
+ }
+ }
+ }
+ break;
+ }
+
+ 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();
+ }
+
+