]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/tooltips/dolphinfilemetadatawidget.cpp
Merge branch 'release/20.08' into master
[dolphin.git] / src / views / tooltips / dolphinfilemetadatawidget.cpp
1 /*
2 * SPDX-FileCopyrightText: 2010 Peter Penz <peter.penz19@gmail.com>
3 * SPDX-FileCopyrightText: 2008 Fredrik Höglund <fredrik@kde.org>
4 * SPDX-FileCopyrightText: 2012 Mark Gaiser <markg85@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #include "dolphinfilemetadatawidget.h"
10
11 #include <KColorScheme>
12 #include <KSeparator>
13 #include <KStringHandler>
14 #include <Baloo/FileMetaDataWidget>
15
16 #include <QLabel>
17 #include <QStyleOptionFrame>
18 #include <QStylePainter>
19 #include <QTextDocument>
20 #include <QTextLayout>
21 #include <QVBoxLayout>
22
23 DolphinFileMetaDataWidget::DolphinFileMetaDataWidget(QWidget* parent) :
24 QWidget(parent),
25 m_preview(nullptr),
26 m_name(nullptr),
27 m_fileMetaDataWidget(nullptr)
28 {
29 // Create widget for file preview
30 m_preview = new QLabel(this);
31 m_preview->setAlignment(Qt::AlignTop);
32
33 // Create widget for file name
34 m_name = new QLabel(this);
35 m_name->setForegroundRole(QPalette::ToolTipText);
36 m_name->setTextFormat(Qt::PlainText);
37 m_name->setAlignment(Qt::AlignHCenter);
38
39 QFont font = m_name->font();
40 font.setBold(true);
41 m_name->setFont(font);
42
43 QFontMetrics fontMetrics(font);
44 m_name->setMaximumWidth(fontMetrics.averageCharWidth() * 40);
45
46 // Create widget for the meta data
47 m_fileMetaDataWidget = new Baloo::FileMetaDataWidget(this);
48 connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::metaDataRequestFinished,
49 this, &DolphinFileMetaDataWidget::metaDataRequestFinished);
50 connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::urlActivated,
51 this, &DolphinFileMetaDataWidget::urlActivated);
52 m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText);
53 m_fileMetaDataWidget->setReadOnly(true);
54
55 QVBoxLayout* textLayout = new QVBoxLayout();
56 textLayout->addWidget(m_name);
57 textLayout->addWidget(new KSeparator());
58 textLayout->addWidget(m_fileMetaDataWidget);
59 textLayout->setAlignment(m_name, Qt::AlignCenter);
60 textLayout->setAlignment(m_fileMetaDataWidget, Qt::AlignLeft);
61 // Assure that the text-layout gets top-aligned by adding a stretch.
62 // Don't use textLayout->setAlignment(Qt::AlignTop) instead, as this does
63 // not work with the heightForWidth()-size-hint of m_fileMetaDataWidget
64 // (see bug #241608)
65 textLayout->addStretch();
66
67 QHBoxLayout* layout = new QHBoxLayout(this);
68 layout->addWidget(m_preview);
69 layout->addSpacing(layout->margin());
70 layout->addLayout(textLayout);
71 }
72
73 DolphinFileMetaDataWidget::~DolphinFileMetaDataWidget()
74 {
75 }
76
77 void DolphinFileMetaDataWidget::setPreview(const QPixmap& pixmap)
78 {
79 m_preview->setPixmap(pixmap);
80 }
81
82 QPixmap DolphinFileMetaDataWidget::preview() const
83 {
84 if (m_preview->pixmap()) {
85 return *m_preview->pixmap();
86 }
87 return QPixmap();
88 }
89
90 void DolphinFileMetaDataWidget::setName(const QString& name)
91 {
92 QTextOption textOption;
93 textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
94
95 const QString processedName = Qt::mightBeRichText(name) ? name : KStringHandler::preProcessWrap(name);
96
97 QTextLayout textLayout(processedName);
98 textLayout.setFont(m_name->font());
99 textLayout.setTextOption(textOption);
100
101 QString wrappedText;
102 wrappedText.reserve(processedName.length());
103
104 // wrap the text to fit into the maximum width of m_name
105 textLayout.beginLayout();
106 QTextLine line = textLayout.createLine();
107 while (line.isValid()) {
108 line.setLineWidth(m_name->maximumWidth());
109 wrappedText += processedName.midRef(line.textStart(), line.textLength());
110
111 line = textLayout.createLine();
112 if (line.isValid()) {
113 wrappedText += QChar::LineSeparator;
114 }
115 }
116 textLayout.endLayout();
117
118 m_name->setText(wrappedText);
119 }
120
121 QString DolphinFileMetaDataWidget::name() const
122 {
123 return m_name->text();
124 }
125
126 void DolphinFileMetaDataWidget::setItems(const KFileItemList& items)
127 {
128 m_fileMetaDataWidget->setItems(items);
129 }
130
131 KFileItemList DolphinFileMetaDataWidget::items() const
132 {
133 return m_fileMetaDataWidget->items();
134 }
135