File indexing completed on 2026-07-12 13:08:17
0001 /* 0002 SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kcmvirtualkeyboard.h" 0008 0009 #include <KAboutData> 0010 #include <KApplicationTrader> 0011 #include <KConfigGroup> 0012 #include <KDesktopFile> 0013 #include <KLocalizedString> 0014 #include <KPluginFactory> 0015 0016 #include <virtualkeyboarddata.h> 0017 #include <virtualkeyboardsettings.h> 0018 0019 K_PLUGIN_FACTORY_WITH_JSON(KcmVirtualKeyboardFactory, "kcm_virtualkeyboard.json", registerPlugin<KcmVirtualKeyboard>(); registerPlugin<VirtualKeyboardData>();) 0020 0021 KcmVirtualKeyboard::KcmVirtualKeyboard(QObject *parent, const QVariantList &args) 0022 : KQuickAddons::ManagedConfigModule(parent) 0023 , m_data(new VirtualKeyboardData(this)) 0024 , m_model(new VirtualKeyboardsModel(this)) 0025 { 0026 qmlRegisterAnonymousType<VirtualKeyboardSettings>("org.kde.kwin.virtualkeyboardsettings", 1); 0027 0028 setAboutData(new KAboutData(QStringLiteral("kcm_virtualkeyboard"), 0029 i18n("Virtual Keyboard"), 0030 QStringLiteral("1.0"), 0031 i18n("Choose Virtual Keyboard"), 0032 KAboutLicense::GPL)); 0033 } 0034 0035 KcmVirtualKeyboard::~KcmVirtualKeyboard() = default; 0036 0037 VirtualKeyboardSettings *KcmVirtualKeyboard::settings() const 0038 { 0039 return m_data->settings(); 0040 } 0041 0042 VirtualKeyboardsModel::VirtualKeyboardsModel(QObject *parent) 0043 : QAbstractListModel(parent) 0044 { 0045 m_services = KApplicationTrader::query([](const KService::Ptr &service) { 0046 return service->property("X-KDE-Wayland-VirtualKeyboard", QMetaType::Bool).toBool(); 0047 }); 0048 0049 m_services.prepend({}); 0050 } 0051 0052 QHash<int, QByteArray> VirtualKeyboardsModel::roleNames() const 0053 { 0054 QHash<int, QByteArray> ret = QAbstractListModel::roleNames(); 0055 ret.insert(DesktopFileNameRole, "desktopFileName"); 0056 return ret; 0057 } 0058 0059 QVariant VirtualKeyboardsModel::data(const QModelIndex &index, int role) const 0060 { 0061 if (!index.isValid() || index.parent().isValid() || index.row() > m_services.count()) { 0062 return {}; 0063 } 0064 0065 const KService::Ptr service = m_services[index.row()]; 0066 switch (role) { 0067 case Qt::DisplayRole: 0068 return service ? service->name() : i18n("None"); 0069 case Qt::DecorationRole: 0070 return service ? service->icon() : QStringLiteral("edit-none"); 0071 case Qt::ToolTipRole: 0072 return service ? service->comment() : i18n("Do not use any virtual keyboard"); 0073 case DesktopFileNameRole: 0074 return service ? QStandardPaths::locate(QStandardPaths::ApplicationsLocation, service->desktopEntryName() + QLatin1String(".desktop")) : QString(); 0075 } 0076 return {}; 0077 } 0078 0079 int VirtualKeyboardsModel::inputMethodIndex(const QString &desktopFile) const 0080 { 0081 if (desktopFile.isEmpty()) { 0082 return 0; 0083 } 0084 0085 int i = 0; 0086 for (const auto &service : m_services) { 0087 if (service && desktopFile.endsWith(service->desktopEntryName() + QLatin1String(".desktop"))) { 0088 return i; 0089 } 0090 ++i; 0091 } 0092 return -1; 0093 } 0094 0095 int VirtualKeyboardsModel::rowCount(const QModelIndex &parent) const 0096 { 0097 return parent.isValid() ? 0 : m_services.count(); 0098 } 0099 0100 #include "kcmvirtualkeyboard.moc" 0101 #include "moc_kcmvirtualkeyboard.cpp"