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 };