/* Copyright (C) 2000-2007 Paul Davis 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 2 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, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __ardour_configuration_variable_h__ #define __ardour_configuration_variable_h__ #include #include #include #include "pbd/xml++.h" namespace ARDOUR { class ConfigVariableBase { public: ConfigVariableBase (std::string str) : _name (str) {} virtual ~ConfigVariableBase() {} std::string name () const { return _name; } void add_to_node (XMLNode&); bool set_from_node (XMLNode const &); virtual std::string get_as_string () const = 0; virtual void set_from_string (std::string const &) = 0; void show_stored_value (const std::string&); static void set_show_stored_values (bool); protected: std::string _name; static bool show_stores; void notify (); void miss (); }; template class ConfigVariable : public ConfigVariableBase { public: ConfigVariable (std::string str) : ConfigVariableBase (str) {} ConfigVariable (std::string str, T val) : ConfigVariableBase (str), value (val) {} T get() const { return value; } std::string get_as_string () const { std::stringstream ss; ss << value; return ss.str (); } virtual bool set (T val) { if (val == value) { miss (); return false; } value = val; notify (); return true; } void set_from_string (std::string const & s) { std::stringstream ss; ss << s; ss >> value; } protected: virtual T get_for_save() { return value; } T value; }; template class ConfigVariableWithMutation : public ConfigVariable { public: ConfigVariableWithMutation (std::string name, T val, T (*m)(T)) : ConfigVariable (name, val), mutator (m) {} bool set (T val) { if (unmutated_value != val) { unmutated_value = val; return ConfigVariable::set (mutator (val)); } return false; } protected: virtual T get_for_save() { return unmutated_value; } T unmutated_value; T (*mutator)(T); }; } #endif /* __ardour_configuration_variable_h__ */