/* * Copyright 2008 Ben Boeckel * * 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 . */ // Header include #include "Config.h" Sigscript::Config::Config(QObject* parent) : QObject(parent), m_lock(QReadWriteLock::Recursive) { } void Sigscript::Config::addValue(const QString& name, const QVariant& value, const Options options) { if (!m_values.contains(name)) { setValue(name, value, options); emit(valueAdded(name, value)); } } void Sigscript::Config::setValue(const QString& name, const QVariant& value, const Options options) { QWriteLocker locker(&m_lock); QVariant oldValue = m_values[name].first; m_values[name] = Value(value, options); emit(valueChanged(name, oldValue, value)); } void Sigscript::Config::setOptions(const QString& name, const Options options) { QWriteLocker locker(&m_lock); const Options oldOptions = m_values[name].second; m_values[name].second |= options; emit(optionsChanged(name, oldOptions, options)); } void Sigscript::Config::unsetOptions(const QString& name, const Options options) { QWriteLocker locker(&m_lock); const Options oldOptions = m_values[name].second; m_values[name].second |= ~options; emit(optionsChanged(name, oldOptions, options)); } void Sigscript::Config::removeValue(const QString& name, const bool shadow) { QWriteLocker locker(&m_lock); if (shadow) m_values[name].second |= Deleted; else m_values.remove(name); emit(valueRemoved(name)); } QVariant Sigscript::Config::value(const QString& name, const bool recursive) const { QReadLocker locker(&m_lock); if (m_values.contains(name)) { if (m_values[name].second & (Deleted | Hidden)) return QVariant(); return m_values[name].first; } if (recursive) { QObject* par = parent(); while (par) { if (qobject_cast(par) && qobject_cast(par)->hasValue(name)) return qobject_cast(par)->value(name); par = par->parent(); } } return QVariant(); } bool Sigscript::Config::hasValue(const QString& name, const bool recursive) const { QReadLocker locker(&m_lock); if (m_values.contains(name)) return !(m_values[name].second & (Deleted | Hidden)); if (recursive && qobject_cast(parent())) return qobject_cast(parent())->hasValue(name, true); return false; } void Sigscript::Config::clean() { QWriteLocker locker(&m_lock); for (QMutableMapIterator i(m_values); i.hasNext(); i.next()) { if (i.value().second & Temporary) { i.remove(); continue; } i.value().second &= ~Hidden; } } void Sigscript::Config::writeBack() { QWriteLocker locker(&m_lock); }