/* SPDX-FileCopyrightText: 2026 Project Tick
* SPDX-FileContributor: Project Tick
* SPDX-License-Identifier: GPL-3.0-or-later
*
* MeshMC - A Custom Launcher for Minecraft
* Copyright (C) 2026 Project Tick
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* This file incorporates work covered by the following copyright and
* permission notice:
*
* Copyright 2013-2021 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include
#include
#include
#include
#include
class Setting;
class SettingsObject;
typedef std::shared_ptr SettingsObjectPtr;
/*!
* \brief The SettingsObject handles communicating settings between the
* application and a settings file. The class keeps a list of Setting objects.
* Each Setting object represents one of the application's settings. These
* Setting objects are registered with a SettingsObject and can be managed
* similarly to the way a list works.
*
* \author Andrew Okin
* \date 2/22/2013
*
* \sa Setting
*/
class SettingsObject : public QObject
{
Q_OBJECT
public:
class Lock
{
public:
Lock(SettingsObjectPtr locked) : m_locked(locked)
{
m_locked->suspendSave();
}
~Lock()
{
m_locked->resumeSave();
}
private:
SettingsObjectPtr m_locked;
};
public:
explicit SettingsObject(QObject* parent = 0);
virtual ~SettingsObject();
/*!
* Registers an override setting for the given original setting in this
* settings object gate decides if the passthrough (true) or the original
* (false) is used for value
*
* This will fail if there is already a setting with the same ID as
* the one that is being registered.
* \return A valid Setting shared pointer if successful.
*/
std::shared_ptr registerOverride(std::shared_ptr original,
std::shared_ptr gate);
/*!
* Registers a passthorugh setting for the given original setting in this
* settings object gate decides if the passthrough (true) or the original
* (false) is used for value
*
* This will fail if there is already a setting with the same ID as
* the one that is being registered.
* \return A valid Setting shared pointer if successful.
*/
std::shared_ptr
registerPassthrough(std::shared_ptr original,
std::shared_ptr gate);
/*!
* Registers the given setting with this SettingsObject and connects the
* necessary signals.
*
* This will fail if there is already a setting with the same ID as
* the one that is being registered.
* \return A valid Setting shared pointer if successful.
*/
std::shared_ptr registerSetting(QStringList synonyms,
QVariant defVal = QVariant());
/*!
* Registers the given setting with this SettingsObject and connects the
* necessary signals.
*
* This will fail if there is already a setting with the same ID as
* the one that is being registered.
* \return A valid Setting shared pointer if successful.
*/
std::shared_ptr registerSetting(QString id,
QVariant defVal = QVariant())
{
return registerSetting(QStringList(id), defVal);
}
/*!
* \brief Gets the setting with the given ID.
* \param id The ID of the setting to get.
* \return A pointer to the setting with the given ID.
* Returns null if there is no setting with the given ID.
* \sa operator []()
*/
std::shared_ptr getSetting(const QString& id) const;
/*!
* \brief Gets the value of the setting with the given ID.
* \param id The ID of the setting to get.
* \return The setting's value as a QVariant.
* If no setting with the given ID exists, returns an invalid QVariant.
*/
QVariant get(const QString& id) const;
/*!
* \brief Sets the value of the setting with the given ID.
* If no setting with the given ID exists, returns false
* \param id The ID of the setting to change.
* \param value The new value of the setting.
* \return True if successful, false if it failed.
*/
bool set(const QString& id, QVariant value);
/*!
* \brief Reverts the setting with the given ID to default.
* \param id The ID of the setting to reset.
*/
void reset(const QString& id) const;
/*!
* \brief Checks if this SettingsObject contains a setting with the given
* ID.
* \param id The ID to check for.
* \return True if the SettingsObject has a setting with the given ID.
*/
bool contains(const QString& id);
/*!
* \brief Reloads the settings and emit signals for changed settings
* \return True if reloading was successful
*/
virtual bool reload();
virtual void suspendSave() = 0;
virtual void resumeSave() = 0;
signals:
/*!
* \brief Signal emitted when one of this SettingsObject object's settings
* changes. This is usually just connected directly to each Setting object's
* SettingChanged() signals.
* \param setting A reference to the Setting object that changed.
* \param value The Setting object's new value.
*/
void SettingChanged(const Setting& setting, QVariant value);
/*!
* \brief Signal emitted when one of this SettingsObject object's settings
* resets. This is usually just connected directly to each Setting object's
* settingReset() signals.
* \param setting A reference to the Setting object that changed.
*/
void settingReset(const Setting& setting);
protected slots:
/*!
* \brief Changes a setting.
* This slot is usually connected to each Setting object's
* SettingChanged() signal. The signal is emitted, causing this slot
* to update the setting's value in the config file.
* \param setting A reference to the Setting object that changed.
* \param value The setting's new value.
*/
virtual void changeSetting(const Setting& setting, QVariant value) = 0;
/*!
* \brief Resets a setting.
* This slot is usually connected to each Setting object's
* settingReset() signal. The signal is emitted, causing this slot
* to update the setting's value in the config file.
* \param setting A reference to the Setting object that changed.
*/
virtual void resetSetting(const Setting& setting) = 0;
protected:
/*!
* \brief Connects the necessary signals to the given Setting.
* \param setting The setting to connect.
*/
void connectSignals(const Setting& setting);
/*!
* \brief Function used by Setting objects to get their values from the
* SettingsObject.
* \param setting The
* \return
*/
virtual QVariant retrieveValue(const Setting& setting) = 0;
friend class Setting;
private:
QMap> m_settings;
protected:
bool m_suspendSave = false;
bool m_doSave = false;
};