]> git.sesse.net Git - kdenlive/blob - src/parameterplotter.cpp
complexparameter can now read "complex"
[kdenlive] / src / parameterplotter.cpp
1 /***************************************************************************
2                           parameterplotter.cpp  -  description
3                              -------------------
4     begin                : Feb 15 2008
5     copyright            : (C) 2008 by Marco Gittler
6     email                : g.marco@freenet.de
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18 #include "parameterplotter.h"
19 #include <QVariant>
20 #include <KPlotObject>
21 #include <QMouseEvent>
22 #include <KDebug>
23 #include <KPlotPoint>
24
25 ParameterPlotter::ParameterPlotter (QWidget *parent):KPlotWidget (parent){
26         setAntialiasing(true);
27         setLeftPadding(20);
28         setRightPadding(10);
29         setTopPadding(10);
30         setBottomPadding(20);
31         movepoint=NULL;
32         colors << Qt::white << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::gray << Qt::cyan;
33         maxy=0;
34         m_moveX=false;
35         m_moveY=true;
36         m_moveTimeline=true;
37         m_newPoints=false;
38         activeIndexPlot=-1;
39 }
40 /*
41     <name>Lines</name>
42     <description>Lines from top to bottom</description>
43     <author>Marco Gittler</author>
44     <properties tag="lines" id="lines" />
45     <parameter default="5" type="constant" value="5" min="0" name="num" max="255" >
46       <name>Num</name>
47     </parameter>
48     <parameter default="4" type="constant" value="4" min="0" name="width" max="255" >
49       <name>Width</name>
50     </parameter>
51   </effect>
52
53 */
54 void ParameterPlotter::setPointLists(const QDomElement& d,int startframe,int endframe){
55         
56         //QListIterator <QPair <QString, QMap< int , QVariant > > > nameit(params);
57         itemParameter=d;
58         QDomNodeList namenode = d.elementsByTagName("parameter");
59         
60         int max_y=0,min_y=0;
61         removeAllPlotObjects ();
62         parameterNameList.clear();
63         plotobjects.clear();
64         
65         QString dat;
66         QTextStream stre(&dat);
67         d.save(stre,2);
68         kDebug() << dat;
69
70         if ( namenode.count() ){
71                 
72                 
73                 QDomNode pa=namenode.item(0);
74                 QDomNode na=pa.firstChildElement("name");
75                 
76                 parameterNameList << pa.attributes().namedItem("name").nodeValue().split(";");
77                 emit parameterList(parameterNameList);
78                 
79                 //max_y=pa.attributes().namedItem("max").nodeValue().toInt();
80                 //int val=pa.attributes().namedItem("value").nodeValue().toInt();
81                 QStringList defauls=pa.attributes().namedItem("default").nodeValue().split(";");
82                 QStringList maxv=pa.attributes().namedItem("max").nodeValue().split(";");
83                 QStringList minv=pa.attributes().namedItem("max").nodeValue().split(";");
84                 for (int i=0;i<maxv.size();i++){
85                         if (max_y< maxv[i].toInt()) max_y=maxv[i].toInt();
86                         if (min_y< minv[i].toInt()) min_y=minv[i].toInt();
87                 }
88                 
89                 for (int i=0;i<parameterNameList.count();i++){
90                         KPlotObject *plot=new KPlotObject(colors[plotobjects.size()%colors.size()]);
91                         plot->setShowLines(true);
92                         
93                         plot->addPoint(startframe,defauls[i].toInt());
94                         //add keyframes here
95                         plot->addPoint(endframe,defauls[i].toInt());
96                 
97                         plotobjects.append(plot);
98                 }
99                 
100                 /*TODO keyframes
101                 while (pointit.hasNext()){
102                         pointit.next();
103                         plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1);
104                         if (pointit.value().toInt() >maxy)
105                                 max_y=pointit.value().toInt();
106                 }*/
107                 
108         }
109         maxx=endframe;
110         maxy=max_y;
111         setLimits(-1,endframe+1,-1,maxy+10);
112         addPlotObjects(plotobjects);
113
114 }
115
116 void ParameterPlotter::createParametersNew(){
117         
118         QList<KPlotObject*> plotobjs=plotObjects();
119         if (plotobjs.size() != parameterNameList.size() ){
120                 kDebug() << "ERROR size not equal";
121         }
122         QDomNodeList namenode = itemParameter.elementsByTagName("parameter");
123         for (int i=0;i<namenode.count() ;i++){
124                 QList<KPlotPoint*> points=plotobjs[i]->points();
125                 QDomNode pa=namenode.item(i);
126                 
127                 
128                 
129                 
130                 
131                 
132                 QMap<int,QVariant> vals;
133                 foreach (KPlotPoint *o,points){
134                         //vals[o->x()]=o->y();
135                         pa.attributes().namedItem("value").setNodeValue(QString::number(o->y()));
136                 }
137                 QPair<QString,QMap<int,QVariant> > pair("contrast",vals);
138                 //ret.append(pair);
139         }
140         
141         emit parameterChanged(itemParameter);
142         
143 }
144
145
146 void ParameterPlotter::mouseMoveEvent ( QMouseEvent * event ) {
147         
148         if (movepoint!=NULL){
149                 QList<KPlotPoint*> list=   pointsUnderPoint (event->pos()-QPoint(leftPadding(), topPadding() )  ) ;
150                 int i=0,j=-1;
151                 foreach (KPlotObject *o, plotObjects() ){
152                         QList<KPlotPoint*> points=o->points();
153                         for(int p=0;p<points.size();p++){
154                                 if (points[p]==movepoint){
155                                         QPoint delta=event->pos()-oldmousepoint;
156                                         if (m_moveY)
157                                         movepoint->setY(movepoint->y()-delta.y()*dataRect().height()/pixRect().height() );
158                                         if (p>0 && p<points.size()-1){
159                                                 double newx=movepoint->x()+delta.x()*dataRect().width()/pixRect().width();
160                                                 if ( newx>points[p-1]->x() && newx<points[p+1]->x() && m_moveX)
161                                                         movepoint->setX(movepoint->x()+delta.x()*dataRect().width()/pixRect().width() );
162                                         }
163                                         if (m_moveTimeline && (m_moveX|| m_moveY) )
164                                                 emit updateFrame(0);
165                                         replacePlotObject(i,o);
166                                         oldmousepoint=event->pos();
167                                 }
168                         }
169                         i++;
170                 }
171                 createParametersNew();
172         }
173 }
174
175 void ParameterPlotter::replot(const QString & name){
176         //removeAllPlotObjects();
177         int i=0;
178         bool drawAll=name.isEmpty() || name=="all";
179         activeIndexPlot=-1;
180         foreach (KPlotObject* p,plotObjects() ){
181                 p->setShowPoints(drawAll || parameterNameList[i]==name);
182                 p->setShowLines(drawAll || parameterNameList[i]==name);
183                 if ( parameterNameList[i]==name )
184                         activeIndexPlot = i;
185                 replacePlotObject(i++,p);
186         }
187 }
188
189 void ParameterPlotter::mousePressEvent ( QMouseEvent * event ) {
190         //topPadding and other padding can be wrong and this (i hope) will be correctet in newer kde versions
191         QPoint inPlot=event->pos()-QPoint(leftPadding(), topPadding() );
192         QList<KPlotPoint*> list=   pointsUnderPoint (inPlot ) ;
193         if (event->button()==Qt::LeftButton){
194                 if (list.size() > 0){
195                         movepoint=list[0];
196                         oldmousepoint=event->pos();
197                 }else{
198                         if (m_newPoints && activeIndexPlot>=0){
199                                 //setup new points
200                                 KPlotObject* p=plotObjects()[activeIndexPlot];
201                                 QList<KPlotPoint*> points=p->points();
202                                 QList<QPointF> newpoints;
203                                 
204                                 double newx=inPlot.x()*dataRect().width()/pixRect().width();
205                                 double newy=(height()-inPlot.y()-bottomPadding()-topPadding() )*dataRect().height()/pixRect().height();
206                                 bool inserted=false;
207                                 foreach (KPlotPoint* pt,points){
208                                         if (pt->x() >newx && !inserted){
209                                                 newpoints.append(QPointF(newx,newy));
210                                                 inserted=true;
211                                         }
212                                         newpoints.append(QPointF(pt->x(),pt->y()));
213                                 }
214                                 p->clearPoints();
215                                 foreach (QPointF qf, newpoints ){
216                                         p->addPoint(qf);
217                                 }
218                                 replacePlotObject(activeIndexPlot,p);
219                         }
220                         movepoint=NULL;
221                 }
222         }else if (event->button()==Qt::LeftButton){
223                 //menu for deleting or exact setup of point
224         }
225 }
226
227 void ParameterPlotter::setMoveX(bool b){
228         m_moveX=b;
229 }
230
231 void ParameterPlotter::setMoveY(bool b){
232         m_moveY=b;
233 }
234
235 void ParameterPlotter::setMoveTimeLine(bool b){
236         m_moveTimeline=b;
237 }
238
239 void ParameterPlotter::setNewPoints(bool b){
240         m_newPoints=b;
241 }
242
243 bool ParameterPlotter::isMoveX(){
244         return m_moveX;
245 }
246
247 bool ParameterPlotter::isMoveY(){
248         return m_moveY;
249 }
250
251 bool ParameterPlotter::isMoveTimeline(){
252         return m_moveTimeline;
253 }
254
255 bool ParameterPlotter::isNewPoints(){
256         return m_newPoints;
257 }