/* * Copyright 2008-2009 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" // Qt includes #include Sigscript::Config::Config(Config* parent) : QObject(parent), m_lock(QReadWriteLock::Recursive), m_parent(parent) { } void Sigscript::Config::addValue(const QString& name, const QVariant& value, const Options options) { if (!m_values.contains(name)) { emit(valueAdded(name, value)); setValue(name, value, options); } } 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) { Config* par = m_parent; while (par) { if (par->hasValue(name)) return par->value(name); par = par->m_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) return m_parent->hasValue(name, true); return false; } QStringList Sigscript::Config::values(const bool recursive) const { QStringList values = m_values.keys(); if (recursive && m_parent) values += m_parent->values(true); foreach (const QString& value, values) { if (m_values.contains(value) && (m_values[value].second & (Deleted | Hidden))) values.removeAll(value); } return values.toSet().toList(); } 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); }