1 /***************************************************************************
2 parameterplotter.cpp - description
5 copyright : (C) 2008 by Marco Gittler
6 email : g.marco@freenet.de
7 ***************************************************************************/
9 /***************************************************************************
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. *
16 ***************************************************************************/
18 #include "parameterplotter.h"
20 #include <KPlotObject>
21 #include <QMouseEvent>
26 ParameterPlotter::ParameterPlotter(QWidget *parent) :
29 setAntialiasing(true);
35 colors << Qt::white << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::gray << Qt::cyan;
39 m_moveTimeline = true;
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" >
51 <parameter default="4" type="constant" value="4" min="0" name="width" max="255" >
57 void ParameterPlotter::setPointLists(const QDomElement& d, const QString& paramName, int startframe, int endframe)
60 //QListIterator <QPair <QString, QMap< int , QVariant > > > nameit(params);
61 m_paramName = paramName;
63 QDomNodeList namenode = d.elementsByTagName("parameter");
67 removeAllPlotObjects();
68 stretchFactors.clear();
69 parameterNameList.clear();
73 QTextStream stre(&dat);
77 while (!namenode.item(i).isNull() && namenode.item(i).toElement().attribute("name") != m_paramName)
79 if (namenode.count()) {
82 QDomElement pa = namenode.item(i).toElement();
83 QDomNode na = pa.firstChildElement("name");
85 parameterNameList << pa.attribute("namedesc").split(";");
86 emit parameterList(parameterNameList);
88 //max_y=pa.attributes().namedItem("max").nodeValue().toInt();
89 //int val=pa.attributes().namedItem("value").nodeValue().toInt();
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();
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();
110 stretchFactors[i] = 1.0;
112 if (i < defaults.size() && defaults[i].toDouble() > max_y)
115 if (i < defaults.size())
116 def = (int)(defaults[i].toInt() * stretchFactors[i]);
118 if (i < parameterNameList.size())
119 name = parameterNameList[i];
120 plot->addPoint(startframe, def, name);
122 plot->addPoint(endframe, def);
124 plotobjects.append(plot);
128 while (pointit.hasNext()){
130 plot->addPoint(QPointF(pointit.key(),pointit.value().toDouble()),item.first,1);
131 if (pointit.value().toInt() >maxy)
132 max_y=pointit.value().toInt();
138 setLimits(-1, endframe + 1, min_y - 10, maxy + 10);
140 addPlotObjects(plotobjects);
144 void ParameterPlotter::createParametersNew()
146 QList<KPlotObject*> plotobjs = plotObjects();
147 if (plotobjs.size() != parameterNameList.size()) {
148 kDebug() << "ERROR size not equal";
150 QDomNodeList namenode = itemParameter.elementsByTagName("parameter");
152 QTextStream txtstr(¶mlist);
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
161 if (i + 1 != plotobjs.count())
165 pa.attributes().namedItem("value").setNodeValue(paramlist);
166 pa.attributes().namedItem("start").setNodeValue(paramlist);
167 emit parameterChanged(itemParameter);
172 void ParameterPlotter::mouseMoveEvent(QMouseEvent * event)
175 if (movepoint != NULL) {
176 QList<KPlotPoint*> list = pointsUnderPoint(event->pos() - QPoint(leftPadding(), topPadding())) ;
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());
191 if (m_moveTimeline && (m_moveX || m_moveY))
193 replacePlotObject(i, o);
194 oldmousepoint = event->pos();
199 createParametersNew();
203 void ParameterPlotter::replot(const QString & name)
206 //removeAllPlotObjects();
208 bool drawAll = name.isEmpty() || name == "all";
209 activeIndexPlot = -1;
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());
221 if (selectedName == name)
223 replacePlotObject(i++, p);
227 void ParameterPlotter::mousePressEvent(QMouseEvent * event)
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) {
235 oldmousepoint = event->pos();
237 if (m_newPoints && activeIndexPlot >= 0) {
239 KPlotObject* p = plotObjects()[activeIndexPlot];
240 QList<KPlotPoint*> points = p->points();
241 QList<QPointF> newpoints;
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));
251 newpoints.append(QPointF(pt->x(), pt->y()));
254 foreach(const QPointF qf, newpoints) {
257 replacePlotObject(activeIndexPlot, p);
261 } else if (event->button() == Qt::LeftButton) {
262 //menu for deleting or exact setup of point
266 void ParameterPlotter::setMoveX(bool b)
271 void ParameterPlotter::setMoveY(bool b)
276 void ParameterPlotter::setMoveTimeLine(bool b)
281 void ParameterPlotter::setNewPoints(bool b)
286 bool ParameterPlotter::isMoveX()
291 bool ParameterPlotter::isMoveY()
296 bool ParameterPlotter::isMoveTimeline()
298 return m_moveTimeline;
301 bool ParameterPlotter::isNewPoints()