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 <QtCore/QDebug>
20 #include <QtCore/QTimeLine>
21 #include <QtGui/QGraphicsItemAnimation>
22 #include <QtGui/QGraphicsPixmapItem>
26 #include "graphicsscene.h"
31 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 return loadImage(value);
104 xRotationPoint_ = intVal;
107 yRotationPoint_ = intVal;
110 qDebug() << "Unknown attribute: " << attr;
122 void Pointer::addToScene(GraphicsScene* scene)
129 element_->setTransformOriginPoint(xRotationPoint_, yRotationPoint_);
130 element_->setX(x_ - xRotationPoint_);
131 element_->setY(y_ - yRotationPoint_);
133 bool animateVal = animate_;
136 animate_ = animateVal;
138 scene->addItem(element_);
141 void Pointer::update()
143 double speed = Odometer::instance().getLatestFix().kmSpeed;
145 if(speed < zeroSpeed_)
147 speed = static_cast<double>(zeroSpeed_);
149 else if(speed > fullSpeed_)
151 speed = static_cast<double>(fullSpeed_);
154 double multiplier = static_cast<double>(speed - zeroSpeed_) / (fullSpeed_ - zeroSpeed_);
155 double angle = static_cast<double>(zeroAngle_) + ((fullAngle_ - zeroAngle_) * multiplier);
157 int rounded = static_cast<int>(round(angle));
159 if(rounded == angle_)
168 element_->setRotation(rounded);
172 targetAngle_ = rounded;
173 startAngle_ = element_->rotation();
175 if(timer_->state() == QTimeLine::Running)
184 void Pointer::setFrame(int frame)
186 element_->setRotation(startAngle_ + ((static_cast<double>(frame) / ANIMATION_FRAMES) * (targetAngle_ - startAngle_)));
189 bool Pointer::loadImage(QString const& name)
194 if(!readFile(name, data))
199 if(!pixmap.loadFromData(data))
201 setError("Invalid image file: " + name);
205 element_->setPixmap(pixmap);