mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 04:53:25 +02:00
add querying for settings that affect a specific type
This commit is contained in:
parent
ab50432ead
commit
731690e358
3 changed files with 73 additions and 11 deletions
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"audio": {
|
"audio": {
|
||||||
"label": "Audio",
|
"label": "Audio",
|
||||||
"types": [0],
|
"assignment-types": [0],
|
||||||
"settings": {
|
"settings": {
|
||||||
"unattenuated-zone": {
|
"unattenuated-zone": {
|
||||||
"label": "Unattenuated Zone",
|
"label": "Unattenuated Zone",
|
||||||
|
|
|
@ -18,10 +18,12 @@
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<% if(setting.type) %>
|
<% if(setting.type) %>
|
||||||
<% if (setting.type === "checkbox") { %>
|
<% if (setting.type === "checkbox") { %>
|
||||||
<% var checked_box = (_.isUndefined(values[group_key][setting_key]) ? setting.default : values[group_key][setting_key]) %>
|
<% var checked_box = (values[group_key] || {})[setting_key] || setting.default %>
|
||||||
<input type="checkbox" id="<%- setting_id %>" <%- checked_box ? "checked" : "" %>>
|
<input type="checkbox" id="<%- setting_id %>" <%- checked_box ? "checked" : "" %>>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<input type="text" class="form-control" id="<%- setting_id %>" placeholder="<%- setting.placeholder %>" value="<%- values[group_key][setting_key] %>">
|
<input type="text" class="form-control" id="<%- setting_id %>"
|
||||||
|
placeholder="<%- setting.placeholder %>"
|
||||||
|
value="<%- (values[group_key] || {})[setting_key] %>">
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,9 +11,12 @@
|
||||||
|
|
||||||
#include <QtCore/QCoreApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtCore/QFile>
|
#include <QtCore/QFile>
|
||||||
|
#include <QtCore/QJsonArray>
|
||||||
#include <QtCore/QJsonObject>
|
#include <QtCore/QJsonObject>
|
||||||
#include <QtCore/QUrl>
|
#include <QtCore/QUrl>
|
||||||
|
#include <QtCore/QUrlQuery>
|
||||||
|
|
||||||
|
#include <Assignment.h>
|
||||||
#include <HTTPConnection.h>
|
#include <HTTPConnection.h>
|
||||||
|
|
||||||
#include "DomainServerSettingsManager.h"
|
#include "DomainServerSettingsManager.h"
|
||||||
|
@ -38,6 +41,9 @@ DomainServerSettingsManager::DomainServerSettingsManager() :
|
||||||
_settingsMap = QJsonDocument::fromJson(configFile.readAll()).toVariant().toMap();
|
_settingsMap = QJsonDocument::fromJson(configFile.readAll()).toVariant().toMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QString DESCRIPTION_SETTINGS_KEY = "settings";
|
||||||
|
const QString SETTING_DEFAULT_KEY = "default";
|
||||||
|
|
||||||
bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) {
|
bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) {
|
||||||
if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") {
|
if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") {
|
||||||
// this is a POST operation to change one or more settings
|
// this is a POST operation to change one or more settings
|
||||||
|
@ -57,20 +63,75 @@ bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection,
|
||||||
return true;
|
return true;
|
||||||
} else if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") {
|
} else if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") {
|
||||||
// this is a GET operation for our settings
|
// this is a GET operation for our settings
|
||||||
// combine the description object and our current settings map
|
|
||||||
QJsonObject combinedObject;
|
|
||||||
combinedObject["descriptions"] = _descriptionObject;
|
|
||||||
combinedObject["values"] = QJsonDocument::fromVariant(_settingsMap).object();
|
|
||||||
|
|
||||||
connection->respond(HTTPConnection::StatusCode200, QJsonDocument(combinedObject).toJson(), "application/json");
|
// check if there is a query parameter for settings affecting a particular type of assignment
|
||||||
|
const QString SETTINGS_TYPE_QUERY_KEY = "type";
|
||||||
|
QUrlQuery settingsQuery(url);
|
||||||
|
QString typeValue = settingsQuery.queryItemValue(SETTINGS_TYPE_QUERY_KEY);
|
||||||
|
|
||||||
|
QJsonObject responseObject;
|
||||||
|
|
||||||
|
if (typeValue.isEmpty()) {
|
||||||
|
// combine the description object and our current settings map
|
||||||
|
responseObject["descriptions"] = _descriptionObject;
|
||||||
|
responseObject["values"] = QJsonDocument::fromVariant(_settingsMap).object();
|
||||||
|
} else {
|
||||||
|
// convert the string type value to a QJsonValue
|
||||||
|
QJsonValue queryType = QJsonValue(typeValue.toInt());
|
||||||
|
|
||||||
|
const QString AFFECTED_TYPES_JSON_KEY = "assignment-types";
|
||||||
|
|
||||||
|
// enumerate the groups in the description object to find which settings to pass
|
||||||
|
foreach(const QString& group, _descriptionObject.keys()) {
|
||||||
|
QJsonObject groupObject = _descriptionObject[group].toObject();
|
||||||
|
QJsonObject groupSettingsObject = groupObject[DESCRIPTION_SETTINGS_KEY].toObject();
|
||||||
|
|
||||||
|
QJsonObject groupResponseObject;
|
||||||
|
|
||||||
|
|
||||||
|
foreach(const QString& settingKey, groupSettingsObject.keys()) {
|
||||||
|
QJsonObject settingObject = groupSettingsObject[settingKey].toObject();
|
||||||
|
|
||||||
|
QJsonArray affectedTypesArray = settingObject[AFFECTED_TYPES_JSON_KEY].toArray();
|
||||||
|
if (affectedTypesArray.isEmpty()) {
|
||||||
|
affectedTypesArray = groupObject[AFFECTED_TYPES_JSON_KEY].toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (affectedTypesArray.contains(queryType)) {
|
||||||
|
// this is a setting we should include in the responseObject
|
||||||
|
|
||||||
|
// we need to check if the settings map has a value for this setting
|
||||||
|
QVariant variantValue;
|
||||||
|
QVariant settingsMapGroupValue = _settingsMap.value(group);
|
||||||
|
|
||||||
|
if (!settingsMapGroupValue.isNull()) {
|
||||||
|
variantValue = settingsMapGroupValue.toMap().value(settingKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (variantValue.isNull()) {
|
||||||
|
// no value for this setting, pass the default
|
||||||
|
groupResponseObject[settingKey] = settingObject[SETTING_DEFAULT_KEY];
|
||||||
|
} else {
|
||||||
|
groupResponseObject[settingKey] = QJsonValue::fromVariant(variantValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!groupResponseObject.isEmpty()) {
|
||||||
|
// set this group's object to the constructed object
|
||||||
|
responseObject[group] = groupResponseObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
connection->respond(HTTPConnection::StatusCode200, QJsonDocument(responseObject).toJson(), "application/json");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString DESCRIPTION_SETTINGS_KEY = "settings";
|
|
||||||
|
|
||||||
void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject,
|
void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject,
|
||||||
QVariantMap& settingsVariant,
|
QVariantMap& settingsVariant,
|
||||||
QJsonObject descriptionObject) {
|
QJsonObject descriptionObject) {
|
||||||
|
@ -94,7 +155,6 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ
|
||||||
settingsVariant[key] = QVariantMap();
|
settingsVariant[key] = QVariantMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
recurseJSONObjectAndOverwriteSettings(rootValue.toObject(),
|
recurseJSONObjectAndOverwriteSettings(rootValue.toObject(),
|
||||||
*reinterpret_cast<QVariantMap*>(settingsVariant[key].data()),
|
*reinterpret_cast<QVariantMap*>(settingsVariant[key].data()),
|
||||||
nextDescriptionObject[DESCRIPTION_SETTINGS_KEY].toObject());
|
nextDescriptionObject[DESCRIPTION_SETTINGS_KEY].toObject());
|
||||||
|
|
Loading…
Reference in a new issue