]> git.sesse.net Git - kdenlive/blobdiff - src/parameterplotter.cpp
Const'ref
[kdenlive] / src / parameterplotter.cpp
index ef4b883be80262c8f5a8d96de3fdd5eaacfede25..5550ba658e60882db2d30869bb4cdef0fe2018dc 100644 (file)
  *   (at your option) any later version.                                   *
  *                                                                         *
  ***************************************************************************/
-#if 0
+
 #include "parameterplotter.h"
 #include <QVariant>
 #include <KPlotObject>
 #include <QMouseEvent>
+#include <QPen>
 #include <KDebug>
 #include <KPlotPoint>
 
-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;
 }
 /*
     <name>Lines</name>
@@ -69,240 +55,250 @@ updateButtonStatus();
   </effect>
 
 */
-void ParameterPlotter::setPointLists(const QDomElement& d,int startframe,int endframe){
-       
-       //QListIterator <QPair <QString, QMap< int , QVariant > > > 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<QString, QMap< int , QVariant > > 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 <QPair <QString, QMap< int , QVariant > > > nameit(params);
+    m_paramName = paramName;
+    m_itemParameter = d;
+    QDomNodeList namenode = d.elementsByTagName("parameter");
 
-void ParameterPlotter::createParametersNew(){
-       
-       QList<KPlotObject*> plotobjs=plotObjects();
-       if (plotobjs.size() != parameterNameList.size() ){
-               kDebug() << "ERROR size not equal";
-       }
-       QDomNodeList namenode = itemParameter.elementsByTagName("parameter");
-       for (int i=0;i<namenode.count() ;i++){
-               QList<KPlotPoint*> points=plotobjs[i]->points();
-               QDomNode pa=namenode.item(i);
-               
-               
-               
-               
-               
-               
-               QMap<int,QVariant> vals;
-               foreach (KPlotPoint *o,points){
-                       //vals[o->x()]=o->y();
-                       pa.attributes().namedItem("value").setNodeValue(QString::number(o->y()));
-               }
-               QPair<QString,QMap<int,QVariant> > 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<KPlotPoint*> list=   pointsUnderPoint (event->pos()-QPoint(leftPadding(), topPadding() )  ) ;
-               int i=0,j=-1;
-               foreach (KPlotObject *o, plotObjects() ){
-                       QList<KPlotPoint*> points=o->points();
-                       for(int p=0;p<points.size();p++){
-                               if (points[p]==movepoint){
-                                       QPoint delta=event->pos()-oldmousepoint;
-                                       if (m_moveY)
-                                       movepoint->setY(movepoint->y()-delta.y()*dataRect().height()/pixRect().height() );
-                                       if (p>0 && p<points.size()-1){
-                                               double newx=movepoint->x()+delta.x()*dataRect().width()/pixRect().width();
-                                               if ( newx>points[p-1]->x() && newx<points[p+1]->x() && 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<KPlotPoint*> 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<KPlotPoint*> points=p->points();
-                               QList<QPointF> 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<KPlotObject*> plotobjs = plotObjects();
+    if (plotobjs.size() != m_parameterNameList.size()) {
+        kDebug() << "ERROR size not equal";
+    }
+    QDomNodeList namenode = m_itemParameter.elementsByTagName("parameter");
+    QString paramlist;
+    QTextStream txtstr(&paramlist);
+    QDomNode pa = namenode.item(0);
+    if (!namenode.isEmpty()) {
+        for (int i = 0; i < plotobjs.count(); ++i) {
+            QList<KPlotPoint*> 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<KPlotPoint*> list =   pointsUnderPoint(event->pos() - QPoint(leftPadding(), topPadding())) ;
+        int i = 0;
+        foreach(KPlotObject *o, plotObjects()) {
+            QList<KPlotPoint*> 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<KPlotPoint*> 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<KPlotPoint*> points = p->points();
+                QList<QPointF> 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;i<namenode.count();i++){
-                       QDomNode pa=namenode.item(i);
-                       QDomNode na=pa.firstChildElement("name");
-                       ui.parameterList->addItem(na.toElement().text() );
-               }*/
+bool ParameterPlotter::isNewPoints() const
+{
+    return m_newPoints;
 }
-#endif
+
+#include "parameterplotter.moc"