diff options
author | hjk <hjk121@nokiamail.com> | 2014-12-08 10:57:05 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-12-08 12:56:12 +0100 |
commit | 50ad32a25b3a5343dfb1157bb71d55b6a4d8a9b4 (patch) | |
tree | 590a6af3b62e7ce9a3b0ad186f03be6b85fc84a8 /src/libs/utils/tooltip | |
parent | 89115df9baaa0945423575b20993dca99c46d198 (diff) |
Utils: Start simplification of tooltip handling
There's a bit too much unneeded flexibility in there, requiring extra
boiler-plate code on the user side.
Change-Id: I34d03838fb1cd3182fcbb93bf65158ebfc7e2bce
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Diffstat (limited to 'src/libs/utils/tooltip')
-rw-r--r-- | src/libs/utils/tooltip/tipcontents.cpp | 139 | ||||
-rw-r--r-- | src/libs/utils/tooltip/tipcontents.h | 95 | ||||
-rw-r--r-- | src/libs/utils/tooltip/tips.cpp | 55 | ||||
-rw-r--r-- | src/libs/utils/tooltip/tips.h | 26 | ||||
-rw-r--r-- | src/libs/utils/tooltip/tooltip.cpp | 33 | ||||
-rw-r--r-- | src/libs/utils/tooltip/tooltip.h | 13 |
6 files changed, 102 insertions, 259 deletions
diff --git a/src/libs/utils/tooltip/tipcontents.cpp b/src/libs/utils/tooltip/tipcontents.cpp index 63becb9e47..75e0da721c 100644 --- a/src/libs/utils/tooltip/tipcontents.cpp +++ b/src/libs/utils/tooltip/tipcontents.cpp @@ -39,146 +39,51 @@ namespace Utils { TipContent::TipContent() -{} - -TipContent::~TipContent() -{} - -ColorContent::ColorContent(const QColor &color) : m_color(color) -{} - -ColorContent::~ColorContent() -{} - -TipContent *ColorContent::clone() const -{ - return new ColorContent(*this); -} - -int ColorContent::typeId() const -{ - return COLOR_CONTENT_ID; -} - -bool ColorContent::isValid() const -{ - return m_color.isValid(); -} - -bool ColorContent::isInteractive() const -{ - return false; -} - -int ColorContent::showTime() const -{ - return 4000; -} - -bool ColorContent::equals(const TipContent &tipContent) const -{ - if (typeId() == tipContent.typeId()) { - if (m_color == static_cast<const ColorContent &>(tipContent).m_color) - return true; - } - return false; -} - -const QColor &ColorContent::color() const -{ - return m_color; -} - -TextContent::TextContent(const QString &text) : m_text(text) -{} - -TextContent::~TextContent() -{} - -TipContent *TextContent::clone() const + : m_typeId(0), m_widget(0), m_interactive(false) { - return new TextContent(*this); } -int TextContent::typeId() const +TipContent::TipContent(const QString &text) + : m_typeId(TEXT_CONTENT_ID), m_text(text), m_widget(0), m_interactive(false) { - return TEXT_CONTENT_ID; } -bool TextContent::isValid() const +TipContent::TipContent(const QColor &color) + : m_typeId(COLOR_CONTENT_ID), m_color(color), m_widget(0), m_interactive(false) { - return !m_text.isEmpty(); } -bool TextContent::isInteractive() const -{ - return false; -} - -int TextContent::showTime() const -{ - return 10000 + 40 * qMax(0, m_text.length() - 100); -} - -bool TextContent::equals(const TipContent &tipContent) const -{ - if (typeId() == tipContent.typeId()) { - if (m_text == static_cast<const TextContent &>(tipContent).m_text) - return true; - } - return false; -} - -const QString &TextContent::text() const -{ - return m_text; -} - -WidgetContent::WidgetContent(QWidget *w, bool interactive) : - m_widget(w), m_interactive(interactive) +TipContent::TipContent(QWidget *w, bool interactive) + : m_typeId(WIDGET_CONTENT_ID), m_widget(w), m_interactive(interactive) { } -TipContent *WidgetContent::clone() const -{ - return new WidgetContent(m_widget, m_interactive); -} - -int WidgetContent::typeId() const -{ - return WIDGET_CONTENT_ID; -} - -bool WidgetContent::isValid() const +bool TipContent::isValid() const { + if (m_typeId == TEXT_CONTENT_ID) + return !m_text.isEmpty(); + if (m_typeId == COLOR_CONTENT_ID) + return m_color.isValid(); return m_widget; } -bool WidgetContent::isInteractive() const -{ - return m_interactive; -} - -void WidgetContent::setInteractive(bool i) -{ - m_interactive = i; -} - -int WidgetContent::showTime() const +int TipContent::showTime() const { + if (m_typeId == TEXT_CONTENT_ID) + return 10000 + 40 * qMax(0, m_text.length() - 100); + if (m_typeId == COLOR_CONTENT_ID) + return 4000; return 30000; } -bool WidgetContent::equals(const TipContent &tipContent) const +bool TipContent::equals(const TipContent &other) const { - if (typeId() == tipContent.typeId()) { - if (m_widget == static_cast<const WidgetContent &>(tipContent).m_widget) - return true; - } - return false; + return m_typeId == other.m_typeId + && m_text == other.m_text + && m_widget == other.m_widget; } -bool WidgetContent::pinToolTip(QWidget *w, QWidget *parent) +bool TipContent::pinToolTip(QWidget *w, QWidget *parent) { QTC_ASSERT(w, return false); // Find the parent WidgetTip, tell it to pin/release the diff --git a/src/libs/utils/tooltip/tipcontents.h b/src/libs/utils/tooltip/tipcontents.h index 1792cbed23..46d81314a6 100644 --- a/src/libs/utils/tooltip/tipcontents.h +++ b/src/libs/utils/tooltip/tipcontents.h @@ -41,86 +41,37 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT TipContent { -protected: - TipContent(); - -public: - virtual ~TipContent(); - - virtual TipContent *clone() const = 0; - virtual int typeId() const = 0; - virtual bool isValid() const = 0; - virtual bool isInteractive() const = 0; - virtual int showTime() const = 0; - virtual bool equals(const TipContent &tipContent) const = 0; -}; - -class QTCREATOR_UTILS_EXPORT ColorContent : public TipContent -{ -public: - ColorContent(const QColor &color); - virtual ~ColorContent(); - - virtual TipContent *clone() const; - virtual int typeId() const; - virtual bool isValid() const; - virtual bool isInteractive() const; - virtual int showTime() const; - virtual bool equals(const TipContent &tipContent) const; - - const QColor &color() const; - - static const int COLOR_CONTENT_ID = 0; - -private: - QColor m_color; -}; - -class QTCREATOR_UTILS_EXPORT TextContent : public TipContent -{ public: - TextContent(const QString &text); - virtual ~TextContent(); - - virtual TipContent *clone() const; - virtual int typeId() const; - virtual bool isValid() const; - virtual bool isInteractive() const; - virtual int showTime() const; - virtual bool equals(const TipContent &tipContent) const; - - const QString &text() const; - - static const int TEXT_CONTENT_ID = 1; - -private: - QString m_text; -}; - -// A content for displaying any widget (with a layout). -class QTCREATOR_UTILS_EXPORT WidgetContent : public TipContent -{ -public: - explicit WidgetContent(QWidget *w, bool interactive = false); - - virtual TipContent *clone() const; - virtual int typeId() const; - virtual bool isValid() const; - virtual int showTime() const; - virtual bool isInteractive() const; - void setInteractive(bool i); + TipContent(); + explicit TipContent(const QString &text); + explicit TipContent(const QColor &color); + explicit TipContent(QWidget *w, bool interactive); + + int typeId() const { return m_typeId; } + bool isValid() const; + bool isInteractive() const { return m_interactive; } + int showTime() const; + bool equals(const TipContent &other) const; + + const QString &text() const { return m_text; } + const QColor &color() const { return m_color; } + QWidget *widget() const { return m_widget; } - virtual bool equals(const TipContent &tipContent) const; + enum { + COLOR_CONTENT_ID = 0, + TEXT_CONTENT_ID = 1, + WIDGET_CONTENT_ID = 42 + }; + void setInteractive(bool i) { m_interactive = i; } // Helper to 'pin' (show as real window) a tooltip shown // using WidgetContent static bool pinToolTip(QWidget *w, QWidget *parent); - static const int WIDGET_CONTENT_ID = 42; - - QWidget *widget() const { return m_widget; } - private: + int m_typeId; + QString m_text; + QColor m_color; QWidget *m_widget; bool m_interactive; }; diff --git a/src/libs/utils/tooltip/tips.cpp b/src/libs/utils/tooltip/tips.cpp index 6df801b945..f2886e7dcb 100644 --- a/src/libs/utils/tooltip/tips.cpp +++ b/src/libs/utils/tooltip/tips.cpp @@ -51,47 +51,38 @@ namespace Utils { namespace Internal { -namespace { - // @todo: Reuse... - QPixmap tilePixMap(int size) - { - const int checkerbordSize= size; - QPixmap tilePixmap(checkerbordSize * 2, checkerbordSize * 2); - tilePixmap.fill(Qt::white); - QPainter tilePainter(&tilePixmap); - QColor color(220, 220, 220); - tilePainter.fillRect(0, 0, checkerbordSize, checkerbordSize, color); - tilePainter.fillRect(checkerbordSize, checkerbordSize, checkerbordSize, checkerbordSize, color); - return tilePixmap; - } +// @todo: Reuse... +static QPixmap tilePixMap(int size) +{ + const int checkerbordSize= size; + QPixmap tilePixmap(checkerbordSize * 2, checkerbordSize * 2); + tilePixmap.fill(Qt::white); + QPainter tilePainter(&tilePixmap); + QColor color(220, 220, 220); + tilePainter.fillRect(0, 0, checkerbordSize, checkerbordSize, color); + tilePainter.fillRect(checkerbordSize, checkerbordSize, checkerbordSize, checkerbordSize, color); + return tilePixmap; } + QTipLabel::QTipLabel(QWidget *parent) : - QLabel(parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget), - m_tipContent(0) + QLabel(parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget) {} QTipLabel::~QTipLabel() { - TipContent *tmpTipContent = m_tipContent; - m_tipContent = 0; - delete tmpTipContent; } bool QTipLabel::isInteractive() const { - return m_tipContent && m_tipContent->isInteractive(); + return m_tipContent.isInteractive(); } void QTipLabel::setContent(const TipContent &content) { - TipContent *tmpTipContent = m_tipContent; - m_tipContent = content.clone(); - delete tmpTipContent; + m_tipContent = content; } -const TipContent &QTipLabel::content() const -{ return *m_tipContent; } ColorTip::ColorTip(QWidget *parent) : QTipLabel(parent) { @@ -112,16 +103,14 @@ void ColorTip::configure(const QPoint &pos, QWidget *w) bool ColorTip::canHandleContentReplacement(const TipContent &content) const { - if (content.typeId() == ColorContent::COLOR_CONTENT_ID) - return true; - return false; + return content.typeId() == TipContent::COLOR_CONTENT_ID; } void ColorTip::paintEvent(QPaintEvent *event) { QTipLabel::paintEvent(event); - const QColor &color = static_cast<const ColorContent &>(content()).color(); + const QColor &color = content().color(); QPen pen; pen.setWidth(1); @@ -155,8 +144,7 @@ TextTip::~TextTip() void TextTip::configure(const QPoint &pos, QWidget *w) { - const QString &text = static_cast<const TextContent &>(content()).text(); - setText(text); + setText(content().text()); // Make it look good with the default ToolTip font on Mac, which has a small descent. QFontMetrics fm(font()); @@ -183,9 +171,7 @@ void TextTip::configure(const QPoint &pos, QWidget *w) bool TextTip::canHandleContentReplacement(const TipContent &content) const { - if (content.typeId() == TextContent::TEXT_CONTENT_ID) - return true; - return false; + return content.typeId() == TipContent::TEXT_CONTENT_ID; } void TextTip::paintEvent(QPaintEvent *event) @@ -219,8 +205,7 @@ WidgetTip::WidgetTip(QWidget *parent) : void WidgetTip::configure(const QPoint &pos, QWidget *) { - const WidgetContent &anyContent = static_cast<const WidgetContent &>(content()); - QWidget *widget = anyContent.widget(); + QWidget *widget = content().widget(); QTC_ASSERT(widget && m_layout->count() == 0, return); diff --git a/src/libs/utils/tooltip/tips.h b/src/libs/utils/tooltip/tips.h index 6d7408950e..1c236f0a8c 100644 --- a/src/libs/utils/tooltip/tips.h +++ b/src/libs/utils/tooltip/tips.h @@ -31,14 +31,14 @@ #ifndef TIPS_H #define TIPS_H +#include "tipcontents.h" + #include <QSharedPointer> #include <QLabel> #include <QPixmap> QT_FORWARD_DECLARE_CLASS(QVBoxLayout) -namespace Utils { class TipContent; } - #ifndef Q_MOC_RUN namespace Utils { namespace Internal { @@ -55,7 +55,7 @@ public: virtual ~QTipLabel(); void setContent(const TipContent &content); - const TipContent &content() const; + const TipContent &content() const { return m_tipContent; } virtual void configure(const QPoint &pos, QWidget *w) = 0; virtual bool canHandleContentReplacement(const TipContent &content) const = 0; @@ -63,38 +63,38 @@ public: bool isInteractive() const; private: - TipContent *m_tipContent; + TipContent m_tipContent; }; -class ColorTip : public QTipLabel +class TextTip : public QTipLabel { Q_OBJECT public: - ColorTip(QWidget *parent); - virtual ~ColorTip(); + TextTip(QWidget *parent); + virtual ~TextTip(); virtual void configure(const QPoint &pos, QWidget *w); virtual bool canHandleContentReplacement(const TipContent &content) const; private: virtual void paintEvent(QPaintEvent *event); - - QPixmap m_tilePixMap; + virtual void resizeEvent(QResizeEvent *event); }; -class TextTip : public QTipLabel +class ColorTip : public QTipLabel { Q_OBJECT public: - TextTip(QWidget *parent); - virtual ~TextTip(); + ColorTip(QWidget *parent); + virtual ~ColorTip(); virtual void configure(const QPoint &pos, QWidget *w); virtual bool canHandleContentReplacement(const TipContent &content) const; private: virtual void paintEvent(QPaintEvent *event); - virtual void resizeEvent(QResizeEvent *event); + + QPixmap m_tilePixMap; }; class WidgetTip : public QTipLabel diff --git a/src/libs/utils/tooltip/tooltip.cpp b/src/libs/utils/tooltip/tooltip.cpp index f62218256d..fa733c1c3d 100644 --- a/src/libs/utils/tooltip/tooltip.cpp +++ b/src/libs/utils/tooltip/tooltip.cpp @@ -51,8 +51,8 @@ using namespace Internal; ToolTip::ToolTip() : m_tip(0), m_widget(0) { - connect(&m_showTimer, SIGNAL(timeout()), this, SLOT(hideTipImmediately())); - connect(&m_hideDelayTimer, SIGNAL(timeout()), this, SLOT(hideTipImmediately())); + connect(&m_showTimer, &QTimer::timeout, this, &ToolTip::hideTipImmediately); + connect(&m_hideDelayTimer, &QTimer::timeout, this, &ToolTip::hideTipImmediately); } ToolTip::~ToolTip() @@ -66,20 +66,25 @@ ToolTip *ToolTip::instance() return &tooltip; } -void ToolTip::show(const QPoint &pos, const TipContent &content, QWidget *w, const QRect &rect) +void ToolTip::show(const QPoint &pos, const QString &content, QWidget *w, const QRect &rect) { - instance()->showInternal(pos, content, w, rect); + instance()->showInternal(pos, TipContent(content), w, rect); } -void ToolTip::move(const QPoint &pos, QWidget *w) +void ToolTip::show(const QPoint &pos, const QColor &color, QWidget *w, const QRect &rect) { - if (isVisible()) - instance()->placeTip(pos, w); + instance()->showInternal(pos, TipContent(color), w, rect); } -void ToolTip::show(const QPoint &pos, const TipContent &content, QWidget *w) +void ToolTip::show(const QPoint &pos, QWidget *content, QWidget *w, const QRect &rect) { - show(pos, content, w, QRect()); + instance()->showInternal(pos, TipContent(content, true), w, rect); +} + +void ToolTip::move(const QPoint &pos, QWidget *w) +{ + if (isVisible()) + instance()->placeTip(pos, w); } bool ToolTip::acceptShow(const TipContent &content, @@ -209,13 +214,13 @@ void ToolTip::showInternal(const QPoint &pos, const TipContent &content, QWidget target = w; switch (content.typeId()) { - case TextContent::TEXT_CONTENT_ID: - m_tip = new TextTip(target); - break; - case ColorContent::COLOR_CONTENT_ID: + case TipContent::COLOR_CONTENT_ID: m_tip = new ColorTip(target); break; - case WidgetContent::WIDGET_CONTENT_ID: + case TipContent::TEXT_CONTENT_ID: + m_tip = new TextTip(target); + break; + case TipContent::WIDGET_CONTENT_ID: m_tip = new WidgetTip(target); break; } diff --git a/src/libs/utils/tooltip/tooltip.h b/src/libs/utils/tooltip/tooltip.h index b7903ec569..3e25ae5f62 100644 --- a/src/libs/utils/tooltip/tooltip.h +++ b/src/libs/utils/tooltip/tooltip.h @@ -71,19 +71,16 @@ public: static ToolTip *instance(); - static void show(const QPoint &pos, const TipContent &content, QWidget *w = 0); - static void show(const QPoint &pos, const TipContent &content, QWidget *w, const QRect &rect); + static void show(const QPoint &pos, const QString &content, QWidget *w = 0, const QRect &rect = QRect()); + static void show(const QPoint &pos, const QColor &color, QWidget *w = 0, const QRect &rect = QRect()); + static void show(const QPoint &pos, QWidget *content, QWidget *w = 0, const QRect &rect = QRect()); static void move(const QPoint &pos, QWidget *w); static void hide(); static bool isVisible(); -protected slots: - void hideTipImmediately(); - -protected: - void showInternal(const QPoint &pos, const TipContent &content, QWidget *w, const QRect &rect); - private: + void showInternal(const QPoint &pos, const TipContent &content, QWidget *w, const QRect &rect); + void hideTipImmediately(); bool acceptShow(const TipContent &content, const QPoint &pos, QWidget *w, const QRect &rect); bool validateContent(const TipContent &content); void setUp(const QPoint &pos, const TipContent &content, QWidget *w, const QRect &rect); |