From 8497178fa5265366928a8d1605a80bf8b96bd50f Mon Sep 17 00:00:00 2001 From: charras Date: Sun, 28 Feb 2010 18:26:48 +0000 Subject: [PATCH] removed unused files. Switch to RC5 --- bitmaps/icon_python.xpm | 113 ------- bitmaps/icon_python_small.xpm | 123 -------- bitmaps/new_python.xpm | 136 -------- common/build_version.cpp | 2 +- common/pyhandler.cpp | 467 --------------------------- gerbview/set_color.cpp.unused | 467 --------------------------- gerbview/set_color.h.unused | 438 -------------------------- include/pyhandler.h | 115 ------- internat/fr/kicad.mo | Bin 223127 -> 222611 bytes internat/fr/kicad.po | 379 +++++++++++----------- kicad/kicad-python.cpp | 348 --------------------- pcbnew/set_color.cpp.unused | 498 ----------------------------- pcbnew/set_color.h.unused | 571 ---------------------------------- pcbnew/via_edit.cpp.unused | 112 ------- pcbnew/xchgmod.cpp | 2 +- version.txt | 4 +- 16 files changed, 190 insertions(+), 3585 deletions(-) delete mode 100644 bitmaps/icon_python.xpm delete mode 100644 bitmaps/icon_python_small.xpm delete mode 100644 bitmaps/new_python.xpm delete mode 100644 common/pyhandler.cpp delete mode 100644 gerbview/set_color.cpp.unused delete mode 100644 gerbview/set_color.h.unused delete mode 100644 include/pyhandler.h delete mode 100644 kicad/kicad-python.cpp delete mode 100644 pcbnew/set_color.cpp.unused delete mode 100644 pcbnew/set_color.h.unused delete mode 100644 pcbnew/via_edit.cpp.unused diff --git a/bitmaps/icon_python.xpm b/bitmaps/icon_python.xpm deleted file mode 100644 index 599cd98dea..0000000000 --- a/bitmaps/icon_python.xpm +++ /dev/null @@ -1,113 +0,0 @@ -/* XPM */ -#ifndef XPMMAIN -extern const char * icon_python_xpm[]; - -#else -const char * icon_python_xpm[] = { -"32 32 72 1", -" c None", -". c #7EA5C6", -"+ c #6495BD", -"@ c #4383B6", -"# c #437FB2", -"$ c #6491B5", -"% c #7DA1BF", -"& c #3882BE", -"* c #387CB5", -"= c #3779AF", -"- c #3776AB", -"; c #4988BB", -"> c #CDDFEE", -", c #F7F7FF", -"' c #82ADD1", -") c #3773A5", -"! c #7096B5", -"~ c #4385BB", -"{ c #FFFFFF", -"] c #F6F5F5", -"^ c #3C729E", -"/ c #9BBDDA", -"( c #366D9C", -"_ c #387FBA", -": c #5A91BF", -"< c #376A94", -"[ c #FFED60", -"} c #FFE659", -"| c #F8E16E", -"1 c #FFEB5E", -"2 c #FFE354", -"3 c #4489C0", -"4 c #3885C3", -"5 c #FFDB4C", -"6 c #FBCE47", -"7 c #FFD544", -"8 c #72A0C5", -"9 c #507CA1", -"0 c #FFE052", -"a c #FFD040", -"b c #F5D98D", -"c c #7F9EB8", -"d c #F1ECDA", -"e c #FFCC3B", -"f c #FBC840", -"g c #FBD54F", -"h c #FCC539", -"i c #4379A7", -"j c #DCE1E7", -"k c #FAE262", -"l c #FFC532", -"m c #FBC037", -"n c #80A6C6", -"o c #FFBC29", -"p c #F7CD74", -"q c #427DAE", -"r c #FABE40", -"s c #FFB521", -"t c #497FAC", -"u c #FFCD57", -"v c #FFE097", -"w c #FFD67B", -"x c #FFD849", -"y c #FFFBF2", -"z c #F7DE92", -"A c #FFCF6A", -"B c #FFEDC8", -"C c #FFE4AC", -"D c #F7D284", -"E c #FFB531", -"F c #F7D47B", -"G c #FDBE2E", -" ", -" ", -" .+@###$% ", -" &&&**==--- ", -" ;&>,'*===))))! ", -" ~&{{]==--))))^ ", -" &&'/@===)))((( ", -" __**===)))(((( ", -" ((((( ", -" :&&&**====)))(((<<[[}}| ", -" &&&&&**===)))(((<<<11}22 ", -" 34&__***---))(((<<<<222556 ", -" 4&&&**====)))((<<<<<225557 ", -" 84&&***==--))(((<<<<900577ab ", -" ~&&&**===)))(((<<< c #3880BC", -", c #4A8AC0", -"' c #538DBD", -") c #3779AF", -"! c #3774A8", -"~ c #3772A3", -"{ c #366D9C", -"] c #366C9A", -"^ c #799785", -"/ c #FFEA5C", -"( c #FCE464", -"_ c #3883BF", -": c #387EB7", -"< c #387AB1", -"[ c #366E9E", -"} c #376A94", -"| c #9BA876", -"1 c #FFE658", -"2 c #FFDF50", -"3 c #4B8EC4", -"4 c #3882BE", -"5 c #387AB2", -"6 c #3778AE", -"7 c #3775A9", -"8 c #A1AA77", -"9 c #FFDE50", -"0 c #FFD848", -"a c #FCD55B", -"b c #3B81BB", -"c c #3880BB", -"d c #387BB4", -"e c #3776AA", -"f c #376B96", -"g c #7E9CB2", -"h c #FADE70", -"i c #FFD646", -"j c #FFCF3E", -"k c #FDC93C", -"l c #3B80B9", -"m c #387CB5", -"n c #6393BB", -"o c #F3E486", -"p c #FFED60", -"q c #FFE85B", -"r c #FFE253", -"s c #FFDA4A", -"t c #FFD545", -"u c #FFCD3C", -"v c #FFC734", -"w c #FEC433", -"x c #508ABB", -"y c #3776AB", -"z c #9AAD84", -"A c #FFE558", -"B c #FFE152", -"C c #FFD342", -"D c #FFCB3A", -"E c #FFC532", -"F c #FFC330", -"G c #FCC242", -"H c #9BB082", -"I c #FFEB5E", -"J c #FFE659", -"K c #FFE052", -"L c #FFD241", -"M c #FFC02E", -"N c #FFBA27", -"O c #4379A7", -"P c #C0C273", -"Q c #FFDE4F", -"R c #FFDB4C", -"S c #FFD040", -"T c #FFCC3B", -"U c #FFCE54", -"V c #FFC540", -"W c #FDBE30", -"X c #F9DA70", -"Y c #FFD645", -"Z c #FFC836", -"` c #FFEEC9", -" . c #FFD37B", -".. c #F9C95E", -"+. c #FCCC4D", -"@. c #FEC232", -"#. c #FFBC29", -"$. c #FCBD3D", -" ", -" . + @ # ", -" $ % & * = - - ; ", -" > , ' ) ! ~ { { ", -" { ] ^ / ( ", -" _ > : < = - [ ] } | 1 2 ", -" 3 4 : 5 6 7 ~ { } } 8 9 0 a ", -" b c d ) e - { f } g h i j k ", -" l m * n o p p q r s t u v w ", -" x * y z p p A B s C D E F G ", -" = ! H I J K 0 L D v M N ", -" O P 1 Q R ", -" r 9 s S T U V W ", -" X Y S Z E ` ... ", -" +.@.#.$. ", -" " -}; -#endif diff --git a/bitmaps/new_python.xpm b/bitmaps/new_python.xpm deleted file mode 100644 index 0b57edb0b2..0000000000 --- a/bitmaps/new_python.xpm +++ /dev/null @@ -1,136 +0,0 @@ -/* XPM */ -#ifndef XPMMAIN -extern const char * new_python_xpm[]; -#else -const char * new_python_xpm[] = { -"16 16 112 2", -" c None", -". c #000000", -"+ c #FEFEFE", -"@ c #090909", -"# c #EEEEEE", -"$ c #F1F1F1", -"% c #FBFBFB", -"& c #DAE2E8", -"* c #CDDBE7", -"= c #528DBD", -"- c #3C7BB0", -"; c #5689B2", -"> c #DAE1E7", -", c #E9EBED", -"' c #767676", -") c #5590C1", -"! c #79A9D1", -"~ c #709FC6", -"{ c #3777AC", -"] c #3672A4", -"^ c #3C73A2", -"/ c #B2C4D4", -"( c #161616", -"_ c #C1D2E1", -": c #C2D3E2", -"< c #BFD0DE", -"[ c #BBCCDB", -"} c #366E9D", -"| c #467695", -"1 c #C4C787", -"2 c #F8E78A", -"3 c #C4C4C4", -"4 c #B7CDDF", -"5 c #3881BD", -"6 c #387EB7", -"7 c #3779B0", -"8 c #3775A9", -"9 c #366F9F", -"0 c #366B99", -"a c #597F89", -"b c #DACF62", -"c c #FFDF50", -"d c #EEEDEC", -"e c #ECECEC", -"f c #4287C0", -"g c #387EB8", -"h c #377AB1", -"i c #3776AB", -"j c #366D9B", -"k c #386A94", -"l c #728F8F", -"m c #E6CF5B", -"n c #FFD545", -"o c #F8D774", -"p c #EBEBEB", -"q c #3A7FB9", -"r c #377BB4", -"s c #4E86B5", -"t c #A8B890", -"u c #AEBA7A", -"v c #AEB674", -"w c #AFB26D", -"x c #DCC969", -"y c #FED348", -"z c #FFCA38", -"A c #F8CE5E", -"B c #EAEAEA", -"C c #4784B7", -"D c #3778AD", -"E c #88A38E", -"F c #FDEC63", -"G c #FFE95C", -"H c #FFE254", -"I c #FFDA4A", -"J c #FFD140", -"K c #FFC836", -"L c #FFC330", -"M c #F7CA65", -"N c #E8E8E8", -"O c #C1D1DE", -"P c #457EAE", -"Q c #95AB84", -"R c #FFE95B", -"S c #FBDB5F", -"T c #FBD55E", -"U c #FACE56", -"V c #FAC851", -"W c #FAC249", -"X c #E7E7E7", -"Y c #B9C9D7", -"Z c #D4CD6F", -"` c #FFE152", -" . c #FFD949", -".. c #F4D881", -"+. c #F1DA9F", -"@. c #F1D494", -"#. c #E9DFC6", -"$. c #E6E6E6", -"%. c #E5E5E5", -"&. c #F8DD79", -"*. c #FFD646", -"=. c #FFCE3D", -"-. c #FFC735", -";. c #FFE5AA", -">. c #FDCC64", -",. c #ECD9AF", -"'. c #E4E4E4", -"). c #F0E8D3", -"!. c #FBC94A", -"~. c #FDBF36", -"{. c #F9C150", -"]. c #E3E3E3", -" . . . . . . . . . . . . ", -". + + + + + + + + + + @ + . ", -". + # # # $ $ $ $ $ $ @ % + . ", -". + # # & * = - ; > , @ ' + + . ", -". + # # ) ! ~ { ] ^ / @ @ @ ( . ", -". + # # _ : < [ } | 1 2 # # 3 . ", -". + 4 5 6 7 8 9 0 a b c d e 3 . ", -". + f g h i ] j k l m n o p 3 . ", -". + q r s t u v w x y z A B 3 . ", -". + C D E F G H I J K L M N 3 . ", -". + O P Q R H S T U V W X X 3 . ", -". + # Y Z ` ...+.@.#.$.$.%.3 . ", -". + # # &.*.=.-.;.>.,.%.'.'.3 . ", -". + # # # ).!.~.{.# '.].].].3 . ", -". 3 3 3 3 3 3 3 3 3 3 3 3 3 3 . ", -" . . . . . . . . . . . . . . "}; -#endif - diff --git a/common/build_version.cpp b/common/build_version.cpp index c61eebaf0b..3df28c70f6 100644 --- a/common/build_version.cpp +++ b/common/build_version.cpp @@ -6,7 +6,7 @@ #endif #ifndef KICAD_BUILD_VERSION -#define KICAD_BUILD_VERSION "(2010-02-26)" +#define KICAD_BUILD_VERSION "(2010-02-28)" #endif #define VERSION_STABILITY "RC5" diff --git a/common/pyhandler.cpp b/common/pyhandler.cpp deleted file mode 100644 index 0cc7f207ea..0000000000 --- a/common/pyhandler.cpp +++ /dev/null @@ -1,467 +0,0 @@ -#include "fctsys.h" -#include "common.h" - -#include - -#include - -#include -#include - -using namespace boost::python; - - -/*****************************************************************************/ -/* Common Python Binding */ -/*****************************************************************************/ - -static int GetLastID() { return ID_END_LIST; } - -static object ChooseFile( str objTitle, str objMask, object objOpen ) -{ - wxString mask = PyHandler::MakeStr( objMask ); - int open = extract( objOpen ); - - wxString script = EDA_FileSelector( PyHandler::MakeStr( objTitle ), - wxEmptyString, - wxEmptyString, - mask, - mask, - NULL, - open ? wxFD_OPEN : wxFD_SAVE, - TRUE ); - - return PyHandler::Convert( script ); -} - -static void Print( str message ) -{ - std::cout << extract(message) << std::endl; -} - - -static void Clear() {} - - -static void RegisterCb( str objKey, object callback ) -{ - PyHandler::GetInstance()->RegisterCallback( PyHandler::MakeStr(objKey), - callback ); -} - - -static void UnRegisterCb( str objKey, object callback ) -{ - PyHandler::GetInstance()->UnRegisterCallback( PyHandler::MakeStr(objKey), - callback ); -} - - -static void init_base_utils() -{ - def ( "ChooseFile", &ChooseFile ); - def ( "RegisterCallback", &RegisterCb ); - def ( "UnRegisterCallback", &UnRegisterCb ); - def ( "GetLastID", &GetLastID ); - - def ( "Print", &Print ); - def ( "Clear", &Clear); -} - - -// Dummy boost callback -static void InitPyModules() -{ - PyHandler::GetInstance()->InitNextModule(); -} - - -/*****************************************************************************/ -/* PyHandler */ -/*****************************************************************************/ - -// std::vector< T > -> python object implicit conversion -template struct std_vector_to_tuple -{ - static PyObject * makeItem( const wxString & str ) - { - return boost::python::incref( PyHandler::Convert( str ).ptr() ); - } - - static PyObject * makeItem( const std::string & str ) - { - return boost::python::incref( - boost::python::str( str.c_str() ).ptr() ); - } - - static PyObject * makeItem( int item ) - { - return boost::python::incref( PyInt_FromLong( item ) ); - } - - static PyObject * convert( const T& vect ) - { - PyObject * tuple = PyTuple_New( vect.size() ); - for ( unsigned int i = 0; i < vect.size() ; i++ ) - { - PyTuple_SET_ITEM( tuple, i, makeItem( vect[i] ) ); - } - return tuple; - } -}; - -PyHandler* PyHandler::m_instance = NULL; - - -/* Singleton implementation */ -PyHandler * PyHandler::GetInstance() -{ - if( !PyHandler::m_instance ) - { - PyHandler::m_instance = new PyHandler(); - } - return PyHandler::m_instance; -} - - -/* Init the Python env */ -PyHandler::PyHandler() -{ - Py_Initialize(); - PyEval_InitThreads(); - m_ModulesLoaded = false; - m_current = 0; - if( !wxPyCoreAPI_IMPORT() ) - { - std::cerr << "Can't get wx Python binding\n" ; - PyErr_Print(); - } -// m_mainTState = wxPyBeginAllowThreads(); // I can't figure out why this make py crash ... - m_mainTState = NULL; - - // Make the console appear in a window: - wxString initConsole; - initConsole += wxT( "import sys\n" ); - initConsole += wxT( "import wx\n" ); - initConsole += wxT( "output = wx.PyOnDemandOutputWindow()\n" ); - initConsole += wxT( "sys.stdout = sys.stderr = output\n" ); - RunSimpleString( initConsole ); - - AddToModule ( wxT( "common" ), &init_base_utils ); - - // Register converters - - to_python_converter < std::vector< std::string >, - std_vector_to_tuple< const std::vector < std::string > > > (); - to_python_converter < std::vector< wxString >, - std_vector_to_tuple< const std::vector < wxString > > > (); -} - - -void PyHandler::DoInitModules() -{ - if ( m_ModulesLoaded ) - return; - - m_ModulesLoaded = true; - - for ( unsigned int i = 0; i < m_ModuleRegistry.size(); i ++ ) - { - detail::init_module( m_ModuleRegistry[i].name.mb_str(), - &InitPyModules ); - } -} - - -/* Returns the module index in the registry, -1 if not found*/ -int PyHandler::GetModuleIndex( const wxString & name ) const -{ - for ( unsigned int i = 0; i < m_ModuleRegistry.size(); i ++ ) - { - if ( m_ModuleRegistry[i].name == name ) return i; - } - return -1; -} - - -/* Adds an init function to a python module */ -void PyHandler::AddToModule( const wxString & name, - PyHandler::initfunc_t initfunc ) -{ - if (!initfunc) - return; - - int i = GetModuleIndex( name ); - - if ( -1 == i ) - { - m_ModuleRegistry.push_back( ModuleRecord( name ) ); - i = m_ModuleRegistry.size() - 1; - } - - m_ModuleRegistry[i].registry.push_back( initfunc ); -} - - -/* Called to initialize a module on py 'import module' */ -void PyHandler::InitNextModule() -{ - for ( unsigned int j = 0; - j < m_ModuleRegistry[m_current].registry.size(); - j++ ) - { - m_ModuleRegistry[m_current].registry[j](); - } - - m_current++; -} - - -/* Closes the Python env */ -PyHandler::~PyHandler() -{ - wxPyEndAllowThreads(m_mainTState); - Py_Finalize(); -} - - -/* Run scripts looking in 'base' directory */ -void PyHandler::RunBaseScripts( const wxString & base ) -{ - const wxString sep = wxFileName().GetPathSeparator(); - - // check if we can have a kicad_startup.py around ? - wxString script = base + wxT( "scripts" ) + sep + wxT( "kicad_startup.py" ); - if ( wxFileExists( script ) ) - RunScript( script ); - - // First find scripts/.py and run it if found : - - script = base + wxString::FromAscii( "scripts" ) + sep + m_appName - + wxString::FromAscii(".py"); - - if ( wxFileExists( script ) ) - RunScript( script ); - - // Now lets see if we can find a suitable plugin directory - // (plugin/) somewhere - - wxString pluginDir = base + wxT( "plugins" ) + sep + m_appName; - if ( wxDirExists( pluginDir ) ) - { - // We do have a systemwide plugin dir, let's find files in it - wxArrayString pluginList; - wxDir::GetAllFiles( pluginDir, &pluginList, wxT("*.py") ); - - for ( unsigned int i = 0; i < pluginList.Count() ; i++ ) - { - RunScript( pluginList[i] ); - } - } -} - - -/* Run application startup scripts */ -void PyHandler::RunScripts() -{ - // SYSTEMWIDE: - - const wxString sep = wxFileName().GetPathSeparator(); - - wxString dataPath = ReturnKicadDatasPath(); - if ( wxDirExists( dataPath ) ) RunBaseScripts( dataPath ); - - // USER Scripts: - wxString userDir = wxGetUserHome() + sep - + wxString::FromAscii(".kicad.d") + sep; - if ( wxDirExists( userDir ) ) - RunBaseScripts( userDir ); - userDir = wxGetUserHome() + sep + wxString::FromAscii("_kicad_d") + sep; - if ( wxDirExists( userDir ) ) - RunBaseScripts( userDir ); - -} - - -/* Run the script specified by 'name' */ -bool PyHandler::RunScript( const wxString & name ) -{ - DoInitModules(); - - object module( handle<>(borrowed(PyImport_AddModule("__main__")))); - object ns = module.attr( "__dict__" ); - bool ret = true; - - FILE * file = fopen( name.mb_str(), "r" ); - - wxPyBlock_t blocked = wxPyBeginBlockThreads(); - - if ( !file ) - { - // do something - std::cout << "Unable to Load " << name.mb_str() << "\n"; - ret = false; - } - else - { - wxString currDir = wxGetCwd(); - - wxFileName fname( name ); - wxString pyDir = fname.GetPath(); - - wxSetWorkingDirectory( pyDir ); - try - { - ns["currentScript"] = Convert( name ); - handle<> ignored( PyRun_File( file, name.mb_str(), Py_file_input, - ns.ptr(), ns.ptr() ) ); - } - catch ( error_already_set ) - { - PyErr_Print(); // should be printed into an error message ... - ret = false; - } - wxSetWorkingDirectory( currDir ); - } - - fclose( file ); - wxPyEndBlockThreads(blocked); - return ret; -} - - -bool PyHandler::RunSimpleString( const wxString & code ) -/* Run the code in 'code' */ -{ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); - try - { - PyRun_SimpleString( code.mb_str() ); - } - catch ( error_already_set ) - { - PyErr_Print(); // should be printed into an error message ... - wxPyEndBlockThreads(blocked); - return false; - } - - wxPyEndBlockThreads(blocked); - return true; -} - - -void PyHandler::SetAppName( const wxString & name ) -/* Set the application name in the python scope */ -{ - m_appName = name; - object module( ( handle<>( borrowed( PyImport_AddModule( "__main__") ) ) ) ); - object ns = module.attr( "__dict__" ); - try - { - ns["kicadApp"] = std::string( name.ToAscii() ); - } - catch( error_already_set ) - { - PyErr_Print(); - } -} - - -const char * PyHandler::GetVersion() { return Py_GetVersion(); } - - -// Event handling : - -void PyHandler::DeclareEvent( const wxString & key ) -{ - m_EventRegistry.push_back( Event( key ) ); -} - - -int PyHandler::GetEventIndex( const wxString & key ) -{ - for ( unsigned int i = 0; i < m_EventRegistry.size(); i ++ ) - { - if ( m_EventRegistry[i].key == key ) - return i; - } - - return -1; -} - - -void PyHandler::TriggerEvent( const wxString & key ) -{ - TriggerEvent( key, str( "" ) ); -} - - -void PyHandler::TriggerEvent( const wxString & key, const object & param ) -{ - - int i = GetEventIndex( key ); - if ( -1 == i ) - return; - - wxPyBlock_t blocked = wxPyBeginBlockThreads(); - - for( unsigned int j = 0; j < m_EventRegistry[i].functors.size(); j++ ) - { - try - { - m_EventRegistry[i].functors[j]( param ); - } - catch( error_already_set ) - { - std::cout << "Error in event " << key.mb_str() << " callback" - << std::endl; - PyErr_Print(); - } - } - - wxPyEndBlockThreads( blocked ); -} - - -void PyHandler::RegisterCallback( const wxString & key, - const object & callback ) -{ - int i = GetEventIndex( key ); - - if( -1 == i ) - return; - - m_EventRegistry[i].functors.push_back( callback ); -} - - -void PyHandler::UnRegisterCallback( const wxString & key, - const object & callback ) -{ - int i = GetEventIndex( key ); - if( -1 == i ) - return; - for( unsigned int j = 0; j < m_EventRegistry[i].functors.size() ; j++ ) - { - if ( callback == m_EventRegistry[i].functors[j] ) - { - m_EventRegistry[i].functors.erase( - m_EventRegistry[i].functors.begin() + j ); - break; - } - } -} - - -// Object conversion: - -wxString PyHandler::MakeStr( const object & objStr ) -{ - return wxString( extract( objStr ), wxConvLocal ); -} - - -object PyHandler::Convert( const wxString & wxStr ) -{ - return str( std::string( wxStr.mb_str() ).c_str() ); -} diff --git a/gerbview/set_color.cpp.unused b/gerbview/set_color.cpp.unused deleted file mode 100644 index 2068c64531..0000000000 --- a/gerbview/set_color.cpp.unused +++ /dev/null @@ -1,467 +0,0 @@ -/*****************/ -/* set_color.cpp */ -/*****************/ - -/*Set up the items and layer colors and show/no show options - */ - -#include "fctsys.h" -#include "gr_basic.h" -#include "common.h" -#include "class_drawpanel.h" - -#include "gerbview.h" -#include "pcbnew.h" -#include "class_board_design_settings.h" - -#include "protos.h" - -// variable used to handle grid visibility: -bool s_showGrid; -int s_gridColor; - -#include "set_color.h" // Header file associated with this file - -// Local variables: -int CurrentColor[NB_BUTT]; // Holds color for each layer while dialog box open - - -IMPLEMENT_DYNAMIC_CLASS( WinEDA_SetColorsFrame, wxDialog ) - -// Table of events for WinEDA_SetColorsFrame -BEGIN_EVENT_TABLE( WinEDA_SetColorsFrame, wxDialog ) - EVT_BUTTON( ID_COLOR_RESET_SHOW_LAYER_OFF, WinEDA_SetColorsFrame::ResetDisplayLayersCu ) - EVT_BUTTON( ID_COLOR_RESET_SHOW_LAYER_ON, WinEDA_SetColorsFrame::ResetDisplayLayersCu ) - EVT_COMMAND_RANGE( ID_COLOR_SETUP, ID_COLOR_SETUP + NB_BUTT - 1, - wxEVT_COMMAND_BUTTON_CLICKED, - WinEDA_SetColorsFrame::SetColor ) - EVT_BUTTON( wxID_OK, WinEDA_SetColorsFrame::OnOkClick ) - EVT_BUTTON( wxID_CANCEL, WinEDA_SetColorsFrame::OnCancelClick ) - EVT_BUTTON( wxID_APPLY, WinEDA_SetColorsFrame::OnApplyClick ) -END_EVENT_TABLE() - - -/*****************************************************/ -void DisplayColorSetupFrame( WinEDA_GerberFrame* parent, - const wxPoint& framepos ) -/*****************************************************/ -{ - WinEDA_SetColorsFrame* frame = - new WinEDA_SetColorsFrame( parent, framepos ); - - frame->ShowModal(); - frame->Destroy(); -} - - -// Default Constructor (whose provision is mandated by the inclusion -// of DECLARE_DYNAMIC_CLASS( WinEDA_SetColorsFrame ) within set_color.h) -WinEDA_SetColorsFrame::WinEDA_SetColorsFrame() -{ - Init(); -} - - -// Standard Constructor -WinEDA_SetColorsFrame::WinEDA_SetColorsFrame( WinEDA_GerberFrame* parent, - const wxPoint& framepos ) -{ - m_Parent = parent; - Init(); - Create( parent, - SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME, - SYMBOL_WINEDA_SETCOLORSFRAME_TITLE, - framepos, - wxDefaultSize, - SYMBOL_WINEDA_SETCOLORSFRAME_STYLE ); -} - - -// Destructor -WinEDA_SetColorsFrame::~WinEDA_SetColorsFrame() { } - - -/**********************************************************/ -bool WinEDA_SetColorsFrame::Create( wxWindow* parent, wxWindowID id, - const wxString& caption, const wxPoint& pos, - const wxSize& size, long style ) -/**********************************************************/ -{ - SetExtraStyle(wxWS_EX_BLOCK_EVENTS); - wxDialog::Create( parent, id, caption, pos, size, style ); - - CreateControls(); - if (GetSizer()) - { - GetSizer()->SetSizeHints(this); - } - return true; -} - - -/**********************************************************/ -void WinEDA_SetColorsFrame::Init() -/**********************************************************/ -{ - OuterBoxSizer = NULL; - MainBoxSizer = NULL; - FlexColumnBoxSizer = NULL; - Label = NULL; - RowBoxSizer = NULL; - BitmapButton = NULL; - CheckBox = NULL; - Button = NULL; - Line = NULL; - StdDialogButtonSizer = NULL; -} - - -/**********************************************************/ -void WinEDA_SetColorsFrame::CreateControls() -/**********************************************************/ -{ - int lyr, cln, butt_ID, buttcolor; - wxString msg; - wxSize CorrectSize; // Used while specifying sizes of buttons and spacers - int ButtonHeight; // Also used for the same reason - - OuterBoxSizer = new wxBoxSizer(wxVERTICAL); - SetSizer(OuterBoxSizer); - - MainBoxSizer = new wxBoxSizer(wxHORIZONTAL); - OuterBoxSizer->Add(MainBoxSizer, 1, wxGROW|wxLEFT|wxRIGHT, 5); - - // Add various items to the dialog box, as determined by the - // details of each element contained within laytool_list[] - s_showGrid = m_Parent->IsGridVisible(); - s_gridColor = m_Parent->GetGridColor(); - for( lyr = 0, cln = 0; lyr < NB_BUTT; lyr++ ) - { - // Look for the first set of controls within each column. - if( lyr == 0 || lyr == laytool_index[cln]->m_Index + 1 ) - { - if( lyr != 0 ) - cln++; - - // Specify a FlexGrid sizer with seventeen rows and one column. - FlexColumnBoxSizer = new wxFlexGridSizer(17, 1, 0, 0); - - // Specify that all of the rows can be expanded. - for( int ii = 0; ii < 17; ii++ ) - { - FlexColumnBoxSizer->AddGrowableRow(ii); - } - - // Specify that the column can also be expanded. - FlexColumnBoxSizer->AddGrowableCol(0); - - MainBoxSizer->Add(FlexColumnBoxSizer, 1, wxGROW|wxLEFT, 5); - - // Add a text string to identify the controls within this column. - Label = new wxStaticText( this, wxID_STATIC, laytool_index[cln]->m_Name, - wxDefaultPosition, wxDefaultSize, 0 ); - - // Make this text string bold (so that it stands out better). - Label->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxNORMAL_FONT->GetFamily(), - wxNORMAL, wxBOLD, false, wxNORMAL_FONT->GetFaceName() ) ); - - FlexColumnBoxSizer->Add(Label, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5); - } - - // Provide a sizer for each layer to accomodate its associated bitmap button and checkbox. - RowBoxSizer = new wxBoxSizer(wxHORIZONTAL); - FlexColumnBoxSizer->Add(RowBoxSizer, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); - - butt_ID = ID_COLOR_SETUP + lyr; - laytool_list[lyr]->m_Id = butt_ID; - - // Provide a bitmap button, and "paint" this with the appropriate color. - wxMemoryDC iconDC; - wxBitmap ButtBitmap( BUTT_SIZE_X, BUTT_SIZE_Y ); - iconDC.SelectObject( ButtBitmap ); - buttcolor = *laytool_list[lyr]->m_Color & MASKCOLOR; - CurrentColor[lyr] = buttcolor; - wxBrush Brush; - iconDC.SelectObject( ButtBitmap ); - iconDC.SetPen( *wxBLACK_PEN ); - Brush.SetColour( - ColorRefs[buttcolor].m_Red, - ColorRefs[buttcolor].m_Green, - ColorRefs[buttcolor].m_Blue - ); - Brush.SetStyle( wxSOLID ); - - iconDC.SetBrush( Brush ); - iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y ); - - BitmapButton = new wxBitmapButton( this, butt_ID, - ButtBitmap, - wxDefaultPosition, - wxSize(BUTT_SIZE_X, BUTT_SIZE_Y) ); - laytool_list[lyr]->m_Button = BitmapButton; - - RowBoxSizer->Add(BitmapButton, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5); - - // Provide a checkbox, and specify the appropriate caption and checked state. - msg = wxGetTranslation( laytool_list[lyr]->m_Name.GetData() ); - - CheckBox = new wxCheckBox( this, ID_COLOR_CHECKBOX_ONOFF, msg, - wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); - - laytool_list[lyr]->m_CheckBox = CheckBox; - - if( laytool_list[lyr]->m_NoDisplayIsColor ) - { - if( m_Parent->GetBoard()->IsLayerVisible( lyr )) - CheckBox->SetValue( TRUE ); - else - CheckBox->SetValue( FALSE ); - } - else - CheckBox->SetValue( *laytool_list[lyr]->m_NoDisplay ); - - RowBoxSizer->Add(CheckBox, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5); - } - - // Now provide two (standard/non-bitmap) buttons within the third column, along with a number - // of spacers (so that if the dialog box is resized by the user, each of the controls within - // each of the columns will be repositioned in an aesthetically-acceptable manner). - // - // Before adding either of those buttons, provide a spacer to properly separate them from the - // bitmap buttons and checkboxes located above them. The height of that spacer should match - // the height of each "RowBox" sizer that has already been provided (to accomodate a bitmap - // button and checkbox), so that the top edge of the first button will line up with the top - // edge of the fourth checkbox provided within each of the first and second columns. (Hence - // that height is the larger of each bitmap button's height and each checkbox'es height.) - CorrectSize = CheckBox->GetSize(); - if( CorrectSize.y < BUTT_SIZE_Y ) - CorrectSize.y = BUTT_SIZE_Y; - - FlexColumnBoxSizer->Add(5, CorrectSize.y, 1, wxBOTTOM, 5); - - // For aesthetic reasons, both of the buttons will be made equally wide; hence the width - // required for each of those buttons needs to be determined before the appropriate width - // for both of them can be specified. - int width0; - - // Specify the relevent details for the first button, but in the first instance, - // specify the caption which will be used by the second of these buttons. - Button = new wxButton( this, ID_COLOR_RESET_SHOW_LAYER_ON, _("Show None"), - wxDefaultPosition, wxDefaultSize, 0 ); - - // Note the width of the button required for the initially specified caption. - // Also note the height of this button, as that detail will be required later while specifying - // the height of yet more spacers that will subsequently be provided beneath both buttons. - Button->GetSize( &width0, &ButtonHeight ); - - // Now change the caption of this button to what is really wanted for it. - Button->SetLabel( _("Show All") ); - - // Also note the width of the button required for the updated caption. - Button->GetSize( &CorrectSize.x, &ButtonHeight ); - - // Upate the value of CorrectSize.x if required (as that value will subsequently - // be used to specify the (minimum) width for both of these buttons). - if( CorrectSize.x < width0 ) - CorrectSize.x = width0; - - // Complete the steps necessary for providing the first button. - if (WinEDA_SetColorsFrame::ShowToolTips()) - Button->SetToolTip( _("Switch on all of the Gerber layers") ); - Button->SetMinSize( wxSize( CorrectSize.x, ButtonHeight ) ); - FlexColumnBoxSizer->Add(Button, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5); - - // Now do everything required for providing the second button. - Button = new wxButton( this, ID_COLOR_RESET_SHOW_LAYER_OFF, _("Show None"), - wxDefaultPosition, wxDefaultSize, 0 ); - if (WinEDA_SetColorsFrame::ShowToolTips()) - Button->SetToolTip( _("Switch off all of the Gerber layers") ); - Button->SetMinSize( wxSize( CorrectSize.x, ButtonHeight ) ); - FlexColumnBoxSizer->Add(Button, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5); - - // As each column contains seventeen rows, and only six rows of the third column have been - // occupied so far, spacers still need to be provided to occupy each of the remaining eleven - // rows within that column. So determine the collective height required for those spacers, - // so that the appropriate height for each of those spacers can subsequently be determined. - // - // Collective height required by the 11 spacers = 13 * CorrectSize.y - 2 * ButtonHeight - // - // As the height of a spacer is always an integral number, some of the spacers will probably - // need to be one unit taller than the remaining spacers; thus the remainder (modulus) will - // also determine what height should subsequently be assigned to each of those spacers. - // (Reuse width0 to hold value of remainder, rather than defining another new variable.) - width0 = (13 * CorrectSize.y - 2 * ButtonHeight) % 11; - CorrectSize.y = (13 * CorrectSize.y - 2 * ButtonHeight) / 11; - for( int ii = 1; ii < 12; ii++ ) - { - if( ii <= width0 ) - FlexColumnBoxSizer->Add(5, CorrectSize.y + 1, 1, wxBOTTOM, 5); - else - FlexColumnBoxSizer->Add(5, CorrectSize.y, 1, wxBOTTOM, 5); - } - - // Provide a line to separate the controls which have been provided so far from - // the OK, Cancel, and Apply buttons (which will be provided after this line) - Line = new wxStaticLine( this, -1, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - OuterBoxSizer->Add(Line, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); - - // Provide a StdDialogButtonSizer to accommodate the OK, Cancel, and Apply - // buttons; using that type of sizer results in those buttons being - // automatically located in positions appropriate for each (OS) version of KiCad. - StdDialogButtonSizer = new wxStdDialogButtonSizer; - OuterBoxSizer->Add(StdDialogButtonSizer, 0, wxGROW|wxALL, 10); - - Button = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - Button = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - Button = new wxButton( this, wxID_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - StdDialogButtonSizer->Realize(); - - // (Dialog now needs to be resized, but the associated command is provided elsewhere.) -} - - -/**********************************************************/ -bool WinEDA_SetColorsFrame::ShowToolTips() -/**********************************************************/ -{ - return true; -} - - -/**********************************************************/ -wxBitmap WinEDA_SetColorsFrame::GetBitmapResource( const wxString& name ) -/**********************************************************/ -{ - wxUnusedVar(name); - return wxNullBitmap; -} - - -/**********************************************************/ -wxIcon WinEDA_SetColorsFrame::GetIconResource( const wxString& name ) -/**********************************************************/ -{ - wxUnusedVar(name); - return wxNullIcon; -} - - -/*******************************************************************/ -void WinEDA_SetColorsFrame::OnOkClick(wxCommandEvent& WXUNUSED(event)) -/*******************************************************************/ -{ - UpdateLayerSettings(); - m_Parent->DrawPanel->Refresh(); - EndModal( 1 ); -} - - -/*******************************************************************/ -void WinEDA_SetColorsFrame::OnCancelClick(wxCommandEvent& WXUNUSED(event)) -/*******************************************************************/ -{ - EndModal( -1 ); -} - - -/*******************************************************************/ -void WinEDA_SetColorsFrame::OnApplyClick(wxCommandEvent& WXUNUSED(event)) -/*******************************************************************/ -{ - UpdateLayerSettings(); - m_Parent->DrawPanel->Refresh(); -} - - -/***********************************************************/ -void WinEDA_SetColorsFrame::SetColor(wxCommandEvent& event) -/***********************************************************/ -{ - int id = event.GetId(); - int color; - - wxBitmapButton* Button; - - color = DisplayColorFrame( this, - CurrentColor[id - ID_COLOR_SETUP] ); - - if( color < 0 ) - return; - - if( CurrentColor[id - ID_COLOR_SETUP] == color ) - return; - - CurrentColor[id - ID_COLOR_SETUP] = color; - wxMemoryDC iconDC; - - Button = laytool_list[id - ID_COLOR_SETUP]->m_Button; - - wxBitmap ButtBitmap = Button->GetBitmapLabel(); - iconDC.SelectObject( ButtBitmap ); - wxBrush Brush; - iconDC.SetPen( *wxBLACK_PEN ); - Brush.SetColour( - ColorRefs[color].m_Red, - ColorRefs[color].m_Green, - ColorRefs[color].m_Blue - ); - Brush.SetStyle( wxSOLID ); - - iconDC.SetBrush( Brush ); - iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y ); - Button->SetBitmapLabel( ButtBitmap ); - Button->Refresh(); - - Refresh( FALSE ); -} - - -/******************************************************************/ -void WinEDA_SetColorsFrame::UpdateLayerSettings() -/******************************************************************/ -{ - for( int lyr = 0; lyr < NB_BUTT - 2; lyr++ ) - { - m_Parent->GetBoard()->GetBoardDesignSettings()->SetLayerVisibility( lyr, laytool_list[lyr]->m_CheckBox->GetValue() ); - *laytool_list[lyr]->m_Color = CurrentColor[lyr]; - } - - // (As a bitmap button and a checkbox have been provided for *every* - // layer, it is not necessary to check whether each of those items - // actually has been provided for each of those layers.) - - - s_gridColor = CurrentColor[32]; - s_showGrid = laytool_list[32]->m_CheckBox->GetValue(); - - g_ColorsSettings.SetItemColor(DCODES_VISIBLE, CurrentColor[33] ); - DisplayOpt.DisplayPadNum = laytool_list[33]->m_CheckBox->GetValue(); - - // Additional command required for updating visibility of grid. - m_Parent->SetGridVisibility( s_showGrid ); - m_Parent->SetGridColor( s_gridColor ); -} - - -/***********************************************************************/ -void WinEDA_SetColorsFrame::ResetDisplayLayersCu(wxCommandEvent& event) -/***********************************************************************/ -{ - bool NewState = ( event.GetId() == ID_COLOR_RESET_SHOW_LAYER_ON ) - ? TRUE - : FALSE; - - for( int lyr = 0; lyr < 32; lyr++ ) - { - // (As a checkbox has been provided for *every* layer, it is not - // necessary to check whether it actually has been provided for - // each of those layers.) - laytool_list[lyr]->m_CheckBox->SetValue( NewState ); - } -} diff --git a/gerbview/set_color.h.unused b/gerbview/set_color.h.unused deleted file mode 100644 index 273e90b0c1..0000000000 --- a/gerbview/set_color.h.unused +++ /dev/null @@ -1,438 +0,0 @@ -/***************/ -/* set_color.h */ -/***************/ - -#ifndef SET_COLOR_H -#define SET_COLOR_H - -#include "wx/statline.h" -#include "colors_selection.h" - -class wxBoxSizer; -class wxFlexGridSizer; -class wxStaticLine; -class wxStdDialogButtonSizer; - - -// Specify how many elements are contained within laytool_list[] -const int NB_BUTT = 34; - -// Specify how many elements are contained within laytool_index[] -const int BUTTON_GROUPS = 3; - -// Specify the numbers associated with assorted controls -enum col_sel_id { - ID_DIALOG = 1800, - ID_COLOR_RESET_SHOW_LAYER_ON, - ID_COLOR_RESET_SHOW_LAYER_OFF, - ID_COLOR_CHECKBOX_ONOFF, - ID_COLOR_SETUP -}; - -// Control identifiers -// #define SYMBOL_WINEDA_SETCOLORSFRAME_STYLE wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER -#define SYMBOL_WINEDA_SETCOLORSFRAME_STYLE wxDEFAULT_DIALOG_STYLE|MAYBE_RESIZE_BORDER -#define SYMBOL_WINEDA_SETCOLORSFRAME_TITLE _("GerbView Layer Colors:") -#define SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME ID_DIALOG -// #define SYMBOL_WINEDA_SETCOLORSFRAME_SIZE wxSize(400, 300) -// #define SYMBOL_WINEDA_SETCOLORSFRAME_POSITION wxDefaultPosition - -#ifndef wxCLOSE_BOX -#define wxCLOSE_BOX 0x1000 -#endif - -// Specify the width and height of every (color-displaying / bitmap) button -const int BUTT_SIZE_X = 20; -const int BUTT_SIZE_Y = 16; - -/* Useful macro : */ -#define LOC_COLOR(numlayer) &g_ColorsSettings.m_LayersColors[numlayer] - - -/**********************************/ -/* Liste des menus de Menu_Layers */ -/**********************************/ -struct ColorButton -{ - wxString m_Name; - int * m_Color; // Pointeur sur la variable couleur - bool m_NoDisplayIsColor; // TRUE si bit ITEM_NON_VISIBLE de la variable Color - bool * m_NoDisplay; // Pointeur sur la variable Display on/off si ce - // n'est pas la var Color - int m_Id; - wxBitmapButton * m_Button; // Button to display/change color assigned to this layer -// int m_State; // (Commented out until when it is actually used.) - wxCheckBox * m_CheckBox; // Option Display ON/OFF -}; - -struct ButtonIndex -{ - wxString m_Name; // Title - int m_Index; // Index to last bitmap button in group -}; - - -static ButtonIndex Msg_Layers_Cu = -{ - _( "Layers 1-16" ), // Title - 15 // Index to last bitmap button in group -}; - -static ColorButton Layer_1_Butt= -{ - _("Layer 1"), // Title - LOC_COLOR(0), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_2_Butt= -{ - _("Layer 2"), // Title - LOC_COLOR(1), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_3_Butt= -{ - _("Layer 3"), // Title - LOC_COLOR(2), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_4_Butt= -{ - _("Layer 4"), // Title - LOC_COLOR(3), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_5_Butt= -{ - _("Layer 5"), // Title - LOC_COLOR(4), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_6_Butt= -{ - _("Layer 6"), // Title - LOC_COLOR(5), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_7_Butt= -{ - _("Layer 7"), // Title - LOC_COLOR(6), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_8_Butt= -{ - _("Layer 8"), // Title - LOC_COLOR(7), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_9_Butt= -{ - _("Layer 9"), // Title - LOC_COLOR(8), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_10_Butt= -{ - _("Layer 10"), // Title - LOC_COLOR(9), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_11_Butt= -{ - _("Layer 11"), // Title - LOC_COLOR(10), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_12_Butt= -{ - _("Layer 12"), // Title - LOC_COLOR(11), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_13_Butt= -{ - _("Layer 13"), // Title - LOC_COLOR(12), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_14_Butt= -{ - _("Layer 14"), // Title - LOC_COLOR(13), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_15_Butt= -{ - _("Layer 15"), // Title - LOC_COLOR(14), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_16_Butt= -{ - _("Layer 16"), // Title - LOC_COLOR(15), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - - -static ButtonIndex Msg_Layers_Tech = -{ - _( "Layers 17-32" ), // Title - 31 // Index to last bitmap button in group -}; - -static ColorButton Layer_17_Butt= -{ - _("Layer 17"), // Title - LOC_COLOR(16), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_18_Butt= -{ - _("Layer 18"), // Title - LOC_COLOR(17), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_19_Butt= -{ - _("Layer 19"), // Title - LOC_COLOR(18), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_20_Butt= -{ - _("Layer 20"), // Title - LOC_COLOR(19), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_21_Butt= -{ - _("Layer 21"), // Title - LOC_COLOR(20), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_22_Butt= -{ - _("Layer 22"), // Title - LOC_COLOR(21), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_23_Butt= -{ - _("Layer 23"), // Title - LOC_COLOR(22), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_24_Butt= -{ - _("Layer 24"), // Title - LOC_COLOR(23), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_25_Butt= -{ - _("Layer 25"), // Title - LOC_COLOR(24), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_26_Butt= -{ - _("Layer 26"), // Title - LOC_COLOR(25), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_27_Butt= -{ - _("Layer 27"), // Title - LOC_COLOR(26), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_28_Butt= -{ - _("Layer 28"), // Title - LOC_COLOR(27), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_29_Butt= -{ - _("Layer 29"), // Title - LOC_COLOR(28), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_30_Butt= -{ - _("Layer 30"), // Title - LOC_COLOR(29), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_31_Butt= -{ - _("Layer 31"), // Title - LOC_COLOR(30), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - -static ColorButton Layer_32_Butt= -{ - _("Layer 32"), // Title - LOC_COLOR(31), // Address of optional parameter - TRUE // Toggle ITEM*NOT*SHOW bit of the color variable -}; - - -static ButtonIndex Msg_Others_Items = -{ - _( "Others" ), // Title - 33 // Index to last bitmap button in group -}; - -static ColorButton Grid_Butt= -{ - _("Grid"), // Title - &s_gridColor, // Address of optional parameter - FALSE, - &s_showGrid // Address of boolean display control parameter to toggle -}; - -static ColorButton Show_DCodes_Butt= -{ - _("D codes id."), // Title - &g_ColorsSettings.m_ItemsColors[DCODES_VISIBLE], // Address of optional parameter - FALSE, - &DisplayOpt.DisplayPadNum // Address of boolean display control parameter to toggle -}; - - -static ColorButton * laytool_list[] = { - &Layer_1_Butt, - &Layer_2_Butt, - &Layer_3_Butt, - &Layer_4_Butt, - &Layer_5_Butt, - &Layer_6_Butt, - &Layer_7_Butt, - &Layer_8_Butt, - &Layer_9_Butt, - &Layer_10_Butt, - &Layer_11_Butt, - &Layer_12_Butt, - &Layer_13_Butt, - &Layer_14_Butt, - &Layer_15_Butt, - &Layer_16_Butt, - - &Layer_17_Butt, - &Layer_18_Butt, - &Layer_19_Butt, - &Layer_20_Butt, - &Layer_21_Butt, - &Layer_22_Butt, - &Layer_23_Butt, - &Layer_24_Butt, - &Layer_25_Butt, - &Layer_26_Butt, - &Layer_27_Butt, - &Layer_28_Butt, - &Layer_29_Butt, - &Layer_30_Butt, - &Layer_31_Butt, - &Layer_32_Butt, - - &Grid_Butt, - &Show_DCodes_Butt, -}; - - -static ButtonIndex* laytool_index[BUTTON_GROUPS] = { - &Msg_Layers_Cu, - &Msg_Layers_Tech, - &Msg_Others_Items -}; - - -/**************************************************************/ -/* classe derivee pour la frame de Configuration des couleurs */ -/**************************************************************/ - -class WinEDA_SetColorsFrame: public wxDialog -{ -private: - DECLARE_DYNAMIC_CLASS( WinEDA_SetColorsFrame ) - DECLARE_EVENT_TABLE() - - WinEDA_GerberFrame* m_Parent; - wxBoxSizer* OuterBoxSizer; - wxBoxSizer* MainBoxSizer; - wxFlexGridSizer* FlexColumnBoxSizer; - wxStaticText* Label; - wxBoxSizer* RowBoxSizer; - wxBitmapButton* BitmapButton; - wxCheckBox* CheckBox; - wxButton* Button; - wxStaticLine* Line; - wxStdDialogButtonSizer* StdDialogButtonSizer; - - // Creation - bool Create( wxWindow* parent, - wxWindowID id = SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME, - const wxString& caption = SYMBOL_WINEDA_SETCOLORSFRAME_TITLE, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = SYMBOL_WINEDA_SETCOLORSFRAME_STYLE ); - - // Initialises member variables - void Init(); - - // Creates the controls and sizers - void CreateControls(); - - wxBitmap GetBitmapResource( const wxString& name ); - wxIcon GetIconResource( const wxString& name ); - static bool ShowToolTips(); - - void SetColor( wxCommandEvent& event ); - void OnOkClick( wxCommandEvent& event ); - void OnCancelClick( wxCommandEvent& event ); - void OnApplyClick( wxCommandEvent& event ); - void UpdateLayerSettings(); - void ResetDisplayLayersCu( wxCommandEvent& event ); - -public: - // Constructors and destructor - WinEDA_SetColorsFrame(); - WinEDA_SetColorsFrame( WinEDA_GerberFrame* parent, const wxPoint& framepos ); - ~WinEDA_SetColorsFrame(); -}; - -#endif - // SET_COLOR_H diff --git a/include/pyhandler.h b/include/pyhandler.h deleted file mode 100644 index dc20a615e9..0000000000 --- a/include/pyhandler.h +++ /dev/null @@ -1,115 +0,0 @@ -/****************************/ -/* pyhandler.h */ -/****************************/ - -#ifndef PYHANDLER_H -#define PYHANDLER_H - -#include - -#include -#include -#include - -/* Use the boost library : */ -#include - - -class PyHandler -{ - typedef void (*initfunc_t )(); - -private: - static PyHandler* m_instance; - bool m_ModulesLoaded; - int m_current; - PyThreadState* m_mainTState; - -protected: - PyHandler(); - - wxString m_appName; - void RunBaseScripts( const wxString& base ); - - // Modules - struct ModuleRecord - { - wxString name; - std::vector< initfunc_t > registry; - - ModuleRecord( const wxString &modName ) : - name( modName ) - { - } - - }; - - std::vector< ModuleRecord > m_ModuleRegistry; - - void DoInitModules(); - - // Events - struct Event - { - wxString key; - std::vector< boost::python::object > functors; - - Event( const wxString &strKey ) : - key( strKey ) - { - } - }; - - std::vector< Event > m_EventRegistry; - -public: - - // Singleton handling: - static PyHandler* GetInstance(); - - ~PyHandler(); - - // Scope params/handling: - void SetAppName( const wxString& name ); - - void AddToModule( const wxString& name, initfunc_t initfunc ); - int GetModuleIndex( const wxString& name ) const; - - // Script and direct call - void RunScripts(); - bool RunScript( const wxString& name ); - bool RunSimpleString( const wxString& code ); - - // Common Informations - const char* GetVersion(); - - void InitNextModule(); - - // Event triggering - - // - C++ interface - void DeclareEvent( const wxString& key ); - void TriggerEvent( const wxString& key ); - void TriggerEvent( const wxString& key, - const boost::python::object& param ); - int GetEventIndex( const wxString& key ); - - // - Py Interface - void RegisterCallback( const wxString& key, - const boost::python::object& obj ); - void UnRegisterCallback( const wxString& key, - const boost::python::object& obj ); - - // Object conversions - - // - Py -> C++ - static wxString MakeStr( const boost::python::object& objStr ); - - // - C++ -> Py - static boost::python::object Convert( const wxString& wxStr ); -}; - - -#define KICAD_PY_BIND_MODULE( mod ) PyHandler::GetInstance()->AddModule( init # mod ) - -#endif //PYHANDLER_H diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index b2a6717d1e472d7cb4bd0302c568e6bdfbc04f70..ca9b0547df59055ae3334e3a2d1293ac96ccb164 100644 GIT binary patch delta 64062 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\n" "MIME-Version: 1.0\n" @@ -11192,7 +11192,7 @@ msgid "File <" msgstr "Fichier <" #: cvpcb/readschematicnetlist.cpp:115 -#: kicad/prjconfig.cpp:108 +#: kicad/prjconfig.cpp:105 msgid "> not found" msgstr "> non trouvé" @@ -11322,136 +11322,136 @@ msgstr "Redessin de l'écran (F3)" msgid "Zoom auto (Home)" msgstr "Zoom Automatique (Home)" -#: kicad/menubar.cpp:94 +#: kicad/menubar.cpp:90 msgid "Open an existing project" msgstr "Ouvrir un projet existant" -#: kicad/menubar.cpp:108 -#: kicad/menubar.cpp:276 +#: kicad/menubar.cpp:104 +#: kicad/menubar.cpp:272 msgid "Start a new project" msgstr "Créer un nouveau projet" -#: kicad/menubar.cpp:114 -#: kicad/menubar.cpp:286 +#: kicad/menubar.cpp:110 +#: kicad/menubar.cpp:282 msgid "Save current project" msgstr "Sauver le projet courrant" -#: kicad/menubar.cpp:122 +#: kicad/menubar.cpp:118 msgid "&Archive" msgstr "Archiver" -#: kicad/menubar.cpp:123 +#: kicad/menubar.cpp:119 msgid "Archive project files in zip archive" msgstr "Archive fichiers projet dans un fichier zip" -#: kicad/menubar.cpp:128 +#: kicad/menubar.cpp:124 msgid "&Unarchive" msgstr "&Désarchiver" -#: kicad/menubar.cpp:129 +#: kicad/menubar.cpp:125 msgid "Unarchive project files from zip file" msgstr "Désarchiver les fichiers du projet" -#: kicad/menubar.cpp:138 +#: kicad/menubar.cpp:134 msgid "Quit KiCad" msgstr "Quitter KiCad" -#: kicad/menubar.cpp:152 +#: kicad/menubar.cpp:148 msgid "Text E&ditor" msgstr "&Editeur de Texte" -#: kicad/menubar.cpp:153 +#: kicad/menubar.cpp:149 msgid "Open prefered text editor" msgstr "Lancer l'éditeur de texte préféré" -#: kicad/menubar.cpp:159 +#: kicad/menubar.cpp:155 msgid "&View File" msgstr "&Voir Fichier" -#: kicad/menubar.cpp:160 +#: kicad/menubar.cpp:156 msgid "View, read or edit file with a text editor" msgstr "Examiner, lire ou éditer des fichiers avec l'éditeur de texte" -#: kicad/menubar.cpp:173 +#: kicad/menubar.cpp:169 msgid "&Text Editor" msgstr "&Editeur de Texte" -#: kicad/menubar.cpp:174 +#: kicad/menubar.cpp:170 msgid "Select your prefered text editor" msgstr "Choisir son éditeur de texte préféré" -#: kicad/menubar.cpp:188 +#: kicad/menubar.cpp:184 msgid "Use system default PDF viewer used to browse datasheets" msgstr "Utiliser le visualisateur PDF par défaut pour afficher les documentations" -#: kicad/menubar.cpp:198 +#: kicad/menubar.cpp:194 msgid "Favourite" msgstr "Visualisateur PDF préféré" -#: kicad/menubar.cpp:199 +#: kicad/menubar.cpp:195 msgid "Use your favourite PDF viewer used to browse datasheets" msgstr "Utiliser le visualisateur PDF préféré pour afficher les documentations" -#: kicad/menubar.cpp:210 -#: kicad/menubar.cpp:217 +#: kicad/menubar.cpp:206 +#: kicad/menubar.cpp:213 msgid "PDF Viewer" msgstr "Visualisateur PDF" -#: kicad/menubar.cpp:211 +#: kicad/menubar.cpp:207 msgid "Select your favourite PDF viewer used to browse datasheets" msgstr "Sélectionner le visualisateur PDF favori pour afficher les documents" -#: kicad/menubar.cpp:218 +#: kicad/menubar.cpp:214 msgid "PDF viewer preferences" msgstr "Préférences pour le visualisateur PDF" -#: kicad/menubar.cpp:233 +#: kicad/menubar.cpp:229 msgid "Open the kicad manual" msgstr "Ouvrir la documentation de kicad" -#: kicad/menubar.cpp:242 +#: kicad/menubar.cpp:238 msgid "About kicad project manager" msgstr "Au sujet de Kicad, gestionnaire de projet" -#: kicad/menubar.cpp:252 +#: kicad/menubar.cpp:248 msgid "&Browse" msgstr "&Examiner" -#: kicad/menubar.cpp:281 +#: kicad/menubar.cpp:277 msgid "Load existing project" msgstr "Ouvrir un projet existant" -#: kicad/menubar.cpp:294 +#: kicad/menubar.cpp:290 msgid "Archive all project files" msgstr "Archiver les fichiers du projet" -#: kicad/menubar.cpp:302 +#: kicad/menubar.cpp:298 msgid "Refresh project tree" msgstr "Mettre à jour l'affichage du projet" -#: kicad/prjconfig.cpp:42 +#: kicad/prjconfig.cpp:39 msgid "Project template file not found " msgstr "Fichier modèle non trouvé" -#: kicad/prjconfig.cpp:73 +#: kicad/prjconfig.cpp:70 msgid "Create New Project" msgstr "Créer un Nouveau Projet" -#: kicad/prjconfig.cpp:78 +#: kicad/prjconfig.cpp:75 msgid "Open Existing Project" msgstr "Ouvrir un Projet Existant" -#: kicad/prjconfig.cpp:107 +#: kicad/prjconfig.cpp:104 msgid "Kicad project file <" msgstr "Fichier projet Kicad <" -#: kicad/prjconfig.cpp:121 -#: kicad/kicad.cpp:74 +#: kicad/prjconfig.cpp:118 +#: kicad/kicad.cpp:69 msgid "Working dir: " msgstr "Répertoire de travail: " -#: kicad/prjconfig.cpp:122 -#: kicad/kicad.cpp:75 +#: kicad/prjconfig.cpp:119 +#: kicad/kicad.cpp:70 msgid "" "\n" "Project: " @@ -11508,7 +11508,7 @@ msgstr "" "\n" "Créer Archive zippée <%s>" -#: kicad/mainframe.cpp:72 +#: kicad/mainframe.cpp:68 #, c-format msgid "" "Ready\n" @@ -11517,11 +11517,11 @@ msgstr "" "Prêt\n" "Répertoire de travail: %s\n" -#: kicad/mainframe.cpp:253 +#: kicad/mainframe.cpp:228 msgid "Text file (" msgstr "Fichier Texte (" -#: kicad/mainframe.cpp:255 +#: kicad/mainframe.cpp:230 msgid "Load File to Edit" msgstr "Fichier à Editer" @@ -11561,90 +11561,16 @@ msgstr "Fichier exécutable (" msgid "Select Prefered Editor" msgstr "Sélection Editeur Préféré" -#: kicad/tree_project_frame.cpp:157 -msgid "&Run" -msgstr "Exécute&r" - -#: kicad/tree_project_frame.cpp:167 -#: kicad/tree_project_frame.cpp:224 -msgid "&Edit in a text editor" -msgstr "Editer avec un éditeur de Texte" - -#: kicad/tree_project_frame.cpp:168 -msgid "&Open the file in a Text Editor" -msgstr "&Ouvrir le fichier avec un Editeur de texte" - -#: kicad/tree_project_frame.cpp:185 -msgid "New D&irectory" -msgstr "&Nouveau Répertoire" - -#: kicad/tree_project_frame.cpp:186 -msgid "Create a New Directory" -msgstr "Créer un nouveau Répertoire" - -#: kicad/tree_project_frame.cpp:195 -msgid "New P&ython Script" -msgstr "Nouveau Script P&ython" - -#: kicad/tree_project_frame.cpp:211 -msgid "&Rename file" -msgstr "&Renommer fichier" - -#: kicad/tree_project_frame.cpp:212 -#: kicad/tree_project_frame.cpp:214 -msgid "&Rename directory" -msgstr "&Renommer répertoire" - -#: kicad/tree_project_frame.cpp:213 -msgid "Rename file" -msgstr "Renommer fichier" - -#: kicad/tree_project_frame.cpp:225 -msgid "Open the file in a Text Editor" -msgstr "Ouvrir le fichier avec un Editeur de texte" - -#: kicad/tree_project_frame.cpp:233 -msgid "&Delete File" -msgstr "&Supprimer Fichier" - -#: kicad/tree_project_frame.cpp:234 -msgid "&Delete Directory" -msgstr "&Supprimer le Répertoire" - -#: kicad/tree_project_frame.cpp:235 -msgid "Delete the File" -msgstr "Supprimer le fichier" - -#: kicad/tree_project_frame.cpp:236 -msgid "&Delete the Directory and its content" -msgstr "Effacer le Répertoire et son contenu" - -#: kicad/tree_project_frame.cpp:511 -msgid "Create New File" -msgstr "Créer un Nouveau Fichier" - -#: kicad/tree_project_frame.cpp:512 -msgid "Create New Directory" -msgstr "Créer un nouveau Répertoire" - -#: kicad/tree_project_frame.cpp:1057 -msgid "Change filename: " -msgstr "Changer Nom Fichier: " - -#: kicad/tree_project_frame.cpp:1059 -msgid "Change filename" -msgstr "Changer Nom Fichier" - -#: kicad/class_treeproject_item.cpp:148 +#: kicad/class_treeproject_item.cpp:128 msgid "Unable to move file ... " msgstr "Impossible de déplacer le fichier " -#: kicad/class_treeproject_item.cpp:149 -#: kicad/class_treeproject_item.cpp:230 +#: kicad/class_treeproject_item.cpp:129 +#: kicad/class_treeproject_item.cpp:204 msgid "Permission error ?" msgstr "Erreur de permission ?" -#: kicad/class_treeproject_item.cpp:213 +#: kicad/class_treeproject_item.cpp:187 msgid "" "Changing file extension will change file type.\n" " Do you want to continue ?" @@ -11652,22 +11578,83 @@ msgstr "" "Changer l'extension changera le type de fichier.\n" "Voulez vous continuer ?" -#: kicad/class_treeproject_item.cpp:215 +#: kicad/class_treeproject_item.cpp:189 msgid "Rename File" msgstr "Renommer Fichier" -#: kicad/class_treeproject_item.cpp:229 +#: kicad/class_treeproject_item.cpp:203 msgid "Unable to rename file ... " msgstr "Impossible de renommer le fichier... " -#: kicad/class_treeproject_item.cpp:250 +#: kicad/class_treeproject_item.cpp:219 msgid "Do you really want to delete " msgstr "Voulez vous réellement effacer" -#: kicad/class_treeproject_item.cpp:251 +#: kicad/class_treeproject_item.cpp:220 msgid "Delete File" msgstr "Supprimer Fichier" +#: kicad/tree_project_frame.cpp:141 +msgid "New D&irectory" +msgstr "&Nouveau Répertoire" + +#: kicad/tree_project_frame.cpp:142 +msgid "Create a New Directory" +msgstr "Créer un nouveau Répertoire" + +#: kicad/tree_project_frame.cpp:157 +msgid "&Rename file" +msgstr "&Renommer fichier" + +#: kicad/tree_project_frame.cpp:158 +#: kicad/tree_project_frame.cpp:160 +msgid "&Rename directory" +msgstr "&Renommer répertoire" + +#: kicad/tree_project_frame.cpp:159 +msgid "Rename file" +msgstr "Renommer fichier" + +#: kicad/tree_project_frame.cpp:170 +msgid "&Edit in a text editor" +msgstr "Editer avec un éditeur de Texte" + +#: kicad/tree_project_frame.cpp:171 +msgid "Open the file in a Text Editor" +msgstr "Ouvrir le fichier avec un Editeur de texte" + +#: kicad/tree_project_frame.cpp:179 +msgid "&Delete File" +msgstr "&Supprimer Fichier" + +#: kicad/tree_project_frame.cpp:180 +msgid "&Delete Directory" +msgstr "&Supprimer le Répertoire" + +#: kicad/tree_project_frame.cpp:181 +msgid "Delete the File" +msgstr "Supprimer le fichier" + +#: kicad/tree_project_frame.cpp:182 +msgid "&Delete the Directory and its content" +msgstr "Effacer le Répertoire et son contenu" + +#: kicad/tree_project_frame.cpp:349 +msgid "Create New File" +msgstr "Créer un Nouveau Fichier" + +#: kicad/tree_project_frame.cpp:350 +msgid "Create New Directory" +msgstr "Créer un nouveau Répertoire" + +#: kicad/tree_project_frame.cpp:854 +msgid "Change filename: " +msgstr "Changer Nom Fichier: " + +#: kicad/tree_project_frame.cpp:856 +msgid "Change filename" +msgstr "Changer Nom Fichier" + #: gerbview/options.cpp:167 msgid "Gerbview Options" msgstr "Gerbview Options " @@ -12187,6 +12174,74 @@ msgstr "Couleurs" msgid "Error" msgstr "Erreur" +#: common/edaappl.cpp:108 +msgid "French" +msgstr "Français" + +#: common/edaappl.cpp:116 +msgid "Finnish" +msgstr "Finlandais" + +#: common/edaappl.cpp:124 +msgid "Spanish" +msgstr "Espagnol" + +#: common/edaappl.cpp:132 +msgid "Portuguese" +msgstr "Portugais" + +#: common/edaappl.cpp:140 +msgid "Italian" +msgstr "Italien" + +#: common/edaappl.cpp:148 +msgid "German" +msgstr "Allemand" + +#: common/edaappl.cpp:156 +msgid "Slovenian" +msgstr "Slovène" + +#: common/edaappl.cpp:164 +msgid "Hungarian" +msgstr "Hongrois" + +#: common/edaappl.cpp:172 +msgid "Polish" +msgstr "Polonais" + +#: common/edaappl.cpp:180 +msgid "Czech" +msgstr "Tchèque" + +#: common/edaappl.cpp:188 +msgid "Russian" +msgstr "Russe" + +#: common/edaappl.cpp:196 +msgid "Korean" +msgstr "Coréen" + +#: common/edaappl.cpp:204 +msgid "Chinese simplified" +msgstr "Chinois Simplifié" + +#: common/edaappl.cpp:212 +msgid "Catalan" +msgstr "Catalan" + +#: common/edaappl.cpp:220 +msgid "Dutch" +msgstr "Hollandais" + +#: common/edaappl.cpp:817 +msgid "Language" +msgstr "Langue" + +#: common/edaappl.cpp:818 +msgid "Select application language (only for testing!)" +msgstr "Choisir la langue (seulement pour tests!)" + #: common/zoom.cpp:185 msgid "Center" msgstr "Centrer" @@ -12236,74 +12291,6 @@ msgstr "Fichiers Modules Kicad (*.mod)|*.mod" msgid "Printed circuit board files (*.brd)|*.brd" msgstr "Fichiers circuits imprimés (*.brd)|*.brd" -#: common/edaappl.cpp:112 -msgid "French" -msgstr "Français" - -#: common/edaappl.cpp:120 -msgid "Finnish" -msgstr "Finlandais" - -#: common/edaappl.cpp:128 -msgid "Spanish" -msgstr "Espagnol" - -#: common/edaappl.cpp:136 -msgid "Portuguese" -msgstr "Portugais" - -#: common/edaappl.cpp:144 -msgid "Italian" -msgstr "Italien" - -#: common/edaappl.cpp:152 -msgid "German" -msgstr "Allemand" - -#: common/edaappl.cpp:160 -msgid "Slovenian" -msgstr "Slovène" - -#: common/edaappl.cpp:168 -msgid "Hungarian" -msgstr "Hongrois" - -#: common/edaappl.cpp:176 -msgid "Polish" -msgstr "Polonais" - -#: common/edaappl.cpp:184 -msgid "Czech" -msgstr "Tchèque" - -#: common/edaappl.cpp:192 -msgid "Russian" -msgstr "Russe" - -#: common/edaappl.cpp:200 -msgid "Korean" -msgstr "Coréen" - -#: common/edaappl.cpp:208 -msgid "Chinese simplified" -msgstr "Chinois Simplifié" - -#: common/edaappl.cpp:216 -msgid "Catalan" -msgstr "Catalan" - -#: common/edaappl.cpp:224 -msgid "Dutch" -msgstr "Hollandais" - -#: common/edaappl.cpp:824 -msgid "Language" -msgstr "Langue" - -#: common/edaappl.cpp:825 -msgid "Select application language (only for testing!)" -msgstr "Choisir la langue (seulement pour tests!)" - #: common/dsnlexer.cpp:168 msgid "in file" msgstr "dans le fichier" @@ -13002,6 +12989,12 @@ msgstr "Options d'Affichage" msgid "Page Settings" msgstr "Ajustage opt Page" +#~ msgid "&Run" +#~ msgstr "Exécute&r" +#~ msgid "&Open the file in a Text Editor" +#~ msgstr "&Ouvrir le fichier avec un Editeur de texte" +#~ msgid "New P&ython Script" +#~ msgstr "Nouveau Script P&ython" #~ msgid "noname" #~ msgstr "noname" #~ msgid "noname." diff --git a/kicad/kicad-python.cpp b/kicad/kicad-python.cpp deleted file mode 100644 index a6deedd4e5..0000000000 --- a/kicad/kicad-python.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/*****************************************************************************/ - -/** - * @file kicad.cpp - * @brief Main kicad library manager file - */ -/*****************************************************************************/ - - -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "fctsys.h" -#include "appl_wxstruct.h" -#include "common.h" -#include "bitmaps.h" -#include "colors.h" - - -#include "kicad.h" -#include "macros.h" - -#ifdef KICAD_PYTHON - #include -#endif - - -/* Import functions */ -char* GetFileName( char* FullPathName ); - -#ifdef KICAD_PYTHON -using namespace boost::python; - - -/*****************************************************************************/ - -// Global functions: -/*****************************************************************************/ -static WinEDA_MainFrame& GetMainFrame() -{ - return *( wxGetApp().m_MainFrame ); -} - - -static void WinEDAPrint( str msg ) -{ - GetMainFrame().PrintMsg( PyHandler::MakeStr( msg ) + wxT( "\n" ) ); -} - - -static void WinEDAClear() -{ - GetMainFrame().ClearMsg(); -} - - -static object GetTypeExt( enum TreeFileType type ) -{ - return PyHandler::Convert( TREE_PROJECT_FRAME::GetFileExt( type ) ); -} - - -/*****************************************************************************/ - -// WinEDA_MainFrame Special binding functions: -// (one line functions are simple wrappers) -/*****************************************************************************/ -object WinEDA_MainFrame::GetPrjName() const -{ - return PyHandler::Convert( m_PrjFileName ); -} - - -object WinEDA_MainFrame::ToWx() -{ - return object( handle<>( borrowed( wxPyMake_wxObject( this, false ) ) ) ); -} - - -TREE_PROJECT_FRAME* WinEDA_MainFrame::GetTree() const -{ - return m_LeftWin; -} - - -/** - * @brief TODO - */ -/*****************************************************************************/ -void WinEDA_MainFrame::AddFastLaunchPy( object& button ) -/*****************************************************************************/ -{ - wxBitmapButton* btn; - - bool success = wxPyConvertSwigPtr( button.ptr(), - (void**) &btn, _T( "wxBitmapButton" ) ); - - if( !success ) - return; - - Py_INCREF( button.ptr() ); - btn->Reparent( m_CommandWin ); - m_CommandWin->AddFastLaunch( btn ); -} - - -/*****************************************************************************/ - -// TREE_PROJECT_FRAME Special binding functions: -// (one line functions are simple wrappers) -/*****************************************************************************/ - -// TODO To WxWidgets ? -object TREE_PROJECT_FRAME::ToWx() -{ - return object( handle<>( borrowed( wxPyMake_wxObject( this, false ) ) ) ); -} - -// TODO Get ? -object TREE_PROJECT_FRAME::GetFtExPy( enum TreeFileType type ) const -{ - return PyHandler::Convert( GetFileExt( type ) ); -} - -// Get python menu -object TREE_PROJECT_FRAME::GetMenuPy( enum TreeFileType type ) -{ - return object( handle<>( borrowed( wxPyMake_wxObject( GetContextMenu( (int) type ), false ) ) ) ); -} - -// Get tree control -object TREE_PROJECT_FRAME::GetTreeCtrl() -{ - return object( handle<>( borrowed( wxPyMake_wxObject( m_TreeProject, false ) ) ) ); -} - -// Get current menu -object TREE_PROJECT_FRAME::GetCurrentMenu() -{ - return object( handle<>( borrowed( wxPyMake_wxObject( m_PopupMenu, false ) ) ) ); -} - - -/** - * @brief TODO - */ -/*****************************************************************************/ -void TREE_PROJECT_FRAME::NewFilePy( const str& name, - enum TreeFileType type, - object& id ) -/*****************************************************************************/ -{ - wxTreeItemId root; - - if( !wxPyConvertSwigPtr( id.ptr(), (void**) &root, _T( "wxTreeItemId" ) ) ) - return; - NewFile( PyHandler::MakeStr( name ), type, root ); -} - - -/** - * @brief Add a file to the tree under root, or m_root if conversion is wrong - */ -/*****************************************************************************/ -void TREE_PROJECT_FRAME::AddFilePy( const str& file, object& root ) -/*****************************************************************************/ -{ - wxTreeItemId* theroot = &m_root; - - if( !wxPyConvertSwigPtr( root.ptr(), (void**) &root, _T( "wxTreeItemId" ) ) ) - { - theroot = &m_root; - } - - AddFile( PyHandler::MakeStr( file ), *theroot ); -} - - -/** - * @brief convert wxTreeItem into TREEPROJECT_ITEM - */ -/*****************************************************************************/ -TREEPROJECT_ITEM* TREE_PROJECT_FRAME::GetItemData( const object& item ) -/*****************************************************************************/ -{ - wxTreeItemId* id = NULL; - - if( !wxPyConvertSwigPtr( item.ptr(), (void**) &id, _T( "wxTreeItemId" ) ) ) - { - return NULL; - } - - return dynamic_cast( m_TreeProject->GetItemData( *id ) ); -} - - -/*****************************************************************************/ - -// TREEPROJECT_ITEM Special binding functions -// (one line functions are simple wrappers) -/*****************************************************************************/ - -// Python rename -bool TREEPROJECT_ITEM::RenamePy( const str& newname, bool check ) -{ - return Rename( PyHandler::MakeStr( newname ), check ); -} - -// Get python directory -object TREEPROJECT_ITEM::GetDirPy() const -{ - return PyHandler::Convert( GetDir() ); -} - -// Get python filename -object TREEPROJECT_ITEM::GetFileNamePy() const -{ - return PyHandler::Convert( GetFileName() ); -} - -// Get python menu -object TREEPROJECT_ITEM::GetMenuPy() -{ - return object( handle<>( borrowed( wxPyMake_wxObject( &m_fileMenu, false ) ) ) ); -} - - -/** - * @brief KiCad python module init, \n - * This function is called from PyHandler to init the kicad module - */ -/*****************************************************************************/ -static void py_kicad_init() -/*****************************************************************************/ -{ - def( "GetMainFrame", &GetMainFrame, - return_value_policy< reference_existing_object >() ); - def( "GetTypeExtension", &GetTypeExt ); - - class_( "PrjItem" ) - - // Internal data: - .def( "GetFileName", &TREEPROJECT_ITEM::GetFileNamePy ) - .def( "GetDir", &TREEPROJECT_ITEM::GetDirPy ) - .def( "GetType", &TREEPROJECT_ITEM::GetType ) - .def( "GetId", &TREEPROJECT_ITEM::GetIdPy ) - .def( "GetMenu", &TREEPROJECT_ITEM::GetMenuPy ) - - // Item control - .def( "SetState", &TREEPROJECT_ITEM::SetState ) - .def( "Rename", &TREEPROJECT_ITEM::RenamePy ) - .def( "Move", &TREEPROJECT_ITEM::Move ) - .def( "Delete", &TREEPROJECT_ITEM::Delete ) - .def( "Activate", &TREEPROJECT_ITEM::Activate ) - ; - - enum_( "FileType" ) - .value( "PROJECT", TREE_PROJECT ) - .value( "SCHEMA", TREE_SCHEMA ) - .value( "BOARD", TREE_PCB ) - .value( "PYSCRIPT", TREE_PY ) - .value( "GERBER", TREE_GERBER ) - .value( "PDF", TREE_PDF ) - .value( "TXT", TREE_TXT ) - .value( "NETLIST", TREE_NET ) - .value( "UNKNOWN", TREE_UNKNOWN ) - .value( "DIRECTORY", TREE_DIRECTORY ) - .value( "MAX", TREE_MAX ); - - - class_( "TreeWindow" ) - - // wx Interface - .def( "ToWx", &TREE_PROJECT_FRAME::ToWx ) - - // common features - .def( "GetContextMenu", &TREE_PROJECT_FRAME::GetMenuPy ) - .def( "GetFileExtension", &TREE_PROJECT_FRAME::GetFtExPy ) - - // file filters control - .def( "AddFilter", &TREE_PROJECT_FRAME::AddFilter ) - .def( "ClearFilters", &TREE_PROJECT_FRAME::ClearFilters ) - .def( "RemoveFilter", &TREE_PROJECT_FRAME::RemoveFilterPy ) - .def( "GetFilters", &TREE_PROJECT_FRAME::GetFilters, - return_value_policy < copy_const_reference >() ) - .def( "GetCurrentMenu", &TREE_PROJECT_FRAME::GetCurrentMenu ) - - - /** Project tree control **/ - - // AddState - .def( "AddState", - &TREE_PROJECT_FRAME::AddStatePy ) - - // GetTreeCtrl - .def( "GetTreeCtrl", - &TREE_PROJECT_FRAME::GetTreeCtrl ) - - // GetItemData - .def( "GetItemData", - &TREE_PROJECT_FRAME::GetItemData, - return_value_policy < reference_existing_object >() ) - - // FindItemData - .def( "FindItemData", - &TREE_PROJECT_FRAME::FindItemData, - return_value_policy < reference_existing_object >() ) - - // NewFile - .def( "NewFile", - &TREE_PROJECT_FRAME::NewFilePy ) - - // AddFile - .def( "AddFile", - &TREE_PROJECT_FRAME::AddFilePy ) - - ; /* ENDOF class_( "TreeWindow" ) */ - - - class_( "MainFrame" ) - - // Wx interface - .def( "ToWx", &WinEDA_MainFrame::ToWx ) - - // Common controls - .def( "AddFastLaunch", &WinEDA_MainFrame::AddFastLaunchPy ) - .def( "Refresh", &WinEDA_MainFrame::OnRefreshPy ) - .def( "GetProjectName", &WinEDA_MainFrame::GetPrjName ) - .def( "GetProjectWindow", &WinEDA_MainFrame::GetTree, - return_value_policy< reference_existing_object >() ); -} - - -/** - * @brief Common python module init - */ -/*****************************************************************************/ -static void py_common_init() -/*****************************************************************************/ -{ - def( "Print", &WinEDAPrint ); - def( "Clear", &WinEDAClear ); -} - - -#endif - diff --git a/pcbnew/set_color.cpp.unused b/pcbnew/set_color.cpp.unused deleted file mode 100644 index b8c20a9165..0000000000 --- a/pcbnew/set_color.cpp.unused +++ /dev/null @@ -1,498 +0,0 @@ -/*****************/ -/* set_color.cpp */ -/*****************/ - -/*Set up the items and layer colors and show/no show options - */ - -#include "fctsys.h" -#include "gr_basic.h" -#include "common.h" -#include "class_drawpanel.h" - -#include "pcbnew.h" -#include "wxPcbStruct.h" -#include "class_board_design_settings.h" - -//#include "protos.h" - -// temporary variable used to handle grid visibility: -bool s_showGrid; - -#include "set_color.h" // Header file associated with this file - -// Local variables: -const int COLOR_COUNT = 40; // 40 = 29 (layers) + 11 (others) -int CurrentColor[COLOR_COUNT]; // Holds color for each layer while dialog box open - - -IMPLEMENT_DYNAMIC_CLASS( WinEDA_SetColorsFrame, wxDialog ) - -// Table of events for WinEDA_SetColorsFrame -BEGIN_EVENT_TABLE( WinEDA_SetColorsFrame, wxDialog ) - EVT_BUTTON( ID_COLOR_RESET_SHOW_LAYER_OFF, WinEDA_SetColorsFrame::ResetDisplayLayersCu ) - EVT_BUTTON( ID_COLOR_RESET_SHOW_LAYER_ON, WinEDA_SetColorsFrame::ResetDisplayLayersCu ) - EVT_COMMAND_RANGE( ID_COLOR_SETUP, ID_COLOR_SETUP + NB_BUTT - 1, - wxEVT_COMMAND_BUTTON_CLICKED, - WinEDA_SetColorsFrame::SetColor ) - EVT_BUTTON( wxID_OK, WinEDA_SetColorsFrame::OnOkClick ) - EVT_BUTTON( wxID_CANCEL, WinEDA_SetColorsFrame::OnCancelClick ) - EVT_BUTTON( wxID_APPLY, WinEDA_SetColorsFrame::OnApplyClick ) -END_EVENT_TABLE() - - -/*****************************************************/ -void DisplayColorSetupFrame( WinEDA_PcbFrame* parent, - const wxPoint& framepos ) -/*****************************************************/ -{ - WinEDA_SetColorsFrame* frame = - new WinEDA_SetColorsFrame( parent, framepos ); - - frame->ShowModal(); - frame->Destroy(); -} - - -// Default Constructor (whose provision is mandated by the inclusion -// of DECLARE_DYNAMIC_CLASS( WinEDA_SetColorsFrame ) within set_color.h) -WinEDA_SetColorsFrame::WinEDA_SetColorsFrame() -{ - Init(); -} - - -// Standard Constructor -WinEDA_SetColorsFrame::WinEDA_SetColorsFrame( WinEDA_PcbFrame* parent, - const wxPoint& framepos ) -{ - m_Parent = parent; - Init(); - Create( parent, - SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME, - SYMBOL_WINEDA_SETCOLORSFRAME_TITLE, - framepos, - wxDefaultSize, - SYMBOL_WINEDA_SETCOLORSFRAME_STYLE ); -} - - -// Destructor -WinEDA_SetColorsFrame::~WinEDA_SetColorsFrame() { } - - -/**********************************************************/ -bool WinEDA_SetColorsFrame::Create( wxWindow* parent, wxWindowID id, - const wxString& caption, const wxPoint& pos, - const wxSize& size, long style ) -/**********************************************************/ -{ - SetExtraStyle(wxWS_EX_BLOCK_EVENTS); - wxDialog::Create( parent, id, caption, pos, size, style ); - - CreateControls(); - if (GetSizer()) - { - GetSizer()->SetSizeHints(this); - } - return true; -} - - -/**********************************************************/ -void WinEDA_SetColorsFrame::Init() -/**********************************************************/ -{ - OuterBoxSizer = NULL; - MainBoxSizer = NULL; - FlexColumnBoxSizer = NULL; - Label = NULL; - RowBoxSizer = NULL; - BitmapButton = NULL; - CheckBox = NULL; - Button = NULL; - Line = NULL; - StdDialogButtonSizer = NULL; -} - - -/**********************************************************/ -void WinEDA_SetColorsFrame::CreateControls() -/**********************************************************/ -{ - int lyr, cln, butt_ID, buttcolor; - wxString msg; - wxSize CorrectRowSize; // Used while specifying height of various spacers - int ButtonHeight; // Used while specifying height of other spacers - - OuterBoxSizer = new wxBoxSizer(wxVERTICAL); - SetSizer(OuterBoxSizer); - - MainBoxSizer = new wxBoxSizer(wxHORIZONTAL); - OuterBoxSizer->Add(MainBoxSizer, 1, wxGROW|wxLEFT|wxRIGHT, 5); - - s_showGrid = m_Parent->m_Draw_Grid; - - // Add various items to the dialog box, as determined by the - // details of each element contained within laytool_list[] - for( lyr = 0, cln = 0; lyr < NB_BUTT; lyr++ ) - { - // Look for the first set of controls within each column. - if( lyr == 0 || lyr == laytool_index[cln]->m_Index + 1 ) - { - if( lyr != 0 ) - cln++; - - // Specify a FlexGrid sizer with nineteen rows and one column. - FlexColumnBoxSizer = new wxFlexGridSizer(19, 1, 0, 0); - - // Specify that all of the rows can be expanded. - for( int ii = 0; ii < 19; ii++ ) - { - FlexColumnBoxSizer->AddGrowableRow(ii); - } - - // Specify that the column can also be expanded. - FlexColumnBoxSizer->AddGrowableCol(0); - - MainBoxSizer->Add(FlexColumnBoxSizer, 1, wxGROW|wxLEFT|wxBOTTOM, 5); - - // Add a text string to identify the controls within this column. - Label = new wxStaticText( this, wxID_STATIC, wxGetTranslation(laytool_index[cln]->m_Name), - wxDefaultPosition, wxDefaultSize, 0 ); - - // Make this text string bold (so that it stands out better). - Label->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxNORMAL_FONT->GetFamily(), - wxNORMAL, wxBOLD, false, wxNORMAL_FONT->GetFaceName() ) ); - - FlexColumnBoxSizer->Add(Label, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5); - } - - // Provide a sizer to accomodate the (bitmap button and) checkbox associated with the - // current layer (while providing a spacer instead a button, when appropriate). - RowBoxSizer = new wxBoxSizer(wxHORIZONTAL); - FlexColumnBoxSizer->Add(RowBoxSizer, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5); - - butt_ID = ID_COLOR_SETUP + lyr; - laytool_list[lyr]->m_Id = butt_ID; - - if( laytool_list[lyr]->m_Color ) - { - // Provide a bitmap button, and "paint" this with the appropriate color. - wxMemoryDC iconDC; - wxBitmap ButtBitmap( BUTT_SIZE_X, BUTT_SIZE_Y ); - iconDC.SelectObject( ButtBitmap ); - buttcolor = *laytool_list[lyr]->m_Color & MASKCOLOR; - CurrentColor[lyr] = buttcolor; - wxBrush Brush; - iconDC.SelectObject( ButtBitmap ); - iconDC.SetPen( *wxBLACK_PEN ); - Brush.SetColour( - ColorRefs[buttcolor].m_Red, - ColorRefs[buttcolor].m_Green, - ColorRefs[buttcolor].m_Blue - ); - Brush.SetStyle( wxSOLID ); - - iconDC.SetBrush( Brush ); - iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y ); - - BitmapButton = new wxBitmapButton( this, butt_ID, - ButtBitmap, - wxDefaultPosition, - wxSize(BUTT_SIZE_X, BUTT_SIZE_Y) ); - laytool_list[lyr]->m_Button = BitmapButton; - - RowBoxSizer->Add(BitmapButton, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5); - } - else - { - // Provide a spacer instead (rather than a bitmap button). - RowBoxSizer->Add(BUTT_SIZE_X, BUTT_SIZE_Y, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5); - } - - //--------------------------------------------------------------- - // Note: When setting texts, we must call wxGetTranslation( ) for all statically created texts - // if we want them translated - switch( laytool_list[lyr]->m_Type ) - { - case type_layer: - msg = m_Parent->GetBoard()->GetLayerName( laytool_list[lyr]->m_LayerNumber ); - break; - - case type_via: - msg = wxGetTranslation( g_ViaType_Name[laytool_list[lyr]->m_LayerNumber] ); - break; - - default: - msg = wxGetTranslation( laytool_list[lyr]->m_Title ); - break; - } - - //--------------------------------------------------------------- - CheckBox = new wxCheckBox( this, ID_COLOR_CHECKBOX_ONOFF, msg, - wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); - - laytool_list[lyr]->m_CheckBox = CheckBox; - - //--------------------------------------------------------------- - - switch( laytool_list[lyr]->m_Type ) - { - case type_layer: - CheckBox->SetValue( g_DesignSettings.IsLayerVisible( laytool_list[lyr]->m_LayerNumber )); - CheckBox->Enable(g_DesignSettings.IsLayerEnabled( laytool_list[lyr]->m_LayerNumber ) ); - break; - - case type_via: - case type_element: - CheckBox->SetValue( g_DesignSettings.IsElementVisible( laytool_list[lyr]->m_LayerNumber )); - break; - - case type_visual: - CheckBox->SetValue( *laytool_list[lyr]->m_NoDisplay ); - break; - } - - RowBoxSizer->Add(CheckBox, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5); - - // Check whether the last (bitmap button and) checkbox has been provided for this column. - if( lyr == laytool_index[cln]->m_Index ) - { - // What happens now depends upon which column is currently being created. Another - // two (standard/non-bitmap) buttons are provided within the first column, while - // assorted spacers are added to each of the other two columns (so that if the - // dialog box is resized by the user, each of the controls within each of the - // columns will be repositioned in an aesthetically-acceptable manner). - if( cln == 0 ) - { - // Provide another two buttons; for aesthetic reasons, these will both be - // made equally wide. - - int GoodWidth, width0; - - // Specify the relevent details for the first button, but in the first instance, - // specify the caption which will be used by the second of these buttons (with - // the objective being to determine how wide those buttons would need to be to - // be able to accomodate the caption provided for either of them). - Button = new wxButton( this, ID_COLOR_RESET_SHOW_LAYER_ON, _("Show None"), - wxDefaultPosition, wxDefaultSize, 0 ); - - // Note the height of this button, so that the same height can also be specified for - // the spacers occupying the corresponding cells within each of the other two columns. - // Also note the width of the button required for the initially specified caption. - Button->GetSize( &width0, &ButtonHeight ); - - // Now change the caption of this button to what is really wanted for it. - Button->SetLabel( _("Show All") ); - - // Also note the width of the button required for the updated caption. - Button->GetSize( &GoodWidth, &ButtonHeight ); - - // Upate the value of GoodWidth if required (as that variable will subsequently - // be used to specify the (minimum) width for both of these buttons). - if( GoodWidth < width0 ) - GoodWidth = width0; - - // Complete the steps necessary for providing the first button. - if (WinEDA_SetColorsFrame::ShowToolTips()) - Button->SetToolTip( _("Switch on all of the copper layers") ); - Button->SetMinSize( wxSize( GoodWidth, ButtonHeight ) ); - FlexColumnBoxSizer->Add(Button, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5); - - // Now do everything required for providing the second button. - Button = new wxButton( this, ID_COLOR_RESET_SHOW_LAYER_OFF, _("Show None"), - wxDefaultPosition, wxDefaultSize, 0 ); - if (WinEDA_SetColorsFrame::ShowToolTips()) - Button->SetToolTip( _("Switch off all of the copper layers") ); - Button->SetMinSize( wxSize( GoodWidth, ButtonHeight ) ); - FlexColumnBoxSizer->Add(Button, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5); - } - else - { - // Provide additional spacers within each other column to occupy any cells - // that would otherwise remain unoccupied. - // - // Provide a spacer, of appropriate height, for each row that - // would otherwise contain a (bitmap button and) checkbox. - // - // First determine what height is required for those spacers; i.e. the - // larger of each bitmap button's height and each checkbox'es height. - // (That only needs to be determined once, so do so after the last - // bitmap button and checkbox have been provided for the second column.) - if( cln == 1 ) - { - CorrectRowSize = CheckBox->GetSize(); - if( CorrectRowSize.y < BUTT_SIZE_Y ) - CorrectRowSize.y = BUTT_SIZE_Y; - } - - // The first column contains 16 checkboxes, while each of the other two columns - // contains a smaller number. Determine how many checkboxes have actually been - // provided within each of the other columns, then provide an appropriate number - // of sizers (to take the total count of checkboxes and substitute sizers to 16). - for( int ii = lyr; ii < 16 + laytool_index[cln - 1]->m_Index - + lyr - laytool_index[cln]->m_Index; ii++ ) - { - FlexColumnBoxSizer->Add(5, CorrectRowSize.y, 1, wxBOTTOM, 5); - } - - // As the first column also contains two (standard/non-bitmap) buttons, while each of - // the other two columns doesn't, also provide yet another two spacers, each of button - // height, within each of the other two columns. - FlexColumnBoxSizer->Add(5, ButtonHeight, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP, 5); - FlexColumnBoxSizer->Add(5, ButtonHeight, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP, 5); - } - } - } - - // Provide a line to separate the controls which have been provided so far from - // the OK, Cancel, and Apply buttons (which will be provided after this line) - Line = new wxStaticLine( this, -1, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - OuterBoxSizer->Add(Line, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); - - // Provide a StdDialogButtonSizer to accommodate the OK, Cancel, and Apply - // buttons; using that type of sizer results in those buttons being - // automatically located in positions appropriate for each (OS) version of KiCad. - StdDialogButtonSizer = new wxStdDialogButtonSizer; - OuterBoxSizer->Add(StdDialogButtonSizer, 0, wxGROW|wxALL, 10); - - Button = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - Button = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - Button = new wxButton( this, wxID_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize, 0 ); - StdDialogButtonSizer->AddButton(Button); - - StdDialogButtonSizer->Realize(); - - // (Dialog now needs to be resized, but the associated command is provided elsewhere.) -} - - -/**********************************************************/ -bool WinEDA_SetColorsFrame::ShowToolTips() -/**********************************************************/ -{ - return true; -} - - -/**********************************************************************/ -void WinEDA_SetColorsFrame::OnOkClick( wxCommandEvent& WXUNUSED (event) ) -/**********************************************************************/ -{ - UpdateLayerSettings(); - m_Parent->DrawPanel->Refresh(); - EndModal( 1 ); -} - - -/*******************************************************************/ -void WinEDA_SetColorsFrame::OnCancelClick(wxCommandEvent& WXUNUSED(event)) -/*******************************************************************/ -{ - EndModal( -1 ); -} - - -/*******************************************************************/ -void WinEDA_SetColorsFrame::OnApplyClick(wxCommandEvent& WXUNUSED(event)) -/*******************************************************************/ -{ - UpdateLayerSettings(); - m_Parent->DrawPanel->Refresh(); -} - - -/**********************************************************/ -void WinEDA_SetColorsFrame::SetColor( wxCommandEvent& event ) -/**********************************************************/ -{ - int id = event.GetId(); - int color; - - wxBitmapButton* Button; - - color = DisplayColorFrame( this, - CurrentColor[id - ID_COLOR_SETUP] ); - - if( color < 0 ) - return; - - if( CurrentColor[id - ID_COLOR_SETUP] == color ) - return; - - CurrentColor[id - ID_COLOR_SETUP] = color; - wxMemoryDC iconDC; - - Button = laytool_list[id - ID_COLOR_SETUP]->m_Button; - - wxBitmap ButtBitmap = Button->GetBitmapLabel(); - iconDC.SelectObject( ButtBitmap ); - wxBrush Brush; - iconDC.SetPen( *wxBLACK_PEN ); - Brush.SetColour( - ColorRefs[color].m_Red, - ColorRefs[color].m_Green, - ColorRefs[color].m_Blue - ); - Brush.SetStyle( wxSOLID ); - - iconDC.SetBrush( Brush ); - iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y ); - Button->SetBitmapLabel( ButtBitmap ); - Button->Refresh(); - - Refresh( FALSE ); -} - - -/******************************************************************/ -void WinEDA_SetColorsFrame::UpdateLayerSettings() -/******************************************************************/ -{ - for( int lyr = 0; lyr < NB_BUTT; lyr++ ) - { - if( laytool_list[lyr]->m_Color ) - *laytool_list[lyr]->m_Color = CurrentColor[lyr]; - switch( laytool_list[lyr]->m_Type ) - { - case type_layer: - g_DesignSettings.SetLayerVisibility( laytool_list[lyr]->m_LayerNumber, - laytool_list[lyr]->m_CheckBox->GetValue() ); - break; - - case type_via: - case type_element: - g_DesignSettings.SetElementVisibility( laytool_list[lyr]->m_LayerNumber, - laytool_list[lyr]->m_CheckBox->GetValue() ); - break; - - case type_visual: - *laytool_list[lyr]->m_NoDisplay = laytool_list[lyr]->m_CheckBox->GetValue(); - break; - } - } - - // Additional command required for updating visibility of grid. - m_Parent->m_Draw_Grid = s_showGrid; -} - -/**********************************************************************/ -void WinEDA_SetColorsFrame::ResetDisplayLayersCu( wxCommandEvent& event ) -/**********************************************************************/ -{ - bool NewState = ( event.GetId() == ID_COLOR_RESET_SHOW_LAYER_ON ) - ? TRUE - : FALSE; - - for( int lyr = 0; lyr < 16; lyr++ ) - { - if( ! laytool_list[lyr]->m_CheckBox->IsEnabled() ) - continue; - laytool_list[lyr]->m_CheckBox->SetValue( NewState ); - } -} diff --git a/pcbnew/set_color.h.unused b/pcbnew/set_color.h.unused deleted file mode 100644 index 9a80ccab71..0000000000 --- a/pcbnew/set_color.h.unused +++ /dev/null @@ -1,571 +0,0 @@ -/***************/ -/* set_color.h */ -/***************/ - -#ifndef SET_COLOR_H -#define SET_COLOR_H - -#include "wx/statline.h" - -class wxBoxSizer; -class wxFlexGridSizer; -class wxStaticLine; -class wxStdDialogButtonSizer; - -// variable used to handle grid visibility: -extern bool s_showGrid; - -// Specify how many elements are contained within laytool_list[] -const int NB_BUTT = 43; - -// Specify how many elements are contained within laytool_index[] -const int BUTTON_GROUPS = 3; - -// Specify the numbers associated with assorted controls -enum col_sel_id { - ID_DIALOG = 1800, - ID_COLOR_RESET_SHOW_LAYER_ON, - ID_COLOR_RESET_SHOW_LAYER_OFF, - ID_COLOR_CHECKBOX_ONOFF, - ID_COLOR_SETUP -}; - -// Control identifiers -// #define SYMBOL_WINEDA_SETCOLORSFRAME_STYLE wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER -#define SYMBOL_WINEDA_SETCOLORSFRAME_STYLE wxDEFAULT_DIALOG_STYLE|MAYBE_RESIZE_BORDER -#define SYMBOL_WINEDA_SETCOLORSFRAME_TITLE _("Pcbnew Layer Colors:") -#define SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME ID_DIALOG -// #define SYMBOL_WINEDA_SETCOLORSFRAME_SIZE wxSize(400, 300) -// #define SYMBOL_WINEDA_SETCOLORSFRAME_POSITION wxDefaultPosition - -#ifndef wxCLOSE_BOX -#define wxCLOSE_BOX 0x1000 -#endif - -// Specify the width and height of every (color-displaying / bitmap) button -const int BUTT_SIZE_X = 25; -const int BUTT_SIZE_Y = 20; - -/* Macro utile : */ -#define ADR( numlayer ) &g_DesignSettings.m_LayerColor[(numlayer)] - - -/**********************************/ -/* Liste des menus de Menu_Layers */ -/**********************************/ - -enum button_types -{ - type_layer, - type_via, - type_element, - type_visual -}; - - -struct ColorButton -{ - int m_Type; /// - const wxString m_Title; - int m_LayerNumber; - int* m_Color; ///< pointer to color variable to manipulate - bool* m_NoDisplay; ///< pointer to the on/off display control variable, if it is not the color variable - - int m_Id; - wxBitmapButton* m_Button; -// int m_State; // (Commented out until when it is actually used.) - wxCheckBox* m_CheckBox; ///< Display ON/OFF toggle -}; - -struct ButtonIndex -{ - wxString m_Name; // Title - int m_Index; // Index to last bitmap button in group -}; - - -static ButtonIndex Msg_Layers_Cu = -{ - _( "Copper Layers" ), // Title - 15 // Index to last bitmap button in group -}; - -static ColorButton Layer_1_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - LAYER_N_BACK, // Layer - ADR( LAYER_N_BACK ) // Address of optional parameter -}; - -static ColorButton Layer_2_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 1, // Layer - ADR( 1 ) // Address of optional parameter -}; - -static ColorButton Layer_3_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 2, // Layer - ADR( 2 ) // Address of optional parameter -}; - -static ColorButton Layer_4_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 3, // Layer - ADR( 3 ) // Address of optional parameter -}; - -static ColorButton Layer_5_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 4, // Layer - ADR( 4 ) // Address of optional parameter -}; - -static ColorButton Layer_6_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 5, // Layer - ADR( 5 ) // Address of optional parameter -}; - -static ColorButton Layer_7_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 6, // Layer - ADR( 6 ) // Address of optional parameter -}; - -static ColorButton Layer_8_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 7, // Layer - ADR( 7 ) // Address of optional parameter -}; - -static ColorButton Layer_9_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 8, // Layer - ADR( 8 ) // Address of optional parameter -}; - -static ColorButton Layer_10_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 9, // Layer - ADR( 9 ) // Address of optional parameter -}; - -static ColorButton Layer_11_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 10, // Layer - ADR( 10 ) // Address of optional parameter -}; - -static ColorButton Layer_12_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 11, // Layer - ADR( 11 ) // Address of optional parameter -}; - -static ColorButton Layer_13_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 12, // Layer - ADR( 12 ) // Address of optional parameter -}; - -static ColorButton Layer_14_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 13, // Layer - ADR( 13 ) // Address of optional parameter -}; - -static ColorButton Layer_15_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - 14, // Layer - ADR( 14 ) // Address of optional parameter -}; - -static ColorButton Layer_16_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - LAYER_N_FRONT, // Layer - ADR( LAYER_N_FRONT ) // Address of optional parameter -}; - - -static ButtonIndex Msg_Layers_Tech = -{ - _( "Tech Layers" ), // Title - 28 // Index to last bitmap button in group -}; - -static ColorButton Layer_17_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - ADHESIVE_N_BACK, // Layer - ADR( ADHESIVE_N_BACK ) // Address of optional parameter -}; - -static ColorButton Layer_18_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - ADHESIVE_N_FRONT, // Layer - ADR( ADHESIVE_N_FRONT ) // Address of optional parameter -}; - -static ColorButton Layer_19_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SOLDERPASTE_N_BACK, // Layer - ADR( SOLDERPASTE_N_BACK ) // Address of optional parameter -}; - -static ColorButton Layer_20_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SOLDERPASTE_N_FRONT, // Layer - ADR( SOLDERPASTE_N_FRONT ), // Address of optional parameter -}; - -static ColorButton Layer_21_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SILKSCREEN_N_BACK, // Layer - ADR( SILKSCREEN_N_BACK ) // Address of optional parameter -}; - -static ColorButton Layer_22_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SILKSCREEN_N_FRONT, // Layer - ADR( SILKSCREEN_N_FRONT ) // Address of optional parameter -}; - -static ColorButton Layer_23_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SOLDERMASK_N_BACK, // Layer - ADR( SOLDERMASK_N_BACK ) // Address of optional parameter -}; - -static ColorButton Layer_24_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - SOLDERMASK_N_FRONT, // Layer - ADR( SOLDERMASK_N_FRONT ) // Address of optional parameter -}; - -static ColorButton Layer_25_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - DRAW_N, // Layer - ADR( DRAW_N ) // Address of optional parameter -}; - -static ColorButton Layer_26_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - COMMENT_N, // Layer - ADR( COMMENT_N ) // Address of optional parameter -}; - -static ColorButton Layer_27_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - ECO1_N, // Layer - ADR( ECO1_N ) // Address of optional parameter -}; - -static ColorButton Layer_28_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - ECO2_N, // Layer - ADR( ECO2_N ) // Address of optional parameter -}; - -static ColorButton Layer_29_Butt = -{ - type_layer, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - EDGE_N, // Layer - ADR( EDGE_N ) // Address of optional parameter -}; - - -static ButtonIndex Msg_Others_Items = -{ - _( "Others" ), // Title - 43 // Index to last bitmap button in group -}; - -static ColorButton VIA_THROUGH_Butt = -{ - type_via, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - VIA_THROUGH, // Layer - &g_DesignSettings.m_ViaColor[VIA_THROUGH] // Address of optional parameter -}; - -static ColorButton VIA_BLIND_BURIED_Butt = -{ - type_via, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - VIA_BLIND_BURIED, // Layer - &g_DesignSettings.m_ViaColor[VIA_BLIND_BURIED] // Address of optional parameter -}; - -static ColorButton MICRO_VIA_Butt = -{ - type_via, // Toggle ITEM_NOT_SHOW bit of the color variable - wxEmptyString, - VIA_MICROVIA, // Layer - &g_DesignSettings.m_ViaColor[VIA_MICROVIA] // Address of optional parameter -}; - -static ColorButton Ratsnest_Butt = -{ - type_visual, - _( "Ratsnest" ), // Title - -1, - &g_DesignSettings.m_RatsnestColor, // Address of optional parameter - &g_Show_Ratsnest // Address of boolean display control parameter to toggle -}; - -static ColorButton Pad_Cu_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variable - _( "Pad Back" ), // Title - PAD_BK_VISIBLE, - &g_PadCUColor // Address of optional parameter -}; - -static ColorButton Pad_Cmp_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variable - _( "Pad Front" ), // Title - PAD_FR_VISIBLE, - &g_PadCMPColor // Address of optional parameter -}; - -static ColorButton Text_Mod_Cu_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variable - _( "Text Module Back" ), // Title - MOD_TEXT_BK_VISIBLE, - &g_ModuleTextCUColor // Address of optional parameter -}; - -static ColorButton Text_Mod_Cmp_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variable - _( "Text Module Front" ), // Title - MOD_TEXT_FR_VISIBLE, - &g_ModuleTextCMPColor // Address of optional parameter -}; - -static ColorButton Text_Mod_NoVisible_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variable - _( "Text Module invisible" ), // Title - MOD_TEXT_INVISIBLE, - &g_ModuleTextNOVColor // Address of optional parameter -}; - -static ColorButton Anchors_Butt = -{ - type_element, // Toggle ITEM_NOT_SHOW bit of the color variableg_ModuleTextNOVColor - _( "Anchors" ), // Title - ANCHOR_VISIBLE, - &g_AnchorColor // Address of optional parameter -}; - -static ColorButton Grid_Butt = -{ - type_visual, - _( "Grid" ), // Title - -1, - &g_GridColor, // Address of optional parameter - &s_showGrid // Address of boolean display control parameter to toggle -}; - -static ColorButton Show_Pads_Noconnect_Butt = -{ - type_visual, - _( "Show Noconnect" ), // Title - -1, - NULL, // Address of optional parameter - &DisplayOpt.DisplayPadNoConn // Address of boolean display control parameter to toggle -}; - -static ColorButton Show_Modules_Cmp_Butt = -{ - type_visual, - _( "Show Modules Front" ), // Title - -1, - NULL, // Address of optional parameter - &DisplayOpt.Show_Modules_Cmp // Address of boolean display control parameter to toggle -}; - -static ColorButton Show_Modules_Cu_Butt = -{ - type_visual, - _( "Show Modules Back" ), // Title - -1, - NULL, // Address of optional parameter - &DisplayOpt.Show_Modules_Cu // Address of boolean display control parameter to toggle -}; - - -static ColorButton* laytool_list[] = { - &Layer_1_Butt, - &Layer_2_Butt, - &Layer_3_Butt, - &Layer_4_Butt, - &Layer_5_Butt, - &Layer_6_Butt, - &Layer_7_Butt, - &Layer_8_Butt, - &Layer_9_Butt, - &Layer_10_Butt, - &Layer_11_Butt, - &Layer_12_Butt, - &Layer_13_Butt, - &Layer_14_Butt, - &Layer_15_Butt, - &Layer_16_Butt, - - &Layer_17_Butt, - &Layer_18_Butt, - &Layer_19_Butt, - &Layer_20_Butt, - &Layer_21_Butt, - &Layer_22_Butt, - &Layer_23_Butt, - &Layer_24_Butt, - &Layer_25_Butt, - &Layer_26_Butt, - &Layer_27_Butt, - &Layer_28_Butt, - &Layer_29_Butt, -// &Layer_30_Butt, -// &Layer_31_Butt, -// &Layer_32_Butt, - - &VIA_THROUGH_Butt, - &VIA_BLIND_BURIED_Butt, - &MICRO_VIA_Butt, - &Ratsnest_Butt, - &Pad_Cu_Butt, - &Pad_Cmp_Butt, - &Text_Mod_Cu_Butt, - &Text_Mod_Cmp_Butt, - &Text_Mod_NoVisible_Butt, - &Anchors_Butt, - &Grid_Butt, - - &Show_Pads_Noconnect_Butt, - &Show_Modules_Cmp_Butt, - &Show_Modules_Cu_Butt, -}; - - -static ButtonIndex* laytool_index[BUTTON_GROUPS] = { - &Msg_Layers_Cu, - &Msg_Layers_Tech, - &Msg_Others_Items -}; - - -/**************************************************************/ -/* classe derivee pour la frame de Configuration des couleurs */ -/**************************************************************/ - -class WinEDA_SetColorsFrame: public wxDialog -{ -private: - DECLARE_DYNAMIC_CLASS( WinEDA_SetColorsFrame ) - DECLARE_EVENT_TABLE() - - WinEDA_PcbFrame* m_Parent; - wxBoxSizer* OuterBoxSizer; - wxBoxSizer* MainBoxSizer; - wxFlexGridSizer* FlexColumnBoxSizer; - wxStaticText* Label; - wxBoxSizer* RowBoxSizer; - wxBitmapButton* BitmapButton; - wxCheckBox* CheckBox; - wxButton* Button; - wxStaticLine* Line; - wxStdDialogButtonSizer* StdDialogButtonSizer; - - // Creation - bool Create( wxWindow* parent, - wxWindowID id = SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME, - const wxString& caption = SYMBOL_WINEDA_SETCOLORSFRAME_TITLE, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = SYMBOL_WINEDA_SETCOLORSFRAME_STYLE ); - - // Initialises member variables - void Init(); - - // Creates the controls and sizers - void CreateControls(); - - wxBitmap GetBitmapResource( const wxString& name ); - wxIcon GetIconResource( const wxString& name ); - static bool ShowToolTips(); - - void SetColor( wxCommandEvent& event ); - void OnOkClick( wxCommandEvent& event ); - void OnCancelClick( wxCommandEvent& event ); - void OnApplyClick( wxCommandEvent& event ); - void UpdateLayerSettings(); - void ResetDisplayLayersCu( wxCommandEvent& event ); - -public: - // Constructors and destructor - WinEDA_SetColorsFrame(); - WinEDA_SetColorsFrame( WinEDA_PcbFrame* parent, const wxPoint& framepos ); - ~WinEDA_SetColorsFrame(); -}; - -#endif // SET_COLOR_H diff --git a/pcbnew/via_edit.cpp.unused b/pcbnew/via_edit.cpp.unused deleted file mode 100644 index 168fa44832..0000000000 --- a/pcbnew/via_edit.cpp.unused +++ /dev/null @@ -1,112 +0,0 @@ -/**********************************************/ -/* vi_edit.cpp: some editing function for vias */ -/**********************************************/ - -#include "fctsys.h" -#include "common.h" -#include "class_drawpanel.h" -#include "confirm.h" -#include "pcbnew.h" -#include "wxPcbStruct.h" -#include "class_board_design_settings.h" -#include "pcbnew_id.h" - - -/**********************************************************************************/ -void WinEDA_PcbFrame::Via_Edit_Control( wxCommandEvent& event ) -/**********************************************************************************/ - -/* - * Execute edit commands relative to vias - */ -{ - TRACK* via_struct; - SEGVIA* via = (SEGVIA*) GetCurItem(); - wxClientDC dc( DrawPanel ); - DrawPanel->CursorOff( &dc ); - DrawPanel->PrepareGraphicContext( &dc ); - - wxASSERT( via->Type() == TYPE_VIA); - - PICKED_ITEMS_LIST itemsListPicker; - ITEM_PICKER picker( NULL, UR_CHANGED ); - - switch( event.GetId() ) - { - case ID_POPUP_PCB_VIA_HOLE_TO_VALUE: // Set the via drill to custom - if( (GetBoard()->GetCurrentViaDrill() > 0) && - (GetBoard()->GetCurrentViaDrill() < via->m_Width) ) - { - SaveCopyInUndoList(via, UR_CHANGED); - via->Draw( DrawPanel, &dc, GR_XOR ); - via->SetDrillValue( GetBoard()->GetCurrentViaDrill() ); - via->Draw( DrawPanel, &dc, GR_OR ); - GetScreen()->SetModify(); - } - else - DisplayError( this, _( "Incorrect value for Via drill. No via drill change" ) ); - break; - - case ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS: // Export the current drill value to via which have the same size - via_struct = GetBoard()->m_Track; - for( ; via_struct != NULL; via_struct = via_struct->Next() ) - { - if( via_struct->Type() == TYPE_VIA ) /* mise a jour du diametre de la via */ - { - if( via_struct->m_Width != via->m_Width ) - continue; - picker.m_PickedItem = via_struct; - picker.m_Link = via_struct->Copy(); - itemsListPicker.PushItem(picker); - via_struct->Draw( DrawPanel, &dc, GR_XOR ); - via_struct->SetDrillValue( via->GetDrillValue() ); - via_struct->Draw( DrawPanel, &dc, GR_OR ); - } - } - SaveCopyInUndoList(itemsListPicker, UR_CHANGED); - - GetScreen()->SetModify(); - break; - - case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT: - SaveCopyInUndoList(via, UR_CHANGED); - via->Draw( DrawPanel, &dc, GR_XOR ); - via->SetDrillDefault(); - via->Draw( DrawPanel, &dc, GR_OR ); - GetScreen()->SetModify(); - break; - - case ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT: // Reset all via drill to default value - via_struct = GetBoard()->m_Track; - for( ; via_struct != NULL; via_struct = via_struct->Next() ) - { - if( via_struct->Type() == TYPE_VIA ) /* Update via drill */ - { - if( ! via_struct->IsDrillDefault() ) - { - picker.m_PickedItem = via_struct; - picker.m_Link = via_struct->Copy(); - itemsListPicker.PushItem(picker); - via_struct->Draw( DrawPanel, &dc, GR_XOR ); - via_struct->SetDrillDefault(); - via_struct->Draw( DrawPanel, &dc, GR_OR ); - } - } - } - SaveCopyInUndoList(itemsListPicker, UR_CHANGED); - - GetScreen()->SetModify(); - break; - - case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE: // Enter a new alternate value for drill via - wxMessageBox( wxT( "WinEDA_PcbFrame::Via_Edit_Control(): obsolete command" ) ); - break; - - default: - wxMessageBox( wxT( "WinEDA_PcbFrame::Via_Edit_Control() error: unknown command" ) ); - break; - } - - DrawPanel->CursorOn( &dc ); - DrawPanel->MouseToCursorSchema(); -} diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index 0430747c05..97d25c41ef 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -577,7 +577,7 @@ void WinEDA_PcbFrame::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) wildcard = _( "Component files (." ) + NetCmpExtBuffer + wxT( ")|*." ) + NetCmpExtBuffer; - wxFileDialog dlg( this, _( "Save Component Files" ), wxEmptyString, + wxFileDialog dlg( this, _( "Save Component Files" ), wxGetCwd(), fn.GetFullName(), wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); diff --git a/version.txt b/version.txt index f45ea09e8c..b028de4cec 100644 --- a/version.txt +++ b/version.txt @@ -1,4 +1,4 @@ release version: -2010 feb 26 +2010 feb 28 files (.zip,.tgz): -kicad-2010-02-26-RC5 +kicad-2010-02-28-RC5