File indexing completed on 2024-05-19 04:41:20

0001 /*
0002     SPDX-FileCopyrightText: 2019 Daniel Mensinger <daniel@mensinger-ka.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QString>
0010 #include <QStringList>
0011 #include <QVector>
0012 #include <memory>
0013 
0014 class QJsonArray;
0015 class QJsonObject;
0016 class QWidget;
0017 class MesonOptionBase;
0018 class MesonOptions;
0019 
0020 using MesonOptionPtr = std::shared_ptr<MesonOptionBase>;
0021 using MesonOptsPtr = std::shared_ptr<MesonOptions>;
0022 
0023 /*!
0024  * Base class for a single meson option.
0025  */
0026 class MesonOptionBase
0027 {
0028 public:
0029     enum Section { CORE, BACKEND, BASE, COMPILER, DIRECTORY, USER, TEST };
0030     enum Type { ARRAY, BOOLEAN, COMBO, INTEGER, STRING };
0031 
0032 public:
0033     explicit MesonOptionBase(const QString& name, const QString& description, Section section);
0034     virtual ~MesonOptionBase();
0035 
0036     virtual Type type() const = 0;
0037     virtual QString value() const = 0;
0038     virtual QString initialValue() const = 0;
0039     virtual void setFromString(const QString& value) = 0;
0040     virtual void reset() = 0;
0041 
0042     QString name() const;
0043     QString description() const;
0044     Section section() const;
0045 
0046     QString mesonArg() const;
0047     bool isUpdated() const;
0048 
0049     static MesonOptionPtr fromJSON(const QJsonObject& obj);
0050 
0051 private:
0052     QString m_name;
0053     QString m_description;
0054     Section m_section;
0055 };
0056 
0057 class MesonOptionArray : public MesonOptionBase
0058 {
0059 public:
0060     MesonOptionArray(const QString& name, const QString& description, Section section, QStringList value);
0061 
0062     MesonOptionBase::Type type() const override;
0063     QString value() const override;
0064     QString initialValue() const override;
0065     void setFromString(const QString& value) override;
0066     void reset() override;
0067 
0068     QStringList rawValue() const;
0069     void setValue(const QStringList& val);
0070 
0071 private:
0072     QStringList m_value;
0073     QStringList m_initialValue;
0074 };
0075 
0076 class MesonOptionBool : public MesonOptionBase
0077 {
0078 public:
0079     MesonOptionBool(const QString& name, const QString& description, Section section, bool value);
0080 
0081     MesonOptionBase::Type type() const override;
0082     QString value() const override;
0083     QString initialValue() const override;
0084     void setFromString(const QString& value) override;
0085     void reset() override;
0086 
0087     bool rawValue() const;
0088     void setValue(bool val);
0089 
0090 private:
0091     bool m_value;
0092     bool m_initialValue;
0093 };
0094 
0095 class MesonOptionCombo : public MesonOptionBase
0096 {
0097 public:
0098     MesonOptionCombo(const QString& name, const QString& description, Section section, QString value,
0099                      QStringList choices);
0100 
0101     MesonOptionBase::Type type() const override;
0102     QString value() const override;
0103     QString initialValue() const override;
0104     void setFromString(const QString& value) override;
0105     void reset() override;
0106 
0107     QString rawValue() const;
0108     void setValue(const QString& val);
0109     QStringList choices() const;
0110 
0111 private:
0112     QString m_value;
0113     QString m_initialValue;
0114     QStringList m_choices;
0115 };
0116 
0117 class MesonOptionInteger : public MesonOptionBase
0118 {
0119 public:
0120     MesonOptionInteger(const QString& name, const QString& description, Section section, int value);
0121 
0122     MesonOptionBase::Type type() const override;
0123     QString value() const override;
0124     QString initialValue() const override;
0125     void setFromString(const QString& value) override;
0126     void reset() override;
0127 
0128     int rawValue() const;
0129     void setValue(int val);
0130 
0131 private:
0132     int m_value;
0133     int m_initialValue;
0134 };
0135 
0136 class MesonOptionString : public MesonOptionBase
0137 {
0138 public:
0139     MesonOptionString(const QString& name, const QString& description, Section section, QString value);
0140 
0141     MesonOptionBase::Type type() const override;
0142     QString value() const override;
0143     QString initialValue() const override;
0144     void setFromString(const QString& value) override;
0145     void reset() override;
0146 
0147     QString rawValue() const;
0148     void setValue(const QString& val);
0149 
0150 private:
0151     QString m_value;
0152     QString m_initialValue;
0153 };
0154 
0155 /*!
0156  * Container class for all meson project options.
0157  */
0158 class MesonOptions
0159 {
0160 public:
0161     explicit MesonOptions(const QJsonArray& arr);
0162 
0163     int numChanged() const;
0164     QStringList getMesonArgs() const;
0165     void print() const;
0166 
0167     QVector<MesonOptionPtr> options();
0168 
0169 private:
0170     QVector<MesonOptionPtr> m_options;
0171 
0172     void fromJSON(const QJsonArray& arr);
0173 };