diff options
Diffstat (limited to 'src/tooltips/ktooltipdelegate.cpp')
| -rw-r--r-- | src/tooltips/ktooltipdelegate.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/tooltips/ktooltipdelegate.cpp b/src/tooltips/ktooltipdelegate.cpp new file mode 100644 index 000000000..0141db143 --- /dev/null +++ b/src/tooltips/ktooltipdelegate.cpp @@ -0,0 +1,138 @@ +/*************************************************************************** + * Copyright (C) 2008 by Fredrik Höglund <[email protected]> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "ktooltipdelegate.h" + +#include "ktooltip.h" + +#include <QApplication> +#include <QPainter> +#include <QIcon> + +#ifdef Q_WS_X11 +# include <QX11Info> +# include <X11/Xlib.h> +# include <X11/extensions/shape.h> +#endif + + +// ---------------------------------------------------------------------------- + + +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 +} |
