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"