summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt-ui/profile/divetooltipitem.cpp209
-rw-r--r--qt-ui/profile/divetooltipitem.h54
-rw-r--r--qt-ui/profilegraphics.cpp199
-rw-r--r--qt-ui/profilegraphics.h41
-rw-r--r--subsurface.pro6
5 files changed, 269 insertions, 240 deletions
diff --git a/qt-ui/profile/divetooltipitem.cpp b/qt-ui/profile/divetooltipitem.cpp
new file mode 100644
index 000000000..dbc6f1df0
--- /dev/null
+++ b/qt-ui/profile/divetooltipitem.cpp
@@ -0,0 +1,209 @@
+#include "divetooltipitem.h"
+#include <QPropertyAnimation>
+#include <QGraphicsSceneMouseEvent>
+#include <QPen>
+#include <QBrush>
+#include <QGraphicsScene>
+#include <QSettings>
+#include <QGraphicsView>
+
+#define PORT_IN_PROGRESS 1
+#ifdef PORT_IN_PROGRESS
+#include "display.h"
+#endif
+
+void ToolTipItem::addToolTip(const QString& toolTip, const QIcon& icon)
+{
+ QGraphicsPixmapItem *iconItem = 0;
+ double yValue = title->boundingRect().height() + SPACING;
+ Q_FOREACH(ToolTip t, toolTips) {
+ yValue += t.second->boundingRect().height();
+ }
+ if (!icon.isNull()) {
+ iconItem = new QGraphicsPixmapItem(icon.pixmap(ICON_SMALL,ICON_SMALL), this);
+ 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;
+ char buffer[500];
+ get_plot_details(gc, time, buffer, 500);
+ addToolTip(QString(buffer));
+
+ QList<QGraphicsItem*> items = scene()->items(pos, Qt::IntersectsItemShape, Qt::DescendingOrder, transform());
+ Q_FOREACH(QGraphicsItem *item, items) {
+ if (!item->toolTip().isEmpty())
+ addToolTip(item->toolTip());
+ }
+}
+
+void ToolTipItem::clear()
+{
+ Q_FOREACH(ToolTip t, toolTips) {
+ delete t.first;
+ delete t.second;
+ }
+ toolTips.clear();
+}
+
+void ToolTipItem::setRect(const QRectF& r)
+{
+ // qDeleteAll(childItems());
+ delete background;
+
+ rectangle = r;
+ setBrush(QBrush(Qt::white));
+ setPen(QPen(Qt::black, 0.5));
+
+ // Creates a 2pixels border
+ QPainterPath border;
+ border.addRoundedRect(-4, -4, rectangle.width() + 8, rectangle.height() + 10, 3, 3);
+ border.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3);
+ 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 */
+ width += SPACING + ICON_SMALL + SPACING + SPACING;
+
+ if (width < title->boundingRect().width() + SPACING*2)
+ width = title->boundingRect().width() + SPACING*2;
+
+ 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;
+}
+
+ToolTipItem::ToolTipItem(QGraphicsItem* parent): QGraphicsPathItem(parent), background(0)
+{
+ title = new QGraphicsSimpleTextItem(tr("Information"), this);
+ separator = new QGraphicsLineItem(this);
+ setFlags(ItemIgnoresTransformations | ItemIsMovable | ItemClipsChildrenToShape);
+ status = COLLAPSED;
+ updateTitlePosition();
+ setZValue(99);
+}
+
+ToolTipItem::~ToolTipItem()
+{
+ clear();
+}
+
+void ToolTipItem::updateTitlePosition()
+{
+ if (rectangle.width() < title->boundingRect().width() + SPACING*4) {
+ QRectF newRect = rectangle;
+ newRect.setWidth(title->boundingRect().width() + SPACING*4);
+ newRect.setHeight((newRect.height() && isExpanded()) ? newRect.height() : ICON_SMALL);
+ setRect(newRect);
+ }
+
+ title->setPos(boundingRect().width()/2 - title->boundingRect().width()/2 -1, 0);
+ title->setFlag(ItemIgnoresTransformations);
+ title->setPen(QPen(Qt::white, 1));
+ title->setBrush(Qt::white);
+
+ if (toolTips.size() > 0) {
+ double x1 = 3;
+ double y1 = title->pos().y() + SPACING/2 + title->boundingRect().height();
+ 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();
+ }
+}
+
+bool ToolTipItem::isExpanded() {
+ return status == EXPANDED;
+}
+
+void ToolTipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
+{
+ 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(
+ s.value("tooltip_position").toPoint()
+ );
+ if (!scene()->sceneRect().contains(value)) {
+ value = QPointF(0,0);
+ }
+ setPos(value);
+}
diff --git a/qt-ui/profile/divetooltipitem.h b/qt-ui/profile/divetooltipitem.h
new file mode 100644
index 000000000..9f7b83656
--- /dev/null
+++ b/qt-ui/profile/divetooltipitem.h
@@ -0,0 +1,54 @@
+#ifndef DIVETOOLTIPITEM_H
+#define DIVETOOLTIPITEM_H
+
+#include <QGraphicsPathItem>
+#include <QVector>
+#include <QPair>
+#include <QRectF>
+#include <QIcon>
+
+class QGraphicsLineItem;
+class QGraphicsSimpleTextItem;
+class QGraphicsPixmapItem;
+struct graphics_context;
+
+/* To use a tooltip, simply ->setToolTip on the QGraphicsItem that you want
+ * or, if it's a "global" tooltip, set it on the mouseMoveEvent of the ProfileGraphicsView.
+ */
+class ToolTipItem :public QObject, public QGraphicsPathItem
+{
+ Q_OBJECT
+ void updateTitlePosition();
+ Q_PROPERTY(QRectF rect READ boundingRect WRITE setRect)
+
+public:
+ enum Status{COLLAPSED, EXPANDED};
+ enum {ICON_SMALL = 16, ICON_MEDIUM = 24, ICON_BIG = 32, SPACING=4};
+
+ explicit ToolTipItem(QGraphicsItem* parent = 0);
+ virtual ~ToolTipItem();
+
+ void collapse();
+ void expand();
+ void clear();
+ void addToolTip(const QString& toolTip, const QIcon& icon = QIcon());
+ void refresh(struct graphics_context* gc, QPointF pos);
+ bool isExpanded();
+ void persistPos();
+ void readPos();
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
+public slots:
+ void setRect(const QRectF& rect);
+
+private:
+ typedef QPair<QGraphicsPixmapItem*, QGraphicsSimpleTextItem*> ToolTip;
+ QVector<ToolTip> toolTips;
+ QGraphicsPathItem *background;
+ QGraphicsLineItem *separator;
+ QGraphicsSimpleTextItem *title;
+ Status status;
+ QRectF rectangle;
+ QRectF nextRectangle;
+};
+
+#endif \ No newline at end of file
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index 0bb78d7e6..d500b42e8 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -28,6 +28,7 @@
#include "../helpers.h"
#include "../planner.h"
#include "../gettextfromc.h"
+#include "profile/divetooltipitem.h"
#include <libdivecomputer/parser.h>
#include <libdivecomputer/version.h>
@@ -1448,204 +1449,6 @@ void ProfileGraphicsView::on_scaleAction()
zoomed_plot = !zoomed_plot;
refresh();
}
-
-void ToolTipItem::addToolTip(const QString& toolTip, const QIcon& icon)
-{
- QGraphicsPixmapItem *iconItem = 0;
- double yValue = title->boundingRect().height() + SPACING;
- Q_FOREACH(ToolTip t, toolTips) {
- yValue += t.second->boundingRect().height();
- }
- if (!icon.isNull()) {
- iconItem = new QGraphicsPixmapItem(icon.pixmap(ICON_SMALL,ICON_SMALL), this);
- 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;
- char buffer[500];
- get_plot_details(gc, time, buffer, 500);
- addToolTip(QString(buffer));
-
- QList<QGraphicsItem*> items = scene()->items(pos, Qt::IntersectsItemShape, Qt::DescendingOrder, transform());
- Q_FOREACH(QGraphicsItem *item, items) {
- if (!item->toolTip().isEmpty())
- addToolTip(item->toolTip());
- }
-
-}
-
-void ToolTipItem::clear()
-{
- Q_FOREACH(ToolTip t, toolTips) {
- delete t.first;
- delete t.second;
- }
- toolTips.clear();
-}
-
-void ToolTipItem::setRect(const QRectF& r)
-{
- // qDeleteAll(childItems());
- delete background;
-
- rectangle = r;
- setBrush(QBrush(Qt::white));
- setPen(QPen(Qt::black, 0.5));
-
- // Creates a 2pixels border
- QPainterPath border;
- border.addRoundedRect(-4, -4, rectangle.width() + 8, rectangle.height() + 10, 3, 3);
- border.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3);
- 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->setFlags(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 */
- width += SPACING + ICON_SMALL + SPACING + SPACING;
-
- if (width < title->boundingRect().width() + SPACING*2)
- width = title->boundingRect().width() + SPACING*2;
-
- 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;
-}
-
-ToolTipItem::ToolTipItem(QGraphicsItem* parent): QGraphicsPathItem(parent), background(0)
-{
- title = new QGraphicsSimpleTextItem(tr("Information"), this);
- separator = new QGraphicsLineItem(this);
- setFlags(ItemIgnoresTransformations | ItemIsMovable | ItemClipsChildrenToShape);
- status = COLLAPSED;
- updateTitlePosition();
- setZValue(99);
-}
-
-ToolTipItem::~ToolTipItem()
-{
- clear();
-}
-
-void ToolTipItem::updateTitlePosition()
-{
- if (rectangle.width() < title->boundingRect().width() + SPACING*4) {
- QRectF newRect = rectangle;
- newRect.setWidth(title->boundingRect().width() + SPACING*4);
- newRect.setHeight((newRect.height() && isExpanded()) ? newRect.height() : ICON_SMALL);
- setRect(newRect);
- }
-
- title->setPos(boundingRect().width()/2 - title->boundingRect().width()/2 -1, 0);
- title->setFlag(ItemIgnoresTransformations);
- title->setPen(QPen(Qt::white, 1));
- title->setBrush(Qt::white);
-
- if (toolTips.size() > 0) {
- double x1 = 3;
- double y1 = title->pos().y() + SPACING/2 + title->boundingRect().height();
- 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();
- }
-}
-
-bool ToolTipItem::isExpanded() {
- return status == EXPANDED;
-}
-
-void ToolTipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
-{
- 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(
- s.value("tooltip_position").toPoint()
- );
- if (!scene()->sceneRect().contains(value)) {
- value = QPointF(0,0);
- }
- setPos(value);
-}
-
QColor EventItem::getColor(const color_indice_t i)
{
return profile_color[i].at((isGrayscale) ? 1 : 0);
diff --git a/qt-ui/profilegraphics.h b/qt-ui/profilegraphics.h
index e2b858149..9080141ef 100644
--- a/qt-ui/profilegraphics.h
+++ b/qt-ui/profilegraphics.h
@@ -12,47 +12,8 @@
struct graphics_context;
struct plot_info;
-
-/* To use a tooltip, simply ->setToolTip on the QGraphicsItem that you want
- * or, if it's a "global" tooltip, set it on the mouseMoveEvent of the ProfileGraphicsView.
- */
-class ToolTipItem :public QObject, public QGraphicsPathItem
-{
- Q_OBJECT
- void updateTitlePosition();
- Q_PROPERTY(QRectF rect READ boundingRect WRITE setRect)
-
-public:
- enum Status{COLLAPSED, EXPANDED};
- enum {ICON_SMALL = 16, ICON_MEDIUM = 24, ICON_BIG = 32, SPACING=4};
-
- explicit ToolTipItem(QGraphicsItem* parent = 0);
- virtual ~ToolTipItem();
-
- void collapse();
- void expand();
- void clear();
- void addToolTip(const QString& toolTip, const QIcon& icon = QIcon());
- void refresh(struct graphics_context* gc, QPointF pos);
- bool isExpanded();
- void persistPos();
- void readPos();
- void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
-public slots:
- void setRect(const QRectF& rect);
-
-private:
- typedef QPair<QGraphicsPixmapItem*, QGraphicsSimpleTextItem*> ToolTip;
- QVector<ToolTip> toolTips;
- QGraphicsPathItem *background;
- QGraphicsLineItem *separator;
- QGraphicsSimpleTextItem *title;
- Status status;
- QRectF rectangle;
- QRectF nextRectangle;
-};
-
class RulerItem;
+class ToolTipItem;
class RulerNodeItem : public QObject, public QGraphicsEllipseItem
{
diff --git a/subsurface.pro b/subsurface.pro
index 32f925ca1..ea5dd3488 100644
--- a/subsurface.pro
+++ b/subsurface.pro
@@ -73,7 +73,8 @@ HEADERS = \
qt-ui/profile/divecartesianaxis.h \
qt-ui/profile/diveplotdatamodel.h \
qt-ui/profile/diveprofileitem.h \
- qt-ui/profile/diveeventitem.h
+ qt-ui/profile/diveeventitem.h \
+ qt-ui/profile/divetooltipitem.h
SOURCES = \
deco.c \
@@ -134,7 +135,8 @@ SOURCES = \
qt-ui/profile/divecartesianaxis.cpp \
qt-ui/profile/diveplotdatamodel.cpp \
qt-ui/profile/diveprofileitem.cpp \
- qt-ui/profile/diveeventitem.cpp
+ qt-ui/profile/diveeventitem.cpp \
+ qt-ui/profile/divetooltipitem.cpp
linux*: SOURCES += linux.c
mac: SOURCES += macos.c