Fix Bug 287983 - Dolphin truncates tooltip information for long file names

Use KStringHandler and QTextLayout to wrap the text (file name)
into the maximum width of the label "name".

Make use of QFontMetrics to calculate a font size aware tooltip size.

BUG: 287983
FIXED-IN: 4.11.3
REVIEW: 113101
This commit is contained in:
Emmanuel Pescosta 2013-11-02 00:12:33 +01:00
parent f55119945f
commit c2bf208fe6

View file

@ -24,11 +24,15 @@
#include <KColorScheme>
#include <KSeparator>
#include <KWindowSystem>
#include <KStringHandler>
#include <QLabel>
#include <QStyleOptionFrame>
#include <QStylePainter>
#include <QVBoxLayout>
#include <QTextDocument>
#include <QTextLayout>
#include <QTextLine>
#ifndef HAVE_NEPOMUK
#include <KFileMetaDataWidget>
@ -56,10 +60,15 @@ FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
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
#ifndef HAVE_NEPOMUK
m_fileMetaDataWidget = new KFileMetaDataWidget(this);
@ -108,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