]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/tooltips/dolphinfilemetadatawidget.cpp
GIT_SILENT Sync po/docbooks with svn
[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 <Baloo/FileMetaDataWidget>
12 #include <KColorScheme>
13 #include <KSeparator>
14 #include <KStringHandler>
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, this, &DolphinFileMetaDataWidget::metaDataRequestFinished);
49 connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::urlActivated, this, &DolphinFileMetaDataWidget::urlActivated);
50 m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText);
51 m_fileMetaDataWidget->setReadOnly(true);
52
53 QVBoxLayout *textLayout = new QVBoxLayout();
54 textLayout->addWidget(m_name);
55 textLayout->addWidget(new KSeparator());
56 textLayout->addWidget(m_fileMetaDataWidget);
57 textLayout->setAlignment(m_name, Qt::AlignCenter);
58 textLayout->setAlignment(m_fileMetaDataWidget, Qt::AlignLeft);
59 // Assure that the text-layout gets top-aligned by adding a stretch.
60 // Don't use textLayout->setAlignment(Qt::AlignTop) instead, as this does
61 // not work with the heightForWidth()-size-hint of m_fileMetaDataWidget
62 // (see bug #241608)
63 textLayout->addStretch();
64
65 QHBoxLayout *layout = new QHBoxLayout(this);
66 layout->addWidget(m_preview);
67 layout->addSpacing(layout->contentsMargins().left());
68 layout->addLayout(textLayout);
69 }
70
71 DolphinFileMetaDataWidget::~DolphinFileMetaDataWidget()
72 {
73 }
74
75 void DolphinFileMetaDataWidget::setPreview(const QPixmap &pixmap)
76 {
77 m_preview->setPixmap(pixmap);
78 }
79
80 QPixmap DolphinFileMetaDataWidget::preview() const
81 {
82 if (!m_preview->pixmap(Qt::ReturnByValue).isNull()) {
83 return m_preview->pixmap(Qt::ReturnByValue);
84 }
85
86 return QPixmap();
87 }
88
89 void DolphinFileMetaDataWidget::setName(const QString &name)
90 {
91 QTextOption textOption;
92 textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
93
94 const QString processedName = Qt::mightBeRichText(name) ? name : KStringHandler::preProcessWrap(name);
95
96 QTextLayout textLayout(processedName);
97 textLayout.setFont(m_name->font());
98 textLayout.setTextOption(textOption);
99
100 QString wrappedText;
101 wrappedText.reserve(processedName.length());
102
103 // wrap the text to fit into the maximum width of m_name
104 textLayout.beginLayout();
105 QTextLine line = textLayout.createLine();
106 while (line.isValid()) {
107 line.setLineWidth(m_name->maximumWidth());
108 wrappedText += QStringView(processedName).mid(line.textStart(), line.textLength());
109
110 line = textLayout.createLine();
111 if (line.isValid()) {
112 wrappedText += QChar::LineSeparator;
113 }
114 }
115 textLayout.endLayout();
116
117 m_name->setText(wrappedText);
118 }
119
120 QString DolphinFileMetaDataWidget::name() const
121 {
122 return m_name->text();
123 }
124
125 void DolphinFileMetaDataWidget::setItems(const KFileItemList &items)
126 {
127 m_fileMetaDataWidget->setItems(items);
128 }
129
130 KFileItemList DolphinFileMetaDataWidget::items() const
131 {
132 return m_fileMetaDataWidget->items();
133 }