]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/tooltips/filemetadatatooltip.cpp
Port Dolphin to Baloo
[dolphin.git] / src / views / tooltips / filemetadatatooltip.cpp
index f1b09a7475894f59c4e1f7b0e0096acdcf395372..b726996641057395a29e614177c38ac6de332bec 100644 (file)
@@ -1,6 +1,7 @@
 /***************************************************************************
- *   Copyright (C) 2010 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2010 by Peter Penz <peter.penz19@gmail.com>             *
  *   Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org>               *
+ *   Copyright (C) 2012 by Mark Gaiser <markg85@gmail.com>                 *
  *                                                                         *
  *   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  *
 #include "filemetadatatooltip.h"
 
 #include <KColorScheme>
-#include <kfilemetadatawidget.h>
 #include <KSeparator>
 #include <KWindowSystem>
+#include <KStringHandler>
 
 #include <QLabel>
-#include <QPainter>
+#include <QStyleOptionFrame>
+#include <QStylePainter>
 #include <QVBoxLayout>
+#include <QTextDocument>
+#include <QTextLayout>
+#include <QTextLine>
+
+#ifndef HAVE_BALOO
+#include <KFileMetaDataWidget>
+#else
+#include <baloo/filemetadatawidget.h>
+#endif
+
+// For the blurred tooltip background
+#include <plasma/windoweffects.h>
 
 FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
     QWidget(parent),
@@ -40,30 +54,47 @@ FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
 
     // Create widget for file preview
     m_preview = new QLabel(this);
+    m_preview->setAlignment(Qt::AlignTop);
 
     // Create widget for file name
     m_name = new QLabel(this);
+    m_name->setForegroundRole(QPalette::ToolTipText);
+    m_name->setTextFormat(Qt::PlainText);
+    m_name->setAlignment(Qt::AlignHCenter);
+
     QFont font = m_name->font();
     font.setBold(true);
     m_name->setFont(font);
 
+    QFontMetrics fontMetrics(font);
+    m_name->setMaximumWidth(fontMetrics.averageCharWidth() * 40);
+
     // Create widget for the meta data
-    m_fileMetaDataWidget = new KFileMetaDataWidget();
+#ifndef HAVE_BALOO
+    m_fileMetaDataWidget = new KFileMetaDataWidget(this);
+#else
+    m_fileMetaDataWidget = new Baloo::FileMetaDataWidget(this);
+#endif
     m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText);
     m_fileMetaDataWidget->setReadOnly(true);
-    connect(m_fileMetaDataWidget, SIGNAL(metaDataRequestFinished()),
-            this, SIGNAL(metaDataRequestFinished()));
+    connect(m_fileMetaDataWidget, SIGNAL(metaDataRequestFinished(KFileItemList)),
+            this, SIGNAL(metaDataRequestFinished(KFileItemList)));
 
     QVBoxLayout* textLayout = new QVBoxLayout();
-    textLayout->setAlignment(Qt::AlignTop);
     textLayout->addWidget(m_name);
     textLayout->addWidget(new KSeparator());
     textLayout->addWidget(m_fileMetaDataWidget);
     textLayout->setAlignment(m_name, Qt::AlignCenter);
     textLayout->setAlignment(m_fileMetaDataWidget, Qt::AlignLeft);
+    // Assure that the text-layout gets top-aligned by adding a stretch.
+    // Don't use textLayout->setAlignment(Qt::AlignTop) instead, as this does
+    // not work with the heightForWidth()-size-hint of m_fileMetaDataWidget
+    // (see bug #241608)
+    textLayout->addStretch();
 
     QHBoxLayout* tipLayout = new QHBoxLayout(this);
     tipLayout->addWidget(m_preview);
+    tipLayout->addSpacing(tipLayout->margin());
     tipLayout->addLayout(textLayout);
 }
 
@@ -78,7 +109,7 @@ void FileMetaDataToolTip::setPreview(const QPixmap& pixmap)
 
 QPixmap FileMetaDataToolTip::preview() const
 {
-    if (m_preview->pixmap() != 0) {
+    if (m_preview->pixmap()) {
         return *m_preview->pixmap();
     }
     return QPixmap();
@@ -86,7 +117,33 @@ QPixmap FileMetaDataToolTip::preview() const
 
 void FileMetaDataToolTip::setName(const QString& name)
 {
-    m_name->setText(name);
+    QTextOption textOption;
+    textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+
+    const QString processedName = Qt::mightBeRichText(name) ? name : KStringHandler::preProcessWrap(name);
+
+    QTextLayout textLayout(processedName);
+    textLayout.setFont(m_name->font());
+    textLayout.setTextOption(textOption);
+
+    QString wrappedText;
+    wrappedText.reserve(processedName.length());
+
+    // wrap the text to fit into the maximum width of m_name
+    textLayout.beginLayout();
+    QTextLine line = textLayout.createLine();
+    while (line.isValid()) {
+        line.setLineWidth(m_name->maximumWidth());
+        wrappedText += processedName.mid(line.textStart(), line.textLength());
+
+        line = textLayout.createLine();
+        if (line.isValid()) {
+            wrappedText += QChar::LineSeparator;
+        }
+    }
+    textLayout.endLayout();
+
+    m_name->setText(wrappedText);
 }
 
 QString FileMetaDataToolTip::name() const
@@ -106,51 +163,19 @@ KFileItemList FileMetaDataToolTip::items() const
 
 void FileMetaDataToolTip::paintEvent(QPaintEvent* event)
 {
-    Q_UNUSED(event);
-
-    QPainter painter(this);
+    QStylePainter painter(this);
+    QStyleOptionFrame option;
+    option.init(this);
+    painter.drawPrimitive(QStyle::PE_PanelTipLabel, option);
+    painter.end();
 
-    QColor toColor = palette().brush(QPalette::ToolTipBase).color();
-    QColor fromColor = KColorScheme::shade(toColor, KColorScheme::LightShade, 0.2);
-
-    const bool haveAlphaChannel = KWindowSystem::compositingActive();
-    if (haveAlphaChannel) {
-        painter.setRenderHint(QPainter::Antialiasing);
-        painter.translate(0.5, 0.5);
-        toColor.setAlpha(220);
-        fromColor.setAlpha(220);
-    }
-
-    QLinearGradient gradient(QPointF(0.0, 0.0), QPointF(0.0, height()));
-    gradient.setColorAt(0.0, fromColor);
-    gradient.setColorAt(1.0, toColor);
-    painter.setPen(Qt::NoPen);
-    painter.setBrush(gradient);
-
-    const QRect rect(0, 0, width(), height());
-    if (haveAlphaChannel) {
-        const qreal radius = 5.0;
-
-        QPainterPath path;
-        path.moveTo(rect.left(), rect.top() + radius);
-        arc(path, rect.left()  + radius, rect.top()    + radius, radius, 180, -90);
-        arc(path, rect.right() - radius, rect.top()    + radius, radius,  90, -90);
-        arc(path, rect.right() - radius, rect.bottom() - radius, radius,   0, -90);
-        arc(path, rect.left()  + radius, rect.bottom() - radius, radius, 270, -90);
-        path.closeSubpath();
-
-        painter.drawPath(path);
-    } else {
-        painter.drawRect(rect);
-    }
+    QWidget::paintEvent(event);
 }
 
-void FileMetaDataToolTip::arc(QPainterPath& path,
-                              qreal cx, qreal cy,
-                              qreal radius, qreal angle,
-                              qreal sweepLength)
+void FileMetaDataToolTip::showEvent(QShowEvent *)
 {
-    path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweepLength);
+    Plasma::WindowEffects::overrideShadow(winId(), true);
+    Plasma::WindowEffects::enableBlurBehind(winId(), true, mask());
 }
 
 #include "filemetadatatooltip.moc"