summaryrefslogtreecommitdiff
path: root/common/config_params.cpp
diff options
context:
space:
mode:
authorsaurabhb172020-02-26 16:20:48 +0530
committerGitHub2020-02-26 16:20:48 +0530
commitb77f5d9d8097c38159c6f60917995d6af13bbe1c (patch)
tree1392c90227aeea231c1d86371131e04c40382918 /common/config_params.cpp
parentdadc4d490966a24efe15b5cc533ef8695986048a (diff)
parent003d02608917e7a69d1a98438837e94ccf68352a (diff)
downloadKiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.gz
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.bz2
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.zip
Merge pull request #4 from FOSSEE/develop
merging dev into master
Diffstat (limited to 'common/config_params.cpp')
-rw-r--r--common/config_params.cpp529
1 files changed, 529 insertions, 0 deletions
diff --git a/common/config_params.cpp b/common/config_params.cpp
new file mode 100644
index 0000000..1882ac1
--- /dev/null
+++ b/common/config_params.cpp
@@ -0,0 +1,529 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
+ * Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
+ * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * 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, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <fctsys.h>
+#include <gr_basic.h>
+#include <pgm_base.h>
+#include <common.h>
+#include <kicad_string.h>
+#include <gestfich.h>
+#include <wxstruct.h>
+#include <config_params.h>
+
+#include <wx/apptrait.h>
+#include <wx/stdpaths.h>
+
+#include <wildcards_and_files_ext.h>
+
+#include <boost/foreach.hpp>
+
+
+void wxConfigLoadParams( wxConfigBase* aCfg,
+ const PARAM_CFG_ARRAY& aList, const wxString& aGroup )
+{
+ wxASSERT( aCfg );
+
+ BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
+ {
+ if( !!param.m_Group )
+ aCfg->SetPath( param.m_Group );
+ else
+ aCfg->SetPath( aGroup );
+
+ if( param.m_Setup )
+ continue;
+
+ param.ReadParam( aCfg );
+ }
+}
+
+
+void wxConfigLoadSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
+{
+ wxASSERT( aCfg );
+
+ BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
+ {
+ if( !param.m_Setup )
+ continue;
+
+ param.ReadParam( aCfg );
+ }
+}
+
+
+void wxConfigSaveParams( wxConfigBase* aCfg,
+ const PARAM_CFG_ARRAY& aList, const wxString& aGroup )
+{
+ wxASSERT( aCfg );
+
+ BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
+ {
+ if( !!param.m_Group )
+ aCfg->SetPath( param.m_Group );
+ else
+ aCfg->SetPath( aGroup );
+
+ if( param.m_Setup )
+ continue;
+
+ if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
+ {
+ if( !!param.m_Ident )
+ aCfg->DeleteGroup( param.m_Ident );
+ }
+ else
+ {
+ param.SaveParam( aCfg );
+ }
+ }
+}
+
+
+void wxConfigSaveSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
+{
+ wxASSERT( aCfg );
+
+ BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
+ {
+ if( !param.m_Setup )
+ continue;
+
+ if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
+ {
+ if( !!param.m_Ident )
+ aCfg->DeleteGroup( param.m_Ident );
+ }
+ else
+ {
+ param.SaveParam( aCfg );
+ }
+ }
+}
+
+
+void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double aValue )
+{
+ // Use a single strategy, regardless of wx version.
+ // Want C locale float string.
+
+ LOCALE_IO toggle;
+ wxString tnumber = wxString::Format( wxT( "%.16g" ), aValue );
+
+ aConfig->Write( aKey, tnumber );
+}
+
+
+PARAM_CFG_BASE::PARAM_CFG_BASE( const wxString& ident, const paramcfg_id type,
+ const wxChar* group )
+{
+ m_Ident = ident;
+ m_Type = type;
+ m_Group = group;
+ m_Setup = false;
+}
+
+
+PARAM_CFG_INT::PARAM_CFG_INT( const wxString& ident, int* ptparam,
+ int default_val, int min, int max,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_INT, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+ m_Min = min;
+ m_Max = max;
+}
+
+
+PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxString& ident, int* ptparam,
+ int default_val, int min, int max,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_INT, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+ m_Min = min;
+ m_Max = max;
+ m_Setup = Insetup;
+}
+
+
+void PARAM_CFG_INT::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ int itmp = aConfig->Read( m_Ident, m_Default );
+
+ if( (itmp < m_Min) || (itmp > m_Max) )
+ itmp = m_Default;
+
+ *m_Pt_param = itmp;
+}
+
+
+void PARAM_CFG_INT::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ aConfig->Write( m_Ident, *m_Pt_param );
+}
+
+
+PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxString& ident, int* ptparam,
+ int default_val, int min, int max,
+ const wxChar* group, double aBiu2cfgunit ) :
+ PARAM_CFG_INT( ident, ptparam, default_val, min, max, group )
+{
+ m_Type = PARAM_INT_WITH_SCALE;
+ m_BIU_to_cfgunit = aBiu2cfgunit;
+}
+
+
+PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( bool Insetup,
+ const wxString& ident, int* ptparam,
+ int default_val, int min, int max,
+ const wxChar* group, double aBiu2cfgunit ) :
+ PARAM_CFG_INT( Insetup, ident, ptparam, default_val, min, max, group )
+{
+ m_Type = PARAM_INT_WITH_SCALE;
+ m_BIU_to_cfgunit = aBiu2cfgunit;
+}
+
+
+void PARAM_CFG_INT_WITH_SCALE::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ double dtmp = (double) m_Default * m_BIU_to_cfgunit;
+ aConfig->Read( m_Ident, &dtmp );
+
+ int itmp = KiROUND( dtmp / m_BIU_to_cfgunit );
+
+ if( (itmp < m_Min) || (itmp > m_Max) )
+ itmp = m_Default;
+
+ *m_Pt_param = itmp;
+}
+
+
+void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ // We cannot use aConfig->Write for a double, because
+ // this function uses a format with very few digits in mantissa,
+ // and truncature issues are frequent.
+ // We uses our function.
+ ConfigBaseWriteDouble( aConfig, m_Ident, *m_Pt_param * m_BIU_to_cfgunit );
+}
+
+
+PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxString& ident, EDA_COLOR_T* ptparam,
+ EDA_COLOR_T default_val,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_SETCOLOR, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+}
+
+
+PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( bool Insetup,
+ const wxString& ident,
+ EDA_COLOR_T* ptparam,
+ EDA_COLOR_T default_val,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_SETCOLOR, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+ m_Setup = Insetup;
+}
+
+
+void PARAM_CFG_SETCOLOR::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ EDA_COLOR_T itmp = ColorByName( aConfig->Read( m_Ident, wxT("NONE") ) );
+
+ if( itmp == UNSPECIFIED_COLOR )
+ itmp = m_Default;
+ *m_Pt_param = itmp;
+}
+
+
+void PARAM_CFG_SETCOLOR::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ aConfig->Write( m_Ident, ColorGetName( *m_Pt_param ) );
+}
+
+
+PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxString& ident, double* ptparam,
+ double default_val, double min, double max,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_DOUBLE, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+ m_Min = min;
+ m_Max = max;
+}
+
+
+PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( bool Insetup,
+ const wxString& ident,
+ double* ptparam,
+ double default_val,
+ double min,
+ double max,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_DOUBLE, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val;
+ m_Min = min;
+ m_Max = max;
+ m_Setup = Insetup;
+}
+
+
+void PARAM_CFG_DOUBLE::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ double dtmp = m_Default;
+ aConfig->Read( m_Ident, &dtmp );
+
+ if( (dtmp < m_Min) || (dtmp > m_Max) )
+ dtmp = m_Default;
+
+ *m_Pt_param = dtmp;
+}
+
+
+void PARAM_CFG_DOUBLE::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ // We cannot use aConfig->Write for a double, because
+ // this function uses a format with very few digits in mantissa,
+ // and truncature issues are frequent.
+ // We uses our function.
+ ConfigBaseWriteDouble( aConfig, m_Ident, *m_Pt_param );
+}
+
+
+PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxString& ident, bool* ptparam,
+ int default_val, const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_BOOL, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val ? true : false;
+}
+
+
+PARAM_CFG_BOOL::PARAM_CFG_BOOL( bool Insetup,
+ const wxString& ident,
+ bool* ptparam,
+ int default_val,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_BOOL, group )
+{
+ m_Pt_param = ptparam;
+ m_Default = default_val ? true : false;
+ m_Setup = Insetup;
+}
+
+
+void PARAM_CFG_BOOL::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ int itmp = aConfig->Read( m_Ident, (int) m_Default );
+
+ *m_Pt_param = itmp ? true : false;
+}
+
+
+void PARAM_CFG_BOOL::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ aConfig->Write( m_Ident, *m_Pt_param );
+}
+
+
+PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxString& ident,
+ wxString* ptparam,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_WXSTRING, group )
+{
+ m_Pt_param = ptparam;
+}
+
+
+PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxString& ident,
+ wxString* ptparam,
+ const wxString& default_val,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_WXSTRING, group )
+{
+ m_Pt_param = ptparam;
+ m_Setup = Insetup;
+ m_default = default_val;
+}
+
+
+void PARAM_CFG_WXSTRING::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ *m_Pt_param = aConfig->Read( m_Ident, m_default );
+}
+
+
+void PARAM_CFG_WXSTRING::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ aConfig->Write( m_Ident, *m_Pt_param );
+}
+
+
+PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxString& ident,
+ wxString* ptparam,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_FILENAME, group )
+{
+ m_Pt_param = ptparam;
+}
+
+
+void PARAM_CFG_FILENAME::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ wxString prm = aConfig->Read( m_Ident );
+ // file names are stored using Unix notation
+ // under Window we must use \ instead of /
+ // mainly if there is a server name in path (something like \\server\kicad)
+#ifdef __WINDOWS__
+ prm.Replace(wxT("/"), wxT("\\"));
+#endif
+ *m_Pt_param = prm;
+}
+
+
+void PARAM_CFG_FILENAME::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ wxString prm = *m_Pt_param;
+ // filenames are stored using Unix notation
+ prm.Replace(wxT("\\"), wxT("/") );
+ aConfig->Write( m_Ident, prm );
+}
+
+
+PARAM_CFG_LIBNAME_LIST::PARAM_CFG_LIBNAME_LIST( const wxChar* ident,
+ wxArrayString* ptparam,
+ const wxChar* group ) :
+ PARAM_CFG_BASE( ident, PARAM_LIBNAME_LIST, group )
+{
+ m_Pt_param = ptparam;
+}
+
+
+void PARAM_CFG_LIBNAME_LIST::ReadParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ int indexlib = 1; // We start indexlib to 1 because first
+ // lib name is LibName1
+ wxString libname, id_lib;
+ wxArrayString* libname_list = m_Pt_param;
+
+ while( 1 )
+ {
+ id_lib = m_Ident;
+ id_lib << indexlib;
+ indexlib++;
+ libname = aConfig->Read( id_lib, wxT( "" ) );
+
+ if( libname.IsEmpty() )
+ break;
+ // file names are stored using Unix notation
+ // under Window we must use \ instead of /
+ // mainly if there is a server name in path (something like \\server\kicad)
+#ifdef __WINDOWS__
+ libname.Replace(wxT("/"), wxT("\\"));
+#endif
+ libname_list->Add( libname );
+ }
+}
+
+
+void PARAM_CFG_LIBNAME_LIST::SaveParam( wxConfigBase* aConfig ) const
+{
+ if( !m_Pt_param || !aConfig )
+ return;
+
+ wxArrayString* libname_list = m_Pt_param;
+
+ wxString configkey;
+ wxString libname;
+
+ for( unsigned indexlib = 0; indexlib < libname_list->GetCount(); indexlib++ )
+ {
+ configkey = m_Ident;
+
+ // We use indexlib+1 because first lib name is LibName1
+ configkey << (indexlib + 1);
+ libname = libname_list->Item( indexlib );
+
+ // filenames are stored using Unix notation
+ libname.Replace(wxT("\\"), wxT("/") );
+ aConfig->Write( configkey, libname );
+ }
+}