X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectstack%2Fcollapsiblegroup.cpp;h=cd5a439fbd6e4fcf8dd3c2261a99ee8691863b14;hb=fabec436114bfe0a226453fc2c5ad2eb85cb54a0;hp=7f89038f89503ba310603da0034bdef02b516da3;hpb=ce68de86827a11cd0dc96465fba021b2f7ceea55;p=kdenlive diff --git a/src/effectstack/collapsiblegroup.cpp b/src/effectstack/collapsiblegroup.cpp index 7f89038f..cd5a439f 100644 --- a/src/effectstack/collapsiblegroup.cpp +++ b/src/effectstack/collapsiblegroup.cpp @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include #include @@ -42,7 +42,7 @@ MyEditableLabel::MyEditableLabel(QWidget * parent): { setFrame(false); setReadOnly(true); - setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); } void MyEditableLabel::mouseDoubleClickEvent ( QMouseEvent * e ) @@ -53,17 +53,19 @@ void MyEditableLabel::mouseDoubleClickEvent ( QMouseEvent * e ) } -CollapsibleGroup::CollapsibleGroup(int ix, bool firstGroup, bool lastGroup, QString groupName, QWidget * parent) : - AbstractCollapsibleWidget(parent), - m_index(ix) +CollapsibleGroup::CollapsibleGroup(int ix, bool firstGroup, bool lastGroup, const EffectInfo &info, QWidget * parent) : + AbstractCollapsibleWidget(parent) { - setupUi(this); + m_info.groupIndex = ix; m_subWidgets = QList (); setFont(KGlobalSettings::smallestReadableFont()); - QHBoxLayout *l = static_cast (framegroup->layout()); + frame->setObjectName("framegroup"); + decoframe->setObjectName("decoframegroup"); + QHBoxLayout *l = static_cast (frame->layout()); m_title = new MyEditableLabel(this); - l->insertWidget(3, m_title); - m_title->setText(groupName.isEmpty() ? i18n("Effect Group") : groupName); + l->insertWidget(2, m_title); + m_title->setText(info.groupName.isEmpty() ? i18n("Effect Group") : info.groupName); + m_info.groupName = m_title->text(); connect(m_title, SIGNAL(editingFinished()), this, SLOT(slotRenameGroup())); buttonUp->setIcon(KIcon("kdenlive-up")); buttonUp->setToolTip(i18n("Move effect up")); @@ -85,6 +87,10 @@ CollapsibleGroup::CollapsibleGroup(int ix, bool firstGroup, bool lastGroup, QStr enabledButton->setChecked(false); enabledButton->setIcon(KIcon("visible")); + + if (info.groupIsCollapsed) { + slotShow(false); + } connect(collapseButton, SIGNAL(clicked()), this, SLOT(slotSwitch())); connect(enabledButton, SIGNAL(toggled(bool)), this, SLOT(slotEnable(bool))); @@ -106,31 +112,31 @@ void CollapsibleGroup::slotUnGroup() bool CollapsibleGroup::isActive() const { - return decoframegroup->property("active").toBool(); + return decoframe->property("active").toBool(); } void CollapsibleGroup::setActive(bool activate) { - decoframegroup->setProperty("active", activate); - decoframegroup->setStyleSheet(decoframegroup->styleSheet()); + decoframe->setProperty("active", activate); + decoframe->setStyleSheet(decoframe->styleSheet()); } void CollapsibleGroup::mouseDoubleClickEvent ( QMouseEvent * event ) { - if (framegroup->underMouse() && collapseButton->isEnabled()) slotSwitch(); + if (frame->underMouse() && collapseButton->isEnabled()) slotSwitch(); QWidget::mouseDoubleClickEvent(event); } -void CollapsibleGroup::slotEnable(bool disable) +void CollapsibleGroup::slotEnable(bool disable, bool emitInfo) { m_title->setEnabled(!disable); enabledButton->blockSignals(true); enabledButton->setChecked(disable); enabledButton->setIcon(disable ? KIcon("novisible") : KIcon("visible")); enabledButton->blockSignals(false); - for (int i = 0; i < m_subWidgets.count(); i++) - m_subWidgets.at(i)->slotEnable(disable); + for (int i = 0; i < m_subWidgets.count(); ++i) + m_subWidgets.at(i)->slotDisable(disable, emitInfo); } void CollapsibleGroup::slotDeleteGroup() @@ -138,19 +144,25 @@ void CollapsibleGroup::slotDeleteGroup() QDomDocument doc; // delete effects from the last one to the first, otherwise each deletion would trigger an update // in other effects's kdenlive_ix index. - for (int i = m_subWidgets.count() - 1; i >= 0; i--) + for (int i = m_subWidgets.count() - 1; i >= 0; --i) doc.appendChild(doc.importNode(m_subWidgets.at(i)->effect(), true)); emit deleteGroup(doc); } void CollapsibleGroup::slotEffectUp() { - emit changeGroupPosition(groupIndex(), true); + QList indexes; + for (int i = 0; i < m_subWidgets.count(); ++i) + indexes << m_subWidgets.at(i)->effectIndex(); + emit changeEffectPosition(indexes, true); } void CollapsibleGroup::slotEffectDown() { - emit changeGroupPosition(groupIndex(), false); + QList indexes; + for (int i = 0; i < m_subWidgets.count(); ++i) + indexes << m_subWidgets.at(i)->effectIndex(); + emit changeEffectPosition(indexes, false); } void CollapsibleGroup::slotSaveGroup() @@ -164,7 +176,7 @@ void CollapsibleGroup::slotSaveGroup() QDomDocument doc = effectsData(); QDomElement base = doc.documentElement(); QDomNodeList effects = base.elementsByTagName("effect"); - for (int i = 0; i < effects.count(); i++) { + for (int i = 0; i < effects.count(); ++i) { QDomElement eff = effects.at(i).toElement(); eff.removeAttribute("kdenlive_ix"); EffectInfo info; @@ -193,7 +205,7 @@ void CollapsibleGroup::slotSaveGroup() void CollapsibleGroup::slotResetGroup() { QMutexLocker lock(&m_mutex); - for (int i = 0; i < m_subWidgets.count(); i++) + for (int i = 0; i < m_subWidgets.count(); ++i) m_subWidgets.at(i)->slotResetEffect(); } @@ -208,13 +220,13 @@ void CollapsibleGroup::slotShow(bool show) widgetFrame->setVisible(show); if (show) { collapseButton->setArrowType(Qt::DownArrow); - m_info.isCollapsed = false; + m_info.groupIsCollapsed = false; } else { collapseButton->setArrowType(Qt::RightArrow); - m_info.isCollapsed = true; + m_info.groupIsCollapsed = true; } - //emit parameterChanged(m_original_effect, m_effect, effectIndex()); + if (!m_subWidgets.isEmpty()) m_subWidgets.at(0)->groupStateChanged(m_info.groupIsCollapsed); } QWidget *CollapsibleGroup::title() const @@ -249,7 +261,7 @@ void CollapsibleGroup::removeGroup(int ix, QVBoxLayout *layout) QMutexLocker lock(&m_mutex); QVBoxLayout *vbox = static_cast(widgetFrame->layout()); if (vbox == NULL) return; - for (int i = m_subWidgets.count() - 1; i >= 0 ; i--) { + for (int i = m_subWidgets.count() - 1; i >= 0 ; --i) { vbox->removeWidget(m_subWidgets.at(i)); layout->insertWidget(ix, m_subWidgets.at(i)); m_subWidgets.at(i)->decoframe->setObjectName("decoframe"); @@ -260,7 +272,7 @@ void CollapsibleGroup::removeGroup(int ix, QVBoxLayout *layout) int CollapsibleGroup::groupIndex() const { - return m_index; + return m_info.groupIndex; } bool CollapsibleGroup::isGroup() const @@ -281,39 +293,82 @@ void CollapsibleGroup::updateTimecodeFormat() void CollapsibleGroup::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("kdenlive/effectslist")) { - framegroup->setProperty("target", true); - framegroup->setStyleSheet(framegroup->styleSheet()); + frame->setProperty("target", true); + frame->setStyleSheet(frame->styleSheet()); event->acceptProposedAction(); } } void CollapsibleGroup::dragLeaveEvent(QDragLeaveEvent */*event*/) { - framegroup->setProperty("target", false); - framegroup->setStyleSheet(framegroup->styleSheet()); + frame->setProperty("target", false); + frame->setStyleSheet(frame->styleSheet()); } void CollapsibleGroup::dropEvent(QDropEvent *event) { - framegroup->setProperty("target", false); - framegroup->setStyleSheet(framegroup->styleSheet()); + frame->setProperty("target", false); + frame->setStyleSheet(frame->styleSheet()); const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist")); //event->acceptProposedAction(); QDomDocument doc; doc.setContent(effects, true); QDomElement e = doc.documentElement(); int ix = e.attribute("kdenlive_ix").toInt(); - if (ix == 0) { + if (ix == 0 || e.tagName() == "effectgroup") { + if (e.tagName() == "effectgroup") { + // dropped a group on another group + QDomNodeList pastedEffects = e.elementsByTagName("effect"); + if (pastedEffects.isEmpty() || m_subWidgets.isEmpty()) { + // Buggy groups, should not happen + event->ignore(); + return; + } + QList pastedEffectIndexes; + QList currentEffectIndexes; + EffectInfo pasteInfo; + pasteInfo.fromString(pastedEffects.at(0).toElement().attribute("kdenlive_info")); + if (pasteInfo.groupIndex == -1) { + // Group dropped from effects list, add effect + e.setAttribute("kdenlive_ix", m_subWidgets.last()->effectIndex()); + emit addEffect(e); + event->setDropAction(Qt::CopyAction); + event->accept(); + return; + } + // Moving group + for (int i = 0; i < pastedEffects.count(); ++i) { + pastedEffectIndexes << pastedEffects.at(i).toElement().attribute("kdenlive_ix").toInt(); + } + for (int i = 0; i < m_subWidgets.count(); ++i) { + currentEffectIndexes << m_subWidgets.at(i)->effectIndex(); + } + kDebug()<<"PASTING: "<setDropAction(Qt::MoveAction); + event->accept(); + return; + } // effect dropped from effects list, add it - e.setAttribute("kdenlive_ix", ix); + e.setAttribute("kdenlive_info", m_info.toString()); + if (!m_subWidgets.isEmpty()) { + e.setAttribute("kdenlive_ix", m_subWidgets.at(0)->effectIndex()); + } + emit addEffect(e); event->setDropAction(Qt::CopyAction); event->accept(); - emit addEffect(e); return; } if (m_subWidgets.isEmpty()) return; int new_index = m_subWidgets.last()->effectIndex(); - emit moveEffect(ix, new_index, m_index, m_title->text()); + emit moveEffect(QList () <text()); event->setDropAction(Qt::MoveAction); event->accept(); } @@ -325,6 +380,7 @@ void CollapsibleGroup::slotRenameGroup() for (int j = 0; j < m_subWidgets.count(); j++) { m_subWidgets.at(j)->setGroupName(m_title->text()); } + m_info.groupName = m_title->text(); emit groupRenamed(this); } @@ -347,3 +403,12 @@ QDomDocument CollapsibleGroup::effectsData() return doc; } +void CollapsibleGroup::adjustEffects() +{ + for (int i = 0; i < m_subWidgets.count(); ++i) { + m_subWidgets.at(i)->adjustButtons(i, m_subWidgets.count()); + } +} + + +#include "collapsiblegroup.moc"