File indexing completed on 2026-07-12 16:17:45

0001 /*
0002     SPDX-FileCopyrightText: 2018 Eike Hein <hein@kde.org>
0003     SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "virtualdesktops.h"
0009 #include "animationsmodel.h"
0010 #include "desktopsmodel.h"
0011 #include "virtualdesktopsdata.h"
0012 #include "virtualdesktopssettings.h"
0013 
0014 #include <KAboutApplicationDialog>
0015 #include <KAboutData>
0016 #include <KConfigGroup>
0017 #include <KLocalizedString>
0018 #include <KPluginFactory>
0019 
0020 K_PLUGIN_FACTORY_WITH_JSON(VirtualDesktopsFactory,
0021                            "kcm_kwin_virtualdesktops.json",
0022                            registerPlugin<KWin::VirtualDesktops>();
0023                            registerPlugin<KWin::VirtualDesktopsData>();)
0024 
0025 namespace KWin
0026 {
0027 
0028 VirtualDesktops::VirtualDesktops(QObject *parent, const QVariantList &args)
0029     : KQuickAddons::ManagedConfigModule(parent, args)
0030     , m_data(new VirtualDesktopsData(this))
0031 {
0032     KAboutData *about = new KAboutData(QStringLiteral("kcm_kwin_virtualdesktops"),
0033                                        i18n("Virtual Desktops"),
0034                                        QStringLiteral("2.0"), QString(), KAboutLicense::GPL);
0035     setAboutData(about);
0036 
0037     qmlRegisterAnonymousType<VirtualDesktopsSettings>("org.kde.kwin.kcm.desktop", 0);
0038 
0039     setButtons(Apply | Default | Help);
0040 
0041     QObject::connect(m_data->desktopsModel(), &KWin::DesktopsModel::userModifiedChanged,
0042                      this, &VirtualDesktops::settingsChanged);
0043     connect(m_data->animationsModel(), &AnimationsModel::animationEnabledChanged,
0044             this, &VirtualDesktops::settingsChanged);
0045     connect(m_data->animationsModel(), &AnimationsModel::animationIndexChanged,
0046             this, &VirtualDesktops::settingsChanged);
0047 }
0048 
0049 VirtualDesktops::~VirtualDesktops()
0050 {
0051 }
0052 
0053 QAbstractItemModel *VirtualDesktops::desktopsModel() const
0054 {
0055     return m_data->desktopsModel();
0056 }
0057 
0058 QAbstractItemModel *VirtualDesktops::animationsModel() const
0059 {
0060     return m_data->animationsModel();
0061 }
0062 
0063 VirtualDesktopsSettings *VirtualDesktops::virtualDesktopsSettings() const
0064 {
0065     return m_data->settings();
0066 }
0067 
0068 void VirtualDesktops::load()
0069 {
0070     ManagedConfigModule::load();
0071 
0072     m_data->desktopsModel()->load();
0073     m_data->animationsModel()->load();
0074 }
0075 
0076 void VirtualDesktops::save()
0077 {
0078     ManagedConfigModule::save();
0079 
0080     m_data->desktopsModel()->syncWithServer();
0081     m_data->animationsModel()->save();
0082 
0083     QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/KWin"),
0084                                                       QStringLiteral("org.kde.KWin"), QStringLiteral("reloadConfig"));
0085     QDBusConnection::sessionBus().send(message);
0086 }
0087 
0088 void VirtualDesktops::defaults()
0089 {
0090     ManagedConfigModule::defaults();
0091 
0092     m_data->desktopsModel()->defaults();
0093     m_data->animationsModel()->defaults();
0094 }
0095 
0096 bool VirtualDesktops::isDefaults() const
0097 {
0098     return m_data->isDefaults();
0099 }
0100 
0101 void VirtualDesktops::configureAnimation()
0102 {
0103     const QModelIndex index = m_data->animationsModel()->index(m_data->animationsModel()->animationIndex(), 0);
0104     if (!index.isValid()) {
0105         return;
0106     }
0107 
0108     m_data->animationsModel()->requestConfigure(index, nullptr);
0109 }
0110 
0111 void VirtualDesktops::showAboutAnimation()
0112 {
0113     const QModelIndex index = m_data->animationsModel()->index(m_data->animationsModel()->animationIndex(), 0);
0114     if (!index.isValid()) {
0115         return;
0116     }
0117 
0118     const QString name = index.data(AnimationsModel::NameRole).toString();
0119     const QString comment = index.data(AnimationsModel::DescriptionRole).toString();
0120     const QString author = index.data(AnimationsModel::AuthorNameRole).toString();
0121     const QString email = index.data(AnimationsModel::AuthorEmailRole).toString();
0122     const QString website = index.data(AnimationsModel::WebsiteRole).toString();
0123     const QString version = index.data(AnimationsModel::VersionRole).toString();
0124     const QString license = index.data(AnimationsModel::LicenseRole).toString();
0125     const QString icon = index.data(AnimationsModel::IconNameRole).toString();
0126 
0127     const KAboutLicense::LicenseKey licenseType = KAboutLicense::byKeyword(license).key();
0128 
0129     KAboutData aboutData(
0130         name, // Plugin name
0131         name, // Display name
0132         version, // Version
0133         comment, // Short description
0134         licenseType, // License
0135         QString(), // Copyright statement
0136         QString(), // Other text
0137         website.toLatin1() // Home page
0138     );
0139     aboutData.setProgramLogo(icon);
0140 
0141     const QStringList authors = author.split(',');
0142     const QStringList emails = email.split(',');
0143 
0144     if (authors.count() == emails.count()) {
0145         int i = 0;
0146         for (const QString &author : authors) {
0147             if (!author.isEmpty()) {
0148                 aboutData.addAuthor(i18n(author.toUtf8()), QString(), emails[i]);
0149             }
0150             i++;
0151         }
0152     }
0153 
0154     QPointer<KAboutApplicationDialog> aboutPlugin = new KAboutApplicationDialog(aboutData);
0155     aboutPlugin->exec();
0156 
0157     delete aboutPlugin;
0158 }
0159 
0160 bool VirtualDesktops::isSaveNeeded() const
0161 {
0162     return m_data->animationsModel()->needsSave() || m_data->desktopsModel()->needsSave();
0163 }
0164 
0165 }
0166 
0167 #include "moc_virtualdesktops.cpp"
0168 #include "virtualdesktops.moc"