mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Added the first overlay of the tooltips, with some test data.
The tooltips now can: 1 - be moved around the canvas 2 - dynamically expand / retreat when a new tooltip is added. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
5e4f06e6ad
commit
c928b9cb94
2 changed files with 175 additions and 3 deletions
|
@ -7,6 +7,9 @@
|
||||||
#include <QBrush>
|
#include <QBrush>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QLineF>
|
#include <QLineF>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QIcon>
|
||||||
|
#include <QPropertyAnimation>
|
||||||
|
|
||||||
#include "../color.h"
|
#include "../color.h"
|
||||||
#include "../display.h"
|
#include "../display.h"
|
||||||
|
@ -146,13 +149,21 @@ static void plot_set_scale(scale_mode_t scale)
|
||||||
|
|
||||||
void ProfileGraphicsView::plot(struct dive *dive)
|
void ProfileGraphicsView::plot(struct dive *dive)
|
||||||
{
|
{
|
||||||
// Clear the items before drawing this dive.
|
|
||||||
qDeleteAll(scene()->items());
|
|
||||||
scene()->clear();
|
scene()->clear();
|
||||||
|
|
||||||
if(!dive)
|
if(!dive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QSettings s;
|
||||||
|
s.beginGroup("ProfileMap");
|
||||||
|
QPointF toolTipPos = s.value("tooltip_position", QPointF(0,0)).toPointF();
|
||||||
|
s.endGroup();
|
||||||
|
|
||||||
|
toolTip = new ToolTipItem();
|
||||||
|
toolTip->setPos(toolTipPos);
|
||||||
|
|
||||||
|
scene()->addItem(toolTip);
|
||||||
|
|
||||||
struct plot_info *pi;
|
struct plot_info *pi;
|
||||||
struct divecomputer *dc = &dive->dc;
|
struct divecomputer *dc = &dive->dc;
|
||||||
|
|
||||||
|
@ -363,7 +374,8 @@ void ProfileGraphicsView::plot_one_event(struct graphics_context *gc, struct plo
|
||||||
}
|
}
|
||||||
|
|
||||||
//attach_tooltip(x-6, y, 12, 12, buffer, ev);
|
//attach_tooltip(x-6, y, 12, 12, buffer, ev);
|
||||||
triangle->setToolTip(name);
|
//triangle->setToolTip(name);
|
||||||
|
toolTip->addToolTip(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProfileGraphicsView::plot_depth_profile(struct graphics_context *gc, struct plot_info *pi)
|
void ProfileGraphicsView::plot_depth_profile(struct graphics_context *gc, struct plot_info *pi)
|
||||||
|
@ -605,6 +617,16 @@ void ProfileGraphicsView::plot_text(struct graphics_context *gc, text_render_opt
|
||||||
scene()->addItem(item);
|
scene()->addItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProfileGraphicsView::addToolTip(const QString& text, const QIcon& icon)
|
||||||
|
{
|
||||||
|
toolTip->addToolTip(text, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProfileGraphicsView::removeToolTip(const QString& text)
|
||||||
|
{
|
||||||
|
toolTip->removeToolTip(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ProfileGraphicsView::resizeEvent(QResizeEvent *event)
|
void ProfileGraphicsView::resizeEvent(QResizeEvent *event)
|
||||||
{
|
{
|
||||||
|
@ -614,3 +636,109 @@ void ProfileGraphicsView::resizeEvent(QResizeEvent *event)
|
||||||
QRectF r = scene()->sceneRect();
|
QRectF r = scene()->sceneRect();
|
||||||
fitInView ( r.x() - 50, r.y() -50, r.width() + 100, r.height() + 100); // do a little bit of spacing;
|
fitInView ( r.x() - 50, r.y() -50, r.width() + 100, r.height() + 100); // do a little bit of spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolTipItem::addToolTip(const QString& toolTip, const QIcon& icon)
|
||||||
|
{
|
||||||
|
qDebug() << "Tooltip Adicionado" << toolTip;
|
||||||
|
|
||||||
|
QGraphicsPixmapItem *iconItem = 0;
|
||||||
|
if (!icon.isNull()) {
|
||||||
|
iconItem = new QGraphicsPixmapItem(icon.pixmap(ICON_SMALL,ICON_SMALL), this);
|
||||||
|
iconItem->setPos( 4, toolTips.keys().size() * ICON_SMALL + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
QGraphicsSimpleTextItem *textItem = new QGraphicsSimpleTextItem(toolTip, this);
|
||||||
|
textItem->setPos( 4 + ICON_SMALL + 4, toolTips.keys().size() * ICON_SMALL + 4);
|
||||||
|
textItem->setPen(QPen(Qt::white, 1));
|
||||||
|
textItem->setBrush(QBrush(Qt::white));
|
||||||
|
textItem->setFlag(ItemIgnoresTransformations);
|
||||||
|
|
||||||
|
toolTips[toolTip] = qMakePair(iconItem, textItem);
|
||||||
|
expand();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipItem::removeToolTip(const QString& toolTip)
|
||||||
|
{
|
||||||
|
ToolTip toBeRemoved = toolTips[toolTip];
|
||||||
|
delete toBeRemoved.first;
|
||||||
|
delete toBeRemoved.second;
|
||||||
|
expand();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipItem::clear()
|
||||||
|
{
|
||||||
|
Q_FOREACH(ToolTip t, toolTips) {
|
||||||
|
delete t.first;
|
||||||
|
delete t.second;
|
||||||
|
}
|
||||||
|
toolTips.clear();
|
||||||
|
expand();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipItem::setRect(const QRectF& r)
|
||||||
|
{
|
||||||
|
|
||||||
|
// qDeleteAll(childItems());
|
||||||
|
if (background) {
|
||||||
|
childItems().removeAt(childItems().indexOf(background));
|
||||||
|
delete background;
|
||||||
|
}
|
||||||
|
|
||||||
|
rectangle = r;
|
||||||
|
setBrush(QBrush(Qt::white));
|
||||||
|
setPen(QPen(Qt::black, 0.5));
|
||||||
|
|
||||||
|
QPainterPath border;
|
||||||
|
border.addRoundedRect(-2, -2, rectangle.width() + 4, rectangle.height()+ 4, 3, 3);
|
||||||
|
border.addRoundedRect( 0, 0, rectangle.width(), rectangle.height(), 3, 3);
|
||||||
|
setPath(border);
|
||||||
|
|
||||||
|
QGraphicsRectItem *b = new QGraphicsRectItem(-1, -1, rectangle.width()+1, rectangle.height()+1, this);
|
||||||
|
b->setFlag(ItemStacksBehindParent);
|
||||||
|
QColor c = QColor(Qt::black);
|
||||||
|
c.setAlpha(155);
|
||||||
|
b->setBrush(c);
|
||||||
|
background = b;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ToolTipItem::collapse()
|
||||||
|
{
|
||||||
|
QRectF newRect = childrenBoundingRect();
|
||||||
|
QPropertyAnimation *animation = new QPropertyAnimation(this, "rect");
|
||||||
|
animation->setDuration(100);
|
||||||
|
animation->setStartValue(boundingRect());
|
||||||
|
animation->setEndValue(QRect(0, 0, ICON_SMALL, ICON_SMALL ));
|
||||||
|
animation->start(QAbstractAnimation::DeleteWhenStopped);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipItem::expand()
|
||||||
|
{
|
||||||
|
QRectF newRect = childrenBoundingRect();
|
||||||
|
newRect = QRect(0, 0, newRect.width() + 8, newRect.height() + 8);
|
||||||
|
if (newRect != boundingRect()) {
|
||||||
|
QRectF newRect = childrenBoundingRect();
|
||||||
|
QPropertyAnimation *animation = new QPropertyAnimation(this, "rect");
|
||||||
|
animation->setDuration(100);
|
||||||
|
animation->setStartValue(boundingRect());
|
||||||
|
animation->setEndValue(newRect);
|
||||||
|
animation->start(QAbstractAnimation::DeleteWhenStopped);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTipItem::ToolTipItem(QGraphicsItem* parent): QGraphicsPathItem(parent), background(0)
|
||||||
|
{
|
||||||
|
setRect(QRectF(0,0,ICON_SMALL, ICON_SMALL));
|
||||||
|
setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||||
|
setFlag(QGraphicsItem::ItemIsMovable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolTipStatusHandler::mousePressEvent(QGraphicsSceneMouseEvent* event)
|
||||||
|
{
|
||||||
|
QGraphicsItem::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTipStatusHandler::ToolTipStatusHandler(QObject* parent): QObject(parent), QGraphicsEllipseItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
|
@ -2,17 +2,59 @@
|
||||||
#define PROFILEGRAPHICS_H
|
#define PROFILEGRAPHICS_H
|
||||||
|
|
||||||
#include <QGraphicsView>
|
#include <QGraphicsView>
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
struct text_render_options;
|
struct text_render_options;
|
||||||
struct graphics_context;
|
struct graphics_context;
|
||||||
struct plot_info;
|
struct plot_info;
|
||||||
typedef struct text_render_options text_render_options_t;
|
typedef struct text_render_options text_render_options_t;
|
||||||
|
|
||||||
|
|
||||||
|
class ToolTipItem;
|
||||||
|
class ToolTipStatusHandler;
|
||||||
|
|
||||||
|
class ToolTipStatusHandler :public QObject, public QGraphicsEllipseItem {
|
||||||
|
public:
|
||||||
|
explicit ToolTipStatusHandler(QObject* parent = 0);
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent* event);
|
||||||
|
};
|
||||||
|
|
||||||
|
class ToolTipItem :public QObject, public QGraphicsPathItem {
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QRectF rect READ boundingRect WRITE setRect)
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Status {COLLAPSED, EXPANDED};
|
||||||
|
enum {ICON_SMALL = 16, ICON_MEDIUM = 24, ICON_BIG = 32};
|
||||||
|
|
||||||
|
explicit ToolTipItem(QGraphicsItem* parent = 0);
|
||||||
|
|
||||||
|
void collapse();
|
||||||
|
void expand();
|
||||||
|
void clear();
|
||||||
|
void addToolTip(const QString& toolTip, const QIcon& icon = QIcon());
|
||||||
|
void removeToolTip(const QString& toolTip);
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void setRect(const QRectF& rect);
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef QPair<QGraphicsPixmapItem*, QGraphicsSimpleTextItem*> ToolTip;
|
||||||
|
enum Status status;
|
||||||
|
QMap<QString, ToolTip > toolTips;
|
||||||
|
QGraphicsRectItem *background;
|
||||||
|
QRectF rectangle;
|
||||||
|
};
|
||||||
|
|
||||||
class ProfileGraphicsView : public QGraphicsView {
|
class ProfileGraphicsView : public QGraphicsView {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
ProfileGraphicsView(QWidget* parent = 0);
|
ProfileGraphicsView(QWidget* parent = 0);
|
||||||
void plot(struct dive *d);
|
void plot(struct dive *d);
|
||||||
|
void addToolTip(const QString& text, const QIcon& icon = QIcon());
|
||||||
|
void removeToolTip(const QString& text);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void resizeEvent(QResizeEvent *event);
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
@ -25,6 +67,8 @@ private:
|
||||||
|
|
||||||
QPen defaultPen;
|
QPen defaultPen;
|
||||||
QBrush defaultBrush;
|
QBrush defaultBrush;
|
||||||
|
ToolTipItem *toolTip;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue