Newer
Older
#include "Waypoint2DIcon.h"
#include <QPainter>
#include "opmapcontrol.h"
Waypoint2DIcon::Waypoint2DIcon(mapcontrol::MapGraphicItem* map, mapcontrol::OPMapWidget* parent, qreal latitude, qreal longitude, qreal altitude, int listindex, QString name, QString description, int radius)
: mapcontrol::WayPointItem(internals::PointLatLng(latitude, longitude), altitude, description, map),
parent(parent),
waypoint(NULL),
radius(radius),
showAcceptanceRadius(true),
showOrbit(false),
color(Qt::red)
lm
committed
{
SetHeading(0);
SetNumber(listindex);
if (mypen == NULL) mypen = new QPen(Qt::red);
// drawIcon(mypen);
this->setFlag(QGraphicsItem::ItemIgnoresTransformations,true);
picture = QPixmap(radius+1, radius+1);
drawIcon();
Waypoint2DIcon::Waypoint2DIcon(mapcontrol::MapGraphicItem* map, mapcontrol::OPMapWidget* parent, Waypoint* wp, const QColor& color, int listindex, int radius)
: mapcontrol::WayPointItem(internals::PointLatLng(wp->getLatitude(), wp->getLongitude()), wp->getAltitude(), wp->getDescription(), map),
parent(parent),
waypoint(wp),
radius(radius),
showAcceptanceRadius(true),
showOrbit(false),
color(color)
SetHeading(wp->getYaw());
SetNumber(listindex);
if (mypen == NULL) mypen = new QPen(Qt::red);
// drawIcon(mypen);
this->setFlag(QGraphicsItem::ItemIgnoresTransformations,true);
picture = QPixmap(radius+1, radius+1);
lm
committed
updateWaypoint();
lm
committed
Waypoint2DIcon::~Waypoint2DIcon()
delete &picture;
lm
committed
}
void Waypoint2DIcon::setPen(QPen* pen)
{
mypen = pen;
// drawIcon(pen);
void Waypoint2DIcon::SetHeading(float heading)
mapcontrol::WayPointItem::SetHeading(heading);
drawIcon();
lm
committed
}
void Waypoint2DIcon::updateWaypoint()
{
// Store old size
static QRectF oldSize;
SetHeading(waypoint->getYaw());
SetCoord(internals::PointLatLng(waypoint->getLatitude(), waypoint->getLongitude()));
lm
committed
qDebug() << "UPDATING WP:" << waypoint->getId() << "LAT:" << waypoint->getLatitude() << "LON:" << waypoint->getLongitude();
SetDescription(waypoint->getDescription());
SetAltitude(waypoint->getAltitude());
// FIXME Add SetNumber (currently needs a separate call)
drawIcon();
QRectF newSize = boundingRect();
qDebug() << "WIDTH" << newSize.width() << "<" << oldSize.width();
// If new size is smaller than old size, update surrounding
if ((newSize.width() <= oldSize.width()) || (newSize.height() <= oldSize.height()))
{
// If the symbol size was reduced, enforce an update of the environment
// update(oldSize);
int oldWidth = oldSize.width() + 20;
int oldHeight = oldSize.height() + 20;
map->update(this->x()-10, this->y()-10, oldWidth, oldHeight);
qDebug() << "UPDATING DUE TO SMALLER SIZE";
qDebug() << "X:" << this->x()-1 << "Y:" << this->y()-1 << "WIDTH:" << oldWidth << "HEIGHT:" << oldHeight;
}
else
{
// Symbol size stayed constant or increased, use new size for update
this->update();
}
oldSize = boundingRect();
qDebug() << "UPDATING WP";
}
}
QRectF Waypoint2DIcon::boundingRect() const
{
int loiter = 0;
int acceptance = 0;
internals::PointLatLng coord = (internals::PointLatLng)Coord();
if (waypoint && showAcceptanceRadius && (waypoint->getAction() == (int)MAV_CMD_NAV_WAYPOINT))
{
acceptance = map->metersToPixels(waypoint->getAcceptanceRadius(), coord);
if (waypoint && ((waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_UNLIM) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TIME) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TURNS)))
{
loiter = map->metersToPixels(waypoint->getLoiterOrbit(), coord);
}
int width = qMax(picture.width()/2, qMax(loiter, acceptance));
int height = qMax(picture.height()/2, qMax(loiter, acceptance));
return QRectF(-width,-height,2*width,2*height);
void Waypoint2DIcon::SetReached(const bool &value)
{
// DO NOTHING
Q_UNUSED(value);
// reached=value;
// emit WPValuesChanged(this);
// if(value)
// picture.load(QString::fromUtf8(":/markers/images/bigMarkerGreen.png"));
// else
// picture.load(QString::fromUtf8(":/markers/images/marker.png"));
// this->update();
}
void Waypoint2DIcon::drawIcon()
lm
committed
{
picture.fill(Qt::transparent);
QPainter painter(&picture);
lm
committed
// DRAW WAYPOINT
QPointF p(picture.width()/2, picture.height()/2);
lm
committed
QPolygonF poly(4);
// Top point
poly.replace(0, QPointF(p.x(), p.y()-picture.height()/2.0f));
lm
committed
// Right point
poly.replace(1, QPointF(p.x()+picture.width()/2.0f, p.y()));
lm
committed
// Bottom point
poly.replace(2, QPointF(p.x(), p.y() + picture.height()/2.0f));
poly.replace(3, QPointF(p.x() - picture.width()/2.0f, p.y()));
lm
committed
// // Select color based on if this is the current waypoint
// if (list.at(i)->getCurrent())
// {
// color = QGC::colorCyan;//uas->getColor();
// pen.setWidthF(refLineWidthToPen(0.8f));
// }
// else
// {
// color = uas->getColor();
// pen.setWidthF(refLineWidthToPen(0.4f));
// }
//pen.setColor(color);
// if (pen) {
// pen->setWidthF(2);
// painter.setPen(*pen);
// } else {
QPen pen2(color);
lm
committed
pen2.setWidth(2);
painter.setPen(pen2);
// }
lm
committed
painter.setBrush(Qt::NoBrush);
int waypointSize = qMin(picture.width(), picture.height());
lm
committed
float rad = (waypointSize/2.0f) * 0.8 * (1/sqrt(2.0f));
// If this is not a waypoint (only the default representation)
// or it is a waypoint, but not one where direction has no meaning
// then draw the heading indicator
if (!waypoint || (waypoint && (
(waypoint->getAction() != (int)MAV_CMD_NAV_TAKEOFF) &&
(waypoint->getAction() != (int)MAV_CMD_NAV_LAND) &&
(waypoint->getAction() != (int)MAV_CMD_NAV_LOITER_UNLIM) &&
(waypoint->getAction() != (int)MAV_CMD_NAV_LOITER_TIME) &&
(waypoint->getAction() != (int)MAV_CMD_NAV_LOITER_TURNS)
)))
{
painter.drawLine(p.x(), p.y(), p.x()+sin(Heading()) * rad, p.y()-cos(Heading()) * rad);
}
if ((waypoint != NULL) && (waypoint->getAction() == (int)MAV_CMD_NAV_TAKEOFF))
{
// Takeoff waypoint
int width = (picture.width()-1);
int height = (picture.height()-1);
painter.drawRect(0, 0, width, height);
painter.drawRect(width*0.2, height*0.2f, width*0.6f, height*0.6f);
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
}
else if ((waypoint != NULL) && (waypoint->getAction() == (int)MAV_CMD_NAV_LAND))
{
// Landing waypoint
int width = (picture.width()-1)/2;
int height = (picture.height()-1)/2;
painter.drawEllipse(p, width, height);
painter.drawEllipse(p, width*0.6f, height*0.6f);
painter.drawLine(0, 0, picture.width(), picture.height());
painter.drawLine(picture.width(), 0, 0, picture.height());
}
else if ((waypoint != NULL) && ((waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_UNLIM) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TIME) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TURNS)))
{
// Loiter waypoint
int width = (picture.width()-1)/2;
int height = (picture.height()-1)/2;
painter.drawEllipse(p, width, height);
}
else
{
// Navigation waypoint
painter.drawPolygon(poly);
}
}
void Waypoint2DIcon::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->drawPixmap(-picture.width()/2,-picture.height()/2,picture);
if (this->isSelected())
{
painter->drawRect(QRectF(-picture.width()/2,-picture.height()/2,picture.width()-1,picture.height()-1));
}
QPen pen = painter->pen();
pen.setColor(color);
if ((waypoint) && (waypoint->getAction() == (int)MAV_CMD_NAV_WAYPOINT) && showAcceptanceRadius)
{
QPen redPen = QPen(pen);
redPen.setColor(Qt::red);
painter->setPen(redPen);
const int acceptance = map->metersToPixels(waypoint->getAcceptanceRadius(), Coord());
if (waypoint) painter->drawEllipse(QPointF(0, 0), acceptance, acceptance);
}
if ((waypoint) && ((waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_UNLIM) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TIME) || (waypoint->getAction() == (int)MAV_CMD_NAV_LOITER_TURNS)))
{
painter->setPen(pen);
pen.setWidth(2);
const int loiter = map->metersToPixels(waypoint->getLoiterOrbit(), Coord());
if (waypoint) painter->drawEllipse(QPointF(0, 0), loiter, loiter);
}