X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fparameterplotter.cpp;h=5550ba658e60882db2d30869bb4cdef0fe2018dc;hb=56aee6aedeeed3efd10ada8fe3c229eddc01ef05;hp=ef4b883be80262c8f5a8d96de3fdd5eaacfede25;hpb=8390845cf30d683074f55cc4dc69b64ace640798;p=kdenlive diff --git a/src/parameterplotter.cpp b/src/parameterplotter.cpp index ef4b883b..5550ba65 100644 --- a/src/parameterplotter.cpp +++ b/src/parameterplotter.cpp @@ -14,46 +14,32 @@ * (at your option) any later version. * * * ***************************************************************************/ -#if 0 + #include "parameterplotter.h" #include #include #include +#include #include #include -ParameterPlotter::ParameterPlotter (QWidget *parent):QWidget(parent){ - setupUi(this); - setAntialiasing(true); - setLeftPadding(20); - setRightPadding(10); - setTopPadding(10); - setBottomPadding(20); - movepoint=NULL; - colors << Qt::white << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::gray << Qt::cyan; - maxy=0; - m_moveX=false; - m_moveY=true; - m_moveTimeline=true; - m_newPoints=false; - activeIndexPlot=-1; - ui.buttonLeftRight->setIcon(KIcon("go-next"));//better icons needed - ui.buttonLeftRight->setToolTip(i18n("Allow horizontal moves")); - ui.buttonUpDown->setIcon(KIcon("go-up")); - ui.buttonUpDown->setToolTip(i18n("Allow vertical moves")); - ui.buttonShowInTimeline->setIcon(KIcon("kmplayer")); - ui.buttonShowInTimeline->setToolTip(i18n("Show keyframes in timeline")); - ui.buttonHelp->setIcon(KIcon("help-about")); - ui.buttonHelp->setToolTip(i18n("Parameter info")); - ui.buttonNewPoints->setIcon(KIcon("xedit")); - ui.buttonNewPoints->setToolTip(i18n("Add keyframe")); - connect (ui.buttonLeftRight, SIGNAL (clicked()), this , SLOT ( slotSetMoveX() ) ); - connect (ui.buttonUpDown, SIGNAL (clicked()), this , SLOT ( slotSetMoveY() ) ); - connect (ui.buttonShowInTimeline, SIGNAL (clicked()), this , SLOT ( slotShowInTimeline() ) ); - connect (ui.buttonNewPoints, SIGNAL (clicked()), this , SLOT ( slotSetNew() ) ); - connect (ui.buttonHelp, SIGNAL (clicked()), this , SLOT ( slotSetHelp() ) ); -connect (ui.parameterList, SIGNAL (currentIndexChanged ( const QString & ) ), this, SLOT( slotParameterChanged(const QString&) ) ); -updateButtonStatus(); +ParameterPlotter::ParameterPlotter(QWidget *parent) : + KPlotWidget(parent) +{ + setAntialiasing(true); + setLeftPadding(20); + setRightPadding(10); + setTopPadding(10); + setBottomPadding(20); + m_movepoint = NULL; + m_colors << Qt::white << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::gray << Qt::cyan; + m_moveX = false; + m_moveY = true; + m_moveTimeline = true; + m_newPoints = false; + m_activeIndexPlot = -1; + m_max_y = 0; + m_min_y = 0; } /* Lines @@ -69,240 +55,250 @@ updateButtonStatus(); */ -void ParameterPlotter::setPointLists(const QDomElement& d,int startframe,int endframe){ - - //QListIterator > > nameit(params); - itemParameter=d; - QDomNodeList namenode = d.elementsByTagName("parameter"); - - int max_y=0; - removeAllPlotObjects (); - parameterNameList.clear(); - plotobjects.clear(); - - - for (int i=0;i< namenode.count() ;i++){ - KPlotObject *plot=new KPlotObject(colors[plotobjects.size()%colors.size()]); - plot->setShowLines(true); - //QPair > item=nameit.next(); - QDomNode pa=namenode.item(i); - QDomNode na=pa.firstChildElement("name"); - - parameterNameList << na.toElement().text(); - - - max_y=pa.attributes().namedItem("max").nodeValue().toInt(); - int val=pa.attributes().namedItem("value").nodeValue().toInt(); - plot->addPoint((i+1)*20,val); - /*TODO keyframes - while (pointit.hasNext()){ - pointit.next(); - plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1); - if (pointit.value().toInt() >maxy) - max_y=pointit.value().toInt(); - }*/ - plotobjects.append(plot); - } - maxx=endframe; - maxy=max_y; - setLimits(0,endframe,0,maxy+10); - addPlotObjects(plotobjects); +void ParameterPlotter::setPointLists(const QDomElement& d, const QString& paramName, int startframe, int endframe) +{ -} + //QListIterator > > nameit(params); + m_paramName = paramName; + m_itemParameter = d; + QDomNodeList namenode = d.elementsByTagName("parameter"); -void ParameterPlotter::createParametersNew(){ - - QList plotobjs=plotObjects(); - if (plotobjs.size() != parameterNameList.size() ){ - kDebug() << "ERROR size not equal"; - } - QDomNodeList namenode = itemParameter.elementsByTagName("parameter"); - for (int i=0;i points=plotobjs[i]->points(); - QDomNode pa=namenode.item(i); - - - - - - - QMap vals; - foreach (KPlotPoint *o,points){ - //vals[o->x()]=o->y(); - pa.attributes().namedItem("value").setNodeValue(QString::number(o->y())); - } - QPair > pair("contrast",vals); - //ret.append(pair); - } - - emit parameterChanged(itemParameter); - -} + m_max_y = 0; + m_min_y = 0; + removeAllPlotObjects(); + m_stretchFactors.clear(); + m_parameterNameList.clear(); + m_plotobjects.clear(); + QString dat; + QTextStream stre(&dat); + d.save(stre, 2); + kDebug() << dat; + int i = 0; + while (!namenode.item(i).isNull() && namenode.item(i).toElement().attribute("name") != m_paramName) + ++i; -void ParameterPlotter::mouseMoveEvent ( QMouseEvent * event ) { - - if (movepoint!=NULL){ - QList list= pointsUnderPoint (event->pos()-QPoint(leftPadding(), topPadding() ) ) ; - int i=0,j=-1; - foreach (KPlotObject *o, plotObjects() ){ - QList points=o->points(); - for(int p=0;ppos()-oldmousepoint; - if (m_moveY) - movepoint->setY(movepoint->y()-delta.y()*dataRect().height()/pixRect().height() ); - if (p>0 && px()+delta.x()*dataRect().width()/pixRect().width(); - if ( newx>points[p-1]->x() && newxx() && m_moveX) - movepoint->setX(movepoint->x()+delta.x()*dataRect().width()/pixRect().width() ); - } - if (m_moveTimeline && (m_moveX|| m_moveY) ) - emit updateFrame(0); - replacePlotObject(i,o); - oldmousepoint=event->pos(); - } - } - i++; - } - createParametersNew(); - } -} + if (namenode.count()) { + QDomElement pa = namenode.item(i).toElement(); + //QDomNode na = pa.firstChildElement("name"); -void ParameterPlotter::replot(const QString & name){ - //removeAllPlotObjects(); - int i=0; - bool drawAll=name.isEmpty() || name=="all"; - activeIndexPlot=-1; - foreach (KPlotObject* p,plotObjects() ){ - p->setShowPoints(drawAll || parameterNameList[i]==name); - p->setShowLines(drawAll || parameterNameList[i]==name); - if ( parameterNameList[i]==name ) - activeIndexPlot = i; - replacePlotObject(i++,p); - } -} + m_parameterNameList << pa.attribute("namedesc").split(';'); + emit parameterList(m_parameterNameList); -void ParameterPlotter::mousePressEvent ( QMouseEvent * event ) { - //topPadding and other padding can be wrong and this (i hope) will be correctet in newer kde versions - QPoint inPlot=event->pos()-QPoint(leftPadding(), topPadding() ); - QList list= pointsUnderPoint (inPlot ) ; - if (event->button()==Qt::LeftButton){ - if (list.size() > 0){ - movepoint=list[0]; - oldmousepoint=event->pos(); - }else{ - if (m_newPoints && activeIndexPlot>=0){ - //setup new points - KPlotObject* p=plotObjects()[activeIndexPlot]; - QList points=p->points(); - QList newpoints; - - double newx=inPlot.x()*dataRect().width()/pixRect().width(); - double newy=(height()-inPlot.y()-bottomPadding()-topPadding() )*dataRect().height()/pixRect().height(); - bool inserted=false; - foreach (KPlotPoint* pt,points){ - if (pt->x() >newx && !inserted){ - newpoints.append(QPointF(newx,newy)); - inserted=true; - } - newpoints.append(QPointF(pt->x(),pt->y())); - } - p->clearPoints(); - foreach (QPointF qf, newpoints ){ - p->addPoint(qf); - } - replacePlotObject(activeIndexPlot,p); - } - movepoint=NULL; - } - }else if (event->button()==Qt::LeftButton){ - //menu for deleting or exact setup of point - } -} + //max_y=pa.attributes().namedItem("max").nodeValue().toInt(); + //int val=pa.attributes().namedItem("value").nodeValue().toInt(); + QStringList defaults; + if (pa.attribute("start").contains(';')) + defaults = pa.attribute("start").split(';'); + else if (pa.attribute("value").contains(';')) + defaults = pa.attribute("value").split(';'); + else if (pa.attribute("default").contains(';')) + defaults = pa.attribute("default").split(';'); + QStringList maxv = pa.attribute("max").split(';'); + QStringList minv = pa.attribute("min").split(';'); + for (int i = 0; i < maxv.size() && i < minv.size(); ++i) { + if (m_max_y < maxv[i].toInt()) m_max_y = maxv[i].toInt(); + if (m_min_y > minv[i].toInt()) m_min_y = minv[i].toInt(); + } + for (int i = 0; i < m_parameterNameList.count(); ++i) { + KPlotObject *plot = new KPlotObject(m_colors[m_plotobjects.size()%m_colors.size()]); + plot->setShowLines(true); + if (!m_stretchFactors.contains(i) && i < maxv.size()) { + if (maxv[i].toInt() != 0) + m_stretchFactors[i] = m_max_y / maxv[i].toInt(); + else + m_stretchFactors[i] = 1.0; + } + if (i < defaults.size() && defaults[i].toDouble() > m_max_y) + defaults[i] = m_max_y; + int def = 0; + if (i < defaults.size()) + def = (int)(defaults[i].toInt() * m_stretchFactors[i]); + QString name = ""; + if (i < m_parameterNameList.size()) + name = m_parameterNameList[i]; + plot->addPoint(startframe, def, name); + //add keyframes here + plot->addPoint(endframe, def); -void ParameterPlotter::setMoveX(bool b){ - m_moveX=b; -} + m_plotobjects.append(plot); + } -void ParameterPlotter::setMoveY(bool b){ - m_moveY=b; -} + /*TODO keyframes + while (pointit.hasNext()){ + pointit.next(); + plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1); + if (pointit.value().toInt() >maxy) + max_y=pointit.value().toInt(); + }*/ + + } + setLimits(-1, endframe + 1, m_min_y - 10, m_max_y + 10); + + addPlotObjects(m_plotobjects); -void ParameterPlotter::setMoveTimeLine(bool b){ - m_moveTimeline=b; } -void ParameterPlotter::setNewPoints(bool b){ - m_newPoints=b; +void ParameterPlotter::createParametersNew() +{ + QList plotobjs = plotObjects(); + if (plotobjs.size() != m_parameterNameList.size()) { + kDebug() << "ERROR size not equal"; + } + QDomNodeList namenode = m_itemParameter.elementsByTagName("parameter"); + QString paramlist; + QTextStream txtstr(¶mlist); + QDomNode pa = namenode.item(0); + if (!namenode.isEmpty()) { + for (int i = 0; i < plotobjs.count(); ++i) { + QList points = plotobjs.at(i)->points(); + foreach(const KPlotPoint *o, points) { + txtstr << (int)o->y() ; + break;//first no keyframes + } + if (i + 1 != plotobjs.count()) + txtstr << ";"; + } + } + pa.attributes().namedItem("value").setNodeValue(paramlist); + pa.attributes().namedItem("start").setNodeValue(paramlist); + emit parameterChanged(m_itemParameter); + } -bool ParameterPlotter::isMoveX(){ - return m_moveX; + +void ParameterPlotter::mouseMoveEvent(QMouseEvent * event) +{ + + if (m_movepoint != NULL) { + QList list = pointsUnderPoint(event->pos() - QPoint(leftPadding(), topPadding())) ; + int i = 0; + foreach(KPlotObject *o, plotObjects()) { + QList points = o->points(); + for (int p = 0; p < points.size(); p++) { + if (points[p] == m_movepoint && (m_activeIndexPlot == -1 || m_activeIndexPlot == i)) { + QPoint delta = event->pos() - m_oldmousepoint; + double newy = m_movepoint->y() - delta.y() * dataRect().height() / pixRect().height(); + if (m_moveY && newy > m_min_y && newy < m_max_y) + m_movepoint->setY(newy); + if (p > 0 && p < points.size() - 1) { + double newx = m_movepoint->x() + delta.x() * dataRect().width() / pixRect().width(); + if (newx > points[p-1]->x() && newx < points[p+1]->x() && m_moveX) + m_movepoint->setX(m_movepoint->x() + delta.x()*dataRect().width() / pixRect().width()); + } + if (m_moveTimeline && (m_moveX || m_moveY)) + emit updateFrame(0); + replacePlotObject(i, o); + m_oldmousepoint = event->pos(); + } + } + ++i; + } + createParametersNew(); + } } -bool ParameterPlotter::isMoveY(){ - return m_moveY; +void ParameterPlotter::replot(const QString & name) +{ + + //removeAllPlotObjects(); + int i = 0; + bool drawAll = name.isEmpty() || name == "all"; + m_activeIndexPlot = -1; + + + foreach(KPlotObject* p, plotObjects()) { + QString selectedName = "none"; + if (i < m_parameterNameList.size()) + selectedName = m_parameterNameList[i]; + p->setShowPoints(drawAll || selectedName == name); + p->setShowLines(drawAll || selectedName == name); + QPen pen = (drawAll || selectedName == name ? QPen(Qt::SolidLine) : QPen(Qt::NoPen)); + pen.setColor(p->linePen().color()); + p->setLabelPen(pen); + if (selectedName == name) + m_activeIndexPlot = i; + replacePlotObject(++i, p); + } } -bool ParameterPlotter::isMoveTimeline(){ - return m_moveTimeline; +void ParameterPlotter::mousePressEvent(QMouseEvent * event) +{ + //topPadding and other padding can be wrong and this (i hope) will be correctet in newer kde versions + QPoint inPlot = event->pos() - QPoint(leftPadding(), topPadding()); + QList list = pointsUnderPoint(inPlot) ; + if (event->button() == Qt::LeftButton) { + if (list.size() > 0) { + m_movepoint = list[0]; + m_oldmousepoint = event->pos(); + } else { + if (m_newPoints && m_activeIndexPlot >= 0) { + //setup new points + KPlotObject* p = plotObjects()[m_activeIndexPlot]; + QList points = p->points(); + QList newpoints; + + double newx = inPlot.x() * dataRect().width() / pixRect().width(); + double newy = (height() - inPlot.y() - bottomPadding() - topPadding()) * dataRect().height() / pixRect().height(); + bool inserted = false; + foreach(const KPlotPoint* pt, points) { + if (pt->x() > newx && !inserted) { + newpoints.append(QPointF(newx, newy)); + inserted = true; + } + newpoints.append(QPointF(pt->x(), pt->y())); + } + p->clearPoints(); + foreach(const QPointF &qf, newpoints) { + p->addPoint(qf); + } + replacePlotObject(m_activeIndexPlot, p); + } + m_movepoint = NULL; + } + } else if (event->button() == Qt::LeftButton) { + //menu for deleting or exact setup of point + } } -bool ParameterPlotter::isNewPoints(){ - return m_newPoints; +void ParameterPlotter::setMoveX(bool b) +{ + m_moveX = b; } -void EffectStackView::slotSetMoveX(){ - ui.kplotwidget->setMoveX(!ui.kplotwidget->isMoveX()); - updateButtonStatus(); + +void ParameterPlotter::setMoveY(bool b) +{ + m_moveY = b; } -void EffectStackView::slotSetMoveY(){ - ui.kplotwidget->setMoveY(!ui.kplotwidget->isMoveY()); - updateButtonStatus(); +void ParameterPlotter::setMoveTimeLine(bool b) +{ + m_moveTimeline = b; } -void EffectStackView::slotSetNew(){ - ui.kplotwidget->setNewPoints(!ui.kplotwidget->isNewPoints()); - updateButtonStatus(); +void ParameterPlotter::setNewPoints(bool b) +{ + m_newPoints = b; } -void EffectStackView::slotSetHelp(){ - ui.infoBox->setVisible(!ui.infoBox->isVisible()); - ui.buttonHelp->setDown(ui.infoBox->isVisible()); +bool ParameterPlotter::isMoveX() const +{ + return m_moveX; } -void EffectStackView::slotShowInTimeline(){ - - ui.kplotwidget->setMoveTimeLine(!ui.kplotwidget->isMoveTimeline()); - updateButtonStatus(); - +bool ParameterPlotter::isMoveY() const +{ + return m_moveY; } -void EffectStackView::updateButtonStatus(){ - ui.buttonLeftRight->setDown(ui.kplotwidget->isMoveX()); - ui.buttonUpDown->setDown(ui.kplotwidget->isMoveY()); - - ui.buttonShowInTimeline->setEnabled( ui.kplotwidget->isMoveX() || ui.kplotwidget->isMoveY () ); - ui.buttonShowInTimeline->setDown(ui.kplotwidget->isMoveTimeline()); - - ui.buttonNewPoints->setEnabled(ui.parameterList->currentText()!="all"); - ui.buttonNewPoints->setDown(ui.kplotwidget->isNewPoints()); +bool ParameterPlotter::isMoveTimeline() const +{ + return m_moveTimeline; } -void EffectStackView::slotParameterChanged(const QString& text){ - - //ui.buttonNewPoints->setEnabled(text!="all"); - ui.kplotwidget->replot(text); - updateButtonStatus(); -/* -ui.parameterList->clear(); - ui.parameterList->addItem("all"); - QDomNodeList namenode = effects.at(activeRow).elementsByTagName("parameter"); - for (int i=0;iaddItem(na.toElement().text() ); - }*/ +bool ParameterPlotter::isNewPoints() const +{ + return m_newPoints; } -#endif + +#include "parameterplotter.moc"