| 1 | // Copyright (C) 2016 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
| 3 | |
| 4 | #include "qstylefactory.h" |
| 5 | #include "qstyleplugin.h" |
| 6 | #include "private/qfactoryloader_p.h" |
| 7 | #include "qmutex.h" |
| 8 | |
| 9 | #include "qapplication.h" |
| 10 | #include "qwindowsstyle_p.h" |
| 11 | #if QT_CONFIG(style_fusion) |
| 12 | #include "qfusionstyle_p.h" |
| 13 | #endif |
| 14 | |
| 15 | QT_BEGIN_NAMESPACE |
| 16 | |
| 17 | using namespace Qt::StringLiterals; |
| 18 | |
| 19 | Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, |
| 20 | (QStyleFactoryInterface_iid, "/styles"_L1 , Qt::CaseInsensitive)) |
| 21 | |
| 22 | /*! |
| 23 | \class QStyleFactory |
| 24 | \brief The QStyleFactory class creates QStyle objects. |
| 25 | |
| 26 | \ingroup appearance |
| 27 | \inmodule QtWidgets |
| 28 | |
| 29 | The QStyle class is an abstract base class that encapsulates the |
| 30 | look and feel of a GUI. QStyleFactory creates a QStyle object |
| 31 | using the create() function and a key identifying the style. The |
| 32 | styles are either built-in or dynamically loaded from a style |
| 33 | plugin (see QStylePlugin). |
| 34 | |
| 35 | The valid keys can be retrieved using the keys() |
| 36 | function. Typically they include "windows" and "fusion". |
| 37 | Depending on the platform, "windowsvista" |
| 38 | and "macos" may be available. |
| 39 | Note that keys are case insensitive. |
| 40 | |
| 41 | \sa QStyle |
| 42 | */ |
| 43 | |
| 44 | /*! |
| 45 | Creates and returns a QStyle object that matches the given \a key, or |
| 46 | returns \nullptr if no matching style is found. |
| 47 | |
| 48 | Both built-in styles and styles from style plugins are queried for a |
| 49 | matching style. |
| 50 | |
| 51 | \note The keys used are case insensitive. |
| 52 | |
| 53 | \sa keys() |
| 54 | */ |
| 55 | QStyle *QStyleFactory::create(const QString& key) |
| 56 | { |
| 57 | QStyle *ret = nullptr; |
| 58 | QString style = key.toLower(); |
| 59 | #if QT_CONFIG(style_windows) |
| 60 | if (style == "windows"_L1 ) |
| 61 | ret = new QWindowsStyle; |
| 62 | else |
| 63 | #endif |
| 64 | #if QT_CONFIG(style_fusion) |
| 65 | if (style == "fusion"_L1 ) |
| 66 | ret = new QFusionStyle; |
| 67 | else |
| 68 | #endif |
| 69 | #if defined(Q_OS_MACOS) && QT_DEPRECATED_SINCE(6, 0) |
| 70 | if (style == "macintosh"_L1 ) { |
| 71 | qWarning() << "The style key 'macintosh' is deprecated. Please use 'macos' instead." ; |
| 72 | style = QStringLiteral("macos" ); |
| 73 | } else |
| 74 | #endif |
| 75 | { } // Keep these here - they make the #ifdefery above work |
| 76 | if (!ret) |
| 77 | ret = qLoadPlugin<QStyle, QStylePlugin>(loader: loader(), key: style); |
| 78 | if (ret) { |
| 79 | ret->setObjectName(style); |
| 80 | ret->setName(style); |
| 81 | } |
| 82 | return ret; |
| 83 | } |
| 84 | |
| 85 | /*! |
| 86 | Returns the list of valid keys, i.e. the keys this factory can |
| 87 | create styles for. |
| 88 | |
| 89 | \sa create() |
| 90 | */ |
| 91 | QStringList QStyleFactory::keys() |
| 92 | { |
| 93 | QStringList list; |
| 94 | typedef QMultiMap<int, QString> PluginKeyMap; |
| 95 | |
| 96 | const PluginKeyMap keyMap = loader()->keyMap(); |
| 97 | const PluginKeyMap::const_iterator cend = keyMap.constEnd(); |
| 98 | for (PluginKeyMap::const_iterator it = keyMap.constBegin(); it != cend; ++it) |
| 99 | list.append(t: it.value()); |
| 100 | #if QT_CONFIG(style_windows) |
| 101 | if (!list.contains(str: "Windows"_L1 )) |
| 102 | list << "Windows"_L1 ; |
| 103 | #endif |
| 104 | #if QT_CONFIG(style_fusion) |
| 105 | if (!list.contains(str: "Fusion"_L1 )) |
| 106 | list << "Fusion"_L1 ; |
| 107 | #endif |
| 108 | return list; |
| 109 | } |
| 110 | |
| 111 | QT_END_NAMESPACE |
| 112 | |