]> git.sesse.net Git - kdenlive/blobdiff - src/effectstack/collapsibleeffect.cpp
Merge branch 'master' into effectstack
[kdenlive] / src / effectstack / collapsibleeffect.cpp
index 3c8b47b2e1d79d60d578adb7185298d3547b207c..d731715a27e4f6a8d4de4da83bff07a089980fc5 100644 (file)
@@ -50,6 +50,7 @@
 #include <QDialog>
 #include <QMenu>
 #include <QVBoxLayout>
+
 #include <KDebug>
 #include <KGlobalSettings>
 #include <KLocale>
@@ -57,6 +58,7 @@
 #include <KStandardDirs>
 #include <KFileDialog>
 #include <KUrlRequester>
+#include <KColorScheme>
 
 class Boolval: public QWidget, public Ui::Boolval_UI
 {
@@ -116,36 +118,30 @@ void MySpinBox::focusOutEvent(QFocusEvent*)
 }
 
 
-CollapsibleEffect::CollapsibleEffect(QDomElement effect, QDomElement original_effect, ItemInfo info, int ix, EffectMetaInfo *metaInfo, bool lastEffect, bool isGroup, QWidget * parent) :
-        QWidget(parent),
+CollapsibleEffect::CollapsibleEffect(QDomElement effect, QDomElement original_effect, ItemInfo info, EffectMetaInfo *metaInfo, bool lastEffect, QWidget * parent) :
+        AbstractCollapsibleWidget(parent),
         m_paramWidget(NULL),
         m_effect(effect),
         m_original_effect(original_effect),
