blob: 537ca1f0584f22538e5d9b4be7eb530787c5bcd9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qquickfilenamefilter_p.h"
#include <QtCore/qloggingcategory.h>
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcFileNameFilter, "qt.quick.dialogs.qquickfilenamefilter")
QQuickFileNameFilter::QQuickFileNameFilter(QObject *parent)
: QObject(parent), m_index(-1)
{
}
int QQuickFileNameFilter::index() const
{
return m_index;
}
void QQuickFileNameFilter::setIndex(int index)
{
if (m_index == index)
return;
m_index = index;
emit indexChanged(index);
}
QString QQuickFileNameFilter::name() const
{
return m_name;
}
QStringList QQuickFileNameFilter::extensions() const
{
return m_extensions;
}
QStringList QQuickFileNameFilter::globs() const
{
return m_globs;
}
QSharedPointer<QFileDialogOptions> QQuickFileNameFilter::options() const
{
return m_options;
}
void QQuickFileNameFilter::setOptions(const QSharedPointer<QFileDialogOptions> &options)
{
m_options = options;
}
static QString extractName(const QString &filter)
{
return filter.left(filter.indexOf(QLatin1Char('(')) - 1);
}
static QString extractExtension(QStringView filter)
{
return filter.mid(filter.indexOf(QLatin1Char('.')) + 1).toString();
}
static void extractExtensionsAndGlobs(QStringView filter, QStringList &extensions, QStringList &globs)
{
extensions.clear();
globs.clear();
const int from = filter.indexOf(QLatin1Char('('));
const int to = filter.lastIndexOf(QLatin1Char(')')) - 1;
if (from >= 0 && from < to) {
const QStringView ref = filter.mid(from + 1, to - from);
const QList<QStringView> exts = ref.split(QLatin1Char(' '), Qt::SkipEmptyParts);
// For example, given the filter "HTML files (*.html *.htm)",
// "ref" would be "*.html" and "*.htm".
for (const QStringView &ref : exts) {
extensions += extractExtension(ref);
globs += ref.toString();
}
}
}
void QQuickFileNameFilter::update(const QString &filter)
{
const QStringList filters = nameFilters();
const int oldIndex = m_index;
const QString oldName = m_name;
const QStringList oldExtensions = m_extensions;
const QStringList oldGlobs = m_globs;
m_index = filters.indexOf(filter);
m_name = extractName(filter);
extractExtensionsAndGlobs(filter, m_extensions, m_globs);
if (oldIndex != m_index)
emit indexChanged(m_index);
if (oldName != m_name)
emit nameChanged(m_name);
if (oldExtensions != m_extensions)
emit extensionsChanged(m_extensions);
if (oldGlobs != m_globs)
emit globsChanged(m_globs);
qCDebug(lcFileNameFilter).nospace() << "update called on " << this << " of " << parent()
<< " with filter " << filter << " (current filters are " << filters << "):"
<< "\n old index=" << oldIndex << "new index=" << m_index
<< "\n old name=" << oldName << "new name=" << m_name
<< "\n old extensions=" << oldExtensions << "new extensions=" << m_extensions
<< "\n old glob=s" << oldGlobs << "new globs=" << m_globs;
}
QStringList QQuickFileNameFilter::nameFilters() const
{
return m_options ? m_options->nameFilters() : QStringList();
}
QString QQuickFileNameFilter::nameFilter(int index) const
{
return m_options ? m_options->nameFilters().value(index) : QString();
}
QT_END_NAMESPACE
#include "moc_qquickfilenamefilter_p.cpp"
|