X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/1cb5a202e4c861025d4eda5813848cdb7d5f350d..230fe13d1f:/src/views/tooltips/filemetadatatooltip.cpp diff --git a/src/views/tooltips/filemetadatatooltip.cpp b/src/views/tooltips/filemetadatatooltip.cpp index d6e0c36aa..2fbba8b9c 100644 --- a/src/views/tooltips/filemetadatatooltip.cpp +++ b/src/views/tooltips/filemetadatatooltip.cpp @@ -1,6 +1,7 @@ /*************************************************************************** - * Copyright (C) 2010 by Peter Penz * + * Copyright (C) 2010 by Peter Penz * * Copyright (C) 2008 by Fredrik Höglund * + * Copyright (C) 2012 by Mark Gaiser * * * * 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 * @@ -20,57 +21,78 @@ #include "filemetadatatooltip.h" -#include -#include -#include -#include +#include +#include +// For the blurred tooltip background +#include +#include +#include #include -#include +#include +#include #include +#include +#include + +#ifndef HAVE_BALOO +#include +#else +#include +#endif FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) : QWidget(parent), m_preview(0), m_name(0), m_fileMetaDataWidget(0) - { - setAttribute(Qt::WA_TranslucentBackground); - setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint); - // 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); - m_name->setAlignment(Qt::AlignHCenter); + + 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); + connect(m_fileMetaDataWidget, &KFileMetaDataWidget::metaDataRequestFinished, + this, &FileMetaDataToolTip::metaDataRequestFinished); +#else + m_fileMetaDataWidget = new Baloo::FileMetaDataWidget(this); + connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::metaDataRequestFinished, + this, &FileMetaDataToolTip::metaDataRequestFinished); +#endif m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText); m_fileMetaDataWidget->setReadOnly(true); - // The stretchwidget allows the metadata widget to be top aligned and fills - // the remaining vertical space - QWidget* stretchWidget = new QWidget(this); - stretchWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - - QWidget* textContainer = new QWidget(this); - QVBoxLayout* textLayout = new QVBoxLayout(textContainer); + QVBoxLayout* textLayout = new QVBoxLayout(); textLayout->addWidget(m_name); textLayout->addWidget(new KSeparator()); textLayout->addWidget(m_fileMetaDataWidget); - textLayout->addWidget(stretchWidget); + 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->addWidget(textContainer); - - tipLayout->setSizeConstraint(QLayout::SetFixedSize); + tipLayout->addSpacing(tipLayout->margin()); + tipLayout->addLayout(textLayout); } FileMetaDataToolTip::~FileMetaDataToolTip() @@ -82,14 +104,43 @@ void FileMetaDataToolTip::setPreview(const QPixmap& pixmap) m_preview->setPixmap(pixmap); } -const QPixmap* FileMetaDataToolTip::preview() const +QPixmap FileMetaDataToolTip::preview() const { - return m_preview->pixmap(); + if (m_preview->pixmap()) { + return *m_preview->pixmap(); + } + return QPixmap(); } 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.midRef(line.textStart(), line.textLength()); + + line = textLayout.createLine(); + if (line.isValid()) { + wrappedText += QChar::LineSeparator; + } + } + textLayout.endLayout(); + + m_name->setText(wrappedText); } QString FileMetaDataToolTip::name() const @@ -107,53 +158,3 @@ KFileItemList FileMetaDataToolTip::items() const return m_fileMetaDataWidget->items(); } -void FileMetaDataToolTip::paintEvent(QPaintEvent* event) -{ - Q_UNUSED(event); - - QPainter painter(this); - - 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); - } -} - -void FileMetaDataToolTip::arc(QPainterPath& path, - qreal cx, qreal cy, - qreal radius, qreal angle, - qreal sweepLength) -{ - path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweepLength); -} - -#include "filemetadatatooltip.moc"