-        m_lastEffect(lastEffect),
-        m_isGroup(isGroup),
-        m_active(false),
-        m_index(ix)
+        m_lastEffect(lastEffect)
 {
-    //setMouseTracking(true);
     setupUi(this);
     filterWheelEvent = true;
     m_info.fromString(effect.attribute("kdenlive_info"));
-    frame->setBackgroundRole(QPalette::Midlight);
-    frame->setAutoFillBackground(true);
     setFont(KGlobalSettings::smallestReadableFont());
    
-    buttonUp->setIcon(KIcon("go-up"));
+    buttonUp->setIcon(KIcon("kdenlive-up"));
     buttonUp->setToolTip(i18n("Move effect up"));
     if (!lastEffect) {
-        buttonDown->setIcon(KIcon("go-down"));
+        buttonDown->setIcon(KIcon("kdenlive-down"));
         buttonDown->setToolTip(i18n("Move effect down"));
     }
-    buttonDel->setIcon(KIcon("edit-delete"));
+    buttonDel->setIcon(KIcon("kdenlive-deleffect"));
     buttonDel->setToolTip(i18n("Delete effect"));
-
-    buttonUp->setVisible(false);
-    buttonDown->setVisible(false);
-    buttonDel->setVisible(false);
+    if (effectIndex() == 1) buttonUp->setVisible(false);
+    if (m_lastEffect) buttonDown->setVisible(false);
+    //buttonUp->setVisible(false);
+    //buttonDown->setVisible(false);
     
     /*buttonReset->setIcon(KIcon("view-refresh"));
     buttonReset->setToolTip(i18n("Reset effect"));*/
@@ -156,34 +152,29 @@ CollapsibleEffect::CollapsibleEffect(QDomElement effect, QDomElement original_ef
     m_menu->addAction(KIcon("view-refresh"), i18n("Reset effect"), this, SLOT(slotResetEffect()));
     m_menu->addAction(KIcon("document-save"), i18n("Save effect"), this, SLOT(slotSaveEffect()));
     
-    if (!m_isGroup) {
-       QDomElement namenode = m_effect.firstChildElement("name");
-       if (namenode.isNull()) return;
-       title->setText(i18n(namenode.text().toUtf8().data()));
-       QString type = m_effect.attribute("type", QString());
-       KIcon icon;
-       if (type == "audio") icon = KIcon("kdenlive-show-audio");
-       else if (m_effect.attribute("tag") == "region") icon = KIcon("kdenlive-mask-effect");
-       else if (type == "custom") icon = KIcon("kdenlive-custom-effect");
-       else icon = KIcon("kdenlive-show-video");
-       title->setIcon(icon);
-       m_menu->addAction(KIcon("folder-new"), i18n("Create Group"), this, SLOT(slotCreateGroup()));
-       setupWidget(info, ix, metaInfo);
-    }
-    else {
-       title->setText(i18n("Effect Group"));
-       title->setIcon(KIcon("folder"));
-       m_menu->addAction(KIcon("list-remove"), i18n("Ungroup"), this, SLOT(slotUnGroup()));
-    }
+    QDomElement namenode = m_effect.firstChildElement("name");
+    if (namenode.isNull()) return;
+    title->setText(i18n(namenode.text().toUtf8().data()));
+    QString type = m_effect.attribute("type", QString());
+    KIcon icon;
+    if (type == "audio") icon = KIcon("kdenlive-show-audio");
+    else if (m_effect.attribute("tag") == "region") icon = KIcon("kdenlive-mask-effect");
+    else if (type == "custom") icon = KIcon("kdenlive-custom-effect");
+    else icon = KIcon("kdenlive-show-video");
+    effecticon->setPixmap(icon.pixmap(16,16));
+    m_menu->addAction(KIcon("folder-new"), i18n("Create Group"), this, SLOT(slotCreateGroup()));
+    setupWidget(info, metaInfo);
+    
     setAcceptDrops(true);
-    title->setMenu(m_menu);
+    menuButton->setIcon(KIcon("kdenlive-menu"));
+    menuButton->setMenu(m_menu);
     
     if (m_effect.attribute("disable") == "1") {
-        enabledBox->setCheckState(Qt::Unchecked);
         title->setEnabled(false);
+       enabledBox->setChecked(false);
     }
     else {
-        enabledBox->setCheckState(Qt::Checked);
+        enabledBox->setChecked(true);
     }
 
     connect(collapseButton, SIGNAL(clicked()), this, SLOT(slotSwitch()));
@@ -212,6 +203,51 @@ CollapsibleEffect::~CollapsibleEffect()
     delete m_menu;
 }
 
+//static
+const QString CollapsibleEffect::getStyleSheet(QPalette p)
+{
+    KColorScheme scheme(p.currentColorGroup(), KColorScheme::View, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+    QColor dark_bg = scheme.shade(KColorScheme::DarkShade);
+    QColor selected_bg = scheme.decoration(KColorScheme::FocusColor).color();
+    QColor hover_bg = scheme.decoration(KColorScheme::HoverColor).color();
+    QColor light_bg = scheme.shade(KColorScheme::LightShade);
+    QColor midlight_bg = scheme.shade(KColorScheme::MidlightShade);
+    QColor normal_bg = scheme.background(KColorScheme::AlternateBackground).color();
+    QColor alt_bg = scheme.background(KColorScheme::NormalBackground).color();
+    
+    KColorScheme scheme2(p.currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+    QColor normal_bg2 = scheme2.background(KColorScheme::NormalBackground).color();
+    QColor normal_bg3 = scheme2.background(KColorScheme::AlternateBackground).color();
+    
+    QString stylesheet;
+    
+    // group editable labels
+    stylesheet.append(QString("MyEditableLabel { background-color: transparent;} "));
+    
+    // effect background
+    stylesheet.append(QString("QFrame#decoframe {border-radius:5px;border:0px solid %1;background:%3;}  QFrame:hover#decoframe {background:%4;} QFrame#decoframe[active=\"true\"] {background:%2;} ").arg(dark_bg.name()).arg(alt_bg.name()).arg(normal_bg2.name()).arg(normal_bg.name()));
+    
+    // effect group background
+    stylesheet.append(QString("QFrame#decoframegroup {border-radius:5px;border:1px solid %1;background:%2;} QFrame#decoframegroup[active=\"true\"] {background:%3;} ").arg(dark_bg.name()).arg(normal_bg2.name()).arg(alt_bg.name()));
+    
+    // effect title bar
+    stylesheet.append(QString("QFrame#frame {border-radius: 5px;} QFrame#frame[active=\"true\"] {background:%1;}").arg(selected_bg.name()));
+    
+    // group effect title bar
+    stylesheet.append(QString("QFrame#framegroup {border-radius: 5px; background: %2;}  QFrame#framegroup[active=\"true\"] {background:%1;} ").arg(selected_bg.name()).arg(normal_bg3.name()));
+    
+    // draggable effect content bar
+    stylesheet.append(QString("QProgressBar::chunk:horizontal {background: %1;border-top-left-radius: 4px;border-bottom-left-radius: 4px;} QProgressBar::chunk:horizontal#dragOnly {background: %2;border-top-left-radius: 4px;border-bottom-left-radius: 4px;} QProgressBar::chunk:horizontal:hover {background: %3;}").arg(normal_bg2.name()).arg(alt_bg.name()).arg(selected_bg.name()));
+    
+    // draggable effect content bar
+    stylesheet.append(QString("QProgressBar:horizontal {border: 1px solid %1;border-top-left-radius: 4px;border-bottom-left-radius: 4px;border-right:0px;background:%4;padding: 0px;text-align:left center} QProgressBar:horizontal:disabled {border: 1px solid %5} QProgressBar:horizontal#dragOnly {background: %4} QProgressBar:horizontal[inTimeline=\"true\"] { border: 1px solid %2;border-right: 0px;background: %3;padding: 0px;text-align:left center } QProgressBar::chunk:horizontal[inTimeline=\"true\"] {background: %2;}").arg(dark_bg.name()).arg(hover_bg.name()).arg(light_bg.name()).arg(alt_bg.name()).arg(normal_bg2.name()));
+    
+    
+    // spin box for draggable widget
+    stylesheet.append(QString("QAbstractSpinBox#dragBox {border: 1px solid %1;border-top-right-radius: 4px;border-bottom-right-radius: 4px;padding-right:0px;} QAbstractSpinBox::down-button#dragBox {width:0px;padding:0px;} QAbstractSpinBox:disabled#dragBox {border: 1px solid %4;} QAbstractSpinBox::up-button#dragBox {width:0px;padding:0px;} QAbstractSpinBox[inTimeline=\"true\"]#dragBox { border: 1px solid %2;} QAbstractSpinBox:hover#dragBox {border: 1px solid %3;} ").arg(dark_bg.name()).arg(hover_bg.name()).arg(selected_bg.name()).arg(normal_bg2.name()));
+
+    return stylesheet;
+}
 
 void CollapsibleEffect::slotCreateGroup()
 {
@@ -278,16 +314,13 @@ QDomElement CollapsibleEffect::effect() const
 
 bool CollapsibleEffect::isActive() const
 {
-    return m_active;
+    return decoframe->property("active").toBool();
 }
 
-void CollapsibleEffect::setActive(bool activate, bool focused)
+void CollapsibleEffect::setActive(bool activate)
 {
-    m_active = activate;
-    if (focused) {
-       frame->setBackgroundRole(QPalette::Highlight);
-    }
-    else frame->setBackgroundRole(m_active ? QPalette::Mid : QPalette::Midlight);
+    decoframe->setProperty("active", activate);
+    decoframe->setStyleSheet(decoframe->styleSheet());
 }
 
 void CollapsibleEffect::mouseDoubleClickEvent ( QMouseEvent * event )
@@ -298,25 +331,11 @@ void CollapsibleEffect::mouseDoubleClickEvent ( QMouseEvent * event )
 
 void CollapsibleEffect::mousePressEvent ( QMouseEvent *event )
 {
-    if (!m_active && !isGroup()) emit activateEffect(effectIndex());
+  
+    if (!decoframe->property("active").toBool() && !isGroup()) emit activateEffect(effectIndex());
     QWidget::mousePressEvent(event);
 }
 
-void CollapsibleEffect::enterEvent ( QEvent * event )
-{
-    if (m_paramWidget == NULL || m_paramWidget->index() > 0) buttonUp->setVisible(true);
-    if (!m_lastEffect) buttonDown->setVisible(true);
-    buttonDel->setVisible(true);
-    QWidget::enterEvent(event);
-}
-
-void CollapsibleEffect::leaveEvent ( QEvent * event )
-{
-    buttonUp->setVisible(false);
-    buttonDown->setVisible(false);
-    buttonDel->setVisible(false);
-    QWidget::leaveEvent(event);
-}
 
 void CollapsibleEffect::slotEnable(bool enable)
 {
@@ -324,35 +343,26 @@ void CollapsibleEffect::slotEnable(bool enable)
     enabledBox->blockSignals(true);
     enabledBox->setChecked(enable);
     enabledBox->blockSignals(false);
-    if (m_isGroup) {
-       QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
-       if (vbox == NULL) return;
-       for (int i = 0; i < vbox->count(); i++) {
-           CollapsibleEffect *e = static_cast<CollapsibleEffect *>(vbox->itemAt(i)->widget());
-           if (e) e->enabledBox->setChecked(enable);// slotEnable(enable);
-       }
-    } else {
-       m_effect.setAttribute("disable", enable ? 0 : 1);
-       if (enable || KdenliveSettings::disable_effect_parameters()) {
-           widgetFrame->setEnabled(enable);
-       }
-       emit effectStateChanged(!enable, effectIndex());
+    m_effect.setAttribute("disable", enable ? 0 : 1);
+    if (enable || KdenliveSettings::disable_effect_parameters()) {
+       widgetFrame->setEnabled(enable);
     }
+    emit effectStateChanged(!enable, effectIndex());
 }
 
 void CollapsibleEffect::slotDeleteEffect()
 {
-    if (!m_isGroup) emit deleteEffect(m_effect);
+    emit deleteEffect(m_effect);
 }
 
 void CollapsibleEffect::slotEffectUp()
 {
-    if (!m_isGroup) emit changeEffectPosition(effectIndex(), true);
+    emit changeEffectPosition(effectIndex(), true);
 }
 
 void CollapsibleEffect::slotEffectDown()
 {
-    if (!m_isGroup) emit changeEffectPosition(effectIndex(), false);
+    emit changeEffectPosition(effectIndex(), false);
 }
 
 void CollapsibleEffect::slotSaveEffect()
@@ -415,29 +425,14 @@ void CollapsibleEffect::slotShow(bool show)
     emit parameterChanged(m_original_effect, m_effect, effectIndex());   
 }
 
-void CollapsibleEffect::updateGroupIndex(int groupIndex)
-{
-    m_info.groupIndex = groupIndex;
-    m_effect.setAttribute("kdenlive_info", m_info.toString());
-    emit parameterChanged(m_original_effect, m_effect, effectIndex());
-}
-
 void CollapsibleEffect::setGroupIndex(int ix)
 {
     m_info.groupIndex = ix;
 }
 
-void CollapsibleEffect::addGroupEffect(CollapsibleEffect *effect)
+void CollapsibleEffect::setGroupName(const QString &groupName)
 {
-    QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
-    if (vbox == NULL) {
-       vbox = new QVBoxLayout();
-       vbox->setContentsMargins(10, 0, 0, 0);
-       vbox->setSpacing(2);
-       widgetFrame->setLayout(vbox);
-    }
-    effect->setGroupIndex(groupIndex());
-    vbox->addWidget(effect);
+    m_info.groupName = groupName;
 }
 
 QString CollapsibleEffect::infoString() const
@@ -445,34 +440,17 @@ QString CollapsibleEffect::infoString() const
     return m_info.toString();
 }
 
-void CollapsibleEffect::removeGroup(int ix, QVBoxLayout *layout)
+void CollapsibleEffect::removeFromGroup()
 {
-    QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
-    if (vbox == NULL) return;
-    
-    for (int j = vbox->count() - 1; j >= 0; j--) {
-       QLayoutItem *child = vbox->takeAt(j);
-       CollapsibleEffect *e = static_cast<CollapsibleEffect *>(child->widget());
-       layout->insertWidget(ix, e);
-       e->updateGroupIndex(-1);
-       delete child;
-    }
-}
-
-int CollapsibleEffect::index() const
-{
-    return m_index;
+    m_info.groupIndex = -1;
+    m_info.groupName.clear();
+    m_effect.setAttribute("kdenlive_info", m_info.toString());
+    emit parameterChanged(m_original_effect, m_effect, effectIndex());
 }
 
 int CollapsibleEffect::groupIndex() const
 {
-    if (m_isGroup) return m_index;
-    return -1;
-}
-
-bool CollapsibleEffect::isGroup() const
-{
-    return m_isGroup;
+    return m_info.groupIndex;
 }
 
 int CollapsibleEffect::effectIndex() const
@@ -481,7 +459,7 @@ int CollapsibleEffect::effectIndex() const
     return m_effect.attribute("kdenlive_ix").toInt();
 }
 
-void CollapsibleEffect::updateWidget(ItemInfo info, int index, QDomElement effect, EffectMetaInfo *metaInfo)
+void CollapsibleEffect::updateWidget(ItemInfo info, QDomElement effect, EffectMetaInfo *metaInfo)
 {
     if (m_paramWidget) {
        // cleanup
@@ -489,10 +467,10 @@ void CollapsibleEffect::updateWidget(ItemInfo info, int index, QDomElement effec
        m_paramWidget = NULL;
     }
     m_effect = effect;
-    setupWidget(info, index, metaInfo);
+    setupWidget(info, metaInfo);
 }
 
-void CollapsibleEffect::setupWidget(ItemInfo info, int index, EffectMetaInfo *metaInfo)
+void CollapsibleEffect::setupWidget(ItemInfo info, EffectMetaInfo *metaInfo)
 {
     if (m_effect.isNull()) {
 //         kDebug() << "// EMPTY EFFECT STACK";
@@ -501,15 +479,15 @@ void CollapsibleEffect::setupWidget(ItemInfo info, int index, EffectMetaInfo *me
 
     if (m_effect.attribute("tag") == "region") {
         QVBoxLayout *vbox = new QVBoxLayout(widgetFrame);
-        vbox->setContentsMargins(0, 0, 0, 0);
+        vbox->setContentsMargins(2, 0, 2, 0);
        vbox->setSpacing(2);
         QDomNodeList effects =  m_effect.elementsByTagName("effect");
        QDomNodeList origin_effects =  m_original_effect.elementsByTagName("effect");
         QWidget *container = new QWidget(widgetFrame);
         vbox->addWidget(container);
-        m_paramWidget = new ParameterContainer(m_effect.toElement(), info, metaInfo, index, container);
+        m_paramWidget = new ParameterContainer(m_effect.toElement(), info, metaInfo, container);
         for (int i = 0; i < effects.count(); i++) {
-            CollapsibleEffect *coll = new CollapsibleEffect(effects.at(i).toElement(), origin_effects.at(i).toElement(), info, i, metaInfo, container);
+            CollapsibleEffect *coll = new CollapsibleEffect(effects.at(i).toElement(), origin_effects.at(i).toElement(), info, metaInfo, container);
             m_subParamWidgets.append(coll);
             //container = new QWidget(widgetFrame);
             vbox->addWidget(coll);
@@ -518,10 +496,11 @@ void CollapsibleEffect::setupWidget(ItemInfo info, int index, EffectMetaInfo *me
         
     }
     else {
-        m_paramWidget = new ParameterContainer(m_effect, info, metaInfo, index, widgetFrame);
+        m_paramWidget = new ParameterContainer(m_effect, info, metaInfo, widgetFrame);
         if (m_effect.firstChildElement("parameter").isNull()) {
             // Effect has no parameter, don't allow expand
             collapseButton->setEnabled(false);
+           collapseButton->setVisible(false);
             widgetFrame->setVisible(false);            
         }
     }
@@ -542,6 +521,11 @@ void CollapsibleEffect::setupWidget(ItemInfo info, int index, EffectMetaInfo *me
     
 }
 
+bool CollapsibleEffect::isGroup() const
+{
+    return false;
+}
+
 void CollapsibleEffect::updateTimecodeFormat()
 {
     m_paramWidget->updateTimecodeFormat();
@@ -560,18 +544,22 @@ void CollapsibleEffect::slotSyncEffectsPos(int pos)
 void CollapsibleEffect::dragEnterEvent(QDragEnterEvent *event)
 {
     if (event->mimeData()->hasFormat("kdenlive/effectslist")) {
-       setActive(m_active, true);
+       frame->setProperty("active", true);
+       frame->setStyleSheet(frame->styleSheet());
        event->acceptProposedAction();
     }
 }
 
 void CollapsibleEffect::dragLeaveEvent(QDragLeaveEvent */*event*/)
 {
-    setActive(m_active, false);
+    frame->setProperty("active", false);
+    frame->setStyleSheet(frame->styleSheet());
 }
 
 void CollapsibleEffect::dropEvent(QDropEvent *event)
 {
+    frame->setProperty("active", false);
+    frame->setStyleSheet(frame->styleSheet());
     const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
     //event->acceptProposedAction();
     QDomDocument doc;
@@ -591,23 +579,12 @@ void CollapsibleEffect::dropEvent(QDropEvent *event)
        emit addEffect(e);
        return;
     }
-    int new_index = -1;
-    if (m_isGroup) {
-       QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
-       if (vbox == NULL) return;
-       CollapsibleEffect *e = static_cast<CollapsibleEffect *>(vbox->itemAt(vbox->count() -1)->widget());
-       new_index = e->effectIndex() + 1;
-    }
-    else {
-       new_index = effectIndex();
-    }
-    emit moveEffect(ix, new_index, this);
+    emit moveEffect(ix, effectIndex(), m_info.groupIndex, m_info.groupName);
     event->setDropAction(Qt::MoveAction);
     event->accept();
 }
 
-ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, EffectMetaInfo *metaInfo, int index, QWidget * parent) :
-       m_index(index),
+ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, EffectMetaInfo *metaInfo, QWidget * parent) :
         m_keyframeEditor(NULL),
         m_geometryWidget(NULL),
         m_metaInfo(metaInfo),
@@ -629,7 +606,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
 
     bool stretch = true;
     m_vbox = new QVBoxLayout(parent);
-    m_vbox->setContentsMargins(0, 0, 0, 0);
+    m_vbox->setContentsMargins(2, 0, 2, 0);
     m_vbox->setSpacing(2);
 
     for (int i = 0; i < namenode.count() ; i++) {
@@ -1301,11 +1278,6 @@ QString ParameterContainer::getWipeString(wipeInfo info)
     return QString(start + ";-1=" + end);
 }
 
-int ParameterContainer::index() const
-{
-    return m_index;
-}
-
 void ParameterContainer::slotStartFilterJobAction()
 {
     QDomNodeList namenode = m_effect.elementsByTagName("parameter");
@@ -1319,5 +1291,3 @@ void ParameterContainer::slotStartFilterJobAction()
         }
     }
 }
-
-