File indexing completed on 2024-06-30 05:51:31

0001 /*
0002     This file is part of the Okteta Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2012 Alex Richardson <alex.richardson@gmx.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "enumscriptclass.hpp"
0010 
0011 #include "../../datatypes/primitive/enumdatainformation.hpp"
0012 #include "../../parsers/parserutils.hpp"
0013 #include "../scriptlogger.hpp"
0014 
0015 EnumScriptClass::EnumScriptClass(QScriptEngine* engine, ScriptHandlerInfo* handlerInfo)
0016     : PrimitiveScriptClass(engine, handlerInfo)
0017 {
0018     s_values = engine->toStringHandle(ParserStrings::PROPERTY_ENUM_VALUES());
0019     mIterableProperties.append(qMakePair(s_values, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
0020 }
0021 
0022 EnumScriptClass::~EnumScriptClass() = default;
0023 
0024 QScriptValue EnumScriptClass::additionalProperty(const DataInformation* data, const QScriptString& name, uint id)
0025 {
0026     if (name == s_values) {
0027         const EnumDataInformation* pData = data->asEnum();
0028         QScriptValue ret = engine()->newObject();
0029         QMapIterator<AllPrimitiveTypes, QString> it(pData->enumValues()->values());
0030         while (it.hasNext()) {
0031             it.next();
0032             ret.setProperty(it.value(), QString::number(it.key().value<quint64>())); // should always work
0033         }
0034         return ret;
0035     }
0036     if (name == s_type) {
0037         return data->typeName();
0038     }
0039     return PrimitiveScriptClass::additionalProperty(data, name, id);
0040 }
0041 
0042 bool EnumScriptClass::queryAdditionalProperty(const DataInformation* data, const QScriptString& name, QScriptClass::QueryFlags* flags, uint* id)
0043 {
0044     if (name == s_values) {
0045         *flags = QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess;
0046         return true;
0047     }
0048     return PrimitiveScriptClass::queryAdditionalProperty(data, name, flags, id);
0049 }
0050 
0051 bool EnumScriptClass::setAdditionalProperty(DataInformation* data, const QScriptString& name, uint id, const QScriptValue& value)
0052 {
0053     if (name == s_values) {
0054         EnumDataInformation* pData = data->asEnum();
0055         QMap<AllPrimitiveTypes, QString> newValues = EnumDefinition::parseEnumValues(value,
0056                                                                                      LoggerWithContext(pData->logger(), pData->fullObjectPath()), pData->type());
0057         if (newValues.isEmpty()) {
0058             pData->logWarn() << "attempting to set empty list of enum values!";
0059         }
0060         pData->setEnumValues(newValues);
0061         return true;
0062     }
0063     return PrimitiveScriptClass::setAdditionalProperty(data, name, id, value);
0064 }