]> git.sesse.net Git - kdenlive/blob - src/parameterplotter.cpp
uses mix/max as limit and stretch value range to max
[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         max_y=0;
61         min_y=0;
62         removeAllPlotObjects ();
63         stretchFactors.clear();
64         parameterNameList.clear();
65         plotobjects.clear();
66         
67         QString dat;
68         QTextStream stre(&dat);
69         d.save(stre,2);
70         kDebug() << dat;
71
72         if ( namenode.count() ){
73                 
74                 
75                 QDomNode pa=namenode.item(0);
76                 QDomNode na=pa.firstChildElement("name");
77                 
78                 parameterNameList << pa.attributes().namedItem("name").nodeValue().split(";");
79                 emit parameterList(parameterNameList);
80                 
81                 //max_y=pa.attributes().namedItem("max").nodeValue().toInt();
82                 //int val=pa.attributes().namedItem("value").nodeValue().toInt();
83                 QStringList defauls=pa.attributes().namedItem("default").nodeValue().split(";");
84                 QStringList maxv=pa.attributes().namedItem("max").nodeValue().split(";");
85                 QStringList minv=pa.attributes().namedItem("max").nodeValue().split(";");
86                 for (int i=0;i<maxv.size();i++){
87                         if (max_y< maxv[i].toInt()) max_y=maxv[i].toInt();
88                         if (min_y> minv[i].toInt()) min_y=minv[i].toInt();
89                 }
90                 
91                 for (int i=0;i<parameterNameList.count();i++){
92                         KPlotObject *plot=new KPlotObject(colors[plotobjects.size()%colors.size()]);
93                         plot->setShowLines(true);
94                         if (!stretchFactors.contains(i) ){
95                                 if ( maxv[i].toInt()!=0)
96                                         stretchFactors[i]=max_y/maxv[i].toInt();
97                                 else
98                                         stretchFactors[i]=1.0;
99                         }
100                         
101                         plot->addPoint(startframe,defauls[i].toInt()*stretchFactors[i]);
102                         //add keyframes here
103                         plot->addPoint(endframe,defauls[i].toInt()*stretchFactors[i]);
104                 
105                         plotobjects.append(plot);
106                 }
107                 
108                 /*TODO keyframes
109                 while (pointit.hasNext()){
110                         pointit.next();
111                         plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1);
112                         if (pointit.value().toInt() >maxy)
113                                 max_y=pointit.value().toInt();
114                 }*/
115                 
116         }
117         maxx=endframe;
118         maxy=max_y;
119         setLimits(-1,endframe+1,min_y-10,maxy+10);
120         addPlotObjects(plotobjects);
121
122 }
123
124 void ParameterPlotter::createParametersNew(){
125         
126         QList<KPlotObject*> plotobjs=plotObjects();
127         if (plotobjs.size() != parameterNameList.size() ){
128                 kDebug() << "ERROR size not equal";
129         }
130         QDomNodeList namenode = itemParameter.elementsByTagName("parameter");
131         for (int i=0;i<namenode.count() ;i++){
132                 QList<KPlotPoint*> points=plotobjs[i]->points();
133                 QDomNode pa=namenode.item(i);
134                 
135                 
136                 
137                 
138                 
139                 
140                 QMap<int,QVariant> vals;
141                 foreach (KPlotPoint *o,points){
142                         //vals[o->x()]=o->y();
143                         pa.attributes().namedItem("value").setNodeValue(QString::number(o->y()));
144                 }
145                 QPair<QString,QMap<int,QVariant> > pair("contrast",vals);
146                 //ret.append(pair);
147         }
148         
149         emit parameterChanged(itemParameter);
150         
151 }
152
153
154 void ParameterPlotter::mouseMoveEvent ( QMouseEvent * event ) {
155         
156         if (movepoint!=NULL){
157                 QList<KPlotPoint*> list=   pointsUnderPoint (event->pos()-QPoint(leftPadding(), topPadding() )  ) ;
158                 int i=0,j=-1;
159                 foreach (KPlotObject *o, plotObjects() ){
160                         QList<KPlotPoint*> points=o->points();
161                         for(int p=0;p<points.size();p++){
162                                 if (points[p]==movepoint){
163                                         QPoint delta=event->pos()-oldmousepoint;
164                                         double newy=movepoint->y()-delta.y()*dataRect().height()/pixRect().height();
165                                         if (m_moveY && newy>min_y && newy<max_y)
166                                                 movepoint->setY(newy);
167                                         if (p>0 && p<points.size()-1){
168                                                 double newx=movepoint->x()+delta.x()*dataRect().width()/pixRect().width();
169                                                 if ( newx>points[p-1]->x() && newx<points[p+1]->x() && m_moveX)
170                                                         movepoint->setX(movepoint->x()+delta.x()*dataRect().width()/pixRect().width() );
171                                         }
172                                         if (m_moveTimeline && (m_moveX|| m_moveY) )
173                                                 emit updateFrame(0);
174                                         replacePlotObject(i,o);
175                                         oldmousepoint=event->pos();
176                                 }
177                         }
178                         i++;
179                 }
180                 createParametersNew();
181         }
182 }
183
184 void ParameterPlotter::replot(const QString & name){
185         //removeAllPlotObjects();
186         int i=0;
187         bool drawAll=name.isEmpty() || name=="all";
188         activeIndexPlot=-1;
189         foreach (KPlotObject* p,plotObjects() ){
190                 p->setShowPoints(drawAll || parameterNameList[i]==name);
191                 p->setShowLines(drawAll || parameterNameList[i]==name);
192                 if ( parameterNameList[i]==name )
193                         activeIndexPlot = i;
194                 replacePlotObject(i++,p);
195         }
196 }
197
198 void ParameterPlotter::mousePressEvent ( QMouseEvent * event ) {
199         //topPadding and other padding can be wrong and this (i hope) will be correctet in newer kde versions
200         QPoint inPlot=event->pos()-QPoint(leftPadding(), topPadding() );
201         QList<KPlotPoint*> list=   pointsUnderPoint (inPlot ) ;
202         if (event->button()==Qt::LeftButton){
203                 if (list.size() > 0){
204                         movepoint=list[0];
205                         oldmousepoint=event->pos();
206                 }else{
207                         if (m_newPoints && activeIndexPlot>=0){
208                                 //setup new points
209                                 KPlotObject* p=plotObjects()[activeIndexPlot];
210                                 QList<KPlotPoint*> points=p->points();
211                                 QList<QPointF> newpoints;
212                                 
213                                 double newx=inPlot.x()*dataRect().width()/pixRect().width();
214                                 double newy=(height()-inPlot.y()-bottomPadding()-topPadding() )*dataRect().height()/pixRect().height();
215                                 bool inserted=false;
216                                 foreach (KPlotPoint* pt,points){
217                                         if (pt->x() >newx && !inserted){
218                                                 newpoints.append(QPointF(newx,newy));
219                                                 inserted=true;
220                                         }
221                                         newpoints.append(QPointF(pt->x(),pt->y()));
222                                 }
223                                 p->clearPoints();
224                                 foreach (QPointF qf, newpoints ){
225                                         p->addPoint(qf);
226                                 }
227                                 replacePlotObject(activeIndexPlot,p);
228                         }
229                         movepoint=NULL;
230                 }
231         }else if (event->button()==Qt::LeftButton){
232                 //menu for deleting or exact setup of point
233         }
234 }
235
236 void ParameterPlotter::setMoveX(bool b){
237         m_moveX=b;
238 }
239
240 void ParameterPlotter::setMoveY(bool b){
241         m_moveY=b;
242 }
243
244 void ParameterPlotter::setMoveTimeLine(bool b){
245         m_moveTimeline=b;
246 }
247
248 void ParameterPlotter::setNewPoints(bool b){
249         m_newPoints=b;
250 }
251
252 bool ParameterPlotter::isMoveX(){
253         return m_moveX;
254 }
255
256 bool ParameterPlotter::isMoveY(){
257         return m_moveY;
258 }
259
260 bool ParameterPlotter::isMoveTimeline(){
261         return m_moveTimeline;
262 }
263
264 bool ParameterPlotter::isNewPoints(){
265         return m_newPoints;
266 }