aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui/profile
diff options
context:
space:
mode:
Diffstat (limited to 'qt-ui/profile')
-rw-r--r--qt-ui/profile/divetooltipitem.cpp209
-rw-r--r--qt-ui/profile/divetooltipitem.h54
2 files changed, 263 insertions, 0 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