Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
8eff8df9
Commit
8eff8df9
authored
Feb 19, 2008
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
beautify
parent
ce04867e
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
649 additions
and
581 deletions
+649
-581
common.cpp
common/common.cpp
+18
-18
edaappl.cpp
common/edaappl.cpp
+13
-7
projet_config.cpp
common/projet_config.cpp
+452
-397
pcbcfg.cpp
pcbnew/pcbcfg.cpp
+166
-159
No files found.
common/common.cpp
View file @
8eff8df9
...
@@ -277,10 +277,10 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
...
@@ -277,10 +277,10 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
*/
*/
{
{
#if
0 && defined(DEBUG)
#if
1 && defined(DEBUG)
// Dick: this code is working fine, but we have no place to store the layer names yet.
// Dick: this code is working fine, but we have no place to store the layer names yet.
const
unsigned
LAYER_LIMIT
=
29
;
const
unsigned
LAYER_LIMIT
=
29
;
// @todo: these layer names should be configurable on a per project basis.
// @todo: these layer names should be configurable on a per project basis.
...
@@ -288,17 +288,17 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
...
@@ -288,17 +288,17 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
// deriving the file names from the "configured" layer names.
// deriving the file names from the "configured" layer names.
// The main idea is to use a single array of names, and then remove
// The main idea is to use a single array of names, and then remove
// spaces on the fly from the names when writing to disk.
// spaces on the fly from the names when writing to disk.
#if 1 // my specific layer names
#if 1 // my specific layer names
static
const
wxString
layer_name_list
[]
=
{
static
const
wxString
layer_name_list
[]
=
{
_
(
"H2 Bottom"
),
_
(
"Power"
),
_
(
"V2 Signal"
),
_
(
"H1 Signal"
),
_
(
"H2 Bottom"
),
_
(
"Power"
),
_
(
"V2 Signal"
),
_
(
"H1 Signal"
),
_( "Ground" ), _( "Inner L5
" ), _( "Inner L6 " ), _( "Inner L7
" ),
_
(
"Ground"
),
_
(
"Inner L5
"
),
_
(
"Inner L6"
),
_
(
"Inner L7
"
),
_( "Inner L8
" ), _( "Inner L9 " ),
_( "Inner L10" ), _( "Inner L11" ),
_
(
"Inner L8
"
),
_
(
"Inner L9"
),
_
(
"Inner L10"
),
_
(
"Inner L11"
),
_
(
"Inner L12"
),
_
(
"Inner L13"
),
_
(
"Inner L14"
),
_
(
"Component"
),
_
(
"Inner L12"
),
_
(
"Inner L13"
),
_
(
"Inner L14"
),
_
(
"Component"
),
_
(
"Adhes Cop"
),
_
(
"Adhes Cmp"
),
_
(
"SoldP Cop"
),
_
(
"SoldP Cmp"
),
_
(
"Adhes Cop"
),
_
(
"Adhes Cmp"
),
_
(
"SoldP Cop"
),
_
(
"SoldP Cmp"
),
_( "SilkS Cop" ), _( "SilkS Cmp" ), _( "Mask Cop
" ), _( "Mask Cmp
" ),
_
(
"SilkS Cop"
),
_
(
"SilkS Cmp"
),
_
(
"Mask Cop
"
),
_
(
"Mask Cmp
"
),
_( "Drawings " ), _( "Comments
" ), _( "Eco1 " ), _( "Eco2
" ),
_
(
"Drawings "
),
_
(
"Comments
"
),
_
(
"Eco1"
),
_
(
"Eco2
"
),
_
(
"Edges Pcb"
),
_
(
"BAD INDEX"
),
_
(
"Edges Pcb"
),
_
(
"BAD INDEX"
),
};
};
#else
#else
...
@@ -319,22 +319,22 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
...
@@ -319,22 +319,22 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
layer_number
=
LAYER_LIMIT
;
layer_number
=
LAYER_LIMIT
;
const
wxString
*
p
=
&
layer_name_list
[
layer_number
];
const
wxString
*
p
=
&
layer_name_list
[
layer_number
];
if
(
omitSpacePadding
)
if
(
omitSpacePadding
)
{
{
wxString
ret
=
*
p
;
// copy the string
wxString
ret
=
*
p
;
// copy the string
// modify the copy
// modify the copy
ret
.
Trim
();
ret
.
Trim
();
ret
.
Replace
(
wxT
(
" "
),
wxT
(
"_"
)
);
ret
.
Replace
(
wxT
(
" "
),
wxT
(
"_"
)
);
return
ret
;
return
ret
;
}
}
else
else
return
*
p
;
return
*
p
;
#else // long standing established code:
#else // long standing established code:
static
const
wxString
layer_name_list
[]
=
{
static
const
wxString
layer_name_list
[]
=
{
_
(
"Copper "
),
_
(
"Inner L1 "
),
_
(
"Inner L2 "
),
_
(
"Inner L3 "
),
_
(
"Copper "
),
_
(
"Inner L1 "
),
_
(
"Inner L2 "
),
_
(
"Inner L3 "
),
_
(
"Inner L4 "
),
_
(
"Inner L5 "
),
_
(
"Inner L6 "
),
_
(
"Inner L7 "
),
_
(
"Inner L4 "
),
_
(
"Inner L5 "
),
_
(
"Inner L6 "
),
_
(
"Inner L7 "
),
...
@@ -346,7 +346,7 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
...
@@ -346,7 +346,7 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
_
(
"Edges Pcb"
),
_
(
"--- "
),
_
(
"--- "
),
_
(
"--- "
)
_
(
"Edges Pcb"
),
_
(
"--- "
),
_
(
"--- "
),
_
(
"--- "
)
};
};
// Same as layer_name_list, without space, not internationalized
// Same as layer_name_list, without space, not internationalized
static
const
wxString
layer_name_list_for_filename
[]
=
{
static
const
wxString
layer_name_list_for_filename
[]
=
{
wxT
(
"Copper"
),
wxT
(
"InnerL1"
),
wxT
(
"InnerL2"
),
wxT
(
"InnerL3"
),
wxT
(
"Copper"
),
wxT
(
"InnerL1"
),
wxT
(
"InnerL2"
),
wxT
(
"InnerL3"
),
...
@@ -358,16 +358,16 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
...
@@ -358,16 +358,16 @@ wxString ReturnPcbLayerName( int layer_number, bool omitSpacePadding )
wxT
(
"Drawings"
),
wxT
(
"Comments"
),
wxT
(
"Eco1"
),
wxT
(
"Eco2"
),
wxT
(
"Drawings"
),
wxT
(
"Comments"
),
wxT
(
"Eco1"
),
wxT
(
"Eco2"
),
wxT
(
"EdgesPcb"
),
wxT
(
"---"
),
wxT
(
"---"
),
wxT
(
"---"
)
wxT
(
"EdgesPcb"
),
wxT
(
"---"
),
wxT
(
"---"
),
wxT
(
"---"
)
};
};
if
(
(
unsigned
)
layer_number
>=
31u
)
if
(
(
unsigned
)
layer_number
>=
31u
)
layer_number
=
31
;
layer_number
=
31
;
return
omitSpacePadding
?
return
omitSpacePadding
?
layer_name_list_for_filename
[
layer_number
]
:
layer_name_list_for_filename
[
layer_number
]
:
layer_name_list
[
layer_number
];
layer_name_list
[
layer_number
];
#endif
#endif
}
}
...
@@ -509,6 +509,6 @@ const wxString& valeur_param( int valeur, wxString& buf_texte )
...
@@ -509,6 +509,6 @@ const wxString& valeur_param( int valeur, wxString& buf_texte )
{
{
buf_texte
.
Printf
(
wxT
(
"%2.4f
\"
"
),
valeur
*
0.0001
);
buf_texte
.
Printf
(
wxT
(
"%2.4f
\"
"
),
valeur
*
0.0001
);
}
}
return
buf_texte
;
return
buf_texte
;
}
}
common/edaappl.cpp
View file @
8eff8df9
...
@@ -118,8 +118,8 @@ void WinEDA_App::InitEDA_Appl( const wxString& name )
...
@@ -118,8 +118,8 @@ void WinEDA_App::InitEDA_Appl( const wxString& name )
/* Init kicad environment
/* Init kicad environment
* the environment variable KICAD (if exists) gives the kicad path:
* the environment variable KICAD (if exists) gives the kicad path:
* something like set KICAD=d:\kicad
* something like set KICAD=d:\kicad
*/
*/
m_Env_Defined
=
wxGetEnv
(
wxT
(
"KICAD"
),
&
m_KicadEnv
);
m_Env_Defined
=
wxGetEnv
(
wxT
(
"KICAD"
),
&
m_KicadEnv
);
if
(
m_Env_Defined
)
// ensure m_KicadEnv ends by "/"
if
(
m_Env_Defined
)
// ensure m_KicadEnv ends by "/"
{
{
...
@@ -214,7 +214,7 @@ bool WinEDA_App::SetBinDir()
...
@@ -214,7 +214,7 @@ bool WinEDA_App::SetBinDir()
if
(
str
==
NULL
)
return
false
;
if
(
str
==
NULL
)
return
false
;
char
*
native_str
=
NULL
;
char
*
native_str
=
NULL
;
int
len
=
CFStringGetMaximumSizeForEncoding
(
CFStringGetLength
(
str
),
int
len
=
CFStringGetMaximumSizeForEncoding
(
CFStringGetLength
(
str
),
kCFStringEncodingUTF8
)
+
1
;
kCFStringEncodingUTF8
)
+
1
;
native_str
=
new
char
[
len
];
native_str
=
new
char
[
len
];
CFStringGetCString
(
str
,
native_str
,
len
,
kCFStringEncodingUTF8
);
CFStringGetCString
(
str
,
native_str
,
len
,
kCFStringEncodingUTF8
);
m_BinDir
=
CONV_FROM_UTF8
(
native_str
);
m_BinDir
=
CONV_FROM_UTF8
(
native_str
);
...
@@ -222,7 +222,7 @@ bool WinEDA_App::SetBinDir()
...
@@ -222,7 +222,7 @@ bool WinEDA_App::SetBinDir()
#elif defined(__UNIX__)
#elif defined(__UNIX__)
// Under Linux, if argv[0] doesn't the complete path to the executable,
// Under Linux, if argv[0] doesn't the complete path to the executable,
// it's necessary to obtain it using "which <filename>".
// it's necessary to obtain it using "which <filename>".
FILE
*
ftmp
;
FILE
*
ftmp
;
...
@@ -270,7 +270,8 @@ void WinEDA_App::GetSettings()
...
@@ -270,7 +270,8 @@ void WinEDA_App::GetSettings()
wxString
Line
,
Ident
;
wxString
Line
,
Ident
;
unsigned
ii
;
unsigned
ii
;
m_HelpSize
.
x
=
500
;
m_HelpSize
.
y
=
400
;
m_HelpSize
.
x
=
500
;
m_HelpSize
.
y
=
400
;
if
(
m_EDA_CommonConfig
)
if
(
m_EDA_CommonConfig
)
{
{
...
@@ -285,8 +286,11 @@ void WinEDA_App::GetSettings()
...
@@ -285,8 +286,11 @@ void WinEDA_App::GetSettings()
for
(
ii
=
0
;
ii
<
10
;
ii
++
)
for
(
ii
=
0
;
ii
<
10
;
ii
++
)
{
{
Ident
=
wxT
(
"LastProject"
);
if
(
ii
)
Ident
=
wxT
(
"LastProject"
);
if
(
ii
)
Ident
<<
ii
;
Ident
<<
ii
;
if
(
m_EDA_Config
->
Read
(
Ident
,
&
Line
)
)
if
(
m_EDA_Config
->
Read
(
Ident
,
&
Line
)
)
m_LastProject
.
Add
(
Line
);
m_LastProject
.
Add
(
Line
);
}
}
...
@@ -299,6 +303,7 @@ void WinEDA_App::GetSettings()
...
@@ -299,6 +303,7 @@ void WinEDA_App::GetSettings()
Line
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontType"
),
wxEmptyString
);
Line
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontType"
),
wxEmptyString
);
if
(
!
Line
.
IsEmpty
()
)
if
(
!
Line
.
IsEmpty
()
)
g_StdFont
->
SetFaceName
(
Line
);
g_StdFont
->
SetFaceName
(
Line
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontStyle"
),
wxFONTFAMILY_ROMAN
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontStyle"
),
wxFONTFAMILY_ROMAN
);
g_StdFont
->
SetStyle
(
ii
);
g_StdFont
->
SetStyle
(
ii
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontWeight"
),
wxNORMAL
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"SdtFontWeight"
),
wxNORMAL
);
...
@@ -309,6 +314,7 @@ void WinEDA_App::GetSettings()
...
@@ -309,6 +314,7 @@ void WinEDA_App::GetSettings()
Line
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontType"
),
wxEmptyString
);
Line
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontType"
),
wxEmptyString
);
if
(
!
Line
.
IsEmpty
()
)
if
(
!
Line
.
IsEmpty
()
)
g_MsgFont
->
SetFaceName
(
Line
);
g_MsgFont
->
SetFaceName
(
Line
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontStyle"
),
wxFONTFAMILY_ROMAN
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontStyle"
),
wxFONTFAMILY_ROMAN
);
g_MsgFont
->
SetStyle
(
ii
);
g_MsgFont
->
SetStyle
(
ii
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontWeight"
),
wxNORMAL
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"MsgFontWeight"
),
wxNORMAL
);
...
@@ -318,6 +324,7 @@ void WinEDA_App::GetSettings()
...
@@ -318,6 +324,7 @@ void WinEDA_App::GetSettings()
Line
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontType"
),
wxEmptyString
);
Line
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontType"
),
wxEmptyString
);
if
(
!
Line
.
IsEmpty
()
)
if
(
!
Line
.
IsEmpty
()
)
g_DialogFont
->
SetFaceName
(
Line
);
g_DialogFont
->
SetFaceName
(
Line
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontStyle"
),
wxFONTFAMILY_ROMAN
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontStyle"
),
wxFONTFAMILY_ROMAN
);
g_DialogFont
->
SetStyle
(
ii
);
g_DialogFont
->
SetStyle
(
ii
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontWeight"
),
wxNORMAL
);
ii
=
m_EDA_Config
->
Read
(
wxT
(
"DialogFontWeight"
),
wxNORMAL
);
...
@@ -343,7 +350,6 @@ void WinEDA_App::SaveSettings()
...
@@ -343,7 +350,6 @@ void WinEDA_App::SaveSettings()
{
{
unsigned
int
ii
;
unsigned
int
ii
;
if
(
m_EDA_Config
==
NULL
)
if
(
m_EDA_Config
==
NULL
)
return
;
return
;
...
...
common/projet_config.cpp
View file @
8eff8df9
/**************************************************/
/**************************************************/
/* projet_config : routines de trace du cartouche */
/* projet_config : routines de trace du cartouche */
/**************************************************/
/**************************************************/
#include "fctsys.h"
#include "fctsys.h"
#include "gr_basic.h"
#include "gr_basic.h"
...
@@ -13,341 +13,386 @@
...
@@ -13,341 +13,386 @@
/*********************************************************************/
/*********************************************************************/
static
bool
ReCreatePrjConfig
(
const
wxString
&
local_config_filename
,
static
bool
ReCreatePrjConfig
(
const
wxString
&
local_config_filename
,
const
wxString
&
GroupName
,
bool
ForceUseLocalConfig
)
const
wxString
&
GroupName
,
bool
ForceUseLocalConfig
)
/*********************************************************************/
/*********************************************************************/
/* Cree ou recree la configuration locale de kicad (filename.pro)
/* Cree ou recree la configuration locale de kicad (filename.pro)
initialise:
*
initialise:
g_Prj_Config
*
g_Prj_Config
g_Prj_Config_LocalFilename
*
g_Prj_Config_LocalFilename
g_Prj_Default_Config_FullFilename
*
g_Prj_Default_Config_FullFilename
return:
*
return:
TRUE si config locale
*
TRUE si config locale
FALSE si default config
*
FALSE si default config
*/
*/
{
{
// free old config
// free old config
if
(
g_Prj_Config
)
delete
g_Prj_Config
;
if
(
g_Prj_Config
)
g_Prj_Config
=
NULL
;
delete
g_Prj_Config
;
g_Prj_Config
=
NULL
;
// Init local Config filename
if
(
local_config_filename
.
IsEmpty
()
)
g_Prj_Config_LocalFilename
=
wxT
(
"kicad"
);
// Init local Config filename
else
g_Prj_Config_LocalFilename
=
local_config_filename
;
if
(
local_config_filename
.
IsEmpty
()
)
g_Prj_Config_LocalFilename
=
wxT
(
"kicad"
);
ChangeFileNameExt
(
g_Prj_Config_LocalFilename
,
g_Prj_Config_Filename_ext
);
else
g_Prj_Config_LocalFilename
=
local_config_filename
;
// Init local config filename
if
(
ForceUseLocalConfig
||
wxFileExists
(
g_Prj_Config_LocalFilename
)
)
ChangeFileNameExt
(
g_Prj_Config_LocalFilename
,
g_Prj_Config_Filename_ext
);
{
g_Prj_Default_Config_FullFilename
.
Empty
();
// Init local config filename
g_Prj_Config
=
new
wxFileConfig
(
wxEmptyString
,
wxEmptyString
,
if
(
ForceUseLocalConfig
||
wxFileExists
(
g_Prj_Config_LocalFilename
)
)
g_Prj_Config_LocalFilename
,
wxEmptyString
,
{
wxCONFIG_USE_RELATIVE_PATH
);
g_Prj_Default_Config_FullFilename
.
Empty
();
g_Prj_Config
->
DontCreateOnDemand
();
g_Prj_Config
=
new
wxFileConfig
(
wxEmptyString
,
wxEmptyString
,
g_Prj_Config_LocalFilename
,
wxEmptyString
,
if
(
ForceUseLocalConfig
)
return
TRUE
;
wxCONFIG_USE_RELATIVE_PATH
);
// Test de la bonne version du fichier (ou groupe) de configuration
g_Prj_Config
->
DontCreateOnDemand
();
int
version
=
-
1
,
def_version
=
0
;
g_Prj_Config
->
SetPath
(
GroupName
);
if
(
ForceUseLocalConfig
)
version
=
g_Prj_Config
->
Read
(
wxT
(
"version"
),
def_version
);
return
TRUE
;
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
if
(
version
>
0
)
return
TRUE
;
// Test de la bonne version du fichier (ou groupe) de configuration
else
delete
g_Prj_Config
;
// Version incorrecte
int
version
=
-
1
,
def_version
=
0
;
}
g_Prj_Config
->
SetPath
(
GroupName
);
version
=
g_Prj_Config
->
Read
(
wxT
(
"version"
),
def_version
);
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
// Fichier local non trouve ou invalide
if
(
version
>
0
)
g_Prj_Config_LocalFilename
.
Empty
();
return
TRUE
;
g_Prj_Default_Config_FullFilename
=
else
ReturnKicadDatasPath
()
+
delete
g_Prj_Config
;
// Version incorrecte
wxT
(
"template/kicad"
)
+
}
g_Prj_Config_Filename_ext
;
// Recreate new config
// Fichier local non trouve ou invalide
g_Prj_Config
=
new
wxFileConfig
(
wxEmptyString
,
wxEmptyString
,
g_Prj_Config_LocalFilename
.
Empty
();
wxEmptyString
,
g_Prj_Default_Config_FullFilename
,
g_Prj_Default_Config_FullFilename
=
wxCONFIG_USE_RELATIVE_PATH
);
ReturnKicadDatasPath
()
+
g_Prj_Config
->
DontCreateOnDemand
();
wxT
(
"template/kicad"
)
+
g_Prj_Config_Filename_ext
;
return
FALSE
;
// Recreate new config
g_Prj_Config
=
new
wxFileConfig
(
wxEmptyString
,
wxEmptyString
,
wxEmptyString
,
g_Prj_Default_Config_FullFilename
,
wxCONFIG_USE_RELATIVE_PATH
);
g_Prj_Config
->
DontCreateOnDemand
();
return
FALSE
;
}
}
/***************************************************************************************/
/***************************************************************************************/
void
WinEDA_App
::
WriteProjectConfig
(
const
wxString
&
local_config_filename
,
void
WinEDA_App
::
WriteProjectConfig
(
const
wxString
&
local_config_filename
,
const
wxString
&
GroupName
,
PARAM_CFG_BASE
**
List
)
const
wxString
&
GroupName
,
PARAM_CFG_BASE
**
List
)
/***************************************************************************************/
/***************************************************************************************/
/* enregistrement de la config "projet"*/
/* enregistrement de la config "projet"*/
{
{
const
PARAM_CFG_BASE
*
pt_cfg
;
const
PARAM_CFG_BASE
*
pt_cfg
;
wxString
msg
;
wxString
msg
;
ReCreatePrjConfig
(
local_config_filename
,
GroupName
,
ReCreatePrjConfig
(
local_config_filename
,
GroupName
,
FORCE_LOCAL_CONFIG
);
FORCE_LOCAL_CONFIG
);
/* Write date ( surtout pour eviter bug de wxFileConfig
qui se trompe de rubrique si declaration [xx] en premiere ligne
/* Write date ( surtout pour eviter bug de wxFileConfig
(en fait si groupe vide) */
* qui se trompe de rubrique si declaration [xx] en premiere ligne
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
* (en fait si groupe vide) */
msg
=
DateAndTime
();
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
g_Prj_Config
->
Write
(
wxT
(
"update"
),
msg
);
msg
=
DateAndTime
();
msg
=
GetAppName
();
g_Prj_Config
->
Write
(
wxT
(
"last_client"
),
msg
);
g_Prj_Config
->
Write
(
wxT
(
"update"
),
msg
);
msg
=
GetAppName
();
/* ecriture de la configuration */
g_Prj_Config
->
DeleteGroup
(
GroupName
);
// Erase all datas
g_Prj_Config
->
Write
(
wxT
(
"last_client"
),
msg
);
g_Prj_Config
->
Flush
();
/* ecriture de la configuration */
g_Prj_Config
->
SetPath
(
GroupName
);
g_Prj_Config
->
DeleteGroup
(
GroupName
);
// Erase all datas
g_Prj_Config
->
Write
(
wxT
(
"version"
),
CONFIG_VERSION
);
g_Prj_Config
->
Flush
();
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
g_Prj_Config
->
SetPath
(
GroupName
);
for
(
;
*
List
!=
NULL
;
List
++
)
g_Prj_Config
->
Write
(
wxT
(
"version"
),
CONFIG_VERSION
);
{
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
pt_cfg
=
*
List
;
if
(
pt_cfg
->
m_Group
)
g_Prj_Config
->
SetPath
(
pt_cfg
->
m_Group
);
for
(
;
*
List
!=
NULL
;
List
++
)
else
g_Prj_Config
->
SetPath
(
GroupName
);
{
pt_cfg
=
*
List
;
switch
(
pt_cfg
->
m_Type
)
if
(
pt_cfg
->
m_Group
)
{
g_Prj_Config
->
SetPath
(
pt_cfg
->
m_Group
);
case
PARAM_INT
:
else
#undef PTCFG
g_Prj_Config
->
SetPath
(
GroupName
);
#define PTCFG ((PARAM_CFG_INT *)pt_cfg)
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
switch
(
pt_cfg
->
m_Type
)
if
(
pt_cfg
->
m_Setup
)
{
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
case
PARAM_INT
:
else
#undef PTCFG
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
#define PTCFG ( (PARAM_CFG_INT*) pt_cfg )
break
;
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
case
PARAM_SETCOLOR
:
#undef PTCFG
if
(
pt_cfg
->
m_Setup
)
#define PTCFG ((PARAM_CFG_SETCOLOR *)pt_cfg)
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
else
if
(
pt_cfg
->
m_Setup
)
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
break
;
else
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
case
PARAM_SETCOLOR
:
break
;
#undef PTCFG
#define PTCFG ( (PARAM_CFG_SETCOLOR*) pt_cfg )
case
PARAM_DOUBLE
:
if
(
PTCFG
->
m_Pt_param
==
NULL
)
#undef PTCFG
break
;
#define PTCFG ((PARAM_CFG_DOUBLE *)pt_cfg)
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
if
(
pt_cfg
->
m_Setup
)
if
(
pt_cfg
->
m_Setup
)
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
else
else
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
break
;
break
;
case
PARAM_DOUBLE
:
case
PARAM_BOOL
:
#undef PTCFG
#undef PTCFG
#define PTCFG ( (PARAM_CFG_DOUBLE*) pt_cfg )
#define PTCFG ((PARAM_CFG_BOOL *)pt_cfg)
if
(
PTCFG
->
m_Pt_param
==
NULL
)
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
break
;
if
(
pt_cfg
->
m_Setup
)
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
(
int
)
*
PTCFG
->
m_Pt_param
);
if
(
pt_cfg
->
m_Setup
)
else
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
(
int
)
*
PTCFG
->
m_Pt_param
);
else
break
;
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
break
;
case
PARAM_WXSTRING
:
#undef PTCFG
case
PARAM_BOOL
:
#define PTCFG ((PARAM_CFG_WXSTRING *)pt_cfg)
#undef PTCFG
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
#define PTCFG ( (PARAM_CFG_BOOL*) pt_cfg )
if
(
pt_cfg
->
m_Setup
)
if
(
PTCFG
->
m_Pt_param
==
NULL
)
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
break
;
else
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
if
(
pt_cfg
->
m_Setup
)
break
;
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
(
int
)
*
PTCFG
->
m_Pt_param
);
else
case
PARAM_LIBNAME_LIST
:
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
(
int
)
*
PTCFG
->
m_Pt_param
);
{
break
;
#undef PTCFG
#define PTCFG ((PARAM_CFG_LIBNAME_LIST *)pt_cfg)
case
PARAM_WXSTRING
:
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
#undef PTCFG
wxArrayString
*
libname_list
=
PTCFG
->
m_Pt_param
;
#define PTCFG ( (PARAM_CFG_WXSTRING*) pt_cfg )
if
(
libname_list
==
NULL
)
break
;
if
(
PTCFG
->
m_Pt_param
==
NULL
)
unsigned
indexlib
=
0
;
break
;
wxString
cle_config
;
for
(
;
indexlib
<
libname_list
->
GetCount
();
indexlib
++
)
if
(
pt_cfg
->
m_Setup
)
{
m_EDA_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
cle_config
=
pt_cfg
->
m_Ident
;
else
// We use indexlib+1 because first lib name is LibName1
g_Prj_Config
->
Write
(
pt_cfg
->
m_Ident
,
*
PTCFG
->
m_Pt_param
);
cle_config
<<
(
indexlib
+
1
);
break
;
g_Prj_Config
->
Write
(
cle_config
,
libname_list
->
Item
(
indexlib
));
}
case
PARAM_LIBNAME_LIST
:
break
;
{
}
#undef PTCFG
#define PTCFG ( (PARAM_CFG_LIBNAME_LIST*) pt_cfg )
case
PARAM_COMMAND_ERASE
:
// Erase all datas
if
(
PTCFG
->
m_Pt_param
==
NULL
)
if
(
pt_cfg
->
m_Ident
)
break
;
{
m_EDA_Config
->
DeleteGroup
(
pt_cfg
->
m_Ident
);
wxArrayString
*
libname_list
=
PTCFG
->
m_Pt_param
;
g_Prj_Config
->
DeleteGroup
(
pt_cfg
->
m_Ident
);
if
(
libname_list
==
NULL
)
}
break
;
break
;
}
unsigned
indexlib
=
0
;
}
wxString
cle_config
;
for
(
;
indexlib
<
libname_list
->
GetCount
();
indexlib
++
)
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
{
delete
g_Prj_Config
;
cle_config
=
pt_cfg
->
m_Ident
;
g_Prj_Config
=
NULL
;
// We use indexlib+1 because first lib name is LibName1
cle_config
<<
(
indexlib
+
1
);
g_Prj_Config
->
Write
(
cle_config
,
libname_list
->
Item
(
indexlib
)
);
}
break
;
}
case
PARAM_COMMAND_ERASE
:
// Erase all datas
if
(
pt_cfg
->
m_Ident
)
{
m_EDA_Config
->
DeleteGroup
(
pt_cfg
->
m_Ident
);
g_Prj_Config
->
DeleteGroup
(
pt_cfg
->
m_Ident
);
}
break
;
}
}
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
delete
g_Prj_Config
;
g_Prj_Config
=
NULL
;
}
}
/***************************************************************************************/
/***************************************************************************************/
bool
WinEDA_App
::
ReadProjectConfig
(
const
wxString
&
local_config_filename
,
bool
WinEDA_App
::
ReadProjectConfig
(
const
wxString
&
local_config_filename
,
const
wxString
&
GroupName
,
PARAM_CFG_BASE
**
List
,
const
wxString
&
GroupName
,
PARAM_CFG_BASE
**
List
,
bool
Load_Only_if_New
)
bool
Load_Only_if_New
)
/***************************************************************************************/
/***************************************************************************************/
/* Lecture de la config "projet"
/* Lecture de la config "projet"
*** si Load_Only_if_New == TRUE, elle n'est lue que si elle
*** si Load_Only_if_New == TRUE, elle n'est lue que si elle
*** est differente de la config actuelle (dates differentes)
*** est differente de la config actuelle (dates differentes)
*
return:
*
return:
TRUE si lue.
*
TRUE si lue.
Met a jour en plus:
*
Met a jour en plus:
g_EDA_Appl->m_CurrentOptionFileDateAndTime
*
g_EDA_Appl->m_CurrentOptionFileDateAndTime
g_EDA_Appl->m_CurrentOptionFile
*
g_EDA_Appl->m_CurrentOptionFile
*/
*/
{
{
const
PARAM_CFG_BASE
*
pt_cfg
;
const
PARAM_CFG_BASE
*
pt_cfg
;
wxString
timestamp
;
wxString
timestamp
;
if
(
List
==
NULL
)
return
FALSE
;
if
(
List
==
NULL
)
return
FALSE
;
ReCreatePrjConfig
(
local_config_filename
,
GroupName
,
FALSE
);
ReCreatePrjConfig
(
local_config_filename
,
GroupName
,
FALSE
);
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
timestamp
=
g_Prj_Config
->
Read
(
wxT
(
"update"
)
);
g_Prj_Config
->
SetPath
(
UNIX_STRING_DIR_SEP
);
if
(
Load_Only_if_New
&&
(
!
timestamp
.
IsEmpty
()
)
&&
timestamp
=
g_Prj_Config
->
Read
(
wxT
(
"update"
)
);
(
timestamp
==
g_EDA_Appl
->
m_CurrentOptionFileDateAndTime
)
)
if
(
Load_Only_if_New
&&
(
!
timestamp
.
IsEmpty
()
)
{
&&
(
timestamp
==
g_EDA_Appl
->
m_CurrentOptionFileDateAndTime
)
)
return
FALSE
;
{
}
return
FALSE
;
}
g_EDA_Appl
->
m_CurrentOptionFileDateAndTime
=
timestamp
;
g_EDA_Appl
->
m_CurrentOptionFileDateAndTime
=
timestamp
;
if
(
!
g_Prj_Default_Config_FullFilename
.
IsEmpty
()
)
g_EDA_Appl
->
m_CurrentOptionFile
=
g_Prj_Default_Config_FullFilename
;
if
(
!
g_Prj_Default_Config_FullFilename
.
IsEmpty
()
)
else
g_EDA_Appl
->
m_CurrentOptionFile
=
g_Prj_Default_Config_FullFilename
;
{
else
if
(
wxPathOnly
(
g_Prj_Config_LocalFilename
).
IsEmpty
()
)
{
g_EDA_Appl
->
m_CurrentOptionFile
=
if
(
wxPathOnly
(
g_Prj_Config_LocalFilename
).
IsEmpty
()
)
wxGetCwd
()
+
STRING_DIR_SEP
+
g_Prj_Config_LocalFilename
;
g_EDA_Appl
->
m_CurrentOptionFile
=
else
wxGetCwd
()
+
STRING_DIR_SEP
+
g_Prj_Config_LocalFilename
;
g_EDA_Appl
->
m_CurrentOptionFile
=
g_Prj_Config_LocalFilename
;
else
}
g_EDA_Appl
->
m_CurrentOptionFile
=
g_Prj_Config_LocalFilename
;
}
for
(
;
*
List
!=
NULL
;
List
++
)
{
for
(
;
*
List
!=
NULL
;
List
++
)
pt_cfg
=
*
List
;
{
if
(
pt_cfg
->
m_Group
)
g_Prj_Config
->
SetPath
(
pt_cfg
->
m_Group
);
pt_cfg
=
*
List
;
else
g_Prj_Config
->
SetPath
(
GroupName
);
if
(
pt_cfg
->
m_Group
)
switch
(
pt_cfg
->
m_Type
)
g_Prj_Config
->
SetPath
(
pt_cfg
->
m_Group
);
{
else
case
PARAM_INT
:
g_Prj_Config
->
SetPath
(
GroupName
);
{
#undef PTCFG
switch
(
pt_cfg
->
m_Type
)
#define PTCFG ((PARAM_CFG_INT *)pt_cfg)
{
int
itmp
;
case
PARAM_INT
:
if
(
pt_cfg
->
m_Setup
)
{
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
#undef PTCFG
else
#define PTCFG ( (PARAM_CFG_INT*) pt_cfg )
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
int
itmp
;
if
(
(
itmp
<
PTCFG
->
m_Min
)
||
(
itmp
>
PTCFG
->
m_Max
)
)
if
(
pt_cfg
->
m_Setup
)
itmp
=
PTCFG
->
m_Default
;
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
*
PTCFG
->
m_Pt_param
=
itmp
;
else
break
;
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
}
if
(
(
itmp
<
PTCFG
->
m_Min
)
||
(
itmp
>
PTCFG
->
m_Max
)
)
case
PARAM_SETCOLOR
:
itmp
=
PTCFG
->
m_Default
;
{
#undef PTCFG
*
PTCFG
->
m_Pt_param
=
itmp
;
#define PTCFG ((PARAM_CFG_SETCOLOR *)pt_cfg)
break
;
int
itmp
;
}
if
(
pt_cfg
->
m_Setup
)
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
case
PARAM_SETCOLOR
:
else
{
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
#undef PTCFG
if
(
(
itmp
<
0
)
||
(
itmp
>
MAX_COLOR
)
)
#define PTCFG ( (PARAM_CFG_SETCOLOR*) pt_cfg )
itmp
=
PTCFG
->
m_Default
;
int
itmp
;
*
PTCFG
->
m_Pt_param
=
itmp
;
if
(
pt_cfg
->
m_Setup
)
break
;
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
}
else
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
case
PARAM_DOUBLE
:
{
if
(
(
itmp
<
0
)
||
(
itmp
>
MAX_COLOR
)
)
#undef PTCFG
itmp
=
PTCFG
->
m_Default
;
#define PTCFG ((PARAM_CFG_DOUBLE *)pt_cfg)
double
ftmp
=
0
;
wxString
msg
;
*
PTCFG
->
m_Pt_param
=
itmp
;
if
(
pt_cfg
->
m_Setup
)
break
;
msg
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
wxT
(
""
)
);
}
else
msg
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
wxT
(
""
)
);
case
PARAM_DOUBLE
:
{
if
(
msg
.
IsEmpty
()
)
ftmp
=
PTCFG
->
m_Default
;
#undef PTCFG
else
#define PTCFG ( (PARAM_CFG_DOUBLE*) pt_cfg )
{
double
ftmp
=
0
;
wxString
msg
;
msg
.
ToDouble
(
&
ftmp
);
if
(
pt_cfg
->
m_Setup
)
if
(
(
ftmp
<
PTCFG
->
m_Min
)
||
(
ftmp
>
PTCFG
->
m_Max
)
)
msg
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
wxT
(
""
)
);
ftmp
=
PTCFG
->
m_Default
;
else
}
msg
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
wxT
(
""
)
);
*
PTCFG
->
m_Pt_param
=
ftmp
;
break
;
if
(
msg
.
IsEmpty
()
)
}
ftmp
=
PTCFG
->
m_Default
;
else
case
PARAM_BOOL
:
{
{
msg
.
ToDouble
(
&
ftmp
);
#undef PTCFG
if
(
(
ftmp
<
PTCFG
->
m_Min
)
||
(
ftmp
>
PTCFG
->
m_Max
)
)
#define PTCFG ((PARAM_CFG_BOOL *)pt_cfg)
ftmp
=
PTCFG
->
m_Default
;
int
itmp
;
}
if
(
pt_cfg
->
m_Setup
)
*
PTCFG
->
m_Pt_param
=
ftmp
;
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
break
;
else
}
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
*
PTCFG
->
m_Pt_param
=
itmp
?
TRUE
:
FALSE
;
case
PARAM_BOOL
:
break
;
{
}
#undef PTCFG
#define PTCFG ( (PARAM_CFG_BOOL*) pt_cfg )
case
PARAM_WXSTRING
:
int
itmp
;
{
if
(
pt_cfg
->
m_Setup
)
#undef PTCFG
itmp
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
#define PTCFG ((PARAM_CFG_WXSTRING *)pt_cfg)
else
if
(
PTCFG
->
m_Pt_param
==
NULL
)
break
;
itmp
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
,
PTCFG
->
m_Default
);
if
(
pt_cfg
->
m_Setup
)
*
PTCFG
->
m_Pt_param
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
);
*
PTCFG
->
m_Pt_param
=
itmp
?
TRUE
:
FALSE
;
else
break
;
*
PTCFG
->
m_Pt_param
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
);
}
break
;
}
case
PARAM_WXSTRING
:
{
case
PARAM_LIBNAME_LIST
:
#undef PTCFG
{
#define PTCFG ( (PARAM_CFG_WXSTRING*) pt_cfg )
#undef PTCFG
if
(
PTCFG
->
m_Pt_param
==
NULL
)
#define PTCFG ((PARAM_CFG_LIBNAME_LIST *)pt_cfg)
break
;
int
indexlib
=
1
;
// We start indexlib to 1 because first lib name is LibName1
wxString
libname
,
id_lib
;
if
(
pt_cfg
->
m_Setup
)
wxArrayString
*
libname_list
=
PTCFG
->
m_Pt_param
;
*
PTCFG
->
m_Pt_param
=
m_EDA_Config
->
Read
(
pt_cfg
->
m_Ident
);
while
(
1
)
else
{
*
PTCFG
->
m_Pt_param
=
g_Prj_Config
->
Read
(
pt_cfg
->
m_Ident
);
id_lib
=
pt_cfg
->
m_Ident
;
id_lib
<<
indexlib
;
indexlib
++
;
break
;
libname
=
g_Prj_Config
->
Read
(
id_lib
,
wxT
(
""
)
);
}
if
(
libname
.
IsEmpty
()
)
break
;
libname_list
->
Add
(
libname
);
case
PARAM_LIBNAME_LIST
:
}
{
break
;
#undef PTCFG
}
#define PTCFG ( (PARAM_CFG_LIBNAME_LIST*) pt_cfg )
int
indexlib
=
1
;
// We start indexlib to 1 because first lib name is LibName1
case
PARAM_COMMAND_ERASE
:
wxString
libname
,
id_lib
;
break
;
wxArrayString
*
libname_list
=
PTCFG
->
m_Pt_param
;
}
while
(
1
)
}
{
id_lib
=
pt_cfg
->
m_Ident
;
id_lib
<<
indexlib
;
indexlib
++
;
delete
g_Prj_Config
;
libname
=
g_Prj_Config
->
Read
(
id_lib
,
wxT
(
""
)
);
g_Prj_Config
=
NULL
;
if
(
libname
.
IsEmpty
()
)
break
;
return
TRUE
;
libname_list
->
Add
(
libname
);
}
break
;
}
case
PARAM_COMMAND_ERASE
:
break
;
}
}
delete
g_Prj_Config
;
g_Prj_Config
=
NULL
;
return
TRUE
;
}
}
...
@@ -355,114 +400,124 @@ wxString timestamp;
...
@@ -355,114 +400,124 @@ wxString timestamp;
/* Constructeurs des descripteurs de structs de configuration */
/* Constructeurs des descripteurs de structs de configuration */
/**************************************************************/
/**************************************************************/
PARAM_CFG_BASE
::
PARAM_CFG_BASE
(
const
wxChar
*
ident
,
const
paramcfg_id
type
,
PARAM_CFG_BASE
::
PARAM_CFG_BASE
(
const
wxChar
*
ident
,
const
paramcfg_id
type
,
const
wxChar
*
group
)
const
wxChar
*
group
)
{
{
m_Ident
=
ident
;
m_Ident
=
ident
;
m_Type
=
type
;
m_Type
=
type
;
m_Group
=
group
;
m_Group
=
group
;
m_Setup
=
FALSE
;
m_Setup
=
FALSE
;
}
}
PARAM_CFG_INT
::
PARAM_CFG_INT
(
const
wxChar
*
ident
,
int
*
ptparam
,
PARAM_CFG_INT
::
PARAM_CFG_INT
(
const
wxChar
*
ident
,
int
*
ptparam
,
int
default_val
,
int
min
,
int
max
,
int
default_val
,
int
min
,
int
max
,
const
wxChar
*
group
)
const
wxChar
*
group
)
:
:
PARAM_CFG_BASE
(
ident
,
PARAM_INT
,
group
)
PARAM_CFG_BASE
(
ident
,
PARAM_INT
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
m_Min
=
min
;
m_Min
=
min
;
m_Max
=
max
;
m_Max
=
max
;
}
}
PARAM_CFG_INT
::
PARAM_CFG_INT
(
bool
Insetup
,
const
wxChar
*
ident
,
int
*
ptparam
,
int
default_val
,
int
min
,
int
max
,
PARAM_CFG_INT
::
PARAM_CFG_INT
(
bool
Insetup
,
const
wxChar
*
ident
,
int
*
ptparam
,
const
wxChar
*
group
)
int
default_val
,
int
min
,
int
max
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_INT
,
group
)
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_INT
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
m_Min
=
min
;
m_Min
=
min
;
m_Max
=
max
;
m_Max
=
max
;
m_Setup
=
Insetup
;
m_Setup
=
Insetup
;
}
}
PARAM_CFG_SETCOLOR
::
PARAM_CFG_SETCOLOR
(
const
wxChar
*
ident
,
int
*
ptparam
,
int
default_val
,
const
wxChar
*
group
)
PARAM_CFG_SETCOLOR
::
PARAM_CFG_SETCOLOR
(
const
wxChar
*
ident
,
int
*
ptparam
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_SETCOLOR
,
group
)
int
default_val
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_SETCOLOR
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
}
}
PARAM_CFG_SETCOLOR
::
PARAM_CFG_SETCOLOR
(
bool
Insetup
,
const
wxChar
*
ident
,
int
*
ptparam
,
int
default_val
,
const
wxChar
*
group
)
PARAM_CFG_SETCOLOR
::
PARAM_CFG_SETCOLOR
(
bool
Insetup
,
const
wxChar
*
ident
,
int
*
ptparam
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_SETCOLOR
,
group
)
int
default_val
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_SETCOLOR
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
m_Setup
=
Insetup
;
m_Setup
=
Insetup
;
}
}
PARAM_CFG_DOUBLE
::
PARAM_CFG_DOUBLE
(
const
wxChar
*
ident
,
double
*
ptparam
,
double
default_val
,
double
min
,
double
max
,
PARAM_CFG_DOUBLE
::
PARAM_CFG_DOUBLE
(
const
wxChar
*
ident
,
double
*
ptparam
,
const
wxChar
*
group
)
double
default_val
,
double
min
,
double
max
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_DOUBLE
,
group
)
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_DOUBLE
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
m_Min
=
min
;
m_Min
=
min
;
m_Max
=
max
;
m_Max
=
max
;
}
}
PARAM_CFG_DOUBLE
::
PARAM_CFG_DOUBLE
(
bool
Insetup
,
const
wxChar
*
ident
,
double
*
ptparam
,
double
default_val
,
double
min
,
double
max
,
const
wxChar
*
group
)
PARAM_CFG_DOUBLE
::
PARAM_CFG_DOUBLE
(
bool
Insetup
,
const
wxChar
*
ident
,
double
*
ptparam
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_DOUBLE
,
group
)
double
default_val
,
double
min
,
double
max
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_DOUBLE
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
;
m_Default
=
default_val
;
m_Min
=
min
;
m_Min
=
min
;
m_Max
=
max
;
m_Max
=
max
;
m_Setup
=
Insetup
;
m_Setup
=
Insetup
;
}
}
PARAM_CFG_BOOL
::
PARAM_CFG_BOOL
(
const
wxChar
*
ident
,
bool
*
ptparam
,
int
default_val
,
const
wxChar
*
group
)
PARAM_CFG_BOOL
::
PARAM_CFG_BOOL
(
const
wxChar
*
ident
,
bool
*
ptparam
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_BOOL
,
group
)
int
default_val
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_BOOL
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
?
TRUE
:
FALSE
;
m_Default
=
default_val
?
TRUE
:
FALSE
;
}
}
PARAM_CFG_BOOL
::
PARAM_CFG_BOOL
(
bool
Insetup
,
const
wxChar
*
ident
,
bool
*
ptparam
,
int
default_val
,
const
wxChar
*
group
)
PARAM_CFG_BOOL
::
PARAM_CFG_BOOL
(
bool
Insetup
,
const
wxChar
*
ident
,
bool
*
ptparam
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_BOOL
,
group
)
int
default_val
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_BOOL
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Default
=
default_val
?
TRUE
:
FALSE
;
m_Default
=
default_val
?
TRUE
:
FALSE
;
m_Setup
=
Insetup
;
m_Setup
=
Insetup
;
}
}
PARAM_CFG_WXSTRING
::
PARAM_CFG_WXSTRING
(
const
wxChar
*
ident
,
wxString
*
ptparam
,
const
wxChar
*
group
)
PARAM_CFG_WXSTRING
::
PARAM_CFG_WXSTRING
(
const
wxChar
*
ident
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_WXSTRING
,
group
)
wxString
*
ptparam
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_WXSTRING
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
}
}
PARAM_CFG_WXSTRING
::
PARAM_CFG_WXSTRING
(
bool
Insetup
,
const
wxChar
*
ident
,
wxString
*
ptparam
,
const
wxChar
*
group
)
PARAM_CFG_WXSTRING
::
PARAM_CFG_WXSTRING
(
bool
Insetup
,
const
wxChar
*
ident
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_WXSTRING
,
group
)
wxString
*
ptparam
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_WXSTRING
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
m_Setup
=
Insetup
;
m_Setup
=
Insetup
;
}
}
PARAM_CFG_LIBNAME_LIST
::
PARAM_CFG_LIBNAME_LIST
(
const
wxChar
*
ident
,
wxArrayString
*
ptparam
,
const
wxChar
*
group
)
PARAM_CFG_LIBNAME_LIST
::
PARAM_CFG_LIBNAME_LIST
(
const
wxChar
*
ident
,
:
PARAM_CFG_BASE
(
ident
,
PARAM_LIBNAME_LIST
,
group
)
wxArrayString
*
ptparam
,
const
wxChar
*
group
)
:
PARAM_CFG_BASE
(
ident
,
PARAM_LIBNAME_LIST
,
group
)
{
{
m_Pt_param
=
ptparam
;
m_Pt_param
=
ptparam
;
}
}
pcbnew/pcbcfg.cpp
View file @
8eff8df9
/***********************************/
/***********************************/
/** pcbcfg() : configuration **/
/** pcbcfg() : configuration **/
/***********************************/
/***********************************/
/* lit ou met a jour la configuration de PCBNEW */
/* lit ou met a jour la configuration de PCBNEW */
...
@@ -21,193 +21,200 @@
...
@@ -21,193 +21,200 @@
/* Variables locales */
/* Variables locales */
#define HOTKEY_FILENAME wxT(
"pcbnew"
)
#define HOTKEY_FILENAME wxT(
"pcbnew"
)
/***********************************************************/
/***********************************************************/
void
WinEDA_PcbFrame
::
Process_Config
(
wxCommandEvent
&
event
)
void
WinEDA_PcbFrame
::
Process_Config
(
wxCommandEvent
&
event
)
/***********************************************************/
/***********************************************************/
{
{
int
id
=
event
.
GetId
();
int
id
=
event
.
GetId
();
wxPoint
pos
;
wxPoint
pos
;
wxClientDC
dc
(
DrawPanel
);
wxString
FullFileName
;
wxClientDC
dc
(
DrawPanel
);
DrawPanel
->
PrepareGraphicContext
(
&
dc
);
wxString
FullFileName
;
pos
=
GetPosition
();
DrawPanel
->
PrepareGraphicContext
(
&
dc
);
pos
.
x
+=
20
;
pos
.
y
+=
20
;
pos
=
GetPosition
();
switch
(
id
)
pos
.
x
+=
20
;
{
pos
.
y
+=
20
;
case
ID_COLORS_SETUP
:
DisplayColorSetupFrame
(
this
,
pos
);
switch
(
id
)
break
;
{
case
ID_COLORS_SETUP
:
case
ID_CONFIG_REQ
:
// Creation de la fenetre de configuration
DisplayColorSetupFrame
(
this
,
pos
);
InstallConfigFrame
(
pos
);
break
;
break
;
case
ID_CONFIG_REQ
:
// Creation de la fenetre de configuration
case
ID_PCB_TRACK_SIZE_SETUP
:
InstallConfigFrame
(
pos
);
case
ID_PCB_LOOK_SETUP
:
break
;
case
ID_OPTIONS_SETUP
:
case
ID_PCB_DRAWINGS_WIDTHS_SETUP
:
case
ID_PCB_TRACK_SIZE_SETUP
:
InstallPcbOptionsFrame
(
pos
,
&
dc
,
id
);
case
ID_PCB_LOOK_SETUP
:
break
;
case
ID_OPTIONS_SETUP
:
case
ID_PCB_DRAWINGS_WIDTHS_SETUP
:
case
ID_PCB_PAD_SETUP
:
InstallPcbOptionsFrame
(
pos
,
&
dc
,
id
);
InstallPadOptionsFrame
(
NULL
,
NULL
,
pos
);
break
;
break
;
case
ID_PCB_PAD_SETUP
:
case
ID_CONFIG_SAVE
:
InstallPadOptionsFrame
(
NULL
,
NULL
,
pos
);
Update_config
(
this
);
break
;
break
;
case
ID_CONFIG_SAVE
:
case
ID_CONFIG_READ
:
Update_config
(
this
);
FullFileName
=
GetScreen
()
->
m_FileName
.
AfterLast
(
'/'
);
break
;
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
FullFileName
=
EDA_FileSelector
(
_
(
"Read config file"
),
case
ID_CONFIG_READ
:
wxPathOnly
(
GetScreen
()
->
m_FileName
),
/* Chemin par defaut */
FullFileName
=
GetScreen
()
->
m_FileName
.
AfterLast
(
'/'
);
FullFileName
,
/* nom fichier par defaut */
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
g_Prj_Config_Filename_ext
,
/* extension par defaut */
FullFileName
=
EDA_FileSelector
(
_
(
"Read config file"
),
FullFileName
,
/* Masque d'affichage */
wxPathOnly
(
GetScreen
()
->
m_FileName
),
/* Chemin par defaut */
this
,
FullFileName
,
/* nom fichier par defaut */
wxFD_OPEN
,
g_Prj_Config_Filename_ext
,
/* extension par defaut */
TRUE
/* ne change pas de repertoire courant */
FullFileName
,
/* Masque d'affichage */
);
this
,
if
(
FullFileName
.
IsEmpty
())
break
;
wxFD_OPEN
,
if
(
!
wxFileExists
(
FullFileName
)
)
TRUE
/* ne change pas de repertoire courant */
{
);
wxString
msg
;
if
(
FullFileName
.
IsEmpty
()
)
msg
.
Printf
(
_
(
"File %s not found"
),
FullFileName
.
GetData
());
break
;
DisplayError
(
this
,
msg
);
break
;
if
(
!
wxFileExists
(
FullFileName
)
)
}
{
Read_Config
(
FullFileName
);
wxString
msg
;
break
;
msg
.
Printf
(
_
(
"File %s not found"
),
FullFileName
.
GetData
()
);
DisplayError
(
this
,
msg
);
break
;
case
ID_PREFERENCES_CREATE_CONFIG_HOTKEYS
:
}
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
Read_Config
(
FullFileName
);
FullFileName
+=
HOTKEY_FILENAME
;
break
;
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
WriteHotkeyConfigFile
(
FullFileName
,
s_Pcbnew_Editor_Hokeys_Descr
,
true
);
case
ID_PREFERENCES_CREATE_CONFIG_HOTKEYS
:
break
;
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
FullFileName
+=
HOTKEY_FILENAME
;
case
ID_PREFERENCES_READ_CONFIG_HOTKEYS
:
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
Read_Hotkey_Config
(
this
,
true
);
WriteHotkeyConfigFile
(
FullFileName
,
s_Pcbnew_Editor_Hokeys_Descr
,
true
);
break
;
break
;
case
ID_PREFERENCES_EDIT_CONFIG_HOTKEYS
:
case
ID_PREFERENCES_READ_CONFIG_HOTKEYS
:
{
Read_Hotkey_Config
(
this
,
true
);
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
break
;
FullFileName
+=
HOTKEY_FILENAME
;
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
case
ID_PREFERENCES_EDIT_CONFIG_HOTKEYS
:
wxString
editorname
=
GetEditorName
();
{
if
(
!
editorname
.
IsEmpty
()
)
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
ExecuteFile
(
this
,
editorname
,
FullFileName
);
FullFileName
+=
HOTKEY_FILENAME
;
break
;
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
}
wxString
editorname
=
GetEditorName
();
if
(
!
editorname
.
IsEmpty
()
)
case
ID_PREFERENCES_HOTKEY_PATH_IS_HOME
:
ExecuteFile
(
this
,
editorname
,
FullFileName
);
case
ID_PREFERENCES_HOTKEY_PATH_IS_KICAD
:
break
;
HandleHotkeyConfigMenuSelection
(
this
,
id
);
}
break
;
case
ID_PREFERENCES_HOTKEY_PATH_IS_HOME
:
case
ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST
:
// Display Current hotkey list for eeschema
case
ID_PREFERENCES_HOTKEY_PATH_IS_KICAD
:
DisplayHotkeyList
(
this
,
s_Board_Editor_Hokeys_Descr
);
HandleHotkeyConfigMenuSelection
(
this
,
id
);
break
;
break
;
default
:
case
ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST
:
// Display Current hotkey list for eeschema
DisplayError
(
this
,
wxT
(
"WinEDA_PcbFrame::Process_Config internal error"
));
DisplayHotkeyList
(
this
,
s_Board_Editor_Hokeys_Descr
);
}
break
;
default
:
DisplayError
(
this
,
wxT
(
"WinEDA_PcbFrame::Process_Config internal error"
)
);
}
}
}
/***************************************************************/
/***************************************************************/
bool
Read_Hotkey_Config
(
WinEDA_DrawFrame
*
frame
,
bool
verbose
)
bool
Read_Hotkey_Config
(
WinEDA_DrawFrame
*
frame
,
bool
verbose
)
/***************************************************************/
/***************************************************************/
/*
/*
* Read the hotkey files config for pcbnew and module_edit
* Read the hotkey files config for pcbnew and module_edit
*/
*/
{
{
wxString
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
wxString
FullFileName
=
ReturnHotkeyConfigFilePath
(
g_ConfigFileLocationChoice
);
FullFileName
+=
HOTKEY_FILENAME
;
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
FullFileName
+=
HOTKEY_FILENAME
;
return
frame
->
ReadHotkeyConfigFile
(
FullFileName
,
s_Pcbnew_Editor_Hokeys_Descr
,
verbose
);
FullFileName
+=
DEFAULT_HOTKEY_FILENAME_EXT
;
return
frame
->
ReadHotkeyConfigFile
(
FullFileName
,
s_Pcbnew_Editor_Hokeys_Descr
,
verbose
);
}
}
/**************************************************************************/
/**************************************************************************/
bool
Read_Config
(
const
wxString
&
project_name
)
bool
Read_Config
(
const
wxString
&
project_name
)
/*************************************************************************/
/*************************************************************************/
/* lit la configuration, si elle n'a pas deja ete lue
1 - lit <nom fichier brd>.pro
2 - si non trouve lit <chemin de *.exe>/kicad.pro
3 - si non trouve: init des variables aux valeurs par defaut
Retourne TRUE si lu, FALSE si config non lue ou non modifie
/* lit la configuration, si elle n'a pas deja ete lue
*/
* 1 - lit <nom fichier brd>.pro
* 2 - si non trouve lit <chemin de *.exe>/kicad.pro
* 3 - si non trouve: init des variables aux valeurs par defaut
*
* Retourne TRUE si lu, FALSE si config non lue ou non modifie
*/
{
{
wxString
FullFileName
;
wxString
FullFileName
;
int
ii
;
int
ii
;
g_Prj_Config_Filename_ext
=
wxT
(
".pro"
);
g_Prj_Config_Filename_ext
=
wxT
(
".pro"
);
FullFileName
=
project_name
;
FullFileName
=
project_name
;
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
/* Init des valeurs par defaut */
/* Init des valeurs par defaut */
g_LibName_List
.
Clear
();
g_LibName_List
.
Clear
();
g_EDA_Appl
->
ReadProjectConfig
(
FullFileName
,
g_EDA_Appl
->
ReadProjectConfig
(
FullFileName
,
GROUP
,
ParamCfgList
,
FALSE
);
GROUP
,
ParamCfgList
,
FALSE
);
/* Traitement des variables particulieres: */
/* Traitement des variables particulieres: */
SetRealLibraryPath
(
wxT
(
"modules"
)
);
SetRealLibraryPath
(
wxT
(
"modules"
)
);
if
(
ScreenPcb
)
if
(
ScreenPcb
)
{
{
ScreenPcb
->
m_Diviseur_Grille
=
Pcbdiv_grille
;
ScreenPcb
->
m_Diviseur_Grille
=
Pcbdiv_grille
;
ScreenPcb
->
m_UserGrid
=
g_UserGrid
;
ScreenPcb
->
m_UserGrid
=
g_UserGrid
;
ScreenPcb
->
m_UserGridUnit
=
g_UserGrid_Unit
;
ScreenPcb
->
m_UserGridUnit
=
g_UserGrid_Unit
;
}
}
g_DesignSettings
.
m_TrackWidthHistory
[
0
]
=
g_DesignSettings
.
m_CurrentTrackWidth
;
g_DesignSettings
.
m_TrackWidthHistory
[
0
]
=
g_DesignSettings
.
m_CurrentTrackWidth
;
g_DesignSettings
.
m_ViaSizeHistory
[
0
]
=
g_DesignSettings
.
m_CurrentViaSize
;
g_DesignSettings
.
m_ViaSizeHistory
[
0
]
=
g_DesignSettings
.
m_CurrentViaSize
;
for
(
ii
=
1
;
ii
<
HISTORY_NUMBER
;
ii
++
)
for
(
ii
=
1
;
ii
<
HISTORY_NUMBER
;
ii
++
)
{
{
g_DesignSettings
.
m_TrackWidthHistory
[
ii
]
=
0
;
g_DesignSettings
.
m_TrackWidthHistory
[
ii
]
=
0
;
g_DesignSettings
.
m_ViaSizeHistory
[
ii
]
=
0
;
g_DesignSettings
.
m_ViaSizeHistory
[
ii
]
=
0
;
}
}
return
TRUE
;
return
TRUE
;
}
}
/**********************************************************/
/**********************************************************/
void
WinEDA_PcbFrame
::
Update_config
(
wxWindow
*
displayframe
)
void
WinEDA_PcbFrame
::
Update_config
(
wxWindow
*
displayframe
)
/***********************************************************/
/***********************************************************/
/* enregistrement de la config */
/* enregistrement de la config */
{
{
wxString
FullFileName
;
wxString
FullFileName
;
wxString
mask
;
wxString
mask
;
mask
=
wxT
(
"*"
)
+
g_Prj_Config_Filename_ext
;
mask
=
wxT
(
"*"
)
+
g_Prj_Config_Filename_ext
;
FullFileName
=
GetScreen
()
->
m_FileName
.
AfterLast
(
'/'
);
FullFileName
=
GetScreen
()
->
m_FileName
.
AfterLast
(
'/'
);
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
ChangeFileNameExt
(
FullFileName
,
g_Prj_Config_Filename_ext
);
FullFileName
=
EDA_FileSelector
(
_
(
"Save preferences"
),
FullFileName
=
EDA_FileSelector
(
_
(
"Save preferences"
),
wxPathOnly
(
GetScreen
()
->
m_FileName
),
/* Chemin par defaut */
wxPathOnly
(
GetScreen
()
->
m_FileName
),
/* Chemin par defaut */
FullFileName
,
/* nom fichier par defaut */
FullFileName
,
/* nom fichier par defaut */
g_Prj_Config_Filename_ext
,
/* extension par defaut */
g_Prj_Config_Filename_ext
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
mask
,
/* Masque d'affichage */
displayframe
,
displayframe
,
wxFD_SAVE
,
wxFD_SAVE
,
TRUE
TRUE
);
);
if
(
FullFileName
.
IsEmpty
()
)
return
;
if
(
FullFileName
.
IsEmpty
()
)
return
;
Pcbdiv_grille
=
GetScreen
()
->
m_Diviseur_Grille
;
Pcbdiv_grille
=
GetScreen
()
->
m_Diviseur_Grille
;
/* ecriture de la configuration */
g_EDA_Appl
->
WriteProjectConfig
(
FullFileName
,
wxT
(
"/pcbnew"
),
ParamCfgList
);
/* ecriture de la configuration */
g_EDA_Appl
->
WriteProjectConfig
(
FullFileName
,
wxT
(
"/pcbnew"
),
ParamCfgList
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment