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] =
39 {"xrotationpoint", true},
40 {"yrotationpoint", true}
43 int const ANIMATION_TIME = 500;
44 int const ANIMATION_FRAMES = 50;
45 int const ANIMATION_UPDATEINTERVAL = 20;
48 Pointer::Pointer(Reader* reader, bool animate): QObject(0), GraphicsElement(reader),
49 xRotationPoint_(0), yRotationPoint_(0), x_(0), y_(0), zeroAngle_(0),
50 fullAngle_(180), zeroSpeed_(0), fullSpeed_(220), targetAngle_(0),
51 startAngle_(0), angle_(-1), imageSet_(false), animate_(animate), timer_(0)
53 element_ = new QGraphicsPixmapItem();
57 timer_ = new QTimeLine(ANIMATION_TIME);
58 timer_->setFrameRange(0, ANIMATION_FRAMES);
59 timer_->setUpdateInterval(ANIMATION_UPDATEINTERVAL);
60 connect(timer_, SIGNAL(frameChanged(int)), this, SLOT(setFrame(int)));
70 bool Pointer::setAttribute(QString const& name, QString const& value)
75 if((attrId = getAttribute(name, value, ATTRIBUTES, ATTRIBUTE_COUNT, intVal)) != -1)
77 Attribute attr = static_cast<Attribute>(attrId);
88 return loadImage(value);
103 xRotationPoint_ = intVal;
106 yRotationPoint_ = intVal;
109 qDebug() << "Unknown attribute: " << attr;
121 void Pointer::addToScene(GraphicsScene* scene)
128 element_->setTransformOriginPoint(xRotationPoint_, yRotationPoint_);
129 element_->setX(x_ - xRotationPoint_);
130 element_->setY(y_ - yRotationPoint_);
132 bool animateVal = animate_;
135 animate_ = animateVal;
137 scene->addItem(element_);
140 void Pointer::update()
142 double speed = Odometer::instance().getLatestFix().kmSpeed;
144 if(speed < zeroSpeed_)
146 speed = static_cast<double>(zeroSpeed_);
148 else if(speed > fullSpeed_)
150 speed = static_cast<double>(fullSpeed_);
153 double multiplier = static_cast<double>(speed - zeroSpeed_) / (fullSpeed_ - zeroSpeed_);
154 double angle = static_cast<double>(zeroAngle_) + ((fullAngle_ - zeroAngle_) * multiplier);
156 int rounded = static_cast<int>(round(angle));
158 if(rounded == angle_)
167 element_->setRotation(rounded);
171 targetAngle_ = rounded;
172 startAngle_ = element_->rotation();
174 if(timer_->state() == QTimeLine::Running)
183 void Pointer::setFrame(int frame)
185 element_->setRotation(startAngle_ + ((static_cast<double>(frame) / ANIMATION_FRAMES) * (targetAngle_ - startAngle_)));
188 bool Pointer::loadImage(QString const& name)
193 if(!readFile(name, data))
198 if(!pixmap.loadFromData(data))
200 setError("Invalid image file: " + name);
204 element_->setPixmap(pixmap);
210 QGraphicsItem* Pointer::getElement() const