diff --git a/private/tooltip.cpp b/private/tooltip.cpp index 136d9f465..ea65134a6 100644 --- a/private/tooltip.cpp +++ b/private/tooltip.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #ifdef Q_WS_X11 #include @@ -43,11 +44,52 @@ namespace Plasma { +class TipTextWidget : public QWidget +{ +public: + TipTextWidget(QWidget *parent) + : QWidget(parent), + document(new QTextDocument(this)) + { + //d->text->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + QTextOption op; + op.setWrapMode(QTextOption::WordWrap); + document->setDefaultTextOption(op); + } + + void setStyleSheet(const QString &css) + { + document->setDefaultStyleSheet(css); + } + + void setContent(const ToolTipContent &data) + { + document->clear(); + data.registerResources(document); + document->setHtml("

" + data.mainText() + "
" + data.subText() + "

"); + document->adjustSize(); + } + + QSize minimumSizeHint() const + { + return document->size().toSize(); + } + + void paintEvent(QPaintEvent *event) + { + QPainter p(this); + document->drawContents(&p, event->rect()); + } + +private: + QTextDocument *document; +}; + class ToolTipPrivate { public: ToolTipPrivate() - : label(0), + : text(0), imageLabel(0), preview(0), source(0), @@ -55,7 +97,7 @@ class ToolTipPrivate autohide(true) { } - QLabel *label; + TipTextWidget *text; QLabel *imageLabel; WindowPreview *preview; FrameSvg *background; @@ -94,9 +136,7 @@ ToolTip::ToolTip(QWidget *parent) setWindowFlags(Qt::ToolTip); QGridLayout *l = new QGridLayout; d->preview = new WindowPreview(this); - d->label = new QLabel(this); - d->label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); - d->label->setWordWrap(true); + d->text = new TipTextWidget(this); d->imageLabel = new QLabel(this); d->imageLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); @@ -108,7 +148,7 @@ ToolTip::ToolTip(QWidget *parent) l->addWidget(d->preview, 0, 0, 1, 2); l->addWidget(d->imageLabel, 1, 0); - l->addWidget(d->label, 1, 1); + l->addWidget(d->text, 1, 1); setLayout(l); } @@ -149,7 +189,7 @@ void ToolTip::checkSize() void ToolTip::setContent(QObject *tipper, const ToolTipContent &data) { //reset our size - d->label->setText("" + data.mainText() + "
" + data.subText() + "
"); + d->text->setContent(data); d->imageLabel->setPixmap(data.image()); d->preview->setWindowId(data.windowToPreview()); d->autohide = data.autohide(); @@ -250,13 +290,14 @@ void ToolTip::updateTheme() setContentsMargins(leftWidth, topHeight, rightWidth, bottomHeight); // Make the tooltip use Plasma's colorscheme + QColor textColor = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor); QPalette plasmaPalette = QPalette(); plasmaPalette.setColor(QPalette::Window, Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor)); - plasmaPalette.setColor(QPalette::WindowText, - Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor)); + plasmaPalette.setColor(QPalette::WindowText, textColor); setAutoFillBackground(true); setPalette(plasmaPalette); + d->text->setStyleSheet(QString("p { color: %1; }").arg(textColor.name())); update(); } diff --git a/tooltipcontent.cpp b/tooltipcontent.cpp index 5fefba7e6..88d3a6c85 100644 --- a/tooltipcontent.cpp +++ b/tooltipcontent.cpp @@ -19,11 +19,29 @@ #include "tooltipcontent.h" +#include +#include + #include namespace Plasma { +struct ToolTipResource +{ + ToolTipResource() + { + } + + ToolTipResource(ToolTipContent::ResourceType t, const QVariant &v) + : type(t), + data(v) + { + } + + ToolTipContent::ResourceType type; + QVariant data; +}; class ToolTipContentPrivate { public: @@ -37,6 +55,7 @@ public: QString subText; QPixmap image; WId windowToPreview; + QHash resources; bool autohide; }; @@ -144,6 +163,39 @@ bool ToolTipContent::autohide() const return d->autohide; } +void ToolTipContent::addResource(ResourceType type, const QUrl &path, const QVariant &resource) +{ + d->resources.insert(path.toString(), ToolTipResource(type, resource)); +} + +void ToolTipContent::registerResources(QTextDocument *document) const +{ + if (!document) { + return; + } + + QHashIterator it(d->resources); + while (it.hasNext()) { + it.next(); + const ToolTipResource &r = it.value(); + QTextDocument::ResourceType t; + + switch (r.type) { + case ImageResource: + t = QTextDocument::ImageResource; + break; + case HtmlResource: + t = QTextDocument::HtmlResource; + break; + case CssResource: + t = QTextDocument::StyleSheetResource; + break; + } + + document->addResource(t, it.key(), r.data); + } +} + } // namespace Plasma diff --git a/tooltipcontent.h b/tooltipcontent.h index 8ee50364f..e54df9812 100644 --- a/tooltipcontent.h +++ b/tooltipcontent.h @@ -21,11 +21,15 @@ #define PLASMA_TOOLTIPCONTENT_H #include +#include +#include #include #include #include +class QTextDocument; + /** * This provides the content for a tooltip. * @@ -41,6 +45,8 @@ class ToolTipContentPrivate; class PLASMA_EXPORT ToolTipContent { public: + enum ResourceType { ImageResource = 0, HtmlResource, CssResource }; + /** Creates an empty Content */ ToolTipContent(); @@ -97,6 +103,13 @@ public: /** Whether or not to autohide the tooltip, defaults to true */ bool autohide() const; + /** Adds a resource that can then be referenced from the text elements + using rich text **/ + void addResource(ResourceType type, const QUrl &path, const QVariant &resource); + + /** Registers all resources with a given document */ + void registerResources(QTextDocument *document) const; + private: ToolTipContentPrivate * const d; };