From 3df9fcb67ac6c77b9f1d64a99a0052cefac008fa Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 13:21:28 +0200 Subject: [PATCH 1/9] Working, but drawing is not perfect --- companion/src/modeledit/mixerslist.cpp | 136 ++++++++++++++++++++++++- companion/src/modeledit/mixerslist.h | 17 ++++ companion/src/modeledit/mixes.cpp | 26 +++-- companion/src/modeledit/mixes.h | 2 +- 4 files changed, 170 insertions(+), 11 deletions(-) diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index 06d8cd3f5..0a434c096 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -8,8 +8,10 @@ MixersList::MixersList(QWidget *parent, bool expo) : setContextMenuPolicy(Qt::CustomContextMenu); setSelectionMode(QAbstractItemView::SingleSelection); setDragEnabled(true); - setAcceptDrops(true); + //setDragDropMode(QAbstractItemView::InternalMove); + viewport()->setAcceptDrops(true); setDropIndicatorShown(true); + setItemDelegate(new MixersDelegate(parent)); } void MixersList::keyPressEvent(QKeyEvent *event) @@ -19,6 +21,7 @@ void MixersList::keyPressEvent(QKeyEvent *event) bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction action ) { + qDebug() << "MixersList::dropMimeData() " << index << data->formats(); QByteArray dropData = data->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&dropData, QIODevice::ReadOnly); QByteArray qba; @@ -31,8 +34,8 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction QList lsVars; lsVars = v.values(); QString itemString = lsVars.at(0).toString(); - qba.append(lsVars.at(1).toByteArray().mid(1)); - + qba.append(lsVars.last().toByteArray().mid(1)); + qDebug() << "MixersList::dropMimeData() added data " << lsVars; if(itemString.isEmpty()) {}; } @@ -52,3 +55,130 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction } +void MixersList::mousePressEvent(QMouseEvent *event) +{ + qDebug() << "MixersList::mousePressEvent" ; + QListWidgetItem *item = currentItem(); + if (item) { + qDebug() << "MixersList::mousePressEvent" << item->text(); + } + if (event->button() == Qt::LeftButton) + { + //startPos = event->pos(); + } + QListWidget::mousePressEvent(event); + +} + +#define QFIXED_MAX (INT_MAX/256) + +QRect __textLayoutBounds(const QStyleOptionViewItemV2 &option) +{ + QRect rect = option.rect; + const bool wrapText = option.features & QStyleOptionViewItemV2::WrapText; + switch (option.decorationPosition) { + case QStyleOptionViewItem::Left: + case QStyleOptionViewItem::Right: + rect.setWidth(wrapText && rect.isValid() ? rect.width() : (QFIXED_MAX)); + break; + case QStyleOptionViewItem::Top: + case QStyleOptionViewItem::Bottom: + rect.setWidth(wrapText ? option.decorationSize.width() : (QFIXED_MAX)); + break; + } + + return rect; +} + +void MixersDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + //Q_D(const QItemDelegate); + Q_ASSERT(index.isValid()); + + QStyleOptionViewItemV4 opt = setOptions(index, option); + //qDebug() << "MixersDelegate::paint" << opt.rect; + + const QStyleOptionViewItemV2 *v2 = qstyleoption_cast(&option); + opt.features = v2 ? v2->features + : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None); + const QStyleOptionViewItemV3 *v3 = qstyleoption_cast(&option); + opt.locale = v3 ? v3->locale : QLocale(); + opt.widget = v3 ? v3->widget : 0; + + // prepare + painter->save(); + if (false /*d->clipPainting*/) + painter->setClipRect(opt.rect); + + // get the data and the rectangles + + QVariant value; + + + QString text; + QRect displayRect; + value = index.data(Qt::DisplayRole); + if (value.isValid() && !value.isNull()) { + text = value.toString(); + displayRect = textRectangle(painter, __textLayoutBounds(opt), opt.font, text); + } + + QRect checkRect; + Qt::CheckState checkState = Qt::Unchecked; + value = index.data(Qt::CheckStateRole); + if (value.isValid()) { + checkState = static_cast(value.toInt()); + checkRect = check(opt, opt.rect, value); + } + + // do the layout + QRect dummy; + + + + doLayout(opt, &checkRect, &dummy, &displayRect, false); + + // draw the item + + drawBackground(painter, opt, index); + drawCheck(painter, opt, checkRect, checkState); + //drawDecoration(painter, opt, decorationRect, pixmap); + drawDisplay(painter, opt, displayRect, text); + drawFocus(painter, opt, displayRect); + + // done + painter->restore(); +} + +void MixersDelegate::drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, + const QRect &rect, const QString &text) const +{ + + painter->save(); + + QTextDocument doc; + doc.setHtml(text); + doc.setDefaultFont(option.font); + + painter->translate(rect.left(), rect.top()); + QRect clip(0, 0, rect.width(), rect.height()); + doc.drawContents(painter, clip); + + painter->restore(); +} + + + +// QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const +// { +// QStyleOptionViewItemV4 options = option; +// initStyleOption(&options, index); + +// QTextDocument doc; +// doc.setHtml(options.text); +// doc.setDefaultFont(option.font); +// doc.setTextWidth(options.rect.width()); +// return QSize(doc.idealWidth(), doc.size().height()); +// } \ No newline at end of file diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslist.h index 52e9ffebb..87e0c7e58 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslist.h @@ -22,6 +22,23 @@ class MixersList : public QListWidget QPoint dragStartPosition; bool expo; + protected: + void mousePressEvent(QMouseEvent *event); + }; +class MixersDelegate : public QItemDelegate +{ + Q_OBJECT + public: + inline MixersDelegate(QObject *parent) : QItemDelegate(parent) {} + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, + const QRect &rect, const QString &text) const ; + //QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + +}; + + #endif // MIXERSLIST_H diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index a40f66ff4..381eb9f48 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -79,7 +79,7 @@ void MixesPanel::update() curDest++; AddMixerLine(-curDest); } - if (AddMixerLine(i)) { + if (AddMixerLine(i, md)) { curDest++; } } @@ -92,12 +92,17 @@ void MixesPanel::update() #define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled -bool MixesPanel::AddMixerLine(int dest) +bool MixesPanel::AddMixerLine(int dest, const MixData * md) { bool new_ch; QString str = getMixerText(dest, &new_ch); QListWidgetItem *itm = new QListWidgetItem(); - itm->setData(Qt::UserRole, QByteArray(1, (quint8)dest)); + QByteArray qba(1, (quint8)dest); + if (md) { + qba.append((const char*)md, sizeof(MixData)); + //qDebug() << "appended mixdata for dest: " << dest; + } + itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 if ((new_ch && (dest > 0)) || (dest < 0)) { //increase size of this row @@ -107,8 +112,11 @@ bool MixesPanel::AddMixerLine(int dest) } #endif MixerlistWidget->addItem(itm); - MixerlistWidget->setItemWidget(itm, getMixerWidget(str)); - // qDebug() << "MixesPanel::AddMixerLine(): " << str; + itm->setText(str); + // if ((new_ch && (dest > 0)) || (dest < 0)) { + // MixerlistWidget->setItemWidget(itm, getMixerWidget(str)); + // } + //qDebug() << "MixesPanel::AddMixerLine(): " << str; return new_ch; } @@ -121,6 +129,8 @@ QWidget * MixesPanel::getMixerWidget(const QString & mixer_text) QString formated_str(mixer_text); formated_str.replace(" ", " "); l->setText(formated_str); + l->setAcceptDrops(true); + //l->setAutoFillBackground(true); return l; } @@ -347,6 +357,7 @@ void MixesPanel::mixersCopy() void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) { + qDebug() << "void MixesPanel::pasteMixerMimeData" << mimeData->formats(); if(mimeData->hasFormat("application/x-companion-mix")) { int idx; // mixer index int dch; @@ -427,8 +438,8 @@ void MixesPanel::mixerHighlight() for(int i=0; icount(); i++) { int t = MixerlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); bool dummy; - QWidget *w = getMixerWidget(getMixerText(t, &dummy)); - MixerlistWidget->setItemWidget(MixerlistWidget->item(i), w); + //QWidget *w = getMixerWidget(); + MixerlistWidget->item(i)->setText(getMixerText(t, &dummy)); } } @@ -483,6 +494,7 @@ void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/) { int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); + qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; pasteMixerMimeData(data, idx); } diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index fda60d8fc..c1f54e601 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -53,7 +53,7 @@ class MixesPanel : public ModelPanel QList createMixListFromSelected(); void setSelectedByMixList(QList list); QString getChannelLabel(int curDest); - bool AddMixerLine(int dest); + bool AddMixerLine(int dest, const MixData * md = 0); QString getMixerText(int dest, bool * new_ch); QWidget * getMixerWidget(const QString & mixer_text); }; From 95e7f7915b4fd70d73b1e29082adfa2bbd10a308 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 14:22:54 +0200 Subject: [PATCH 2/9] Better implementation, spacing now correct, drag&drop working. Inputs tab still needs spaces converted to   --- companion/src/modeledit/mixerslist.cpp | 140 ++++++++----------------- companion/src/modeledit/mixerslist.h | 8 +- companion/src/modeledit/mixes.cpp | 9 +- 3 files changed, 53 insertions(+), 104 deletions(-) diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index 0a434c096..a40e4b600 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -34,11 +34,12 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction QList lsVars; lsVars = v.values(); QString itemString = lsVars.at(0).toString(); - qba.append(lsVars.last().toByteArray().mid(1)); - qDebug() << "MixersList::dropMimeData() added data " << lsVars; + qba.append(lsVars.at(1).toByteArray().mid(1)); + qDebug() << "MixersList::dropMimeData() added data " << lsVars.count() << lsVars; if(itemString.isEmpty()) {}; } + qDebug() << "MixersList::dropMimeData() qba.length() " << qba.length(); if(qba.length()>0) { QMimeData *mimeData = new QMimeData; @@ -47,6 +48,7 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction else mimeData->setData("application/x-companion-mix", qba); + qDebug() << "MixersList::dropMimeData() emit mimeDropped " << index << mimeData << action; emit mimeDropped(index, mimeData, action); } @@ -70,115 +72,63 @@ void MixersList::mousePressEvent(QMouseEvent *event) } -#define QFIXED_MAX (INT_MAX/256) -QRect __textLayoutBounds(const QStyleOptionViewItemV2 &option) -{ - QRect rect = option.rect; - const bool wrapText = option.features & QStyleOptionViewItemV2::WrapText; - switch (option.decorationPosition) { - case QStyleOptionViewItem::Left: - case QStyleOptionViewItem::Right: - rect.setWidth(wrapText && rect.isValid() ? rect.width() : (QFIXED_MAX)); - break; - case QStyleOptionViewItem::Top: - case QStyleOptionViewItem::Bottom: - rect.setWidth(wrapText ? option.decorationSize.width() : (QFIXED_MAX)); - break; - } - - return rect; -} +#define ADDED_SPACE 20 void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - //Q_D(const QItemDelegate); - Q_ASSERT(index.isValid()); - - QStyleOptionViewItemV4 opt = setOptions(index, option); - //qDebug() << "MixersDelegate::paint" << opt.rect; - - const QStyleOptionViewItemV2 *v2 = qstyleoption_cast(&option); - opt.features = v2 ? v2->features - : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None); - const QStyleOptionViewItemV3 *v3 = qstyleoption_cast(&option); - opt.locale = v3 ? v3->locale : QLocale(); - opt.widget = v3 ? v3->widget : 0; - - // prepare - painter->save(); - if (false /*d->clipPainting*/) - painter->setClipRect(opt.rect); - - // get the data and the rectangles - - QVariant value; - - - QString text; - QRect displayRect; - value = index.data(Qt::DisplayRole); - if (value.isValid() && !value.isNull()) { - text = value.toString(); - displayRect = textRectangle(painter, __textLayoutBounds(opt), opt.font, text); - } - - QRect checkRect; - Qt::CheckState checkState = Qt::Unchecked; - value = index.data(Qt::CheckStateRole); - if (value.isValid()) { - checkState = static_cast(value.toInt()); - checkRect = check(opt, opt.rect, value); - } - - // do the layout - QRect dummy; - - - - doLayout(opt, &checkRect, &dummy, &displayRect, false); - - // draw the item - - drawBackground(painter, opt, index); - drawCheck(painter, opt, checkRect, checkState); - //drawDecoration(painter, opt, decorationRect, pixmap); - drawDisplay(painter, opt, displayRect, text); - drawFocus(painter, opt, displayRect); - - // done - painter->restore(); -} - -void MixersDelegate::drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, - const QRect &rect, const QString &text) const -{ + QStyleOptionViewItemV4 options = option; + initStyleOption(&options, index); painter->save(); QTextDocument doc; - doc.setHtml(text); + doc.setHtml(options.text); doc.setDefaultFont(option.font); - painter->translate(rect.left(), rect.top()); - QRect clip(0, 0, rect.width(), rect.height()); - doc.drawContents(painter, clip); + options.text = ""; + options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter); + + if ( index.model()->data(index, Qt::UserRole + 2).toInt() > 0 ) { + //qDebug() << "MixersDelegate::sizeHint() detected channel head"; + painter->translate(options.rect.left(), options.rect.top() + ADDED_SPACE); + QRect clip(0, 0, options.rect.width(), options.rect.height() - ADDED_SPACE); + doc.drawContents(painter, clip); + } + else { + painter->translate(options.rect.left(), options.rect.top()); + QRect clip(0, 0, options.rect.width(), options.rect.height()); + doc.drawContents(painter, clip); + } painter->restore(); + } -// QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const -// { -// QStyleOptionViewItemV4 options = option; -// initStyleOption(&options, index); +QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const +{ + QStyleOptionViewItemV4 options = option; + initStyleOption(&options, index); -// QTextDocument doc; -// doc.setHtml(options.text); -// doc.setDefaultFont(option.font); -// doc.setTextWidth(options.rect.width()); -// return QSize(doc.idealWidth(), doc.size().height()); -// } \ No newline at end of file + QTextDocument doc; + doc.setHtml(options.text); + doc.setDefaultFont(option.font); + doc.setTextWidth(options.rect.width()); + + //qDebug() << "MixersDelegate::sizeHint() UserRole-> " << index.model()->data(index, Qt::UserRole + 2); + + int height = doc.size().height(); + if ( index.model()->data(index, Qt::UserRole + 2).toInt() > 0 ) { + //qDebug() << "MixersDelegate::sizeHint() detected channel head"; + height = doc.size().height() + ADDED_SPACE; + } + + //qDebug() << "MixersDelegate::sizeHint() options.rect " << options.rect; + //qDebug() << "MixersDelegate::sizeHint() result " << QSize(doc.idealWidth(), height); + + return QSize(doc.idealWidth(), height); +} \ No newline at end of file diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslist.h index 87e0c7e58..90cc0a1d9 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslist.h @@ -27,16 +27,14 @@ class MixersList : public QListWidget }; -class MixersDelegate : public QItemDelegate +class MixersDelegate : public QStyledItemDelegate { Q_OBJECT public: - inline MixersDelegate(QObject *parent) : QItemDelegate(parent) {} + inline MixersDelegate(QObject *parent) : QStyledItemDelegate(parent) {} void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; - void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, - const QRect &rect, const QString &text) const ; - //QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; }; diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index 381eb9f48..aa74bc21d 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -106,9 +106,10 @@ bool MixesPanel::AddMixerLine(int dest, const MixData * md) #if MIX_ROW_HEIGHT_INCREASE > 0 if ((new_ch && (dest > 0)) || (dest < 0)) { //increase size of this row - QFontMetrics * fm = new QFontMetrics(itm->font()); - QRect rect = fm->boundingRect("C)"); - itm->setSizeHint(QSize(-1, (rect.height() * (14+MIX_ROW_HEIGHT_INCREASE))/10)); + //QFontMetrics * fm = new QFontMetrics(itm->font()); + //QRect rect = fm->boundingRect("C)"); + //itm->setSizeHint(QSize(-1, (rect.height() * (14+MIX_ROW_HEIGHT_INCREASE))/10)); + itm->setData(Qt::UserRole+2, 1); } #endif MixerlistWidget->addItem(itm); @@ -211,7 +212,7 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) } } } - return str; + return str.replace(" ", " "); } bool MixesPanel::gm_insertMix(int idx) From 0e7b420b71591191e093052b1331c25a97c67255 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 15:40:40 +0200 Subject: [PATCH 3/9] Code cleanup --- companion/src/modeledit/mixerslist.cpp | 85 +++++++++++--------------- companion/src/modeledit/mixerslist.h | 13 ++-- companion/src/modeledit/mixes.cpp | 43 +++---------- companion/src/modeledit/mixes.h | 1 - 4 files changed, 52 insertions(+), 90 deletions(-) diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index a40e4b600..da9292cfe 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -8,9 +8,8 @@ MixersList::MixersList(QWidget *parent, bool expo) : setContextMenuPolicy(Qt::CustomContextMenu); setSelectionMode(QAbstractItemView::SingleSelection); setDragEnabled(true); - //setDragDropMode(QAbstractItemView::InternalMove); - viewport()->setAcceptDrops(true); setDropIndicatorShown(true); + viewport()->setAcceptDrops(true); setItemDelegate(new MixersDelegate(parent)); } @@ -21,34 +20,31 @@ void MixersList::keyPressEvent(QKeyEvent *event) bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction action ) { - qDebug() << "MixersList::dropMimeData() " << index << data->formats(); + // qDebug() << "MixersList::dropMimeData() index:" << index << "formats" << data->formats(); QByteArray dropData = data->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&dropData, QIODevice::ReadOnly); QByteArray qba; - while (!stream.atEnd()) - { + while (!stream.atEnd()) { int r,c; QMap v; stream >> r >> c >> v; QList lsVars; lsVars = v.values(); - QString itemString = lsVars.at(0).toString(); + //QString itemString = lsVars.at(0).toString(); qba.append(lsVars.at(1).toByteArray().mid(1)); - qDebug() << "MixersList::dropMimeData() added data " << lsVars.count() << lsVars; - if(itemString.isEmpty()) {}; + // qDebug() << "MixersList::dropMimeData() added" << lsVars.count() << "items, data:" << lsVars; + + //if(itemString.isEmpty()) {}; } - qDebug() << "MixersList::dropMimeData() qba.length() " << qba.length(); - if(qba.length()>0) - { + if(qba.length()>0) { QMimeData *mimeData = new QMimeData; if (expo) mimeData->setData("application/x-companion-expo", qba); else mimeData->setData("application/x-companion-mix", qba); - qDebug() << "MixersList::dropMimeData() emit mimeDropped " << index << mimeData << action; emit mimeDropped(index, mimeData, action); } @@ -56,45 +52,26 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction return true; } - -void MixersList::mousePressEvent(QMouseEvent *event) -{ - qDebug() << "MixersList::mousePressEvent" ; - QListWidgetItem *item = currentItem(); - if (item) { - qDebug() << "MixersList::mousePressEvent" << item->text(); - } - if (event->button() == Qt::LeftButton) - { - //startPos = event->pos(); - } - QListWidget::mousePressEvent(event); - -} - - -#define ADDED_SPACE 20 - -void MixersDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const +void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { + //Custom paint handler + //we paint HTML formated text inside list item QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); painter->save(); + //setup html document QTextDocument doc; - doc.setHtml(options.text); - doc.setDefaultFont(option.font); + SetupDocument(doc, options); options.text = ""; options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter); - if ( index.model()->data(index, Qt::UserRole + 2).toInt() > 0 ) { - //qDebug() << "MixersDelegate::sizeHint() detected channel head"; - painter->translate(options.rect.left(), options.rect.top() + ADDED_SPACE); - QRect clip(0, 0, options.rect.width(), options.rect.height() - ADDED_SPACE); + if ( index.model()->data(index, GroupHeaderRole).toInt() > 0 ) { + //paint with added space + painter->translate(options.rect.left(), options.rect.top() + MIX_ROW_HEIGHT_INCREASE); + QRect clip(0, 0, options.rect.width(), options.rect.height() - MIX_ROW_HEIGHT_INCREASE); doc.drawContents(painter, clip); } else { @@ -102,33 +79,43 @@ void MixersDelegate::paint(QPainter *painter, QRect clip(0, 0, options.rect.width(), options.rect.height()); doc.drawContents(painter, clip); } - painter->restore(); - } QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { + //custom size handler + //returns needed size for each HTML formated list item QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); + //setup html document QTextDocument doc; - doc.setHtml(options.text); - doc.setDefaultFont(option.font); - doc.setTextWidth(options.rect.width()); + SetupDocument(doc, options); //qDebug() << "MixersDelegate::sizeHint() UserRole-> " << index.model()->data(index, Qt::UserRole + 2); - int height = doc.size().height(); if ( index.model()->data(index, Qt::UserRole + 2).toInt() > 0 ) { //qDebug() << "MixersDelegate::sizeHint() detected channel head"; - height = doc.size().height() + ADDED_SPACE; + height = doc.size().height() + MIX_ROW_HEIGHT_INCREASE; } - //qDebug() << "MixersDelegate::sizeHint() options.rect " << options.rect; //qDebug() << "MixersDelegate::sizeHint() result " << QSize(doc.idealWidth(), height); - return QSize(doc.idealWidth(), height); +} + +void MixersDelegate::SetupDocument(QTextDocument & doc, const QStyleOptionViewItemV4 & options) const +{ + //setup html document + doc.setHtml(options.text); + doc.setDefaultFont(options.font); + doc.setTextWidth(options.rect.width()); + + //minimize margins (default margins look ugly) + QTextFrame *tf = doc.rootFrame(); + QTextFrameFormat tff = tf->frameFormat(); + tff.setMargin(0); + tf->setFrameFormat(tff); } \ No newline at end of file diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslist.h index 90cc0a1d9..ee5f9a9ba 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslist.h @@ -3,6 +3,10 @@ #include + +#define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled +const int GroupHeaderRole = (Qt::UserRole+2); //defines new user role for list items. If value is > 0, then space is added before that item + class MixersList : public QListWidget { Q_OBJECT @@ -22,21 +26,20 @@ class MixersList : public QListWidget QPoint dragStartPosition; bool expo; - protected: - void mousePressEvent(QMouseEvent *event); - }; class MixersDelegate : public QStyledItemDelegate { Q_OBJECT public: - inline MixersDelegate(QObject *parent) : QStyledItemDelegate(parent) {} + inline MixersDelegate(QObject *parent) : QStyledItemDelegate(parent) {}; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + private: + void SetupDocument(QTextDocument & doc, const QStyleOptionViewItemV4 & options) const; + }; - #endif // MIXERSLIST_H diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index aa74bc21d..eeb2564a4 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -90,55 +90,30 @@ void MixesPanel::update() } } -#define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled - bool MixesPanel::AddMixerLine(int dest, const MixData * md) { bool new_ch; QString str = getMixerText(dest, &new_ch); QListWidgetItem *itm = new QListWidgetItem(); QByteArray qba(1, (quint8)dest); - if (md) { - qba.append((const char*)md, sizeof(MixData)); - //qDebug() << "appended mixdata for dest: " << dest; - } + if (md) qba.append((const char*)md, sizeof(MixData)); itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 if ((new_ch && (dest > 0)) || (dest < 0)) { //increase size of this row - //QFontMetrics * fm = new QFontMetrics(itm->font()); - //QRect rect = fm->boundingRect("C)"); - //itm->setSizeHint(QSize(-1, (rect.height() * (14+MIX_ROW_HEIGHT_INCREASE))/10)); - itm->setData(Qt::UserRole+2, 1); + itm->setData(GroupHeaderRole, 1); } #endif MixerlistWidget->addItem(itm); itm->setText(str); - // if ((new_ch && (dest > 0)) || (dest < 0)) { - // MixerlistWidget->setItemWidget(itm, getMixerWidget(str)); - // } //qDebug() << "MixesPanel::AddMixerLine(): " << str; return new_ch; } -QWidget * MixesPanel::getMixerWidget(const QString & mixer_text) -{ - QLabel * l = new QLabel(); - l->setFont(QFont("Courier New",12)); - l->setTextFormat(Qt::RichText); - l->setAlignment(Qt::AlignBottom); - QString formated_str(mixer_text); - formated_str.replace(" ", " "); - l->setText(formated_str); - l->setAcceptDrops(true); - //l->setAutoFillBackground(true); - return l; -} - QString MixesPanel::getMixerText(int dest, bool * new_ch) { QString str; - *new_ch = 0; + if (new_ch) *new_ch = 0; if (dest < 0) { str = getChannelLabel(-dest); //highlight channell if needed @@ -152,12 +127,12 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) str = getChannelLabel(md->destCh); if ((dest == 0) || (model.mixData[dest-1].destCh != md->destCh)) { - *new_ch = 1; + if (new_ch) *new_ch = 1; //highlight channell if needed if (md->destCh == highlightedSource) { str = "" + str + ""; } - } + } else { str.fill(' '); } @@ -358,7 +333,7 @@ void MixesPanel::mixersCopy() void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) { - qDebug() << "void MixesPanel::pasteMixerMimeData" << mimeData->formats(); + //qDebug() << "void MixesPanel::pasteMixerMimeData" << mimeData->formats(); if(mimeData->hasFormat("application/x-companion-mix")) { int idx; // mixer index int dch; @@ -438,9 +413,7 @@ void MixesPanel::mixerHighlight() // qDebug() << "MixesPanel::mixerHighlight(): " << highlightedSource ; for(int i=0; icount(); i++) { int t = MixerlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); - bool dummy; - //QWidget *w = getMixerWidget(); - MixerlistWidget->item(i)->setText(getMixerText(t, &dummy)); + MixerlistWidget->item(i)->setText(getMixerText(t, 0)); } } @@ -495,7 +468,7 @@ void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/) { int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); - qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; + //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; pasteMixerMimeData(data, idx); } diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index c1f54e601..dcf3e8052 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -55,7 +55,6 @@ class MixesPanel : public ModelPanel QString getChannelLabel(int curDest); bool AddMixerLine(int dest, const MixData * md = 0); QString getMixerText(int dest, bool * new_ch); - QWidget * getMixerWidget(const QString & mixer_text); }; #endif // MIXES_H From a8c828f105f51225c40c8fa58b08db8f37053cb8 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 18:27:28 +0200 Subject: [PATCH 4/9] Corrected list items width (long items were wrapping) Refactored inputs tab, same system as mixes tab (grouping of lines) Fixed incorrect spacing for first list item --- companion/src/modeledit/inputs.cpp | 79 +++++++++++++++++--------- companion/src/modeledit/inputs.h | 3 + companion/src/modeledit/mixerslist.cpp | 3 +- companion/src/modeledit/mixes.cpp | 24 +++++--- companion/src/modeledit/mixes.h | 1 + 5 files changed, 72 insertions(+), 38 deletions(-) diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index a3cece6c1..1d05a96d9 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -55,6 +55,7 @@ void InputsPanel::update() // i -> mixer number QByteArray qba; ExposlistWidget->clear(); + firstLine = true; int curDest = -1; for (int i=0; ichn-1) { curDest++; - str = getInputStr(model, curDest); - qba.clear(); - qba.append((quint8)-curDest-1); - QListWidgetItem *itm = new QListWidgetItem(str); - itm->setData(Qt::UserRole,qba); - ExposlistWidget->addItem(itm); + AddInputLine(-curDest-1); + } + if (AddInputLine(i, md)) { + curDest++; } - if (curDest!=(int)md->chn) { + } + + while (curDestsetData(Qt::UserRole, qba); +#if MIX_ROW_HEIGHT_INCREASE > 0 + if (new_ch && !firstLine) { + //increase size of this row + itm->setData(GroupHeaderRole, 1); + } +#endif + ExposlistWidget->addItem(itm); + firstLine = false; + //qDebug() << "InputsPanel::AddInputLine(): dest" << dest << "text" << str; + return new_ch; +} + + +QString InputsPanel::getInputText(int dest, bool * new_ch) +{ + QString str; + if (new_ch) *new_ch = 0; + if (dest < 0) { + str = getInputStr(model, -dest-1); + if (new_ch) *new_ch = 1; + } + else { + ExpoData *md = &model.expoData[dest]; + + if ((dest == 0) || (model.expoData[dest-1].chn != md->chn)) { + if (new_ch) *new_ch = 1; if (firmware->getCapability(VirtualInputs)) str = QString("%1").arg(getInputStr(model, md->chn), -8, ' '); else str = getInputStr(model, md->chn); - curDest = md->chn; } else { if (firmware->getCapability(VirtualInputs)) @@ -117,29 +159,10 @@ void InputsPanel::update() QString expoName = md->name; if (!expoName.isEmpty()) str += QString(" [%1]").arg(expoName); } - - qba.clear(); - qba.append((quint8)i); - qba.append((const char*)md, sizeof(ExpoData)); - QListWidgetItem *itm = new QListWidgetItem(str); - itm->setData(Qt::UserRole,qba); // expo number - ExposlistWidget->addItem(itm); //(str); } - - while (curDestsetData(Qt::UserRole,qba); // add new expo - ExposlistWidget->addItem(itm); - } - - lock = false; + return Qt::escape(str).replace(" ", " "); } - bool InputsPanel::gm_insertExpo(int idx) { if (idx<0 || idx>=C9X_MAX_EXPOS || model.expoData[C9X_MAX_EXPOS-1].mode > 0) { diff --git a/companion/src/modeledit/inputs.h b/companion/src/modeledit/inputs.h index 393901b2c..00ff4273a 100644 --- a/companion/src/modeledit/inputs.h +++ b/companion/src/modeledit/inputs.h @@ -33,6 +33,7 @@ class InputsPanel : public ModelPanel private: bool expoInserted; MixersList *ExposlistWidget; + bool firstLine; int getExpoIndex(unsigned int dch); bool gm_insertExpo(int idx); @@ -43,6 +44,8 @@ class InputsPanel : public ModelPanel QList createExpoListFromSelected(); void setSelectedByExpoList(QList list); void pasteExpoMimeData(const QMimeData * mimeData, int destIdx); + bool AddInputLine(int dest, const ExpoData * md = 0); + QString getInputText(int dest, bool * new_ch); }; diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index da9292cfe..8da5028b5 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -102,7 +102,7 @@ QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QMod height = doc.size().height() + MIX_ROW_HEIGHT_INCREASE; } //qDebug() << "MixersDelegate::sizeHint() options.rect " << options.rect; - //qDebug() << "MixersDelegate::sizeHint() result " << QSize(doc.idealWidth(), height); + //qDebug() << "MixersDelegate::sizeHint() result " << QSize(doc.idealWidth(), height) << options.rect.width(); return QSize(doc.idealWidth(), height); } @@ -111,7 +111,6 @@ void MixersDelegate::SetupDocument(QTextDocument & doc, const QStyleOptionViewIt //setup html document doc.setHtml(options.text); doc.setDefaultFont(options.font); - doc.setTextWidth(options.rect.width()); //minimize margins (default margins look ugly) QTextFrame *tf = doc.rootFrame(); diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index eeb2564a4..fe69d3db0 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -57,7 +57,7 @@ QString MixesPanel::getChannelLabel(int curDest) name.append(" "); str += name.left(8); } - return str; + return Qt::escape(str); } void MixesPanel::update() @@ -66,6 +66,7 @@ void MixesPanel::update() // i -> mixer number QByteArray qba; MixerlistWidget->clear(); + firstLine = true; unsigned int curDest = 0; int i; unsigned int outputs = firmware->getCapability(Outputs); @@ -73,7 +74,10 @@ void MixesPanel::update() for (i=0; igetCapability(Mixes); i++) { MixData *md = &model.mixData[i]; // qDebug() << "md->destCh: " << md->destCh; - if (md->destCh==0 || md->destCh>outputs) continue; + if (md->destCh==0 || md->destCh>outputs) { + qDebug() << "WARNING: possible mixer corrupiton at i" << i << "destCh" << md->destCh; + continue; + } QString str = ""; while (curDest < md->destCh-1) { curDest++; @@ -94,19 +98,20 @@ bool MixesPanel::AddMixerLine(int dest, const MixData * md) { bool new_ch; QString str = getMixerText(dest, &new_ch); - QListWidgetItem *itm = new QListWidgetItem(); + QListWidgetItem *itm = new QListWidgetItem(str); QByteArray qba(1, (quint8)dest); if (md) qba.append((const char*)md, sizeof(MixData)); itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 - if ((new_ch && (dest > 0)) || (dest < 0)) { + //if ((new_ch && (dest > 0)) || (dest < -1)) { + if (new_ch && ! firstLine ) { //increase size of this row itm->setData(GroupHeaderRole, 1); } #endif MixerlistWidget->addItem(itm); - itm->setText(str); - //qDebug() << "MixesPanel::AddMixerLine(): " << str; + firstLine = false; + // qDebug() << "MixesPanel::AddMixerLine(): dest" << dest << "text" << str; return new_ch; } @@ -120,6 +125,7 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) if (-dest == (int)highlightedSource) { str = "" + str + ""; } + if (new_ch) *new_ch = 1; } else { MixData *md = &model.mixData[dest]; @@ -333,7 +339,7 @@ void MixesPanel::mixersCopy() void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) { - //qDebug() << "void MixesPanel::pasteMixerMimeData" << mimeData->formats(); + qDebug() << "void MixesPanel::pasteMixerMimeData" << destIdx; if(mimeData->hasFormat("application/x-companion-mix")) { int idx; // mixer index int dch; @@ -346,6 +352,7 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) dch = model.mixData[idx].destCh; } + qDebug() << "void MixesPanel::pasteMixerMimeData() dch" << dch; QByteArray mxData = mimeData->data("application/x-companion-mix"); int i = 0; @@ -358,6 +365,7 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) MixData *md = &model.mixData[idx]; memcpy(md,mxData.mid(i,sizeof(MixData)).constData(),sizeof(MixData)); md->destCh = dch; + qDebug() << "void MixesPanel::pasteMixerMimeData() dch1" << dch; i += sizeof(MixData); } @@ -468,7 +476,7 @@ void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/) { int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); - //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; + qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; pasteMixerMimeData(data, idx); } diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index dcf3e8052..09876bb5f 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -43,6 +43,7 @@ class MixesPanel : public ModelPanel MixersList *MixerlistWidget; bool mixInserted; unsigned int highlightedSource; + bool firstLine; int getMixerIndex(unsigned int dch); bool gm_insertMix(int idx); From b70586bd9f86388602e79b633dd1ee009c495fc8 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 18:31:54 +0200 Subject: [PATCH 5/9] Reverted to original code (both work) --- companion/src/modeledit/mixerslist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index 8da5028b5..0b473a5b4 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -8,8 +8,8 @@ MixersList::MixersList(QWidget *parent, bool expo) : setContextMenuPolicy(Qt::CustomContextMenu); setSelectionMode(QAbstractItemView::SingleSelection); setDragEnabled(true); + setAcceptDrops(true); setDropIndicatorShown(true); - viewport()->setAcceptDrops(true); setItemDelegate(new MixersDelegate(parent)); } From 65521d96d426c848da79e1f322cc25d4621a1e40 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 19:06:55 +0200 Subject: [PATCH 6/9] Code refactoring Added documentation --- companion/src/modeledit/inputs.cpp | 31 +++++++++++++++++-- companion/src/modeledit/inputs.h | 2 +- companion/src/modeledit/mixerslist.cpp | 15 ++++----- companion/src/modeledit/mixerslist.h | 7 ++++- companion/src/modeledit/mixes.cpp | 43 +++++++++++++++++++------- companion/src/modeledit/mixes.h | 2 +- 6 files changed, 75 insertions(+), 25 deletions(-) diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index 1d05a96d9..3852264c7 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -69,7 +69,7 @@ void InputsPanel::update() curDest++; AddInputLine(-curDest-1); } - if (AddInputLine(i, md)) { + if (AddInputLine(i)) { curDest++; } @@ -84,13 +84,29 @@ void InputsPanel::update() } -bool InputsPanel::AddInputLine(int dest, const ExpoData * md) +/** + @brief Creates new input line (list item) and adds it to the list widget + + @note Input lines are now HTML formated because they use same widget as mixers. + + @param[in] dest defines which input line to create. + If dest < 0 then create empty input slot for input -dest ( dest=-6 -> Input05) + if dest >=0 then create used input based on model input data from slot dest (dest=4 -> model expoData[4]) + + @retval true created input number is different from the previous list item + false created input number is the same as previous list item +*/ +bool InputsPanel::AddInputLine(int dest) { bool new_ch; QString str = getInputText(dest, &new_ch); QListWidgetItem *itm = new QListWidgetItem(str); QByteArray qba(1, (quint8)dest); - if (md) qba.append((const char*)md, sizeof(ExpoData)); + if (dest >= 0) { + //add input data + ExpoData *md = &model.expoData[dest]; + qba.append((const char*)md, sizeof(ExpoData)); + } itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 if (new_ch && !firstLine) { @@ -105,6 +121,15 @@ bool InputsPanel::AddInputLine(int dest, const ExpoData * md) } +/** + @brief Returns HTML formated input representation + + @param[in] dest defines which input line to create. + If dest < 0 then create empty input slot for input -dest ( dest=-6 -> Input05) + if dest >=0 then create used input based on model input data from slot dest (dest=4 -> model expoData[4]) + + @retval string input line in HTML +*/ QString InputsPanel::getInputText(int dest, bool * new_ch) { QString str; diff --git a/companion/src/modeledit/inputs.h b/companion/src/modeledit/inputs.h index 00ff4273a..83db760a6 100644 --- a/companion/src/modeledit/inputs.h +++ b/companion/src/modeledit/inputs.h @@ -44,7 +44,7 @@ class InputsPanel : public ModelPanel QList createExpoListFromSelected(); void setSelectedByExpoList(QList list); void pasteExpoMimeData(const QMimeData * mimeData, int destIdx); - bool AddInputLine(int dest, const ExpoData * md = 0); + bool AddInputLine(int dest); QString getInputText(int dest, bool * new_ch); }; diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index 0b473a5b4..447570b3c 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -10,7 +10,7 @@ MixersList::MixersList(QWidget *parent, bool expo) : setDragEnabled(true); setAcceptDrops(true); setDropIndicatorShown(true); - setItemDelegate(new MixersDelegate(parent)); + setItemDelegate(new MixersDelegate(parent)); //set custom paint handler } void MixersList::keyPressEvent(QKeyEvent *event) @@ -52,10 +52,11 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction return true; } +/** + @brief Paints our HTML formated list item text +*/ void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - //Custom paint handler - //we paint HTML formated text inside list item QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); @@ -83,11 +84,11 @@ void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option } - +/** + @brief Returns needed size for our HTML formated list item text +*/ QSize MixersDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { - //custom size handler - //returns needed size for each HTML formated list item QStyleOptionViewItemV4 options = option; initStyleOption(&options, index); @@ -117,4 +118,4 @@ void MixersDelegate::SetupDocument(QTextDocument & doc, const QStyleOptionViewIt QTextFrameFormat tff = tf->frameFormat(); tff.setMargin(0); tf->setFrameFormat(tff); -} \ No newline at end of file +} diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslist.h index ee5f9a9ba..991b186df 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslist.h @@ -4,7 +4,7 @@ #include -#define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled +#define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled const int GroupHeaderRole = (Qt::UserRole+2); //defines new user role for list items. If value is > 0, then space is added before that item class MixersList : public QListWidget @@ -28,6 +28,11 @@ class MixersList : public QListWidget }; +/** + @brief Provides sizing and painting of items for our mixes and inputs lists + + This class draws HTML formated strings into QListWidget class +*/ class MixersDelegate : public QStyledItemDelegate { Q_OBJECT diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index fe69d3db0..b9237b5c6 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -62,7 +62,7 @@ QString MixesPanel::getChannelLabel(int curDest) void MixesPanel::update() { - // curDest -> destination channel4 + // curDest -> destination channel // i -> mixer number QByteArray qba; MixerlistWidget->clear(); @@ -74,16 +74,13 @@ void MixesPanel::update() for (i=0; igetCapability(Mixes); i++) { MixData *md = &model.mixData[i]; // qDebug() << "md->destCh: " << md->destCh; - if (md->destCh==0 || md->destCh>outputs) { - qDebug() << "WARNING: possible mixer corrupiton at i" << i << "destCh" << md->destCh; - continue; - } + if (md->destCh==0 || md->destCh>outputs) continue; QString str = ""; while (curDest < md->destCh-1) { curDest++; AddMixerLine(-curDest); } - if (AddMixerLine(i, md)) { + if (AddMixerLine(i)) { curDest++; } } @@ -94,13 +91,29 @@ void MixesPanel::update() } } -bool MixesPanel::AddMixerLine(int dest, const MixData * md) +/** + @brief Creates new mixer line (list item) and adds it to the list widget + + @note Mixer lines are now HTML formated in order to support bold text. + + @param[in] dest defines which mixer line to create. + If dest < 0 then create empty channel slotr fo channel -dest ( dest=-2 -> CH2) + if dest >=0 then create used channel based on model mix data from slot dest (dest=4 -> model mix[4]) + + @retval true destination channel is different from the previous list item + false destination channle is the same as previous list item +*/ +bool MixesPanel::AddMixerLine(int dest) { bool new_ch; QString str = getMixerText(dest, &new_ch); QListWidgetItem *itm = new QListWidgetItem(str); QByteArray qba(1, (quint8)dest); - if (md) qba.append((const char*)md, sizeof(MixData)); + if (dest >= 0) { + //add mix data + MixData *md = &model.mixData[dest]; + qba.append((const char*)md, sizeof(MixData)); + } itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 //if ((new_ch && (dest > 0)) || (dest < -1)) { @@ -115,6 +128,15 @@ bool MixesPanel::AddMixerLine(int dest, const MixData * md) return new_ch; } +/** + @brief Returns HTML formated mixer representation + + @param[in] dest defines which mixer line to create. + If dest < 0 then create empty channel slot for channel -dest ( dest=-2 -> CH2) + if dest >=0 then create used channel based on model mix data from slot dest (dest=4 -> model mix[4]) + + @retval string mixer line in HTML +*/ QString MixesPanel::getMixerText(int dest, bool * new_ch) { QString str; @@ -339,7 +361,6 @@ void MixesPanel::mixersCopy() void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) { - qDebug() << "void MixesPanel::pasteMixerMimeData" << destIdx; if(mimeData->hasFormat("application/x-companion-mix")) { int idx; // mixer index int dch; @@ -352,7 +373,6 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) dch = model.mixData[idx].destCh; } - qDebug() << "void MixesPanel::pasteMixerMimeData() dch" << dch; QByteArray mxData = mimeData->data("application/x-companion-mix"); int i = 0; @@ -365,7 +385,6 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) MixData *md = &model.mixData[idx]; memcpy(md,mxData.mid(i,sizeof(MixData)).constData(),sizeof(MixData)); md->destCh = dch; - qDebug() << "void MixesPanel::pasteMixerMimeData() dch1" << dch; i += sizeof(MixData); } @@ -476,7 +495,7 @@ void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/) { int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); - qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; + //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; pasteMixerMimeData(data, idx); } diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index 09876bb5f..eae80ca98 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -54,7 +54,7 @@ class MixesPanel : public ModelPanel QList createMixListFromSelected(); void setSelectedByMixList(QList list); QString getChannelLabel(int curDest); - bool AddMixerLine(int dest, const MixData * md = 0); + bool AddMixerLine(int dest); QString getMixerText(int dest, bool * new_ch); }; From fc92ad3a869d432b1df09b65e3f9bdfd18ed1e28 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 21:29:08 +0200 Subject: [PATCH 7/9] Prevent drag&drop between inputs and mixers --- companion/src/modeledit/mixerslist.cpp | 26 ++++++++++++++++---------- companion/src/modeledit/mixerslist.h | 3 +++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslist.cpp index 447570b3c..f1a368a03 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslist.cpp @@ -18,10 +18,23 @@ void MixersList::keyPressEvent(QKeyEvent *event) emit keyWasPressed(event); } + +/** + @brief Override to give us different mime type for mixers and inputs +*/ +QStringList MixersList::mimeTypes () const +{ + QStringList types; + if (expo) types << "application/x-companion-expo-item"; + else types << "application/x-companion-mix-item"; + return types; +} + bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction action ) { // qDebug() << "MixersList::dropMimeData() index:" << index << "formats" << data->formats(); - QByteArray dropData = data->data("application/x-qabstractitemmodeldatalist"); + QByteArray dropData = data->data(expo ? "application/x-companion-expo-item" : "application/x-companion-mix-item"); + if (dropData.isNull() ) return false; QDataStream stream(&dropData, QIODevice::ReadOnly); QByteArray qba; @@ -31,24 +44,17 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction stream >> r >> c >> v; QList lsVars; lsVars = v.values(); - //QString itemString = lsVars.at(0).toString(); qba.append(lsVars.at(1).toByteArray().mid(1)); // qDebug() << "MixersList::dropMimeData() added" << lsVars.count() << "items, data:" << lsVars; - - //if(itemString.isEmpty()) {}; } if(qba.length()>0) { QMimeData *mimeData = new QMimeData; - if (expo) - mimeData->setData("application/x-companion-expo", qba); - else - mimeData->setData("application/x-companion-mix", qba); - + mimeData->setData(expo ? "application/x-companion-expo" : "application/x-companion-mix", qba); emit mimeDropped(index, mimeData, action); + delete mimeData; //is this correct? is mimeData freed elswere?? } - return true; } diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslist.h index 991b186df..a0cc9f0c7 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslist.h @@ -22,6 +22,9 @@ class MixersList : public QListWidget public slots: bool dropMimeData(int index, const QMimeData *data, Qt::DropAction action); + protected: + virtual QStringList mimeTypes() const; + private: QPoint dragStartPosition; bool expo; From 27600ba37e84958a5059d4d29afc2755ec23d092 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Apr 2014 22:12:55 +0200 Subject: [PATCH 8/9] Cosmetic changes --- companion/src/modeledit/mixes.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index b9237b5c6..98ee29595 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -116,8 +116,7 @@ bool MixesPanel::AddMixerLine(int dest) } itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 - //if ((new_ch && (dest > 0)) || (dest < -1)) { - if (new_ch && ! firstLine ) { + if (new_ch && !firstLine) { //increase size of this row itm->setData(GroupHeaderRole, 1); } From a6ad130df77c5c1d952a86a3f3ae5c80b33fea1f Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Mon, 21 Apr 2014 12:22:25 +0200 Subject: [PATCH 9/9] Reverted commit 8c5fc3a01fa611033207fe11df875d3c894334a8 (which prevented moving second mixer to the first line) --- companion/src/modeledit/mixes.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index 98ee29595..56bf98c47 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -522,14 +522,11 @@ void MixesPanel::mixerlistWidget_KeyPress(QKeyEvent *event) int MixesPanel::gm_moveMix(int idx, bool dir) //true=inc=down false=dec=up { - if(idx>firmware->getCapability(Mixes) || (idx==firmware->getCapability(Mixes) && dir)) return idx; + if(idx>firmware->getCapability(Mixes) || (idx==0 && !dir) || (idx==firmware->getCapability(Mixes) && dir)) return idx; int tdx = dir ? idx+1 : idx-1; MixData &src=model.mixData[idx]; MixData &tgt=model.mixData[tdx]; - - if (src.destCh == 1 && !dir) - return idx; unsigned int outputs = firmware->getCapability(Outputs); if((src.destCh==0) || (src.destCh>outputs) || (tgt.destCh>outputs)) return idx;