1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-12-01 07:01:16 +01:00
GPXSee/src/GUI/waypointitem.cpp

188 lines
4.7 KiB
C++
Raw Normal View History

#include <QApplication>
2015-10-05 01:43:48 +02:00
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include <QLabel>
#include "font.h"
#include "popup.h"
2016-02-19 21:34:55 +01:00
#include "waypointitem.h"
2015-10-05 01:43:48 +02:00
#define HS(size) \
((int)((qreal)size * 1.2))
#define FS(size) \
((int)((qreal)size * 1.41))
2015-10-05 01:43:48 +02:00
2020-05-20 21:00:36 +02:00
Units WaypointItem::_units = Metric;
CoordinatesFormat WaypointItem::_format = DecimalDegrees;
QTimeZone WaypointItem::_timeZone = QTimeZone::utc();
ToolTip WaypointItem::info() const
{
2016-08-02 00:28:56 +02:00
ToolTip tt;
QLocale l;
2016-08-02 00:28:56 +02:00
if (!_waypoint.name().isEmpty())
2016-08-09 01:16:19 +02:00
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
tt.insert(qApp->translate("WaypointItem", "Coordinates"),
Format::coordinates(_waypoint.coordinates(), _format));
if (!std::isnan(_waypoint.elevations().first)) {
QString val = Format::elevation(_waypoint.elevations().first, _units);
if (!std::isnan(_waypoint.elevations().second))
val += " (" + Format::elevation(_waypoint.elevations().second,
_units) + ")";
tt.insert(qApp->translate("WaypointItem", "Elevation"), val);
}
2019-03-14 18:52:15 +01:00
if (_waypoint.timestamp().isValid())
tt.insert(qApp->translate("WaypointItem", "Date"),
l.toString(_waypoint.timestamp().toTimeZone(_timeZone),
QLocale::ShortFormat));
2019-03-14 18:52:15 +01:00
if (!_waypoint.description().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Description"),
_waypoint.description());
if (!_waypoint.comment().isEmpty()
&& _waypoint.comment() != _waypoint.description())
tt.insert(qApp->translate("WaypointItem", "Comment"),
_waypoint.comment());
if (!_waypoint.address().isEmpty()) {
QString addr(_waypoint.address());
addr.replace('\n', "<br/>");
addr = "<address>" + addr + "</address>";
2019-11-08 21:00:59 +01:00
tt.insert(qApp->translate("WaypointItem", "Address"), addr);
}
if (!_waypoint.phone().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Phone"), _waypoint.phone());
2019-10-22 22:27:12 +02:00
if (!_waypoint.links().isEmpty()) {
QString links;
for (int i = 0; i < _waypoint.links().size(); i++) {
const Link &link = _waypoint.links().at(i);
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
link.text().isEmpty() ? link.URL() : link.text()));
if (i != _waypoint.links().size() - 1)
links.append("<br/>");
}
tt.insert(qApp->translate("WaypointItem", "Links"), links);
2019-10-14 20:07:05 +02:00
}
2019-11-15 22:10:55 +01:00
tt.setImages(_waypoint.images());
2016-08-02 00:28:56 +02:00
return tt;
}
WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
QGraphicsItem *parent) : GraphicsItem(parent)
2015-10-05 01:43:48 +02:00
{
_waypoint = waypoint;
2016-08-09 01:16:19 +02:00
_showLabel = true;
_size = 8;
_color = Qt::black;
2016-08-02 00:28:56 +02:00
2018-05-19 20:30:29 +02:00
_font.setPixelSize(FS(_size));
_font.setFamily(FONT_FAMILY);
updateCache();
2016-07-25 19:32:36 +02:00
setPos(map->ll2xy(waypoint.coordinates()));
setCursor(Qt::ArrowCursor);
2016-09-10 13:11:46 +02:00
setAcceptHoverEvents(true);
2015-10-05 01:43:48 +02:00
}
2018-05-19 20:30:29 +02:00
void WaypointItem::updateCache()
2015-10-05 01:43:48 +02:00
{
QPainterPath p;
2018-05-19 20:30:29 +02:00
qreal pointSize = _font.bold() ? HS(_size) : _size;
2016-09-10 13:11:46 +02:00
2016-08-09 01:16:19 +02:00
if (_showLabel) {
2018-05-19 20:30:29 +02:00
QFontMetrics fm(_font);
_labelBB = fm.tightBoundingRect(_waypoint.name());
2016-08-09 01:16:19 +02:00
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
2018-05-19 20:30:29 +02:00
p.addRect(pointSize/2, pointSize/2, _labelBB.width(), _labelBB.height()
+ fm.descent());
2016-08-09 01:16:19 +02:00
} else
p.addRect(-pointSize/2, -pointSize/2, pointSize, pointSize);
_shape = p;
2015-10-05 01:43:48 +02:00
}
2016-07-25 19:32:36 +02:00
void WaypointItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
2015-10-05 01:43:48 +02:00
{
Q_UNUSED(option);
Q_UNUSED(widget);
2018-05-19 20:30:29 +02:00
qreal pointSize = _font.bold() ? HS(_size) : _size;
painter->setPen(_color);
2016-09-10 13:11:46 +02:00
2016-08-09 01:16:19 +02:00
if (_showLabel) {
2018-05-19 20:30:29 +02:00
painter->setFont(_font);
painter->drawText(pointSize/2 - qMax(_labelBB.x(), 0), pointSize/2
+ _labelBB.height(), _waypoint.name());
2016-08-09 01:16:19 +02:00
}
painter->setBrush(QBrush(_color, Qt::SolidPattern));
2016-09-10 13:11:46 +02:00
painter->drawEllipse(-pointSize/2, -pointSize/2, pointSize, pointSize);
2015-10-05 01:43:48 +02:00
/*
painter->setPen(Qt::red);
painter->setBrush(Qt::NoBrush);
painter->drawPath(_shape);
2015-10-05 01:43:48 +02:00
*/
}
2016-08-02 00:28:56 +02:00
void WaypointItem::setSize(int size)
{
if (_size == size)
return;
prepareGeometryChange();
_size = size;
2018-05-19 20:30:29 +02:00
_font.setPixelSize(FS(_size));
updateCache();
}
void WaypointItem::setColor(const QColor &color)
{
if (_color == color)
return;
_color = color;
update();
}
2016-08-09 01:16:19 +02:00
void WaypointItem::showLabel(bool show)
{
if (_showLabel == show)
return;
2016-08-09 01:16:19 +02:00
prepareGeometryChange();
_showLabel = show;
2018-05-19 20:30:29 +02:00
updateCache();
2016-08-09 01:16:19 +02:00
}
2016-09-10 13:11:46 +02:00
void WaypointItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
prepareGeometryChange();
2018-05-19 20:30:29 +02:00
_font.setBold(true);
updateCache();
2016-09-19 01:45:28 +02:00
setZValue(zValue() + 1.0);
2016-09-10 13:11:46 +02:00
}
void WaypointItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
prepareGeometryChange();
2018-05-19 20:30:29 +02:00
_font.setBold(false);
updateCache();
2016-09-19 01:45:28 +02:00
setZValue(zValue() - 1.0);
2016-09-10 13:11:46 +02:00
}
void WaypointItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
2019-10-14 20:07:05 +02:00
/* Do not propagate the event any further as lower stacked items (path
items) would replace the popup with their own popup */
}