00001 #include <QPainter>
00002 #include <QGraphicsSceneMouseEvent>
00003
00004 #include "ThymioButtons.h"
00005
00006
00007 namespace Aseba
00008 {
00009
00010 ThymioMoveAction::ThymioMoveAction( QGraphicsItem *parent ) :
00011 ThymioButton(false, 0.2, false, false, parent)
00012 {
00013 setData(0, "action");
00014 setData(1, "move");
00015
00016 QTransform transMatrix(2.0,0.0,0.0,0.0,2.3,0.0,0.0,0.0,1.0);
00017
00018 for(int i=0; i<2; i++)
00019 {
00020 QSlider *s = new QSlider(Qt::Vertical);
00021 s->setRange(-500,500);
00022 s->setStyleSheet("QSlider::groove:vertical { width: 14px; border: 2px solid #000000; "
00023 "background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #00FF00, stop:0.25 #FFFF00, stop:0.5 #FF0000, stop:0.75 #FFFF00, stop:1 #00FF00 ); }"
00024 "QSlider::handle:vertical { "
00025 "background: #FFFFFF; "
00026 "border: 2px solid #000000; height: 10px; width: 20px; margin: 0px 0; }");
00027 s->setSliderPosition(0);
00028
00029 QGraphicsProxyWidget *w = new QGraphicsProxyWidget(this);
00030 w->setWidget(s);
00031 w->setPos(10+i*200, 15);
00032 w->setTransform(transMatrix);
00033
00034 sliders.push_back(s);
00035 widgets.push_back(w);
00036
00037 connect(s, SIGNAL(valueChanged(int)), this, SLOT(valueChangeDetected()));
00038 connect(s, SIGNAL(valueChanged(int)), this, SLOT(updateIRButton()));
00039 }
00040
00041 timer = new QTimeLine(2000);
00042 timer->setFrameRange(0, 100);
00043 timer->setCurveShape(QTimeLine::LinearCurve);
00044 animation = new QGraphicsItemAnimation(this);
00045 animation->setItem(thymioBody);
00046 animation->setTimeLine(timer);
00047 thymioBody->setTransformOriginPoint(0,-14);
00048 }
00049
00050 ThymioMoveAction::~ThymioMoveAction()
00051 {
00052 delete(timer);
00053 }
00054
00055 void ThymioMoveAction::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
00056 {
00057 Q_UNUSED(option);
00058 Q_UNUSED(widget);
00059
00060 painter->setPen(QColor(147, 134, 115));
00061 painter->setBrush(buttonColor);
00062 painter->drawRoundedRect(0, 0, 256, 256, 5, 5);
00063
00064 qreal pt[2];
00065 for(int i=0; i<2; i++)
00066 pt[i] = (sliders[i]->value())*0.06;
00067
00068 timer->stop();
00069 timer->setLoopCount(1);
00070
00071 double angle=0;
00072 double center = -23.5*(pt[1]+pt[0])/(pt[1] == pt[0] ? 0.03 : (pt[1]-pt[0]));
00073
00074 for (int i = 0; i < 200; ++i)
00075 {
00076 qreal step = i/200.0;
00077
00078 angle = (pt[0]-pt[1]-0.04)*3*step;
00079 animation->setPosAt(step, QPointF(center*(1-cos(-angle*3.14/180))+128,center*sin(-angle*3.14/180)+128));
00080 animation->setRotationAt(step, angle);
00081 }
00082 timer->start();
00083 }
00084
00085 QPixmap ThymioMoveAction::image(bool on)
00086 {
00087 QPixmap pixmap(256, 256);
00088 pixmap.fill(buttonColor);
00089 QPainter painter(&pixmap);
00090 painter.setRenderHint(QPainter::Antialiasing);
00091
00092 painter.translate(QPointF(128,128));
00093 painter.scale(0.4,0.4);
00094 painter.rotate(thymioBody->rotation());
00095 thymioBody->paint(&painter, 0, 0);
00096 painter.resetTransform();
00097
00098 for(int i=0; i<getNumButtons(); i++)
00099 {
00100 painter.translate(widgets[i]->pos());
00101 painter.scale(2.0, 2.3);
00102 sliders[i]->render(&painter);
00103 painter.resetTransform();
00104 }
00105
00106 return pixmap;
00107 }
00108
00109 void ThymioMoveAction::valueChangeDetected()
00110 {
00111 update();
00112 }
00113
00114 void ThymioMoveAction::setClicked(int i, int status)
00115 {
00116 if(i<getNumButtons())
00117 sliders[i]->setSliderPosition(status);
00118 }
00119
00120 int ThymioMoveAction::isClicked(int i)
00121 {
00122 if(i<getNumButtons())
00123 return sliders[i]->value();
00124 return -1;
00125 }
00126
00127
00128 ThymioColorAction::ThymioColorAction( QGraphicsItem *parent ) :
00129 ThymioButton(false, 1.0, true, false, parent)
00130 {
00131 setData(0, "action");
00132 setData(1, "color");
00133
00134 QTransform transMatrix(1.0,0.0,0.0,0.0,2.0,0.0,0.0,0.0,1.0);
00135 QString sliderColor("FF0000");
00136
00137 for(int i=0; i<3; i++)
00138 {
00139 if( i == 1 ) sliderColor="00FF00";
00140 else if( i == 2 ) sliderColor="0000FF";
00141
00142 QSlider *s = new QSlider(Qt::Horizontal);
00143 s->setRange(0,32);
00144 s->setStyleSheet(QString("QSlider::groove:horizontal { height: 14px; border: 2px solid #000000; "
00145 "background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #000000, stop:1 #%0); }"
00146 "QSlider::handle:horizontal { "
00147 "background: #FFFFFF; "
00148 "border: 5px solid #000000; width: 18px; margin: -2px 0; }").arg(sliderColor));
00149 s->setSliderPosition(0);
00150
00151 QGraphicsProxyWidget *w = new QGraphicsProxyWidget(this);
00152 w->setWidget(s);
00153 w->setPos(27, 70+i*60);
00154 w->setTransform(transMatrix);
00155
00156
00157 sliders.push_back(s);
00158 widgets.push_back(w);
00159
00160 connect(s, SIGNAL(valueChanged(int)), this, SLOT(valueChangeDetected()));
00161 connect(s, SIGNAL(valueChanged(int)), this, SLOT(updateIRButton()));
00162 }
00163
00164 }
00165
00166 void ThymioColorAction::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
00167 {
00168 Q_UNUSED(option);
00169 Q_UNUSED(widget);
00170
00171 painter->setPen(QColor(147, 134, 115));
00172 painter->setBrush(buttonColor);
00173 painter->drawRoundedRect(0, 0, 256, 256, 5, 5);
00174
00175 thymioBody->bodyColor = QColor(sliders[0]->value()*5.46875+80,
00176 sliders[1]->value()*5.46875+80,
00177 sliders[2]->value()*5.46875+80);
00178 }
00179
00180 QPixmap ThymioColorAction::image(bool on)
00181 {
00182 QPixmap pixmap(256, 256);
00183 pixmap.fill(buttonColor);
00184 QPainter painter(&pixmap);
00185 painter.setRenderHint(QPainter::Antialiasing);
00186
00187 painter.translate(thymioBody->pos());
00188 painter.scale(thymioBody->scale(),thymioBody->scale());
00189 painter.rotate(thymioBody->rotation());
00190 thymioBody->paint(&painter, 0, 0);
00191 painter.resetTransform();
00192
00193 for(int i=0; i<getNumButtons(); i++)
00194 {
00195 painter.translate(widgets[i]->pos());
00196 painter.scale(1.0, 2.0);
00197 sliders[i]->render(&painter);
00198 painter.resetTransform();
00199 }
00200
00201 return pixmap;
00202 }
00203
00204 void ThymioColorAction::valueChangeDetected()
00205 {
00206 update();
00207 }
00208
00209 void ThymioColorAction::setClicked(int i, int status)
00210 {
00211 if(i<getNumButtons())
00212 sliders[i]->setSliderPosition(status);
00213 }
00214
00215 int ThymioColorAction::isClicked(int i)
00216 {
00217 if(i<getNumButtons())
00218 return sliders[i]->value();
00219 return -1;
00220 }
00221
00222
00223 ThymioCircleAction::ThymioCircleAction(QGraphicsItem *parent) :
00224 ThymioButton(false, 1.0, true, false, parent)
00225 {
00226 setData(0, "action");
00227 setData(1, "circle");
00228
00229 for(uint i=0; i<8; i++)
00230 {
00231 ThymioClickableButton *button = new ThymioClickableButton(QRectF(-25,-15,50,30), THYMIO_RECTANGULAR_BUTTON, 3, this);
00232
00233 qreal offset = (qreal)i;
00234 button->setRotation(45*offset);
00235 button->setPos(128 - 90*qCos(0.785398163*offset+1.57079633),
00236 128 - 90*qSin(0.785398163*offset+1.57079633));
00237
00238 button->setBeginButtonColor(QColor(255, 172, 155));
00239 button->setButtonColor(QColor(255, 90, 54));
00240
00241 thymioButtons.push_back(button);
00242 connect(button, SIGNAL(stateChanged()), this, SLOT(updateIRButton()));
00243 }
00244 }
00245
00246
00247 void ThymioSoundAction::Speaker::paint (QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
00248 {
00249 Q_UNUSED(option);
00250 Q_UNUSED(widget);
00251
00252 painter->setPen(QPen(Qt::black, 3.0, Qt::SolidLine, Qt::RoundCap));
00253 painter->setBrush(Qt::black);
00254 painter->drawRect(25, 108, 30, 50);
00255
00256 QPointF points[4];
00257 points[0] = QPointF(52, 158);
00258 points[1] = QPointF(52, 108);
00259 points[2] = QPointF(84, 78);
00260 points[3] = QPointF(84, 188);
00261 painter->drawPolygon(points, 4);
00262 painter->drawChord(64, 78, 40, 110, -1440, 2880);
00263
00264 painter->drawArc(64, 68, 60, 130, -1440, 2880);
00265 painter->drawArc(64, 53, 80, 160, -1440, 2880);
00266 }
00267
00268 ThymioSoundAction::ThymioSoundAction(QGraphicsItem *parent) :
00269 ThymioButton(false, 1.0, true, false, parent)
00270 {
00271 setData(0, "action");
00272 setData(1, "sound");
00273
00274 for(int i=0; i<3; i++)
00275 {
00276 ThymioFaceButton *button = new ThymioFaceButton(QRectF(-30,-30,60,60), (ThymioSmileType)i, this);
00277
00278 button->setPos(195,70+70*(qreal)i);
00279 button->setButtonColor(i == 0 ? Qt::green : (i == 1 ? Qt::yellow : Qt::red) );
00280 button->setData(0, i);
00281 button->setToggleState(false);
00282
00283 thymioButtons.push_back(button);
00284 connect(button, SIGNAL(stateChanged()), this, SLOT(updateIRButton()));
00285 }
00286 thymioButtons.at(0)->setClicked(1);
00287
00288 for(int i=0; i<3; i++)
00289 {
00290 for(int j=0; j<3; j++)
00291 {
00292 if( i!=j )
00293 thymioButtons.at(i)->addSibling(thymioButtons.at(j));
00294 }
00295 }
00296
00297 speaker = new Speaker(this);
00298 }
00299
00300 QPixmap ThymioSoundAction::image(bool on)
00301 {
00302 QPixmap pixmap = ThymioButton::image(on);
00303 QPainter painter(&pixmap);
00304
00305 painter.translate(speaker->pos());
00306 speaker->paint(&painter, 0, 0);
00307 painter.resetTransform();
00308
00309 return pixmap;
00310 }
00311
00312
00313 ThymioMemoryAction::ThymioMemoryAction(QGraphicsItem *parent) :
00314 ThymioButton(false, 1.0, true, false, parent)
00315 {
00316 setData(0, "action");
00317 setData(1, "memory");
00318
00319 for(uint i=0; i<4; i++)
00320 {
00321
00322
00323
00324 ThymioClickableButton *button = new ThymioClickableButton(QRectF(-20,-20,40,40), THYMIO_CIRCULAR_BUTTON, 2, this);
00325
00326 button->setPos(128, i*60 + 40);
00327 button->setButtonColor(QColor(255,200,0));
00328
00329 thymioButtons.push_back(button);
00330 connect(button, SIGNAL(stateChanged()), this, SLOT(updateIRButton()));
00331 }
00332 }
00333
00334 };
00335