File indexing completed on 2024-05-12 17:07:17

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andriy Rysin <rysin@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QList>
0010 #include <QStringList>
0011 
0012 #include <config-keyboard.h>
0013 
0014 struct ConfigItem {
0015     QString name;
0016     QString description;
0017 };
0018 
0019 template<class T>
0020 inline T *findByName(QList<T *> list, QString name)
0021 {
0022     for (T *info : qAsConst(list)) {
0023         if (info->name == name)
0024             return info;
0025     }
0026     return nullptr;
0027 }
0028 
0029 struct VariantInfo : public ConfigItem {
0030     QList<QString> languages;
0031     const bool fromExtras;
0032 
0033     VariantInfo(bool fromExtras_)
0034         : fromExtras(fromExtras_)
0035     {
0036     }
0037 };
0038 
0039 struct LayoutInfo : public ConfigItem {
0040     QList<VariantInfo *> variantInfos;
0041     QList<QString> languages;
0042     const bool fromExtras;
0043 
0044     //  LayoutInfo() {}
0045     LayoutInfo(bool fromExtras_)
0046         : fromExtras(fromExtras_)
0047     {
0048     }
0049     ~LayoutInfo()
0050     {
0051         qDeleteAll(variantInfos);
0052     }
0053 
0054     VariantInfo *getVariantInfo(const QString &variantName) const
0055     {
0056         return findByName(variantInfos, variantName);
0057     }
0058 
0059     bool isLanguageSupportedByLayout(const QString &lang) const;
0060     bool isLanguageSupportedByDefaultVariant(const QString &lang) const;
0061     bool isLanguageSupportedByVariants(const QString &lang) const;
0062     bool isLanguageSupportedByVariant(const VariantInfo *variantInfo, const QString &lang) const;
0063 };
0064 
0065 struct ModelInfo : public ConfigItem {
0066     QString vendor;
0067 };
0068 
0069 struct OptionInfo : public ConfigItem {
0070 };
0071 
0072 struct OptionGroupInfo : public ConfigItem {
0073     QList<OptionInfo *> optionInfos;
0074     bool exclusive;
0075 
0076     ~OptionGroupInfo()
0077     {
0078         qDeleteAll(optionInfos);
0079     }
0080 
0081     const OptionInfo *getOptionInfo(const QString &optionName) const
0082     {
0083         return findByName(optionInfos, optionName);
0084     }
0085 };
0086 
0087 struct Rules {
0088     enum ExtrasFlag { NO_EXTRAS, READ_EXTRAS };
0089 
0090     static const char XKB_OPTION_GROUP_SEPARATOR;
0091 
0092     QList<LayoutInfo *> layoutInfos;
0093     QList<ModelInfo *> modelInfos;
0094     QList<OptionGroupInfo *> optionGroupInfos;
0095     QString version;
0096 
0097     Rules();
0098 
0099     ~Rules()
0100     {
0101         qDeleteAll(layoutInfos);
0102         qDeleteAll(modelInfos);
0103         qDeleteAll(optionGroupInfos);
0104     }
0105 
0106     const LayoutInfo *getLayoutInfo(const QString &layoutName) const
0107     {
0108         return findByName(layoutInfos, layoutName);
0109     }
0110 
0111     const OptionGroupInfo *getOptionGroupInfo(const QString &optionGroupName) const
0112     {
0113         return findByName(optionGroupInfos, optionGroupName);
0114     }
0115 
0116     static Rules *readRules(ExtrasFlag extrasFlag);
0117     static Rules *readRules(Rules *rules, const QString &filename, bool fromExtras);
0118     static QString getRulesName();
0119     static QString findXkbDir();
0120 };