X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectstackedit.cpp;h=361e5f2e64d1a89693872165308e84a9bfcf5589;hb=dbe90c60ebee4ea154174b90972f673111f24172;hp=1047e8c866669e800a76d27d7cad1d866cc214c2;hpb=c9a430f043690ea8e3a8fa0c2eb685b201b0694e;p=kdenlive diff --git a/src/effectstackedit.cpp b/src/effectstackedit.cpp index 1047e8c8..361e5f2e 100644 --- a/src/effectstackedit.cpp +++ b/src/effectstackedit.cpp @@ -21,125 +21,226 @@ #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 "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); + + 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)); + + 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(); -EffectStackEdit::EffectStackEdit(QGroupBox* gbox,QWidget *parent): QWidget(parent) -{ - - vbox=new QVBoxLayout; - gbox->setSizePolicy(QSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum)); - QVBoxLayout *tmpvbox=new QVBoxLayout; - tmpvbox->addLayout(vbox); - tmpvbox->addItem(new QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy::Expanding)); - gbox->setLayout(tmpvbox); - } -void EffectStackEdit::transferParamDesc(const QDomElement& d,int ,int){ - kDebug() << "in"; - params=d; - QDomNodeList namenode = params.elementsByTagName("parameter"); - - clearAllItems(); - QString outstr; - QTextStream str(&outstr); - d.save(str,2); - kDebug() << outstr; - for (int i=0;i< namenode.count() ;i++){ - kDebug() << "in form"; - QDomNode pa=namenode.item(i); - QDomNode na=pa.firstChildElement("name"); - QDomNamedNodeMap nodeAtts=pa.attributes(); - QString type=nodeAtts.namedItem("type").nodeValue(); - QWidget * toFillin=NULL,*labelToFillIn=NULL; - //TODO constant, list, bool, complex , color, geometry, position - if (type=="double" || type=="constant"){ - toFillin=new QWidget; - Ui::Constval_UI *ctval=new Ui::Constval_UI; - ctval->setupUi(toFillin); - - ctval->horizontalSlider->setMinimum(nodeAtts.namedItem("min").nodeValue().toInt()); - ctval->horizontalSlider->setMaximum(nodeAtts.namedItem("max").nodeValue().toInt()); - ctval->spinBox->setMinimum(ctval->horizontalSlider->minimum()); - ctval->spinBox->setMaximum(ctval->horizontalSlider->maximum()); - if (nodeAtts.namedItem("value").isNull()) - ctval->horizontalSlider->setValue(nodeAtts.namedItem("default").nodeValue().toInt()); - else - ctval->horizontalSlider->setValue(nodeAtts.namedItem("value").nodeValue().toInt()); - ctval->title->setTitle(na.toElement().text() ); - valueItems[na.toElement().text()]=ctval; - connect (ctval->horizontalSlider, SIGNAL(valueChanged(int)) , this, SLOT (slotSliderMoved(int))); - } - if (type=="list"){ - toFillin=new QWidget; - Ui::Listval_UI *lsval=new Ui::Listval_UI; - lsval->setupUi(toFillin); - nodeAtts.namedItem("paramlist"); - - lsval->list->addItems(nodeAtts.namedItem("paramlist").nodeValue().split(",")); - /*if (nodeAtts.namedItem("value").isNull()) - lsval->list->setCurrentText(nodeAtts.namedItem("default").nodeValue()); - else - lsval->list->setCurrentText(nodeAtts.namedItem("value").nodeValue()); - */ - connect (lsval->list, SIGNAL(currentIndexChanged(int)) , this, SLOT (slotSliderMoved(int))); - lsval->title->setTitle(na.toElement().text() ); - valueItems[na.toElement().text()]=lsval; - } - if (type=="bool"){ - toFillin=new QWidget; - Ui::Boolval_UI *bval=new Ui::Boolval_UI; - bval->setupUi(toFillin); - if (nodeAtts.namedItem("value").isNull()) - bval->checkBox->setCheckState(nodeAtts.namedItem("default").nodeValue()=="0" ? Qt::Unchecked : Qt::Checked); - else - bval->checkBox->setCheckState(nodeAtts.namedItem("value").nodeValue()=="0" ? Qt::Unchecked : Qt::Checked); - - connect (bval->checkBox, SIGNAL(stateChanged(int)) , this, SLOT (slotSliderMoved(int))); - bval->title->setTitle(na.toElement().text() ); - valueItems[na.toElement().text()]=bval; - } - - if (toFillin){ - items.append(toFillin); - vbox->addWidget(toFillin); - } - } + +EffectStackEdit::~EffectStackEdit() { + iconCache.clear(); } -void EffectStackEdit::collectAllParameters(){ - 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(); - if (type=="double" || type=="constant"){ - QSlider* slider=((Ui::Constval_UI*)valueItems[na.toElement().text()])->horizontalSlider; - pa.attributes().namedItem("value").setNodeValue(QString::number(slider->value())); - } - if (type=="list"){ - KComboBox *box=((Ui::Listval_UI*)valueItems[na.toElement().text()])->list; - pa.attributes().namedItem("value").setNodeValue(box->currentText()); - } - if (type=="bool"){ - QCheckBox *box=((Ui::Boolval_UI*)valueItems[na.toElement().text()])->checkBox; - pa.attributes().namedItem("value").setNodeValue(box->checkState() == Qt::Checked ? "1" :"0" ); - } - } - emit parameterChanged(params); + +void EffectStackEdit::transferParamDesc(const QDomElement& d, int , int) { + kDebug() << "in"; + params = d; + QDomNodeList namenode = params.elementsByTagName("parameter"); + + clearAllItems(); + + 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"); + } + if (type == "complex") { + //pa.setAttribute("namedesc",pa.attribute("name")); + + } + //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(","); + lsval->list->addItems(listitems); + lsval->list->setCurrentIndex(listitems.indexOf(value)); + for (int i = 0;i < lsval->list->count();i++) { + QString entry = lsval->list->itemText(i); + 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])); + } + } + 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"<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 { + delete toFillin; + toFillin = NULL; + } + + if (toFillin) { + items.append(toFillin); + vbox->addWidget(toFillin); + } + } +} +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->currentText(); + } 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(); + } + if (!setValue.isNull()) { + pa.attributes().namedItem("value").setNodeValue(setValue); + } + } + emit parameterChanged(oldparam, params); } -void EffectStackEdit::slotSliderMoved(int){ - collectAllParameters(); + +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::slotSliderMoved(int) { + collectAllParameters(); } -void EffectStackEdit::clearAllItems(){ - foreach (QWidget* w,items){ - kDebug() << "delete" << w; - vbox->removeWidget(w); - delete w; - } - items.clear(); - valueItems.clear(); +void EffectStackEdit::clearAllItems() { + foreach(QWidget* w, items) { + vbox->removeWidget(w); + delete w; + } + foreach(void * p, uiItems) { + delete p; + } + uiItems.clear(); + items.clear(); + valueItems.clear(); }