File indexing completed on 2024-05-19 05:38:25

0001 /*
0002     SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include <KQuickManagedConfigModule>
0010 
0011 #include "soundthemesettings.h"
0012 
0013 class SoundThemeData;
0014 struct ca_context;
0015 
0016 class ThemeInfo : public QObject
0017 {
0018     Q_OBJECT
0019     QML_ANONYMOUS
0020 
0021     Q_PROPERTY(QString id MEMBER id CONSTANT)
0022     Q_PROPERTY(QString name MEMBER name CONSTANT)
0023     Q_PROPERTY(QString comment MEMBER comment CONSTANT)
0024     Q_PROPERTY(QStringList inherits MEMBER inherits CONSTANT)
0025     Q_PROPERTY(QStringList directories MEMBER directories CONSTANT)
0026     Q_PROPERTY(bool hidden MEMBER isHidden CONSTANT)
0027     Q_PROPERTY(QString example MEMBER example CONSTANT)
0028 
0029 public:
0030     explicit ThemeInfo(const QString &themeId, QObject *parent = nullptr);
0031 
0032 public:
0033     // Properties provided by index.theme
0034     QString id;
0035     QString name;
0036     QString comment;
0037     QStringList inherits;
0038     QStringList directories;
0039     bool isHidden;
0040     QString example;
0041     // Validation
0042     bool isValid = false;
0043 };
0044 
0045 class KCMSoundTheme : public KQuickManagedConfigModule
0046 {
0047     Q_OBJECT
0048 
0049     Q_PROPERTY(SoundThemeSettings *settings READ settings CONSTANT);
0050     Q_PROPERTY(QList<ThemeInfo *> themes MEMBER m_themes NOTIFY themesLoaded);
0051     Q_PROPERTY(int currentIndex READ currentIndex NOTIFY themeChanged);
0052     Q_PROPERTY(QString playingTheme MEMBER m_playingTheme NOTIFY playingChanged);
0053     Q_PROPERTY(QString playingSound MEMBER m_playingSound NOTIFY playingChanged);
0054 
0055 public:
0056     KCMSoundTheme(QObject *parent, const KPluginMetaData &data);
0057     ~KCMSoundTheme() override;
0058 
0059     SoundThemeSettings *settings() const;
0060     int currentIndex() const;
0061 
0062     Q_INVOKABLE int indexOf(const QString &themeId) const;
0063     Q_INVOKABLE QString nameFor(const QString &themeId) const;
0064 
0065     Q_INVOKABLE int playSound(const QString &themeId, const QStringList &soundList);
0066     Q_SLOT void cancelSound();
0067 
0068     Q_INVOKABLE static QString errorString(int errorCode);
0069 
0070     virtual void load() override;
0071 
0072 Q_SIGNALS:
0073     void themesLoaded();
0074     void themeChanged();
0075     void playingChanged();
0076 
0077 private:
0078     ca_context *canberraContext();
0079     static void ca_finish_callback(ca_context *c, uint32_t id, int error_code, void *userdata);
0080     Q_SLOT void onPlayingFinished();
0081 
0082     void loadThemes();
0083 
0084 private:
0085     ca_context *m_canberraContext = nullptr;
0086     SoundThemeData *m_data = nullptr;
0087 
0088     QList<ThemeInfo *> m_themes;
0089     QString m_playingTheme;
0090     QString m_playingSound;
0091 };