2 * This file is part of jSpeed.
4 * jSpeed is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * jSpeed is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with jSpeed. If not, see <http://www.gnu.org/licenses/>.
19 #include <QtGui/QGraphicsPixmapItem>
20 #include <QtCore/QDebug>
21 #include <QtCore/QTimeLine>
25 #include "graphicsscene.h"
30 const GraphicsElement::AttributeDetails ATTRIBUTES[Pointer::ATTRIBUTE_COUNT] =
40 {"xrotationpoint", true},
41 {"yrotationpoint", true}
44 int const ANIMATION_TIME = 500;
45 int const ANIMATION_FRAMES = 50;
46 int const ANIMATION_UPDATEINTERVAL = 20;
49 Pointer::Pointer(Reader* reader, bool animate): QObject(0), GraphicsElement(reader),
50 xRotationPoint_(0), yRotationPoint_(0), x_(0), y_(0), zeroAngle_(0),
51 fullAngle_(180), zeroSpeed_(0), fullSpeed_(220), targetAngle_(0),
52 startAngle_(0), angle_(-1), imageSet_(false), animate_(animate), timer_(0)
54 element_ = new QGraphicsPixmapItem();
58 timer_ = new QTimeLine(ANIMATION_TIME);
59 timer_->setFrameRange(0, ANIMATION_FRAMES);
60 timer_->setUpdateInterval(ANIMATION_UPDATEINTERVAL);
61 connect(timer_, SIGNAL(frameChanged(int)), this, SLOT(setFrame(int)));
71 bool Pointer::setAttribute(QString const& name, QString const& value)
76 if((attrId = getAttribute(name, value, ATTRIBUTES, ATTRIBUTE_COUNT, intVal)) != -1)
78 Attribute attr = static_cast<Attribute>(attrId);
89 element_->setZValue(intVal);
92 return loadImage(value);
107 xRotationPoint_ = intVal;
110 yRotationPoint_ = intVal;
113 qDebug() << "Unknown attribute: " << attr;
125 void Pointer::addToScene(GraphicsScene* scene)
132 element_->setTransformOriginPoint(xRotationPoint_, yRotationPoint_);
133 element_->setX(x_ - xRotationPoint_);
134 element_->setY(y_ - yRotationPoint_);
136 bool animateVal = animate_;
139 animate_ = animateVal;
141 scene->addItem(element_);
144 void Pointer::update()
146 double speed = Odometer::instance().getLatestFix().kmSpeed;
148 if(speed < zeroSpeed_)
150 speed = static_cast<double>(zeroSpeed_);
152 else if(speed > fullSpeed_)
154 speed = static_cast<double>(fullSpeed_);
157 double multiplier = static_cast<double>(speed - zeroSpeed_) / (fullSpeed_ - zeroSpeed_);
158 double angle = static_cast<double>(zeroAngle_) + ((fullAngle_ - zeroAngle_) * multiplier);
160 int rounded = static_cast<int>(round(angle));
162 if(rounded == angle_)
171 element_->setRotation(rounded);
175 targetAngle_ = rounded;
176 startAngle_ = element_->rotation();
178 if(timer_->state() == QTimeLine::Running)
187 void Pointer::setFrame(int frame)
189 element_->setRotation(startAngle_ + ((static_cast<double>(frame) / ANIMATION_FRAMES) * (targetAngle_ - startAngle_)));
192 bool Pointer::loadImage(QString const& name)
197 if(!readFile(name, data))
202 if(!pixmap.loadFromData(data))
204 setError("Invalid image file: " + name);
208 element_->setPixmap(pixmap);
214 QGraphicsItem* Pointer::getElement() const