diff options
-rw-r--r-- | qt-ui/profile/divetooltipitem.cpp | 209 | ||||
-rw-r--r-- | qt-ui/profile/divetooltipitem.h | 54 | ||||
-rw-r--r-- | qt-ui/profilegraphics.cpp | 199 | ||||
-rw-r--r-- | qt-ui/profilegraphics.h | 41 | ||||
-rw-r--r-- | subsurface.pro | 6 |
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 |