X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f034356d7462f23b8a2f5820af4d020c745280cf..abb6807645598e8117e98bbf232cd9cd90fe019a:/src/tooltips/ktooltip.cpp diff --git a/src/tooltips/ktooltip.cpp b/src/tooltips/ktooltip.cpp index b0b044674..52a4d4a5f 100644 --- a/src/tooltips/ktooltip.cpp +++ b/src/tooltips/ktooltip.cpp @@ -19,16 +19,12 @@ #include "ktooltip.h" #include "ktooltip_p.h" +#include "ktooltipdelegate.h" #include -#include -#include #include -#include -#include #include #include -#include #ifdef Q_WS_X11 # include @@ -42,172 +38,9 @@ const int ShapeInput = 2; #endif -class KToolTipItemPrivate -{ -public: - QMap map; - int type; -}; - -KToolTipItem::KToolTipItem(const QString &text, int type) - : d(new KToolTipItemPrivate) -{ - d->map[Qt::DisplayRole] = text; - d->type = type; -} - -KToolTipItem::KToolTipItem(const QIcon &icon, const QString &text, int type) - : d(new KToolTipItemPrivate) -{ - d->map[Qt::DecorationRole] = icon; - d->map[Qt::DisplayRole] = text; - d->type = type; -} - -KToolTipItem::~KToolTipItem() -{ - delete d; -} - -int KToolTipItem::type() const -{ - return d->type; -} - -QString KToolTipItem::text() const -{ - return data(Qt::DisplayRole).toString(); -} - -QIcon KToolTipItem::icon() const -{ - return qvariant_cast(data(Qt::DecorationRole)); -} - -QVariant KToolTipItem::data(int role) const -{ - return d->map.value(role); -} - -void KToolTipItem::setData(int role, const QVariant &data) -{ - d->map[role] = data; - KToolTipManager::instance()->update(); -} - - - // ---------------------------------------------------------------------------- -KStyleOptionToolTip::KStyleOptionToolTip() - : fontMetrics(QApplication::font()) -{ -} - - -// ---------------------------------------------------------------------------- - - - -KToolTipDelegate::KToolTipDelegate() : QObject() -{ -} - -KToolTipDelegate::~KToolTipDelegate() -{ -} - -QSize KToolTipDelegate::sizeHint(const KStyleOptionToolTip *option, const KToolTipItem *item) const -{ - QSize size; - size.rwidth() = option->fontMetrics.width(item->text()); - size.rheight() = option->fontMetrics.lineSpacing(); - - QIcon icon = item->icon(); - if (!icon.isNull()) { - const QSize iconSize = icon.actualSize(option->decorationSize); - size.rwidth() += iconSize.width() + 4; - size.rheight() = qMax(size.height(), iconSize.height()); - } - - return size + QSize(20, 20); - -} - -void KToolTipDelegate::paint(QPainter *painter, const KStyleOptionToolTip *option, - const KToolTipItem *item) const -{ - bool haveAlpha = haveAlphaChannel(); - painter->setRenderHint(QPainter::Antialiasing); - - QPainterPath path; - if (haveAlpha) - path.addRoundRect(option->rect.adjusted(0, 0, -1, -1), 25); - else - path.addRect(option->rect.adjusted(0, 0, -1, -1)); - - QColor color = option->palette.color(QPalette::ToolTipBase); - QColor from = color.lighter(105); - QColor to = color.darker(120); - - QLinearGradient gradient(0, 0, 0, 1); - gradient.setCoordinateMode(QGradient::ObjectBoundingMode); - gradient.setColorAt(0, from); - gradient.setColorAt(1, to); - - painter->translate(.5, .5); - painter->setPen(QPen(Qt::black, 1)); - painter->setBrush(gradient); - painter->drawPath(path); - painter->translate(-.5, -.5); - - if (haveAlpha) { - QLinearGradient mask(0, 0, 0, 1); - gradient.setCoordinateMode(QGradient::ObjectBoundingMode); - gradient.setColorAt(0, QColor(0, 0, 0, 192)); - gradient.setColorAt(1, QColor(0, 0, 0, 72)); - painter->setCompositionMode(QPainter::CompositionMode_DestinationIn); - painter->fillRect(option->rect, gradient); - painter->setCompositionMode(QPainter::CompositionMode_SourceOver); - } - - QRect textRect = option->rect.adjusted(10, 10, -10, -10); - - QIcon icon = item->icon(); - if (!icon.isNull()) { - const QSize iconSize = icon.actualSize(option->decorationSize); - painter->drawPixmap(textRect.topLeft(), icon.pixmap(iconSize)); - textRect.adjust(iconSize.width() + 4, 0, 0, 0); - } - painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, item->text()); -} - -QRegion KToolTipDelegate::inputShape(const KStyleOptionToolTip *option) const -{ - return QRegion(option->rect); -} - -QRegion KToolTipDelegate::shapeMask(const KStyleOptionToolTip *option) const -{ - return QRegion(option->rect); -} - -bool KToolTipDelegate::haveAlphaChannel() const -{ -#ifdef Q_WS_X11 - return QX11Info::isCompositingManagerRunning(); -#else - return false; -#endif -} - - - -// ---------------------------------------------------------------------------- - - - class KTipLabel : public QWidget { public: @@ -223,7 +56,7 @@ private: KToolTipDelegate *delegate() const; private: - const KToolTipItem *currentItem; + const KToolTipItem *m_currentItem; }; KTipLabel::KTipLabel() : QWidget(0, Qt::ToolTip) @@ -237,7 +70,7 @@ KTipLabel::KTipLabel() : QWidget(0, Qt::ToolTip) void KTipLabel::showTip(const QPoint &pos, const KToolTipItem *item) { - currentItem = item; + m_currentItem = item; move(pos); show(); } @@ -245,7 +78,7 @@ void KTipLabel::showTip(const QPoint &pos, const KToolTipItem *item) void KTipLabel::hideTip() { hide(); - currentItem = 0; + m_currentItem = 0; } void KTipLabel::moveTip(const QPoint &pos) @@ -255,30 +88,33 @@ void KTipLabel::moveTip(const QPoint &pos) void KTipLabel::paintEvent(QPaintEvent*) { + if (!m_currentItem) + return; + KStyleOptionToolTip option = styleOption(); option.rect = rect(); #ifdef Q_WS_X11 if (QX11Info::isCompositingManagerRunning()) XShapeCombineRegion(x11Info().display(), winId(), ShapeInput, 0, 0, - delegate()->inputShape(&option).handle(), ShapeSet); + delegate()->inputShape(option).handle(), ShapeSet); else #endif - setMask(delegate()->shapeMask(&option)); + setMask(delegate()->shapeMask(option)); QPainter p(this); p.setFont(option.font); p.setPen(QPen(option.palette.brush(QPalette::Text), 0)); - delegate()->paint(&p, &option, currentItem); + delegate()->paint(&p, option, *m_currentItem); } QSize KTipLabel::sizeHint() const { - if (!currentItem) + if (!m_currentItem) return QSize(); KStyleOptionToolTip option = styleOption(); - return delegate()->sizeHint(&option, currentItem); + return delegate()->sizeHint(option, *m_currentItem); } KStyleOptionToolTip KTipLabel::styleOption() const @@ -294,39 +130,35 @@ KToolTipDelegate *KTipLabel::delegate() const } - - // ---------------------------------------------------------------------------- - - KToolTipManager *KToolTipManager::s_instance = 0; KToolTipManager::KToolTipManager() - : label(new KTipLabel), currentItem(0), m_delegate(0) + : m_label(new KTipLabel), m_currentItem(0), m_delegate(0) { } KToolTipManager::~KToolTipManager() { - delete label; - delete currentItem; + delete m_label; + delete m_currentItem; } void KToolTipManager::showTip(const QPoint &pos, KToolTipItem *item) { hideTip(); - label->showTip(pos, item); - currentItem = item; + m_label->showTip(pos, item); + m_currentItem = item; m_tooltipPos = pos; } void KToolTipManager::hideTip() { - label->hideTip(); - delete currentItem; - currentItem = 0; + m_label->hideTip(); + delete m_currentItem; + m_currentItem = 0; } void KToolTipManager::initStyleOption(KStyleOptionToolTip *option) const @@ -348,9 +180,9 @@ void KToolTipManager::setDelegate(KToolTipDelegate *delegate) void KToolTipManager::update() { - if (currentItem == 0) + if (m_currentItem == 0) return; - label->showTip(m_tooltipPos, currentItem); + m_label->showTip(m_tooltipPos, m_currentItem); } KToolTipDelegate *KToolTipManager::delegate() const @@ -359,11 +191,9 @@ KToolTipDelegate *KToolTipManager::delegate() const } - // ---------------------------------------------------------------------------- - namespace KToolTip { void showText(const QPoint &pos, const QString &text, QWidget *widget, const QRect &rect)