X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5e73577d6c3520fa3dfd63646795e628cf2a0614..a0d3cf4aa8ffa76ed22a67efa4ea156eb2ef9f68:/src/tooltips/ktooltip.cpp diff --git a/src/tooltips/ktooltip.cpp b/src/tooltips/ktooltip.cpp index e33cd197c..99114106f 100644 --- a/src/tooltips/ktooltip.cpp +++ b/src/tooltips/ktooltip.cpp @@ -18,381 +18,85 @@ ***************************************************************************/ #include "ktooltip.h" -#include "ktooltip_p.h" - -#include -#include -#include -#include -#include -#include +#include "ktooltipwindow_p.h" +#include +#include #include -#include -#include - -#ifdef Q_WS_X11 -# include -# include -# include -#endif - -// compile with XShape older than 1.0 -#ifndef ShapeInput -const int ShapeInput = 2; -#endif - -class KToolTipItemPrivate +class KToolTipManager { 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()) -{ -} + ~KToolTipManager(); + static KToolTipManager* instance(); -// ---------------------------------------------------------------------------- - - - -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: - KTipLabel(); - void showTip(const QPoint &pos, const KToolTipItem *item); - void moveTip(const QPoint &pos); + void showTip(const QPoint& pos, QWidget* content); void hideTip(); private: - void paintEvent(QPaintEvent*); - QSize sizeHint() const; - KStyleOptionToolTip styleOption() const; - KToolTipDelegate *delegate() const; + KToolTipManager(); -private: - const KToolTipItem *m_currentItem; + KToolTipWindow* m_window; + static KToolTipManager *s_instance; }; -KTipLabel::KTipLabel() : QWidget(0, Qt::ToolTip) -{ -#ifdef Q_WS_X11 - if (QX11Info::isCompositingManagerRunning()) { - setAttribute(Qt::WA_TranslucentBackground); - } -#endif -} - -void KTipLabel::showTip(const QPoint &pos, const KToolTipItem *item) -{ - m_currentItem = item; - move(pos); - show(); -} - -void KTipLabel::hideTip() -{ - hide(); - m_currentItem = 0; -} - -void KTipLabel::moveTip(const QPoint &pos) -{ - move(pos); -} - -void KTipLabel::paintEvent(QPaintEvent*) -{ - 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); - else -#endif - setMask(delegate()->shapeMask(option)); - - QPainter p(this); - p.setFont(option.font); - p.setPen(QPen(option.palette.brush(QPalette::Text), 0)); - delegate()->paint(&p, option, *m_currentItem); -} - -QSize KTipLabel::sizeHint() const -{ - if (!m_currentItem) - return QSize(); - - KStyleOptionToolTip option = styleOption(); - return delegate()->sizeHint(option, *m_currentItem); -} - -KStyleOptionToolTip KTipLabel::styleOption() const -{ - KStyleOptionToolTip option; - KToolTipManager::instance()->initStyleOption(&option); - return option; -} - -KToolTipDelegate *KTipLabel::delegate() const -{ - return KToolTipManager::instance()->delegate(); -} - - - - -// ---------------------------------------------------------------------------- - - - - KToolTipManager *KToolTipManager::s_instance = 0; -KToolTipManager::KToolTipManager() - : m_label(new KTipLabel), m_currentItem(0), m_delegate(0) +KToolTipManager::KToolTipManager() : + m_window(0) { } KToolTipManager::~KToolTipManager() { - delete m_label; - delete m_currentItem; -} - -void KToolTipManager::showTip(const QPoint &pos, KToolTipItem *item) -{ - hideTip(); - m_label->showTip(pos, item); - m_currentItem = item; - m_tooltipPos = pos; -} - -void KToolTipManager::hideTip() -{ - m_label->hideTip(); - delete m_currentItem; - m_currentItem = 0; + delete m_window; + m_window = 0; } -void KToolTipManager::initStyleOption(KStyleOptionToolTip *option) const +KToolTipManager* KToolTipManager::instance() { - option->direction = QApplication::layoutDirection(); - option->fontMetrics = QFontMetrics(QToolTip::font()); - option->activeCorner = KStyleOptionToolTip::TopLeftCorner; - option->palette = QToolTip::palette(); - option->font = QToolTip::font(); - option->rect = QRect(); - option->state = QStyle::State_None; - option->decorationSize = QSize(32, 32); -} + if (s_instance == 0) { + s_instance = new KToolTipManager(); + } -void KToolTipManager::setDelegate(KToolTipDelegate *delegate) -{ - m_delegate = delegate; + return s_instance; } -void KToolTipManager::update() +void KToolTipManager::showTip(const QPoint& pos, QWidget* content) { - if (m_currentItem == 0) - return; - m_label->showTip(m_tooltipPos, m_currentItem); + hideTip(); + Q_ASSERT(m_window == 0); + m_window = new KToolTipWindow(content); + m_window->move(pos); + m_window->show(); } -KToolTipDelegate *KToolTipManager::delegate() const +void KToolTipManager::hideTip() { - return m_delegate; + if (m_window != 0) { + m_window->hide(); + m_window->deleteLater(); + m_window = 0; + } } - - -// ---------------------------------------------------------------------------- - - - namespace KToolTip { - void showText(const QPoint &pos, const QString &text, QWidget *widget, const QRect &rect) - { - Q_UNUSED(widget) - Q_UNUSED(rect) - KToolTipItem *item = new KToolTipItem(text); - KToolTipManager::instance()->showTip(pos, item); - } - - void showText(const QPoint &pos, const QString &text, QWidget *widget) + void showText(const QPoint& pos, const QString& text) { - showText(pos, text, widget, QRect()); + QLabel* label = new QLabel(text); + label->setForegroundRole(QPalette::ToolTipText); + showTip(pos, label); } - void showTip(const QPoint &pos, KToolTipItem *item) + void showTip(const QPoint& pos, QWidget* content) { - KToolTipManager::instance()->showTip(pos, item); + KToolTipManager::instance()->showTip(pos, content); } void hideTip() { KToolTipManager::instance()->hideTip(); } - - void setToolTipDelegate(KToolTipDelegate *delegate) - { - KToolTipManager::instance()->setDelegate(delegate); - } }