Files
2020-05-25 21:45:13 +08:00

160 lines
5.1 KiB
C++

/**
******************************************************************************
*
* @file homeitem.cpp
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @brief A graphicsItem representing a trail point
* @see The GNU Public License (GPL) Version 3
* @defgroup OPMapWidget
* @{
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "homeitem.h"
#include <QGraphicsSceneMouseEvent>
namespace mapcontrol {
HomeItem::HomeItem(MapGraphicItem *map, OPMapWidget *parent) : safe(true), map(map), mapwidget(parent),
showsafearea(true), toggleRefresh(true), safearea(1000), altitude(0), isDragging(false)
{
pic.load(QString::fromUtf8(":/markers/images/home2.svg"));
pic = pic.scaled(30, 30, Qt::IgnoreAspectRatio);
this->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
this->setFlag(QGraphicsItem::ItemIsMovable, false);
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
localposition = map->FromLatLngToLocal(mapwidget->CurrentPosition());
this->setPos(localposition.X(), localposition.Y());
this->setZValue(4);
coord = internals::PointLatLng(50, 50);
RefreshToolTip();
setCacheMode(QGraphicsItem::DeviceCoordinateCache);
connect(map, SIGNAL(childRefreshPosition()), this, SLOT(RefreshPos()));
connect(map, SIGNAL(childSetOpacity(qreal)), this, SLOT(setOpacitySlot(qreal)));
}
void HomeItem::RefreshToolTip()//不必要
{
QString coord_str = " " + QString::number(coord.Lat(), 'f', 6) + " " + QString::number(coord.Lng(), 'f', 6);
setToolTip(QString("Waypoint: Home\nCoordinate:%1\nAltitude:%2\n").arg(coord_str).arg(QString::number(altitude)));
}
void HomeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->drawPixmap(-pic.width() / 2, -pic.height() / 2, pic);
if (showsafearea) {
if (safe) {
painter->setPen(Qt::green);
} else {
painter->setPen(Qt::red);
}
painter->drawEllipse(QPointF(0, 0), localsafearea, localsafearea);
// painter->drawRect(QRectF(-localsafearea,-localsafearea,localsafearea*2,localsafearea*2));
}
}
QRectF HomeItem::boundingRect() const
{
if (pic.width() > localsafearea * 2 && !toggleRefresh) {
return QRectF(-pic.width() / 2, -pic.height() / 2, pic.width(), pic.height());
} else {
return QRectF(-localsafearea, -localsafearea, localsafearea * 2, localsafearea * 2);
}
}
int HomeItem::type() const
{
return Type;
}
void HomeItem::RefreshPos()
{
prepareGeometryChange();
localposition = map->FromLatLngToLocal(coord);
this->setPos(localposition.X(), localposition.Y());
if (showsafearea) {
localsafearea = safearea / map->Projection()->GetGroundResolution(map->ZoomTotal(), coord.Lat());
}
RefreshToolTip();
this->update();
toggleRefresh = false;
}
void HomeItem::setOpacitySlot(qreal opacity)
{
setOpacity(opacity);
}
void HomeItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
isDragging = true;
qDebug() << "mousePressEvent";
}
//QGraphicsItem::mousePressEvent(event);
}
void HomeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
coord = map->FromLocalToLatLng(this->pos().x(), this->pos().y());
isDragging = false;
qDebug() << "mouseReleaseEvent";
emit homePositionChanged(coord, Altitude());
}
//QGraphicsItem::mouseReleaseEvent(event);
RefreshToolTip();
}
void HomeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
emit homedoubleclick(this);
}
}
void HomeItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (isDragging) {
qDebug() << "mouseMoveEvent";
coord = map->FromLocalToLatLng(this->pos().x(), this->pos().y());
emit homePositionChanged(coord, Altitude());
RefreshPos();
}
//QGraphicsItem::mouseMoveEvent(event);
}
// Set clickable area as smaller than the bounding rect.
QPainterPath HomeItem::shape() const
{
QPainterPath path;
path.addEllipse(QRectF(-12, -25, 24, 50));
return path;
}
}