X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectstackedit.cpp;h=11d9d7c6f0d45f154058bf9c62e3159f8504d382;hb=f2fe0d6c467877c59f3fa4eb7f20cf79d1814b66;hp=2a7b64c06d302f32e882536b5a79fe50152d97bc;hpb=c39f6eb2d6b5adf561daa70340a31de880f68d01;p=kdenlive diff --git a/src/effectstackedit.cpp b/src/effectstackedit.cpp index 2a7b64c0..11d9d7c6 100644 --- a/src/effectstackedit.cpp +++ b/src/effectstackedit.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - effecstackview.cpp - description + effecstackedit.cpp - description ------------------- begin : Feb 15 2008 copyright : (C) 2008 by Marco Gittler @@ -15,365 +15,180 @@ * * ***************************************************************************/ -#include -#include #include "effectstackedit.h" +#include "effectstack/effectstackview2.h" +#include "effectslist.h" +#include "monitor.h" +#include "kdenlivesettings.h" + +#include +#include +#include +#include + #include -#include #include #include #include #include -#include "ui_constval_ui.h" -#include "ui_listval_ui.h" -#include "ui_boolval_ui.h" -#include "ui_colorval_ui.h" -#include "ui_wipeval_ui.h" -#include "complexparameter.h" - -QMap EffectStackEdit::iconCache; - -EffectStackEdit::EffectStackEdit(QFrame* frame, QWidget *parent): QObject(parent) { - QScrollArea *area; - QVBoxLayout *vbox1 = new QVBoxLayout(frame); - QVBoxLayout *vbox2 = new QVBoxLayout(frame); - vbox = new QVBoxLayout(frame); - vbox1->setContentsMargins(0, 0, 0, 0); - vbox1->setSpacing(0); - vbox2->setContentsMargins(0, 0, 0, 0); - vbox2->setSpacing(0); - vbox->setContentsMargins(0, 0, 0, 0); - vbox->setSpacing(0); - frame->setLayout(vbox1); - QFont widgetFont = frame->font(); - widgetFont.setPointSize(widgetFont.pointSize() - 2); - frame->setFont(widgetFont); +#include +#include +#include + +// For QDomNode debugging (output into files); leaving here as sample code. +//#define DEBUG_ESE + + +EffectStackEdit::EffectStackEdit(Monitor *monitor, QWidget *parent) : + QScrollArea(parent), + m_paramWidget(NULL) +{ + m_baseWidget = new QWidget(this); + m_metaInfo.monitor = monitor; + m_metaInfo.trackMode = false; + setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + setFrameStyle(QFrame::NoFrame); + setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding)); + + setStyleSheet(EffectStackView2::getStyleSheet()); + setWidget(m_baseWidget); + /*m_vbox = new QVBoxLayout(m_baseWidget); + m_vbox->setContentsMargins(0, 0, 0, 0); + m_vbox->setSpacing(2); */ + setWidgetResizable(true); +} - area = new QScrollArea(frame); - QWidget *wid = new QWidget(area); - area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - area->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - wid->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); - //area->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::MinimumExpanding)); +EffectStackEdit::~EffectStackEdit() +{ + delete m_baseWidget; +} - vbox1->addWidget(area); - wid->setLayout(vbox2); - vbox2->addLayout(vbox); - vbox2->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding)); - area->setWidget(wid); - area->setWidgetResizable(true); - wid->show(); +Monitor *EffectStackEdit::monitor() +{ + return m_metaInfo.monitor; +} +void EffectStackEdit::updateProjectFormat(const MltVideoProfile &profile, const Timecode &t) +{ + m_metaInfo.profile = profile; + m_metaInfo.timecode = t; } -EffectStackEdit::~EffectStackEdit() { - iconCache.clear(); +void EffectStackEdit::setFrameSize(const QPoint &p) +{ + m_metaInfo.frameSize = p; } -void EffectStackEdit::transferParamDesc(const QDomElement& d, int , int) { - kDebug() << "in"; - params = d; - QDomNodeList namenode = params.elementsByTagName("parameter"); +void EffectStackEdit::updateTimecodeFormat() +{ + if (m_paramWidget) m_paramWidget->updateTimecodeFormat(); +} - clearAllItems(); +void EffectStackEdit::updateParameter(const QString &name, const QString &value) +{ + m_paramWidget->updateParameter(name, value); - for (int i = 0;i < namenode.count() ;i++) { - kDebug() << "in form"; - QDomElement pa = namenode.item(i).toElement(); - QDomNode na = pa.firstChildElement("name"); - QString type = pa.attribute("type"); - QString paramName = na.toElement().text(); - QWidget * toFillin = new QWidget; - QString value = pa.attribute("value").isNull() ? - pa.attribute("default") : pa.attribute("value"); - if (type == "geometry") { - pa.setAttribute("namedesc", "X;Y;W;H;M"); - pa.setAttribute("format", "%d%,%d%:%d%x%d%:%d%"); - pa.setAttribute("min", "-200;-20;0;0;0"); - pa.setAttribute("max", "200;200;100;100;100"); - } else if (type == "complex") { - //pa.setAttribute("namedesc",pa.attribute("name")); + if (name == "disable") { + // if effect is disabled, disable parameters widget + bool enabled = value.toInt() == 0 || !KdenliveSettings::disable_effect_parameters(); + setEnabled(enabled); + emit effectStateChanged(enabled); + } +} +bool EffectStackEdit::eventFilter( QObject * o, QEvent * e ) +{ + if (e->type() == QEvent::Wheel) { + QWheelEvent *we = static_cast(e); + bool filterWheel = verticalScrollBar() && verticalScrollBar()->isVisible(); + if (!filterWheel || we->modifiers() != Qt::NoModifier) { + e->accept(); + return false; } - - - //TODO constant, list, bool, complex , color, geometry, position - if (type == "double" || type == "constant") { - createSliderItem(paramName, value.toInt(), pa.attribute("min").toInt(), pa.attribute("max").toInt()); - delete toFillin; - toFillin = NULL; - } else if (type == "list") { - Ui::Listval_UI *lsval = new Ui::Listval_UI; - lsval->setupUi(toFillin); - QStringList listitems = pa.attribute("paramlist").split(","); - QStringList listitemsdisplay = pa.attribute("paramlistdisplay").split(","); - if (listitemsdisplay.count() != listitems.count()) listitemsdisplay = listitems; - //lsval->list->addItems(listitems); - for (int i = 0;i < listitems.count();i++) { - lsval->list->addItem(listitemsdisplay.at(i), listitems.at(i)); + if (qobject_cast(o)) { + if(qobject_cast(o)->focusPolicy() == Qt::WheelFocus) + { + e->accept(); + return false; } - lsval->list->setCurrentIndex(listitems.indexOf(value)); - for (int i = 0;i < lsval->list->count();i++) { - QString entry = lsval->list->itemData(i).toString(); - if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) { - if (!EffectStackEdit::iconCache.contains(entry)) { - QImage pix(entry); - EffectStackEdit::iconCache[entry] = pix.scaled(30, 30); - } - lsval->list->setIconSize(QSize(30, 30)); - lsval->list->setItemIcon(i, QPixmap::fromImage(iconCache[entry])); - } + else + { + e->ignore(); + return true; } - connect(lsval->list, SIGNAL(currentIndexChanged(int)) , this, SLOT(collectAllParameters())); - lsval->title->setTitle(na.toElement().text()); - valueItems[paramName] = lsval; - uiItems.append(lsval); - } else if (type == "bool") { - Ui::Boolval_UI *bval = new Ui::Boolval_UI; - bval->setupUi(toFillin); - bval->checkBox->setCheckState(value == "0" ? Qt::Unchecked : Qt::Checked); - - connect(bval->checkBox, SIGNAL(stateChanged(int)) , this, SLOT(collectAllParameters())); - bval->checkBox->setText(na.toElement().text()); - valueItems[paramName] = bval; - uiItems.append(bval); - } else if (type == "complex" || type == "geometry") { - /*QStringList names=nodeAtts.namedItem("name").nodeValue().split(";"); - QStringList max=nodeAtts.namedItem("max").nodeValue().split(";"); - QStringList min=nodeAtts.namedItem("min").nodeValue().split(";"); - QStringList val=value.split(";"); - kDebug() << "in complex"<(o)) { + if(qobject_cast(o)->focusPolicy() == Qt::WheelFocus) { - for (int i=0;i< names.size();i++){ - createSliderItem(names[i],val[i].toInt(),min[i].toInt(),max[i].toInt()); - }; - }*/ - ComplexParameter *pl = new ComplexParameter; - connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - pl->setupParam(d, pa.attribute("name"), 0, 100); - vbox->addWidget(pl); - valueItems[paramName+"complex"] = pl; - items.append(pl); - } else if (type == "color") { - Ui::Colorval_UI *cval = new Ui::Colorval_UI; - cval->setupUi(toFillin); - bool ok; - cval->kcolorbutton->setColor(value.toUInt(&ok, 16)); - kDebug() << value.toUInt(&ok, 16); - - connect(cval->kcolorbutton, SIGNAL(clicked()) , this, SLOT(collectAllParameters())); - cval->label->setText(na.toElement().text()); - valueItems[paramName] = cval; - uiItems.append(cval); - } else if (type == "wipe") { - Ui::Wipeval_UI *wpval = new Ui::Wipeval_UI; - wpval->setupUi(toFillin); - wipeInfo w = getWipeInfo(value); - switch (w.start) { - case UP: - wpval->start_up->setChecked(true); - break; - case DOWN: - wpval->start_down->setChecked(true); - break; - case RIGHT: - wpval->start_right->setChecked(true); - break; - case LEFT: - wpval->start_left->setChecked(true); - break; - default: - wpval->start_center->setChecked(true); - break; + e->accept(); + return false; } - switch (w.end) { - case UP: - wpval->end_up->setChecked(true); - break; - case DOWN: - wpval->end_down->setChecked(true); - break; - case RIGHT: - wpval->end_right->setChecked(true); - break; - case LEFT: - wpval->end_left->setChecked(true); - break; - default: - wpval->end_center->setChecked(true); - break; + else + { + e->ignore(); + return true; } - - connect(wpval->end_up, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_down, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_left, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_right, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->end_center, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_up, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_down, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_left, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_right, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - connect(wpval->start_center, SIGNAL(clicked()), this, SLOT(collectAllParameters())); - - //wpval->title->setTitle(na.toElement().text()); - valueItems[paramName] = wpval; - uiItems.append(wpval); - } else { - delete toFillin; - toFillin = NULL; } - - if (toFillin) { - items.append(toFillin); - vbox->addWidget(toFillin); + if (qobject_cast(o)) { + if(qobject_cast(o)->focusPolicy() == Qt::WheelFocus) + { + e->accept(); + return false; + } + else + { + e->ignore(); + return true; + } } } + return QWidget::eventFilter(o, e); } -wipeInfo EffectStackEdit::getWipeInfo(QString value) { - wipeInfo info; - QString start = value.section(";", 0, 0); - QString end = value.section(";", 1, 1).section("=", 1, 1); - if (start.startsWith("-100%,0")) info.start = LEFT; - else if (start.startsWith("100%,0")) info.start = RIGHT; - else if (start.startsWith("0%,100%")) info.start = DOWN; - else if (start.startsWith("0%,-100%")) info.start = UP; - else if (start.startsWith("0%,0%")) info.start = CENTER; - - if (end.startsWith("-100%,0")) info.end = LEFT; - else if (end.startsWith("100%,0")) info.end = RIGHT; - else if (end.startsWith("0%,100%")) info.end = DOWN; - else if (end.startsWith("0%,-100%")) info.end = UP; - else if (end.startsWith("0%,0%")) info.end = CENTER; - - return info; -} - -QString EffectStackEdit::getWipeString(wipeInfo info) { - - QString start; - QString end; - switch (info.start) { - case LEFT: - start = "-100%,0%:100%x100%"; - break; - case RIGHT: - start = "100%,0%:100%x100%"; - break; - case DOWN: - start = "0%,100%:100%x100%"; - break; - case UP: - start = "0%,-100%:100%x100%"; - break; - default: - start = "0%,0%:100%x100%"; - break; +void EffectStackEdit::transferParamDesc(const QDomElement &d, ItemInfo info, bool /*isEffect*/) +{ + if (m_paramWidget) delete m_paramWidget; + m_paramWidget = new ParameterContainer(d, info, &m_metaInfo, m_baseWidget); + connect (m_paramWidget, SIGNAL(parameterChanged(QDomElement,QDomElement,int)), this, SIGNAL(parameterChanged(QDomElement,QDomElement,int))); + + connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QMap)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QMap))); + + connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int))); + connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int))); + connect (m_paramWidget, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int))); + connect (m_paramWidget, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes())); + + Q_FOREACH( QSpinBox * sp, m_baseWidget->findChildren() ) { + sp->installEventFilter( this ); + sp->setFocusPolicy( Qt::StrongFocus ); } - switch (info.end) { - case LEFT: - end = "-100%,0%:100%x100%"; - break; - case RIGHT: - end = "100%,0%:100%x100%"; - break; - case DOWN: - end = "0%,100%:100%x100%"; - break; - case UP: - end = "0%,-100%:100%x100%"; - break; - default: - end = "0%,0%:100%x100%"; - break; + Q_FOREACH( KComboBox * cb, m_baseWidget->findChildren() ) { + cb->installEventFilter( this ); + cb->setFocusPolicy( Qt::StrongFocus ); } - return QString(start + ";-1=" + end); -} - -void EffectStackEdit::collectAllParameters() { - QDomElement oldparam = params.cloneNode().toElement(); - QDomNodeList namenode = params.elementsByTagName("parameter"); - - for (int i = 0;i < namenode.count() ;i++) { - QDomNode pa = namenode.item(i); - QDomNode na = pa.firstChildElement("name"); - QString type = pa.attributes().namedItem("type").nodeValue(); - QString setValue; - if (type == "double" || type == "constant") { - QSlider* slider = ((Ui::Constval_UI*)valueItems[na.toElement().text()])->horizontalSlider; - setValue = QString::number(slider->value()); - } else if (type == "list") { - KComboBox *box = ((Ui::Listval_UI*)valueItems[na.toElement().text()])->list; - setValue = box->itemData(box->currentIndex()).toString(); - } else if (type == "bool") { - QCheckBox *box = ((Ui::Boolval_UI*)valueItems[na.toElement().text()])->checkBox; - setValue = box->checkState() == Qt::Checked ? "1" : "0" ; - } else if (type == "color") { - KColorButton *color = ((Ui::Colorval_UI*)valueItems[na.toElement().text()])->kcolorbutton; - setValue.sprintf("0x%08x", color->color().rgba()); - } else if (type == "complex" || type == "geometry") { - ComplexParameter *complex = ((ComplexParameter*)valueItems[na.toElement().text()+"complex"]); - namenode.item(i) = complex->getParamDesc(); - } else if (type == "wipe") { - Ui::Wipeval_UI *wp = (Ui::Wipeval_UI*)valueItems[na.toElement().text()]; - wipeInfo info; - if (wp->start_left->isChecked()) info.start = LEFT; - else if (wp->start_right->isChecked()) info.start = RIGHT; - else if (wp->start_up->isChecked()) info.start = UP; - else if (wp->start_down->isChecked()) info.start = DOWN; - else if (wp->start_center->isChecked()) info.start = CENTER; - - if (wp->end_left->isChecked()) info.end = LEFT; - else if (wp->end_right->isChecked()) info.end = RIGHT; - else if (wp->end_up->isChecked()) info.end = UP; - else if (wp->end_down->isChecked()) info.end = DOWN; - else if (wp->end_center->isChecked()) info.end = CENTER; - - setValue = getWipeString(info); - } - - if (!setValue.isNull()) { - pa.attributes().namedItem("value").setNodeValue(setValue); - } + Q_FOREACH( QProgressBar * cb, m_baseWidget->findChildren() ) { + cb->installEventFilter( this ); + cb->setFocusPolicy( Qt::StrongFocus ); } - emit parameterChanged(oldparam, params); } -void EffectStackEdit::createSliderItem(const QString& name, int val , int min, int max) { - QWidget* toFillin = new QWidget; - Ui::Constval_UI *ctval = new Ui::Constval_UI; - ctval->setupUi(toFillin); - - ctval->horizontalSlider->setMinimum(min); - ctval->horizontalSlider->setMaximum(max); - ctval->spinBox->setMinimum(min); - ctval->spinBox->setMaximum(max); - ctval->horizontalSlider->setPageStep((int)(max - min) / 10); - ctval->horizontalSlider->setValue(val); - ctval->label->setText(name); - valueItems[name] = ctval; - uiItems.append(ctval); - connect(ctval->horizontalSlider, SIGNAL(valueChanged(int)) , this, SLOT(collectAllParameters())); - items.append(toFillin); - vbox->addWidget(toFillin); +void EffectStackEdit::slotSyncEffectsPos(int pos) +{ + emit syncEffectsPos(pos); } -void EffectStackEdit::slotSliderMoved(int) { - collectAllParameters(); +bool EffectStackEdit::needsMonitorEffectScene() const +{ + if (!m_paramWidget) return false; + return m_paramWidget->needsMonitorEffectScene(); } -void EffectStackEdit::clearAllItems() { - foreach(QWidget *w, items) { - vbox->removeWidget(w); - delete w; - } - foreach(void *p, uiItems) { - delete p; - } - uiItems.clear(); - items.clear(); - valueItems.clear(); +void EffectStackEdit::setKeyframes(const QString &data, int maximum) +{ + if (!m_paramWidget) return; + m_paramWidget->setKeyframes(data, maximum); } + + +#include "effectstackedit.moc"