11#include "filemetadatawidget.h"
12#include "filemetadataprovider.h"
13#include "metadatafilter.h"
14#include "widgetfactory.h"
17#include <KConfigGroup>
28class Baloo::FileMetaDataWidgetPrivate
37 explicit FileMetaDataWidgetPrivate(FileMetaDataWidget *parent);
38 ~FileMetaDataWidgetPrivate();
40 FileMetaDataWidgetPrivate(
const FileMetaDataWidgetPrivate&) =
delete;
41 FileMetaDataWidget& operator=(
const FileMetaDataWidgetPrivate&) =
delete;
45 void slotLoadingFinished();
47 QStringList sortedKeys(
const QVariantMap &data)
const;
48 QLabel *createLabel(
const QString &key,
const QString &itemLabel, FileMetaDataWidget *parent);
53 FileMetaDataProvider *m_provider =
nullptr;
54 QGridLayout *m_gridLayout =
nullptr;
56 MetadataFilter *m_filter =
nullptr;
57 WidgetFactory *m_widgetFactory =
nullptr;
59 QMap<QString, bool> m_visibilityChanged;
60 bool m_configureVisibleProperties =
false;
63 FileMetaDataWidget *
const q;
66FileMetaDataWidgetPrivate::FileMetaDataWidgetPrivate(FileMetaDataWidget *parent)
70 m_filter =
new MetadataFilter(q);
72 m_widgetFactory =
new WidgetFactory(q);
73 QObject::connect(m_widgetFactory, &WidgetFactory::urlActivated, q, &FileMetaDataWidget::urlActivated);
79 slotLoadingFinished();
83FileMetaDataWidgetPrivate::~FileMetaDataWidgetPrivate() =
default;
85void FileMetaDataWidgetPrivate::deleteRows()
87 for (
const Row &row : std::as_const(m_rows)) {
89 row.value->deleteLater();
91 row.checkBox->deleteLater();
98QLabel *FileMetaDataWidgetPrivate::createLabel(
const QString &key,
const QString &itemLabel, FileMetaDataWidget *parent)
100 auto label =
new QLabel(itemLabel + QLatin1Char(
':'), parent);
105 label->setWordWrap(
true);
107 label->setObjectName(QStringLiteral(
"L_%1").arg(key));
111void FileMetaDataWidgetPrivate::slotLoadingFinished()
115 if (m_gridLayout ==
nullptr) {
116 m_gridLayout =
new QGridLayout(q);
117 m_gridLayout->setContentsMargins(0, 0, 0, 0);
118 m_gridLayout->setSpacing(q->fontMetrics().height() / 4);
121 QVariantMap data = m_provider->data();
123 if (m_configureVisibleProperties) {
124 active = m_filter->
filter(data).keys();
125 auto changedIt = m_visibilityChanged.
constBegin();
126 while (changedIt != m_visibilityChanged.constEnd()) {
127 if (changedIt.value()) {
128 active.
append(changedIt.key());
134 m_widgetFactory->setReadOnly(
true);
135 m_gridLayout->setColumnStretch(0, 1);
136 m_gridLayout->setColumnStretch(1, 3);
137 m_gridLayout->setColumnStretch(2, 0);
138 m_gridLayout->setColumnStretch(3, 6);
140 data = m_filter->filter(data);
141 m_widgetFactory->setReadOnly(m_provider->isReadOnly());
142 m_gridLayout->setColumnStretch(0, 4);
143 m_gridLayout->setColumnStretch(1, 0);
144 m_gridLayout->setColumnStretch(2, 6);
145 m_gridLayout->setColumnStretch(3, 0);
151 const QStringList keys = sortedKeys(data);
152 const int spacerWidth = QFontMetrics(q->font()).size(
Qt::TextSingleLine, QStringLiteral(
" ")).width();
154 const int labelColumn = m_configureVisibleProperties ? 1 : 0;
156 for (
const auto &key : keys) {
158 if (m_configureVisibleProperties) {
159 row.checkBox =
new QCheckBox(q);
161 row.checkBox->setChecked(
true);
165 this->m_visibilityChanged[key] = (state == Qt::Checked);
168 row.checkBox =
nullptr;
171 row.label = createLabel(key, m_provider->label(key), q);
172 m_gridLayout->addWidget(row.label, rowIndex, labelColumn + 0,
Qt::AlignRight);
174 m_gridLayout->addItem(
new QSpacerItem(spacerWidth, 1), rowIndex, labelColumn + 1);
176 row.value = m_widgetFactory->createWidget(key, data[key], q);
177 m_gridLayout->addWidget(row.value, rowIndex, labelColumn + 2,
Qt::AlignLeft);
179 m_gridLayout->setRowStretch(rowIndex, 0);
189 m_gridLayout->addItem(
new QSpacerItem(0, 0), rowIndex, 0, 1, -1);
190 m_gridLayout->setRowStretch(rowIndex, 1);
193 Q_EMIT q->metaDataRequestFinished(m_provider->items());
196QStringList FileMetaDataWidgetPrivate::sortedKeys(
const QVariantMap &data)
const
202 QMap<QString, QString>
map;
203 QVariantMap::const_iterator hashIt = data.constBegin();
204 while (hashIt != data.constEnd()) {
205 const QString propName = hashIt.key();
207 QString key = m_provider->group(propName);
208 key += m_provider->label(propName);
210 map.insert(key, propName);
217 QMap<QString, QString>::const_iterator mapIt =
map.constBegin();
218 while (mapIt !=
map.constEnd()) {
226void FileMetaDataWidgetPrivate::saveConfig()
228 if (m_visibilityChanged.isEmpty()) {
233 KConfigGroup showGroup = config.group(QStringLiteral(
"Show"));
235 auto changedIt = m_visibilityChanged.constBegin();
236 while (changedIt != m_visibilityChanged.constEnd()) {
237 showGroup.
writeEntry(changedIt.key(), changedIt.value());
244FileMetaDataWidget::FileMetaDataWidget(QWidget *parent)
246 , d(new FileMetaDataWidgetPrivate(this))
250FileMetaDataWidget::~FileMetaDataWidget() =
default;
254 d->m_provider->setItems(items);
255 d->m_widgetFactory->setItems(items);
258KFileItemList FileMetaDataWidget::items()
const
260 return d->m_provider->items();
263void FileMetaDataWidget::setReadOnly(
bool readOnly)
265 d->m_provider->setReadOnly(readOnly);
266 d->m_widgetFactory->setReadOnly(readOnly);
269bool FileMetaDataWidget::isReadOnly()
const
271 return d->m_provider->isReadOnly();
273void FileMetaDataWidget::setDateFormat(
const DateFormats format)
275 d->m_widgetFactory->setDateFormat(format);
278DateFormats FileMetaDataWidget::dateFormat()
const
280 return d->m_widgetFactory->dateFormat();
283QSize FileMetaDataWidget::sizeHint()
const
285 if (d->m_gridLayout ==
nullptr) {
290 int leftWidthMax = 0;
291 int rightWidthMax = 0;
292 int rightWidthAverage = 0;
293 for (
const FileMetaDataWidgetPrivate::Row &row : std::as_const(d->m_rows)) {
294 const QWidget *valueWidget = row.value;
295 const int rightWidth = valueWidget->
sizeHint().width();
296 rightWidthAverage += rightWidth;
297 if (rightWidth > rightWidthMax) {
298 rightWidthMax = rightWidth;
301 const int leftWidth = row.label->sizeHint().width();
302 if (leftWidth > leftWidthMax) {
303 leftWidthMax = leftWidth;
310 if (d->m_rows.count() > 1) {
311 rightWidthAverage /= d->m_rows.count();
312 if (rightWidthMax > rightWidthAverage * 2) {
313 rightWidthMax = rightWidthAverage * 2;
318 const auto margins = d->m_gridLayout->contentsMargins();
319 int height = margins.top() + margins.bottom() + d->m_gridLayout->spacing() * (d->m_rows.count() - 1);
320 for (
const FileMetaDataWidgetPrivate::Row &row : std::as_const(d->m_rows)) {
321 const QWidget *valueWidget = row.value;
322 const int rowHeight = qMax(row.label->heightForWidth(leftWidthMax), valueWidget->
heightForWidth(rightWidthMax));
326 const int width = margins.left() + margins.right() + leftWidthMax + d->m_gridLayout->spacing() + rightWidthMax;
331void FileMetaDataWidget::setConfigurationMode(ConfigurationMode mode)
333 if (mode == ConfigurationMode::ReStart) {
334 d->m_configureVisibleProperties =
true;
335 }
else if (mode == ConfigurationMode::Accept) {
337 d->m_configureVisibleProperties =
false;
338 }
else if (mode == ConfigurationMode::Cancel) {
339 d->m_configureVisibleProperties =
false;
341 d->m_visibilityChanged.clear();
342 d->slotLoadingFinished();
345#include "moc_filemetadatawidget.cpp"
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
QString label(StandardShortcut id)
void stateChanged(int state)
void append(QList< T > &&value)
const_iterator constBegin() const const
qsizetype removeAll(const AT &t)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QStringList filter(QStringView str, Qt::CaseSensitivity cs) const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)