diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-08-19 13:40:34 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-08-25 06:33:44 +0200 |
commit | fb9ec8ad44decba7b2878370f3711b61614f035a (patch) | |
tree | 6904b3936a8ee7c61a770ef92a4e033bb18b0fc3 /src/gui/image | |
parent | e24bbc4871e6a3711ffaa0e01397a40954465a3a (diff) |
Move QFileSystemModel into QtGui
This requires a QAbstractFileIconProvider in QtGui, as the standard
QFileIconProvider depends on QStyle, and cannot be moved out of
QtWidgets.
QAbstractFileIconProvider returns strings for file types, but returns
no icons yet. Support for a default icon set might be added in a
follow-up commit.
Change-Id: Ib9d095cd612fdcf04db62f2e40709fcffe3dc2b7
Fixes: QTBUG-66177
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/gui/image')
-rw-r--r-- | src/gui/image/image.pri | 7 | ||||
-rw-r--r-- | src/gui/image/qabstractfileiconprovider.cpp | 197 | ||||
-rw-r--r-- | src/gui/image/qabstractfileiconprovider.h | 84 | ||||
-rw-r--r-- | src/gui/image/qabstractfileiconprovider_p.h | 73 |
4 files changed, 359 insertions, 2 deletions
diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri index bf0aa519a8..f503c97b82 100644 --- a/src/gui/image/image.pri +++ b/src/gui/image/image.pri @@ -26,7 +26,9 @@ HEADERS += \ image/qiconloader_p.h \ image/qiconengine.h \ image/qiconengineplugin.h \ - image/qabstractfileiconengine_p.h + image/qabstractfileiconengine_p.h \ + image/qabstractfileiconprovider.h \ + image/qabstractfileiconprovider_p.h SOURCES += \ image/qbitmap.cpp \ @@ -48,7 +50,8 @@ SOURCES += \ image/qiconloader.cpp \ image/qiconengine.cpp \ image/qiconengineplugin.cpp \ - image/qabstractfileiconengine.cpp + image/qabstractfileiconengine.cpp \ + image/qabstractfileiconprovider.cpp qtConfig(movie) { HEADERS += image/qmovie.h diff --git a/src/gui/image/qabstractfileiconprovider.cpp b/src/gui/image/qabstractfileiconprovider.cpp new file mode 100644 index 0000000000..2c2a694b60 --- /dev/null +++ b/src/gui/image/qabstractfileiconprovider.cpp @@ -0,0 +1,197 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qabstractfileiconprovider.h" + +#include <qguiapplication.h> +#include <private/qabstractfileiconprovider_p.h> +#include <private/qfilesystementry_p.h> + +QT_BEGIN_NAMESPACE + +QAbstractFileIconProviderPrivate::QAbstractFileIconProviderPrivate(QAbstractFileIconProvider *q) + : q_ptr(q) +{} + +QAbstractFileIconProviderPrivate::~QAbstractFileIconProviderPrivate() = default; + +/*! + \class QAbstractFileIconProvider + + \inmodule QtGui + \since 6.0 + + \brief The QAbstractFileIconProvider class provides file icons for the QFileSystemModel class. +*/ + +/*! + \enum QAbstractFileIconProvider::IconType + + \value Computer + \value Desktop + \value Trashcan + \value Network + \value Drive + \value Folder + \value File +*/ + +/*! + \enum QAbstractFileIconProvider::Option + + \value DontUseCustomDirectoryIcons Always use the default directory icon. + Some platforms allow the user to set a different icon. Custom icon lookup + cause a big performance impact over network or removable drives. +*/ + +/*! + Constructs a file icon provider. +*/ +QAbstractFileIconProvider::QAbstractFileIconProvider() + : d_ptr(new QAbstractFileIconProviderPrivate(this)) +{ +} + +/*! + \internal +*/ +QAbstractFileIconProvider::QAbstractFileIconProvider(QAbstractFileIconProviderPrivate &dd) + : d_ptr(&dd) +{} + +/*! + Destroys the file icon provider. +*/ + +QAbstractFileIconProvider::~QAbstractFileIconProvider() = default; + + +/*! + Sets \a options that affect the icon provider. + \sa options() +*/ + +void QAbstractFileIconProvider::setOptions(QAbstractFileIconProvider::Options options) +{ + Q_D(QAbstractFileIconProvider); + d->options = options; +} + +/*! + Returns all the options that affect the icon provider. + By default, all options are disabled. + \sa setOptions() +*/ + +QAbstractFileIconProvider::Options QAbstractFileIconProvider::options() const +{ + Q_D(const QAbstractFileIconProvider); + return d->options; +} + +/*! + Returns an icon set for the given \a type. +*/ + +QIcon QAbstractFileIconProvider::icon(IconType type) const +{ + Q_UNUSED(type); + return {}; +} + +/*! + Returns an icon for the file described by \a info. +*/ + +QIcon QAbstractFileIconProvider::icon(const QFileInfo &info) const +{ + Q_UNUSED(info); + return {}; +} + +/*! + Returns the type of the file described by \a info. +*/ + +QString QAbstractFileIconProvider::type(const QFileInfo &info) const +{ + /* ### Qt 6 These string translations being in the QFileDialog context is not ideal, + but translating them in QFileDialog context only in the QFileIconProvider subclass + isn't either (it basically requires a duplication of the entire function). + Either we change it to QAbstractFileIconProvider context (invalidates existing + translations, but that's probably ok), or make a runtime lookup and use QFileDIalog + context only if QGuiApplication is a QApplication. + */ + if (QFileSystemEntry::isRootPath(info.absoluteFilePath())) + return QGuiApplication::translate("QFileDialog", "Drive"); + if (info.isFile()) { + // ### could use QMimeDatabase::mimeTypeForFile(const QFileInfo&) here + if (!info.suffix().isEmpty()) { + //: %1 is a file name suffix, for example txt + return QGuiApplication::translate("QFileDialog", "%1 File").arg(info.suffix()); + } + return QGuiApplication::translate("QFileDialog", "File"); + } + + if (info.isDir()) +#ifdef Q_OS_WIN + return QGuiApplication::translate("QFileDialog", "File Folder", "Match Windows Explorer"); +#else + return QGuiApplication::translate("QFileDialog", "Folder", "All other platforms"); +#endif + // Windows - "File Folder" + // macOS - "Folder" + // Konqueror - "Folder" + // Nautilus - "folder" + + if (info.isSymLink()) +#ifdef Q_OS_MACOS + return QGuiApplication::translate("QFileDialog", "Alias", "macOS Finder"); +#else + return QGuiApplication::translate("QFileDialog", "Shortcut", "All other platforms"); +#endif + // macOS - "Alias" + // Windows - "Shortcut" + // Konqueror - "Folder" or "TXT File" i.e. what it is pointing to + // Nautilus - "link to folder" or "link to object file", same as Konqueror + + return QGuiApplication::translate("QFileDialog", "Unknown"); +} + +QT_END_NAMESPACE diff --git a/src/gui/image/qabstractfileiconprovider.h b/src/gui/image/qabstractfileiconprovider.h new file mode 100644 index 0000000000..fc107e0ca3 --- /dev/null +++ b/src/gui/image/qabstractfileiconprovider.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QABSTRACTFILEICONPROVIDER_H +#define QABSTRACTFILEICONPROVIDER_H + +#include <QtGui/qtguiglobal.h> +#include <QtCore/qfileinfo.h> +#include <QtCore/qscopedpointer.h> +#include <QtGui/qicon.h> + +QT_BEGIN_NAMESPACE + +class QAbstractFileIconProviderPrivate; + +class Q_GUI_EXPORT QAbstractFileIconProvider +{ +public: + enum IconType { Computer, Desktop, Trashcan, Network, Drive, Folder, File }; + enum Option { + DontUseCustomDirectoryIcons = 0x00000001 + }; + Q_DECLARE_FLAGS(Options, Option) + + QAbstractFileIconProvider(); + virtual ~QAbstractFileIconProvider(); + + virtual QIcon icon(IconType) const; + virtual QIcon icon(const QFileInfo &) const; + virtual QString type(const QFileInfo &) const; + + virtual void setOptions(Options); + virtual Options options() const; + +protected: + QAbstractFileIconProvider(QAbstractFileIconProviderPrivate &dd); + QScopedPointer<QAbstractFileIconProviderPrivate> d_ptr; + +private: + Q_DECLARE_PRIVATE(QAbstractFileIconProvider) + Q_DISABLE_COPY(QAbstractFileIconProvider) +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractFileIconProvider::Options) + +QT_END_NAMESPACE + +#endif // QABSTRACTFILEICONPROVIDER_H diff --git a/src/gui/image/qabstractfileiconprovider_p.h b/src/gui/image/qabstractfileiconprovider_p.h new file mode 100644 index 0000000000..db7ac6db1b --- /dev/null +++ b/src/gui/image/qabstractfileiconprovider_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QABSTRACTFILEICONPROVIDER_P_H +#define QABSTRACTFILEICONPROVIDER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/private/qtguiglobal_p.h> +#include "qabstractfileiconprovider.h" + +QT_BEGIN_NAMESPACE + +class Q_GUI_EXPORT QAbstractFileIconProviderPrivate +{ + Q_DECLARE_PUBLIC(QAbstractFileIconProvider) + +public: + QAbstractFileIconProviderPrivate(QAbstractFileIconProvider *q); + virtual ~QAbstractFileIconProviderPrivate(); + + QAbstractFileIconProvider *q_ptr = nullptr; + QAbstractFileIconProvider::Options options = {}; +}; + +QT_END_NAMESPACE + +#endif // QABSTRACTFILEICONPROVIDER_P_H |