2014-02-05 16:25:28 +00:00
|
|
|
#include "divetooltipitem.h"
|
2014-02-05 16:53:57 +00:00
|
|
|
#include "divecartesianaxis.h"
|
|
|
|
#include "profile.h"
|
2014-01-19 00:21:13 +00:00
|
|
|
#include "dive.h"
|
|
|
|
#include "membuffer.h"
|
2014-02-05 16:25:28 +00:00
|
|
|
#include <QPropertyAnimation>
|
|
|
|
#include <QGraphicsSceneMouseEvent>
|
|
|
|
#include <QPen>
|
|
|
|
#include <QBrush>
|
|
|
|
#include <QGraphicsScene>
|
|
|
|
#include <QSettings>
|
|
|
|
#include <QGraphicsView>
|
2014-02-05 17:25:24 +00:00
|
|
|
#include <QDebug>
|
2014-02-05 16:25:28 +00:00
|
|
|
|
|
|
|
#define PORT_IN_PROGRESS 1
|
|
|
|
#ifdef PORT_IN_PROGRESS
|
|
|
|
#include "display.h"
|
|
|
|
#endif
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::addToolTip(const QString &toolTip, const QIcon &icon)
|
2014-02-05 16:25:28 +00:00
|
|
|
{
|
|
|
|
QGraphicsPixmapItem *iconItem = 0;
|
|
|
|
double yValue = title->boundingRect().height() + SPACING;
|
|
|
|
Q_FOREACH(ToolTip t, toolTips) {
|
|
|
|
yValue += t.second->boundingRect().height();
|
|
|
|
}
|
|
|
|
if (!icon.isNull()) {
|
2014-02-28 04:09:57 +00:00
|
|
|
iconItem = new QGraphicsPixmapItem(icon.pixmap(ICON_SMALL, ICON_SMALL), this);
|
2014-02-05 16:25:28 +00:00
|
|
|
iconItem->setPos(SPACING, yValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
QGraphicsSimpleTextItem *textItem = new QGraphicsSimpleTextItem(toolTip, this);
|
|
|
|
textItem->setPos(SPACING + ICON_SMALL + SPACING, yValue);
|
|
|
|
textItem->setBrush(QBrush(Qt::white));
|
|
|
|
textItem->setFlag(ItemIgnoresTransformations);
|
|
|
|
toolTips.push_back(qMakePair(iconItem, textItem));
|
|
|
|
expand();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::refresh(struct graphics_context *gc, QPointF pos)
|
|
|
|
{
|
|
|
|
clear();
|
|
|
|
int time = (pos.x() * gc->maxtime) / gc->maxx;
|
2014-01-19 00:21:13 +00:00
|
|
|
struct membuffer mb = { 0 };
|
|
|
|
|
|
|
|
get_plot_details(gc, time, &mb);
|
|
|
|
addToolTip(QString::fromUtf8(mb.buffer, mb.len));
|
|
|
|
free_buffer(&mb);
|
2014-02-05 16:25:28 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
QList<QGraphicsItem *> items = scene()->items(pos, Qt::IntersectsItemShape, Qt::DescendingOrder, transform());
|
|
|
|
Q_FOREACH(QGraphicsItem * item, items) {
|
2014-02-05 16:25:28 +00:00
|
|
|
if (!item->toolTip().isEmpty())
|
|
|
|
addToolTip(item->toolTip());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::clear()
|
|
|
|
{
|
|
|
|
Q_FOREACH(ToolTip t, toolTips) {
|
|
|
|
delete t.first;
|
|
|
|
delete t.second;
|
|
|
|
}
|
|
|
|
toolTips.clear();
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::setRect(const QRectF &r)
|
2014-02-05 16:25:28 +00:00
|
|
|
{
|
|
|
|
// qDeleteAll(childItems());
|
|
|
|
delete background;
|
|
|
|
|
|
|
|
rectangle = r;
|
|
|
|
setBrush(QBrush(Qt::white));
|
|
|
|
setPen(QPen(Qt::black, 0.5));
|
|
|
|
|
|
|
|
// Creates a 2pixels border
|
|
|
|
QPainterPath border;
|
2014-02-28 04:09:57 +00:00
|
|
|
border.addRoundedRect(-4, -4, rectangle.width() + 8, rectangle.height() + 10, 3, 3);
|
|
|
|
border.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3);
|
2014-02-05 16:25:28 +00:00
|
|
|
setPath(border);
|
|
|
|
|
|
|
|
QPainterPath bg;
|
|
|
|
bg.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3);
|
|
|
|
|
|
|
|
QColor c = QColor(Qt::black);
|
|
|
|
c.setAlpha(155);
|
|
|
|
|
|
|
|
QGraphicsPathItem *b = new QGraphicsPathItem(bg, this);
|
|
|
|
b->setFlag(ItemStacksBehindParent);
|
|
|
|
b->setFlag(ItemIgnoresTransformations);
|
|
|
|
b->setBrush(c);
|
|
|
|
b->setPen(QPen(QBrush(Qt::transparent), 0));
|
|
|
|
b->setZValue(-10);
|
|
|
|
background = b;
|
|
|
|
|
|
|
|
updateTitlePosition();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::collapse()
|
|
|
|
{
|
|
|
|
QPropertyAnimation *animation = new QPropertyAnimation(this, "rect");
|
|
|
|
animation->setDuration(100);
|
|
|
|
animation->setStartValue(nextRectangle);
|
|
|
|
animation->setEndValue(QRect(0, 0, ICON_SMALL, ICON_SMALL));
|
|
|
|
animation->start(QAbstractAnimation::DeleteWhenStopped);
|
|
|
|
clear();
|
|
|
|
|
|
|
|
status = COLLAPSED;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::expand()
|
|
|
|
{
|
|
|
|
if (!title)
|
|
|
|
return;
|
|
|
|
|
|
|
|
double width = 0, height = title->boundingRect().height() + SPACING;
|
|
|
|
Q_FOREACH(ToolTip t, toolTips) {
|
|
|
|
if (t.second->boundingRect().width() > width)
|
|
|
|
width = t.second->boundingRect().width();
|
|
|
|
height += t.second->boundingRect().height();
|
|
|
|
}
|
|
|
|
/* Left padding, Icon Size, space, right padding */
|
2014-02-28 04:09:57 +00:00
|
|
|
width += SPACING + ICON_SMALL + SPACING + SPACING;
|
2014-02-05 16:25:28 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
if (width < title->boundingRect().width() + SPACING * 2)
|
|
|
|
width = title->boundingRect().width() + SPACING * 2;
|
2014-02-05 16:25:28 +00:00
|
|
|
|
|
|
|
if (height < ICON_SMALL)
|
|
|
|
height = ICON_SMALL;
|
|
|
|
|
|
|
|
nextRectangle.setWidth(width);
|
|
|
|
nextRectangle.setHeight(height);
|
|
|
|
|
|
|
|
QPropertyAnimation *animation = new QPropertyAnimation(this, "rect");
|
|
|
|
animation->setDuration(100);
|
|
|
|
animation->setStartValue(rectangle);
|
|
|
|
animation->setEndValue(nextRectangle);
|
|
|
|
animation->start(QAbstractAnimation::DeleteWhenStopped);
|
|
|
|
|
|
|
|
status = EXPANDED;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
ToolTipItem::ToolTipItem(QGraphicsItem *parent) : QGraphicsPathItem(parent),
|
2014-02-09 18:04:59 +00:00
|
|
|
background(0),
|
|
|
|
separator(new QGraphicsLineItem(this)),
|
|
|
|
title(new QGraphicsSimpleTextItem(tr("Information"), this)),
|
|
|
|
status(COLLAPSED),
|
2014-02-20 00:06:16 +00:00
|
|
|
timeAxis(0),
|
|
|
|
lastTime(-1)
|
2014-02-05 16:25:28 +00:00
|
|
|
{
|
2014-02-09 18:04:59 +00:00
|
|
|
memset(&pInfo, 0, sizeof(pInfo));
|
|
|
|
|
2014-02-05 16:25:28 +00:00
|
|
|
setFlags(ItemIgnoresTransformations | ItemIsMovable | ItemClipsChildrenToShape);
|
|
|
|
updateTitlePosition();
|
|
|
|
setZValue(99);
|
|
|
|
}
|
|
|
|
|
|
|
|
ToolTipItem::~ToolTipItem()
|
|
|
|
{
|
|
|
|
clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::updateTitlePosition()
|
|
|
|
{
|
2014-02-28 04:09:57 +00:00
|
|
|
if (rectangle.width() < title->boundingRect().width() + SPACING * 4) {
|
2014-02-05 16:25:28 +00:00
|
|
|
QRectF newRect = rectangle;
|
2014-02-28 04:09:57 +00:00
|
|
|
newRect.setWidth(title->boundingRect().width() + SPACING * 4);
|
2014-02-05 16:25:28 +00:00
|
|
|
newRect.setHeight((newRect.height() && isExpanded()) ? newRect.height() : ICON_SMALL);
|
|
|
|
setRect(newRect);
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
title->setPos(boundingRect().width() / 2 - title->boundingRect().width() / 2 - 1, 0);
|
2014-02-05 16:25:28 +00:00
|
|
|
title->setFlag(ItemIgnoresTransformations);
|
|
|
|
title->setPen(QPen(Qt::white, 1));
|
|
|
|
title->setBrush(Qt::white);
|
|
|
|
|
|
|
|
if (toolTips.size() > 0) {
|
|
|
|
double x1 = 3;
|
2014-02-28 04:09:57 +00:00
|
|
|
double y1 = title->pos().y() + SPACING / 2 + title->boundingRect().height();
|
2014-02-05 16:25:28 +00:00
|
|
|
double x2 = boundingRect().width() - 10;
|
|
|
|
double y2 = y1;
|
|
|
|
|
|
|
|
separator->setLine(x1, y1, x2, y2);
|
|
|
|
separator->setFlag(ItemIgnoresTransformations);
|
|
|
|
separator->setPen(QPen(Qt::white));
|
|
|
|
separator->show();
|
|
|
|
} else {
|
|
|
|
separator->hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
bool ToolTipItem::isExpanded() const
|
|
|
|
{
|
2014-02-05 16:25:28 +00:00
|
|
|
return status == EXPANDED;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
2014-02-05 16:25:28 +00:00
|
|
|
{
|
|
|
|
persistPos();
|
|
|
|
QGraphicsPathItem::mouseReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::persistPos()
|
|
|
|
{
|
|
|
|
QPoint currentPos = scene()->views().at(0)->mapFromScene(pos());
|
|
|
|
QSettings s;
|
|
|
|
s.beginGroup("ProfileMap");
|
|
|
|
s.setValue("tooltip_position", currentPos);
|
|
|
|
s.endGroup();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ToolTipItem::readPos()
|
|
|
|
{
|
|
|
|
QSettings s;
|
|
|
|
s.beginGroup("ProfileMap");
|
|
|
|
QPointF value = scene()->views().at(0)->mapToScene(
|
2014-02-28 04:09:57 +00:00
|
|
|
s.value("tooltip_position").toPoint());
|
2014-02-05 16:25:28 +00:00
|
|
|
if (!scene()->sceneRect().contains(value)) {
|
2014-02-28 04:09:57 +00:00
|
|
|
value = QPointF(0, 0);
|
2014-02-05 16:25:28 +00:00
|
|
|
}
|
|
|
|
setPos(value);
|
|
|
|
}
|
2014-02-05 16:53:57 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::setPlotInfo(const plot_info &plot)
|
2014-02-05 16:53:57 +00:00
|
|
|
{
|
|
|
|
pInfo = plot;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::setTimeAxis(DiveCartesianAxis *axis)
|
2014-02-05 16:53:57 +00:00
|
|
|
{
|
|
|
|
timeAxis = axis;
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ToolTipItem::refresh(const QPointF &pos)
|
2014-02-05 16:53:57 +00:00
|
|
|
{
|
2014-02-28 04:09:57 +00:00
|
|
|
int time = timeAxis->valueAt(pos);
|
2014-02-20 00:06:16 +00:00
|
|
|
if (time == lastTime)
|
|
|
|
return;
|
|
|
|
|
|
|
|
lastTime = time;
|
|
|
|
clear();
|
2014-01-19 00:21:13 +00:00
|
|
|
struct membuffer mb = { 0 };
|
|
|
|
|
|
|
|
get_plot_details_new(&pInfo, time, &mb);
|
|
|
|
addToolTip(QString::fromUtf8(mb.buffer, mb.len));
|
|
|
|
free_buffer(&mb);
|
2014-02-05 16:53:57 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
QList<QGraphicsItem *> items = scene()->items(pos, Qt::IntersectsItemShape, Qt::DescendingOrder, scene()->views().first()->transform());
|
|
|
|
Q_FOREACH(QGraphicsItem * item, items) {
|
2014-02-05 16:53:57 +00:00
|
|
|
if (!item->toolTip().isEmpty())
|
|
|
|
addToolTip(item->toolTip());
|
|
|
|
}
|
|
|
|
}
|