]> git.sesse.net Git - kdenlive/blob - src/parameterplotter.cpp
Reformat initializer lists in all constructors.
[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 <QPen>
23 #include <KDebug>
24 #include <KPlotPoint>
25
26 ParameterPlotter::ParameterPlotter(QWidget *parent) :
27         KPlotWidget(parent)
28 {
29     setAntialiasing(true);
30     setLeftPadding(20);
31     setRightPadding(10);
32     setTopPadding(10);
33     setBottomPadding(20);
34     movepoint = NULL;
35     colors << Qt::white << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::gray << Qt::cyan;
36     maxy = 0;
37     m_moveX = false;
38     m_moveY = true;
39     m_moveTimeline = true;
40     m_newPoints = false;
41     activeIndexPlot = -1;
42 }
43 /*
44     <name>Lines</name>
45     <description>Lines from top to bottom</description>
46     <author>Marco Gittler</author>
47     <properties tag="lines" id="lines" />
48     <parameter default="5" type="constant" value="5" min="0" name="num" max="255" >
49       <name>Num</name>
50     </parameter>
51     <parameter default="4" type="constant" value="4" min="0" name="width" max="255" >
52       <name>Width</name>
53     </parameter>
54   </effect>
55
56 */
57 void ParameterPlotter::setPointLists(const QDomElement& d, const QString& paramName, int startframe, int endframe)
58 {
59
60     //QListIterator <QPair <QString, QMap< int , QVariant > > > nameit(params);
61     m_paramName = paramName;
62     itemParameter = d;
63     QDomNodeList namenode = d.elementsByTagName("parameter");
64
65     max_y = 0;
66     min_y = 0;
67     removeAllPlotObjects();
68     stretchFactors.clear();
69     parameterNameList.clear();
70     plotobjects.clear();
71
72     QString dat;
73     QTextStream stre(&dat);
74     d.save(stre, 2);
75     kDebug() << dat;
76     int i = 0;
77     while (!namenode.item(i).isNull() && namenode.item(i).toElement().attribute("name") != m_paramName)
78         i++;
79     if (namenode.count()) {
80
81
82         QDomElement pa = namenode.item(i).toElement();
83         QDomNode na = pa.firstChildElement("name");
84
85         parameterNameList << pa.attribute("namedesc").split(";");
86         emit parameterList(parameterNameList);
87
88         //max_y=pa.attributes().namedItem("max").nodeValue().toInt();
89         //int val=pa.attributes().namedItem("value").nodeValue().toInt();
90         QStringList defaults;
91         if (pa.attribute("start").contains(";"))
92             defaults = pa.attribute("start").split(";");
93         else if (pa.attribute("value").contains(";"))
94             defaults = pa.attribute("value").split(";");
95         else if (pa.attribute("default").contains(";"))
96             defaults = pa.attribute("default").split(";");
97         QStringList maxv = pa.attribute("max").split(";");
98         QStringList minv = pa.attribute("min").split(";");
99         for (int i = 0;i < maxv.size() && i < minv.size();i++) {
100             if (max_y < maxv[i].toInt()) max_y = maxv[i].toInt();
101             if (min_y > minv[i].toInt()) min_y = minv[i].toInt();
102         }
103         for (int i = 0;i < parameterNameList.count();i++) {
104             KPlotObject *plot = new KPlotObject(colors[plotobjects.size()%colors.size()]);
105             plot->setShowLines(true);
106             if (!stretchFactors.contains(i) && i < maxv.size()) {
107                 if (maxv[i].toInt() != 0)
108                     stretchFactors[i] = max_y / maxv[i].toInt();
109                 else
110                     stretchFactors[i] = 1.0;
111             }
112             if (i < defaults.size() && defaults[i].toDouble() > max_y)
113                 defaults[i] = max_y;
114             int def = 0;
115             if (i < defaults.size())
116                 def = (int)(defaults[i].toInt() * stretchFactors[i]);
117             QString name = "";
118             if (i < parameterNameList.size())
119                 name = parameterNameList[i];
120             plot->addPoint(startframe, def, name);
121             //add keyframes here
122             plot->addPoint(endframe, def);
123
124             plotobjects.append(plot);
125         }
126
127         /*TODO keyframes
128         while (pointit.hasNext()){
129          pointit.next();
130          plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1);
131          if (pointit.value().toInt() >maxy)
132           max_y=pointit.value().toInt();
133         }*/
134
135     }
136     maxx = endframe;
137     maxy = max_y;
138     setLimits(-1, endframe + 1, min_y - 10, maxy + 10);
139
140     addPlotObjects(plotobjects);
141
142 }
143
144 void ParameterPlotter::createParametersNew()
145 {
146     QList<KPlotObject*> plotobjs = plotObjects();
147     if (plotobjs.size() != parameterNameList.size()) {
148         kDebug() << "ERROR size not equal";
149     }
150     QDomNodeList namenode = itemParameter.elementsByTagName("parameter");
151     QString paramlist;
152     QTextStream txtstr(&paramlist);
153     QDomNode pa = namenode.item(0);
154     if (namenode.count() > 0) {
155         for (int i = 0;i < plotobjs.count();i++) {
156             QList<KPlotPoint*> points = plotobjs[i]->points();
157             foreach(const KPlotPoint *o, points) {
158                 txtstr << (int)o->y() ;
159                 break;//first no keyframes
160             }
161             if (i + 1 != plotobjs.count())
162                 txtstr << ";";
163         }
164     }
165     pa.attributes().namedItem("value").setNodeValue(paramlist);
166     pa.attributes().namedItem("start").setNodeValue(paramlist);
167     emit parameterChanged(itemParameter);
168
169 }
170
171
172 void ParameterPlotter::mouseMoveEvent(QMouseEvent * event)
173 {
174
175     if (movepoint != NULL) {
176         QList<KPlotPoint*> list =   pointsUnderPoint(event->pos() - QPoint(leftPadding(), topPadding())) ;
177         int i = 0;
178         foreach(KPlotObject *o, plotObjects()) {
179             QList<KPlotPoint*> points = o->points();
180             for (int p = 0;p < points.size();p++) {
181                 if (points[p] == movepoint && (activeIndexPlot == -1 || activeIndexPlot == i)) {
182                     QPoint delta = event->pos() - oldmousepoint;
183                     double newy = movepoint->y() - delta.y() * dataRect().height() / pixRect().height();
184                     if (m_moveY && newy > min_y && newy < max_y)
185                         movepoint->setY(newy);
186                     if (p > 0 && p < points.size() - 1) {
187                         double newx = movepoint->x() + delta.x() * dataRect().width() / pixRect().width();
188                         if (newx > points[p-1]->x() && newx < points[p+1]->x() && m_moveX)
189                             movepoint->setX(movepoint->x() + delta.x()*dataRect().width() / pixRect().width());
190                     }
191                     if (m_moveTimeline && (m_moveX || m_moveY))
192                         emit updateFrame(0);
193                     replacePlotObject(i, o);
194                     oldmousepoint = event->pos();
195                 }
196             }
197             i++;
198         }
199         createParametersNew();
200     }
201 }
202
203 void ParameterPlotter::replot(const QString & name)
204 {
205
206     //removeAllPlotObjects();
207     int i = 0;
208     bool drawAll = name.isEmpty() || name == "all";
209     activeIndexPlot = -1;
210
211
212     foreach(KPlotObject* p, plotObjects()) {
213         QString selectedName = "none";
214         if (i < parameterNameList.size())
215             selectedName = parameterNameList[i];
216         p->setShowPoints(drawAll || selectedName == name);
217         p->setShowLines(drawAll || selectedName == name);
218         QPen pen = (drawAll || selectedName == name ? QPen(Qt::SolidLine) : QPen(Qt::NoPen));
219         pen.setColor(p->linePen().color());
220         p->setLabelPen(pen);
221         if (selectedName == name)
222             activeIndexPlot = i;
223         replacePlotObject(i++, p);
224     }
225 }
226
227 void ParameterPlotter::mousePressEvent(QMouseEvent * event)
228 {
229     //topPadding and other padding can be wrong and this (i hope) will be correctet in newer kde versions
230     QPoint inPlot = event->pos() - QPoint(leftPadding(), topPadding());
231     QList<KPlotPoint*> list =   pointsUnderPoint(inPlot) ;
232     if (event->button() == Qt::LeftButton) {
233         if (list.size() > 0) {
234             movepoint = list[0];
235             oldmousepoint = event->pos();
236         } else {
237             if (m_newPoints && activeIndexPlot >= 0) {
238                 //setup new points
239                 KPlotObject* p = plotObjects()[activeIndexPlot];
240                 QList<KPlotPoint*> points = p->points();
241                 QList<QPointF> newpoints;
242
243                 double newx = inPlot.x() * dataRect().width() / pixRect().width();
244                 double newy = (height() - inPlot.y() - bottomPadding() - topPadding()) * dataRect().height() / pixRect().height();
245                 bool inserted = false;
246                 foreach(const KPlotPoint* pt, points) {
247                     if (pt->x() > newx && !inserted) {
248                         newpoints.append(QPointF(newx, newy));
249                         inserted = true;
250                     }
251                     newpoints.append(QPointF(pt->x(), pt->y()));
252                 }
253                 p->clearPoints();
254                 foreach(const QPointF qf, newpoints) {
255                     p->addPoint(qf);
256                 }
257                 replacePlotObject(activeIndexPlot, p);
258             }
259             movepoint = NULL;
260         }
261     } else if (event->button() == Qt::LeftButton) {
262         //menu for deleting or exact setup of point
263     }
264 }
265
266 void ParameterPlotter::setMoveX(bool b)
267 {
268     m_moveX = b;
269 }
270
271 void ParameterPlotter::setMoveY(bool b)
272 {
273     m_moveY = b;
274 }
275
276 void ParameterPlotter::setMoveTimeLine(bool b)
277 {
278     m_moveTimeline = b;
279 }
280
281 void ParameterPlotter::setNewPoints(bool b)
282 {
283     m_newPoints = b;
284 }
285
286 bool ParameterPlotter::isMoveX()
287 {
288     return m_moveX;
289 }
290
291 bool ParameterPlotter::isMoveY()
292 {
293     return m_moveY;
294 }
295
296 bool ParameterPlotter::isMoveTimeline()
297 {
298     return m_moveTimeline;
299 }
300
301 bool ParameterPlotter::isNewPoints()
302 {
303     return m_newPoints;
304 }