From f5eae50680b1cc0f4510140a1e7dd42f0c70384b Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Thu, 30 Aug 2007 08:15:05 +0000 Subject: [PATCH] more work on hotkeys. many features are ok. --- change_log.txt | 9 + common/hotkeys_basic.cpp | 735 ++++++++++++++++++++---------------- eeschema/controle.cpp | 10 +- eeschema/eeschema.cpp | 124 +++--- eeschema/hotkeys.cpp | 582 ++++++++++++++++------------- eeschema/hotkeys.h | 35 ++ eeschema/onrightclick.cpp | 18 +- eeschema/tool_lib.cpp | 391 +++++++++---------- eeschema/tool_sch.cpp | 423 +++++++++++---------- include/build_version.h | 2 +- include/hotkeys_basic.h | 37 +- internat/fr/kicad.mo | Bin 131327 -> 131440 bytes internat/fr/kicad.po | 748 +++++++++++++++++++------------------ pcbnew/class_pad.cpp | 91 +++-- pcbnew/class_pad.h | 103 ++--- pcbnew/controle.cpp | 76 ---- pcbnew/dialog_pad_edit.cpp | 89 ++--- pcbnew/dialog_pad_edit.h | 11 +- pcbnew/dialog_pad_edit.pjd | 198 ++++++++-- pcbnew/editpads.cpp | 9 - pcbnew/files.cpp | 14 +- pcbnew/hotkeys.cpp | 671 +++++++++++++++++++-------------- pcbnew/hotkeys.h | 45 +++ pcbnew/menubarpcb.cpp | 4 +- pcbnew/pcbnew.cpp | 5 +- pcbnew/tool_modedit.cpp | 423 +++++++++++---------- pcbnew/tool_pcb.cpp | 27 +- 27 files changed, 2657 insertions(+), 2223 deletions(-) create mode 100644 eeschema/hotkeys.h create mode 100644 pcbnew/hotkeys.h diff --git a/change_log.txt b/change_log.txt index 27fabc95a3..68b17e01c6 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-aug-30 UPDATE Jean-Pierre Charras +================================================================================ ++ eeschema & pcbnew + more about programmable hotkeys. + Most existing hotkeys are programmable and displayed in popup menus or tools + Work still in progress but most features are ok. + some features are not fixed (mainly the configuration files path, which is + currently the home directory under unix systems and kicad/template under windows)) + 2007-Aug-29 UPDATE Dick Hollenbeck ================================================================================ diff --git a/common/hotkeys_basic.cpp b/common/hotkeys_basic.cpp index 6b856a7ea7..d3ea61c264 100644 --- a/common/hotkeys_basic.cpp +++ b/common/hotkeys_basic.cpp @@ -1,9 +1,9 @@ - /*********************/ - /* hotkeys_basic.cpp */ - /*********************/ +/*********************/ +/* hotkeys_basic.cpp */ +/*********************/ /* Some functions to handle hotkeys in kicad -*/ + */ #include "fctsys.h" #include "common.h" #include "wxstruct.h" @@ -11,384 +11,477 @@ #include "macros.h" /* Class to handle hotkey commnands. hotkeys have a default value -This class allows (for the future..) the real key code changed by user(from a key code list file, TODO) -*/ + * This class allows (for the future..) the real key code changed by user(from a key code list file, TODO) + */ -Ki_HotkeyInfo::Ki_HotkeyInfo(const wxChar * infomsg, int idcommand, int keycode) +Ki_HotkeyInfo::Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode ) { - m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key - m_InfoMsg = infomsg; // info message. - m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) + m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key + m_InfoMsg = infomsg; // info message. + m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) } + /* class to handle the printable name and the keycode -*/ -struct hotkey_name_descr { - wxChar * m_Name; - int m_KeyCode; + */ +struct hotkey_name_descr +{ + wxChar* m_Name; + int m_KeyCode; }; -struct hotkey_name_descr s_Notkey_Name_List[] = { - {wxT("F1"), WXK_F1}, - {wxT("F2"), WXK_F2}, - {wxT("F3"), WXK_F3}, - {wxT("F4"), WXK_F4}, - {wxT("F5"), WXK_F5}, - {wxT("F6"), WXK_F6}, - {wxT("F7"), WXK_F7}, - {wxT("F8"), WXK_F8}, - {wxT("F9"), WXK_F9}, - {wxT("F10"), WXK_F10}, - {wxT("F11"), WXK_F11}, - {wxT("F12"), WXK_F12}, +struct hotkey_name_descr s_Hotkey_Name_List[] = +{ + { wxT( "F1" ), WXK_F1 }, + { wxT( "F2" ), WXK_F2 }, + { wxT( "F3" ), WXK_F3 }, + { wxT( "F4" ), WXK_F4 }, + { wxT( "F5" ), WXK_F5 }, + { wxT( "F6" ), WXK_F6 }, + { wxT( "F7" ), WXK_F7 }, + { wxT( "F8" ), WXK_F8 }, + { wxT( "F9" ), WXK_F9 }, + { wxT( "F10" ), WXK_F10 }, + { wxT( "F11" ), WXK_F11 }, + { wxT( "F12" ), WXK_F12 }, - {wxT("Esc"), WXK_ESCAPE}, - {wxT("Delete"), WXK_DELETE}, - {wxT("Esc"), WXK_ESCAPE}, - {wxT("Tab"), '\t'}, - {wxT("Backspace"), WXK_BACK}, - {wxT("Insert"), WXK_INSERT}, + { wxT( "Esc" ), WXK_ESCAPE }, + { wxT( "Delete" ), WXK_DELETE }, + { wxT( "Esc" ), WXK_ESCAPE }, + { wxT( "Tab" ), '\t' }, + { wxT( "Backspace" ), WXK_BACK }, + { wxT( "Insert" ), WXK_INSERT }, - {wxT("End"), WXK_END}, - {wxT("Page Up"), WXK_PAGEUP}, - {wxT("Page Down"), WXK_PAGEDOWN}, - {wxT("+"), WXK_ADD}, - {wxT("-"), WXK_SUBTRACT}, + { wxT( "End" ), WXK_END }, + { wxT( "Page Up" ), WXK_PAGEUP }, + { wxT( "Page Down" ), WXK_PAGEDOWN }, + { wxT( "+" ), WXK_ADD }, + { wxT( "-" ), WXK_SUBTRACT }, - {wxT("space"), ' '}, - {wxT("?"), '?'}, - {wxT("A"), 'A'}, - {wxT("B"), 'B'}, - {wxT("C"), 'C'}, - {wxT("D"), 'D'}, - {wxT("E"), 'E'}, - {wxT("F"), 'F'}, - {wxT("G"), 'G'}, - {wxT("H"), 'H'}, - {wxT("I"), 'I'}, - {wxT("J"), 'J'}, - {wxT("K"), 'K'}, - {wxT("L"), 'L'}, - {wxT("M"), 'M'}, - {wxT("N"), 'N'}, - {wxT("O"), 'O'}, - {wxT("P"), 'P'}, - {wxT("Q"), 'Q'}, - {wxT("R"), 'R'}, - {wxT("S"), 'S'}, - {wxT("T"), 'T'}, - {wxT("U"), 'U'}, - {wxT("V"), 'V'}, - {wxT("W"), 'W'}, - {wxT("X"), 'X'}, - {wxT("Y"), 'Y'}, - {wxT("Z"), 'Z'}, + { wxT( "Up" ), WXK_UP }, + { wxT( "Down" ), WXK_DOWN }, + { wxT( "Left" ), WXK_LEFT }, + { wxT( "Right" ), WXK_RIGHT }, - {wxT("Ctrl A"), GR_KB_CTRL + 'A'}, - {wxT("Ctrl B"), GR_KB_CTRL + 'B'}, - {wxT("Ctrl C"), GR_KB_CTRL + 'C'}, - {wxT("Ctrl D"), GR_KB_CTRL + 'D'}, - {wxT("Ctrl E"), GR_KB_CTRL + 'E'}, - {wxT("Ctrl F"), GR_KB_CTRL + 'F'}, - {wxT("Ctrl G"), GR_KB_CTRL + 'G'}, - {wxT("Ctrl H"), GR_KB_CTRL + 'H'}, - {wxT("Ctrl I"), GR_KB_CTRL + 'I'}, - {wxT("Ctrl J"), GR_KB_CTRL + 'J'}, - {wxT("Ctrl K"), GR_KB_CTRL + 'K'}, - {wxT("Ctrl L"), GR_KB_CTRL + 'L'}, - {wxT("Ctrl M"), GR_KB_CTRL + 'M'}, - {wxT("Ctrl N"), GR_KB_CTRL + 'N'}, - {wxT("Ctrl O"), GR_KB_CTRL + 'O'}, - {wxT("Ctrl P"), GR_KB_CTRL + 'P'}, - {wxT("Ctrl Q"), GR_KB_CTRL + 'Q'}, - {wxT("Ctrl R"), GR_KB_CTRL + 'R'}, - {wxT("Ctrl S"), GR_KB_CTRL + 'S'}, - {wxT("Ctrl T"), GR_KB_CTRL + 'T'}, - {wxT("Ctrl U"), GR_KB_CTRL + 'U'}, - {wxT("Ctrl V"), GR_KB_CTRL + 'V'}, - {wxT("Ctrl W"), GR_KB_CTRL + 'W'}, - {wxT("Ctrl X"), GR_KB_CTRL + 'X'}, - {wxT("Ctrl Y"), GR_KB_CTRL + 'Y'}, - {wxT("Ctrl Z"), GR_KB_CTRL + 'Z'}, + { wxT( "space" ), ' ' }, + { wxT( "?" ), '?' }, + { wxT( "!" ), '!' }, + { wxT( ":" ), ':' }, + { wxT( "," ), ',' }, + { wxT( "*" ), '*' }, + { wxT( "+" ), '+' }, + { wxT( "-" ), '-' }, + { wxT( "\%" ), '%' }, + { wxT( "A" ), 'A' }, + { wxT( "B" ), 'B' }, + { wxT( "C" ), 'C' }, + { wxT( "D" ), 'D' }, + { wxT( "E" ), 'E' }, + { wxT( "F" ), 'F' }, + { wxT( "G" ), 'G' }, + { wxT( "H" ), 'H' }, + { wxT( "I" ), 'I' }, + { wxT( "J" ), 'J' }, + { wxT( "K" ), 'K' }, + { wxT( "L" ), 'L' }, + { wxT( "M" ), 'M' }, + { wxT( "N" ), 'N' }, + { wxT( "O" ), 'O' }, + { wxT( "P" ), 'P' }, + { wxT( "Q" ), 'Q' }, + { wxT( "R" ), 'R' }, + { wxT( "S" ), 'S' }, + { wxT( "T" ), 'T' }, + { wxT( "U" ), 'U' }, + { wxT( "V" ), 'V' }, + { wxT( "W" ), 'W' }, + { wxT( "X" ), 'X' }, + { wxT( "Y" ), 'Y' }, + { wxT( "Z" ), 'Z' }, - {wxT(""), 0} // Do not change: end of list + { wxT( "Ctrl A" ), GR_KB_CTRL + 'A' }, + { wxT( "Ctrl B" ), GR_KB_CTRL + 'B' }, + { wxT( "Ctrl C" ), GR_KB_CTRL + 'C' }, + { wxT( "Ctrl D" ), GR_KB_CTRL + 'D' }, + { wxT( "Ctrl E" ), GR_KB_CTRL + 'E' }, + { wxT( "Ctrl F" ), GR_KB_CTRL + 'F' }, + { wxT( "Ctrl G" ), GR_KB_CTRL + 'G' }, + { wxT( "Ctrl H" ), GR_KB_CTRL + 'H' }, + { wxT( "Ctrl I" ), GR_KB_CTRL + 'I' }, + { wxT( "Ctrl J" ), GR_KB_CTRL + 'J' }, + { wxT( "Ctrl K" ), GR_KB_CTRL + 'K' }, + { wxT( "Ctrl L" ), GR_KB_CTRL + 'L' }, + { wxT( "Ctrl M" ), GR_KB_CTRL + 'M' }, + { wxT( "Ctrl N" ), GR_KB_CTRL + 'N' }, + { wxT( "Ctrl O" ), GR_KB_CTRL + 'O' }, + { wxT( "Ctrl P" ), GR_KB_CTRL + 'P' }, + { wxT( "Ctrl Q" ), GR_KB_CTRL + 'Q' }, + { wxT( "Ctrl R" ), GR_KB_CTRL + 'R' }, + { wxT( "Ctrl S" ), GR_KB_CTRL + 'S' }, + { wxT( "Ctrl T" ), GR_KB_CTRL + 'T' }, + { wxT( "Ctrl U" ), GR_KB_CTRL + 'U' }, + { wxT( "Ctrl V" ), GR_KB_CTRL + 'V' }, + { wxT( "Ctrl W" ), GR_KB_CTRL + 'W' }, + { wxT( "Ctrl X" ), GR_KB_CTRL + 'X' }, + { wxT( "Ctrl Y" ), GR_KB_CTRL + 'Y' }, + { wxT( "Ctrl Z" ), GR_KB_CTRL + 'Z' }, + + { wxT( "" ), 0 } // Do not change: end of list }; /****************************************************/ -wxString ReturnKeyNameFromKeyCode(int keycode) +wxString ReturnKeyNameFromKeyCode( int keycode ) /****************************************************/ + /* - * return the key name from the key code - * Only some wxWidgets key values are handled for function key - * @param key = key code (ascii value, or wxWidgets value for function keys) - * @return the key name in a wxString -*/ + * return the key name from the key code + * Only some wxWidgets key values are handled for function key + * @param key = key code (ascii value, or wxWidgets value for function keys) + * @return the key name in a wxString + */ { -wxString keyname, modifier, fullkeyname; -int ii; + wxString keyname, modifier, fullkeyname; + int ii; - if ( (keycode & GR_KB_CTRL) != 0 ) modifier << wxT("Ctrl "); - if ( (keycode & GR_KB_ALT) != 0 ) modifier << wxT("Alt "); - if ( (keycode & GR_KB_SHIFT) != 0 ) modifier << wxT("Shift "); + if( (keycode & GR_KB_CTRL) != 0 ) + modifier << wxT( "Ctrl " ); + if( (keycode & GR_KB_ALT) != 0 ) + modifier << wxT( "Alt " ); + if( (keycode & GR_KB_SHIFT) != 0 ) + modifier << wxT( "Shift " ); - keycode &= ~(GR_KB_CTRL|GR_KB_ALT|GR_KB_SHIFT); - for ( ii = 0; ; ii++) - { - if ( s_Notkey_Name_List[ii].m_KeyCode == 0 ) - { - keyname = wxT(""); - break; - } - if ( s_Notkey_Name_List[ii].m_KeyCode == keycode) - { - keyname = s_Notkey_Name_List[ii].m_Name; - break; - } - } - - fullkeyname = modifier + keyname; - return fullkeyname; + keycode &= ~(GR_KB_CTRL | GR_KB_ALT | GR_KB_SHIFT); + for( ii = 0; ; ii++ ) + { + if( s_Hotkey_Name_List[ii].m_KeyCode == 0 ) + { + keyname = wxT( "" ); + break; + } + if( s_Hotkey_Name_List[ii].m_KeyCode == keycode ) + { + keyname = s_Hotkey_Name_List[ii].m_Name; + break; + } + } + + fullkeyname = modifier + keyname; + return fullkeyname; } -/************************************************************/ -static int ReturnKeyCodeFromKeyName(const wxString & keyname) -/************************************************************/ -/* - * return the key code from its key name - * Only some wxWidgets key values are handled for function key - * @param keyname = wxString key name to find in s_Notkey_Name_List[] - * @return the key code -*/ -{ -int ii, keycode = 0; - for ( ii = 0; ; ii++) - { - if ( s_Notkey_Name_List[ii].m_KeyCode == 0 ) break; - if ( s_Notkey_Name_List[ii].m_Name == keyname) - { - keycode = s_Notkey_Name_List[ii].m_KeyCode; - break; - } - } - - return keycode; +/**********************************************************************************/ +wxString AddHotkeyName( const wxString& text, Ki_HotkeyInfo** List, int CommandId ) +/**********************************************************************************/ + +/* + * Add the key name from the Command id value ( m_Idcommand member value) + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @param CommandId = Command Id value + * @return text (key name) in a wxString if found or text without modification + */ +{ + wxString msg = text; + wxString keyname = ReturnKeyNameFromCommandId( List, CommandId ); + + if( !keyname.IsEmpty() ) + msg << wxT( " (" ) << keyname << wxT( ")" ); + return msg; } + +/***********************************************************************/ +wxString ReturnKeyNameFromCommandId( Ki_HotkeyInfo** List, int CommandId ) +/***********************************************************************/ + +/* + * return the key name from the Command id value ( m_Idcommand member value) + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @param CommandId = Command Id value + * @return the key name in a wxString + */ +{ + wxString keyname; + + for( ; *List != NULL; List++ ) + { + Ki_HotkeyInfo* hk_decr = *List; + if( hk_decr->m_Idcommand == CommandId ) + { + keyname = ReturnKeyNameFromKeyCode( hk_decr->m_KeyCode ); + break; + } + } + + return keyname; +} + + +/************************************************************/ +static int ReturnKeyCodeFromKeyName( const wxString& keyname ) +/************************************************************/ + +/* + * return the key code from its key name + * Only some wxWidgets key values are handled for function key + * @param keyname = wxString key name to find in s_Hotkey_Name_List[] + * @return the key code + */ +{ + int ii, keycode = 0; + + for( ii = 0; ; ii++ ) + { + if( s_Hotkey_Name_List[ii].m_KeyCode == 0 ) // End of list reached + break; + if( keyname.CmpNoCase( s_Hotkey_Name_List[ii].m_Name ) == 0 ) + { + keycode = s_Hotkey_Name_List[ii].m_KeyCode; + break; + } + } + + return keycode; +} + + /****************************************************************************/ -void DisplayHotkeyList(WinEDA_DrawFrame * frame, Ki_HotkeyInfo ** List) +void DisplayHotkeyList( WinEDA_DrawFrame* frame, Ki_HotkeyInfo** List ) /*****************************************************************************/ + /* - * Displays the current hotkey list - * @param frame = current open frame - * @param List = pointer to a Ki_HotkeyInfo list of commands - * @return none -*/ + * Displays the current hotkey list + * @param frame = current open frame + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @return none + */ { -wxString keyname; - - wxString msg = _("Current hotkey list:\n\n"); - for ( ; * List != NULL; List++ ) - { - Ki_HotkeyInfo * hk_decr = * List; - msg += _("key "); - keyname = ReturnKeyNameFromKeyCode(hk_decr->m_KeyCode); - msg += keyname + wxT(": ") + hk_decr->m_InfoMsg + wxT("\n"); - } - DisplayInfo(frame, msg); + wxString keyname; + + wxString msg = _( "Current hotkey list:\n\n" ); + + for( ; *List != NULL; List++ ) + { + Ki_HotkeyInfo* hk_decr = *List; + msg += _( "key " ); + keyname = ReturnKeyNameFromKeyCode( hk_decr->m_KeyCode ); + msg += keyname + wxT( ": " ) + hk_decr->m_InfoMsg + wxT( "\n" ); + } + + DisplayInfo( frame, msg ); } + /******************************************************************/ -int GetCommandCodeFromHotkey(int key, Ki_HotkeyInfo ** List) +int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List ) /******************************************************************/ + /* - * Return an id identifier fron a key code for OnHotKey() function - * @param key = key code (ascii value, or wxWidgets value for function keys - * @param List = pointer to a Ki_HotkeyInfo list of commands - * @return the corresponding function identifier from the Ki_HotkeyInfo List -*/ + * Return an id identifier fron a key code for OnHotKey() function + * @param key = key code (ascii value, or wxWidgets value for function keys + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @return the corresponding function identifier from the Ki_HotkeyInfo List + */ { - for ( ; * List != NULL; List++ ) - { - Ki_HotkeyInfo * hk_decr = * List; - if ( hk_decr->m_KeyCode == key ) return hk_decr->m_Idcommand; - } - - return 0; + for( ; *List != NULL; List++ ) + { + Ki_HotkeyInfo* hk_decr = *List; + if( hk_decr->m_KeyCode == key ) + return hk_decr->m_Idcommand; + } + + return 0; } + /*************************************************************************/ -int WinEDA_BasicFrame::WriteHotkeyConfigFile(const wxString & Filename, - Ki_HotkeyInfo ** List, bool verbose) +int WinEDA_BasicFrame::WriteHotkeyConfigFile( const wxString& Filename, + Ki_HotkeyInfo** List, bool verbose ) /*************************************************************************/ + /* * Create a configuration file (*.key) from the current hotkey list * @param Filename = default full file name to create. If void, A filename will be asked * @param List = pointer to the current hotkey list. * the ouput format is: shortcut "key" "function" * lines starting by # are comments - * -*/ + * + */ { - wxString FullFilename = Filename; - FILE * cfgfile; - wxString msg; - if ( FullFilename.IsEmpty() || verbose) - { - wxString Mask, Path, Ext; - Ext = DEFAULT_HOTKEY_FILENAME_EXT; - Mask = wxT("*") + Ext; - Path = DEFAULT_HOTKEY_FILENAME_PATH; - FullFilename = EDA_FileSelector( _("Hotkey configuration file:"), - Path, /* Chemin par defaut */ - FullFilename, /* nom fichier par defaut */ - Ext, /* extension par defaut */ - Mask, /* Masque d'affichage */ - this, - wxFD_SAVE, - TRUE - ); - } - if ( FullFilename.IsEmpty() ) return 0; - - cfgfile = wxFopen(FullFilename, wxT("wt")); - - if ( cfgfile == NULL ) - { - if ( verbose ) - { - msg = _("Unable to create ") + FullFilename; - DisplayError(this, msg); - } - return 0; - } - -wxString keyname, infokey; - - msg = wxT("$hotkey list\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - - /* print the allowed keys, for info - */ - msg = wxT("# "); msg += _("Allowed keys:\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - msg.Empty(); - for ( int ii = 0; ; ii ++ ) - { - if ( s_Notkey_Name_List[ii].m_KeyCode == 0 ) break;; - if ( msg.IsEmpty() ) msg = wxT("# "); - else msg += wxT(", "); - msg += s_Notkey_Name_List[ii].m_Name; - if ( msg.Len() > 60 ) - { - msg += wxT("\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - msg.Empty(); - } - } - /* print the last line */ - if ( ! msg.IsEmpty() ) msg += wxT("\n"); - msg += wxT("#\n#\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - - /* Print the current list */ - for ( ; * List != NULL; List++ ) - { - Ki_HotkeyInfo * hk_decr = * List; - msg = wxT("shortcut "); - keyname = ReturnKeyNameFromKeyCode(hk_decr->m_KeyCode); - AddDelimiterString( keyname ); - infokey = hk_decr->m_InfoMsg; - AddDelimiterString( infokey ); - msg += keyname + wxT(": ") + infokey + wxT("\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - } - msg = wxT("$Endlist\n"); - fprintf(cfgfile, CONV_TO_UTF8(msg)); - fclose(cfgfile); - return 1; + wxString FullFilename = Filename; + FILE* cfgfile; + wxString msg; + + if( FullFilename.IsEmpty() || verbose ) + { + wxString Mask, Path, Ext; + Ext = DEFAULT_HOTKEY_FILENAME_EXT; + Mask = wxT( "*" ) + Ext; + Path = DEFAULT_HOTKEY_FILENAME_PATH; + FullFilename = EDA_FileSelector( _( "Hotkey configuration file:" ), + Path, /* Chemin par defaut */ + FullFilename, /* nom fichier par defaut */ + Ext, /* extension par defaut */ + Mask, /* Masque d'affichage */ + this, + wxFD_SAVE, + TRUE + ); + } + if( FullFilename.IsEmpty() ) + return 0; + + cfgfile = wxFopen( FullFilename, wxT( "wt" ) ); + + if( cfgfile == NULL ) + { + if( verbose ) + { + msg = _( "Unable to create " ) + FullFilename; + DisplayError( this, msg ); + } + return 0; + } + + wxString keyname, infokey; + + msg = wxT( "$hotkey list\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + + /* print the allowed keys, for info + */ + msg = wxT( "# " ); msg += _( "Allowed keys:\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + msg.Empty(); + for( int ii = 0; ; ii++ ) + { + if( s_Hotkey_Name_List[ii].m_KeyCode == 0 ) + break;; + if( msg.IsEmpty() ) + msg = wxT( "# " ); + else + msg += wxT( ", " ); + msg += s_Hotkey_Name_List[ii].m_Name; + if( msg.Len() > 60 ) + { + msg += wxT( "\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + msg.Empty(); + } + } + + /* print the last line */ + if( !msg.IsEmpty() ) + msg += wxT( "\n" ); + msg += wxT( "#\n#\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + + /* Print the current list */ + for( ; *List != NULL; List++ ) + { + Ki_HotkeyInfo* hk_decr = *List; + msg = wxT( "shortcut " ); + keyname = ReturnKeyNameFromKeyCode( hk_decr->m_KeyCode ); + AddDelimiterString( keyname ); + infokey = hk_decr->m_InfoMsg; + AddDelimiterString( infokey ); + msg += keyname + wxT( ": " ) + infokey + wxT( "\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + } + + msg = wxT( "$Endlist\n" ); + fprintf( cfgfile, CONV_TO_UTF8( msg ) ); + fclose( cfgfile ); + return 1; } /********************************************************************************************/ -int WinEDA_BasicFrame::ReadHotkeyConfigFile(const wxString & Filename, - Ki_HotkeyInfo ** CurrentHotkeyList, bool verbose) +int WinEDA_BasicFrame::ReadHotkeyConfigFile( const wxString& Filename, + Ki_HotkeyInfo** CurrentHotkeyList, bool verbose ) /********************************************************************************************/ + /* * Read a configuration file (.key) and fill the current hotkey list with hotkeys * @param Filename = default full file name to create. If void, A filename will be asked * @param CurrentHotkeyList = current hotkey list to initialise. * the input format is: shortcut "key" "function" * lines starting by # are ignored (comments) -* -*/ + * + */ { - wxString FullFilename = Filename; - FILE * cfgfile; - wxString msg; - if ( FullFilename.IsEmpty() || verbose ) - { - wxString Mask, Path, Ext; - Ext = DEFAULT_HOTKEY_FILENAME_EXT; - Mask = wxT("*") + Ext; - Path = DEFAULT_HOTKEY_FILENAME_PATH; - FullFilename = EDA_FileSelector( _("Hotkey configuration file:"), - Path, /* Chemin par defaut */ - FullFilename, /* nom fichier par defaut */ - Ext, /* extension par defaut */ - Mask, /* Masque d'affichage */ - this, - wxFD_OPEN, - TRUE - ); - if ( FullFilename.IsEmpty() ) return 0; - } + wxString FullFilename = Filename; + FILE* cfgfile; + wxString msg; - cfgfile = wxFopen(FullFilename, wxT("rt")); - - if ( cfgfile == NULL ) - { - if ( verbose ) - { - msg = _("Unable to read ") + FullFilename; - DisplayError(this, msg); - } - return 0; - } - - wxString keyname; - char Line[1024]; - int LineNum = 0; - /* Read the file */ + if( FullFilename.IsEmpty() || verbose ) + { + wxString Mask, Path, Ext; + Ext = DEFAULT_HOTKEY_FILENAME_EXT; + Mask = wxT( "*" ) + Ext; + Path = DEFAULT_HOTKEY_FILENAME_PATH; + FullFilename = EDA_FileSelector( _( "Hotkey configuration file:" ), + Path, /* Chemin par defaut */ + FullFilename, /* nom fichier par defaut */ + Ext, /* extension par defaut */ + Mask, /* Masque d'affichage */ + this, + wxFD_OPEN, + TRUE + ); + if( FullFilename.IsEmpty() ) + return 0; + } + + cfgfile = wxFopen( FullFilename, wxT( "rt" ) ); + + if( cfgfile == NULL ) + { + if( verbose ) + { + msg = _( "Unable to read " ) + FullFilename; + DisplayError( this, msg ); + } + return 0; + } + + wxString keyname; + char Line[1024]; + int LineNum = 0; + /* Read the file */ while( GetLine( cfgfile, Line, &LineNum ) != NULL ) { - char * line_type, * keyname, *fctname; - line_type = strtok(Line, " \t\n\r"); - msg = CONV_FROM_UTF8(line_type); - if( msg != wxT("shortcut") ) continue; - if( msg == wxT("$Endlist") ) break; + char* line_type, * keyname, * fctname; + line_type = strtok( Line, " \t\n\r" ); + msg = CONV_FROM_UTF8( line_type ); + if( msg != wxT( "shortcut" ) ) + continue; + if( msg == wxT( "$Endlist" ) ) + break; - /* Get the key name */ - strtok(NULL, "\"\n\r"); - keyname = strtok(NULL, "\"\n\r"); - strtok(NULL, "\"\n\r"); - /* Get the command name */ - fctname = strtok(NULL, "\"\n\r"); - msg = CONV_FROM_UTF8(fctname); - /* search the hotkey in current hotkey list */ - for (Ki_HotkeyInfo ** List = CurrentHotkeyList; * List != NULL; List++ ) - { - Ki_HotkeyInfo * hk_decr = * List; - if (hk_decr->m_InfoMsg == msg ) - { - msg = CONV_FROM_UTF8(keyname); - int code = ReturnKeyCodeFromKeyName(msg); - if ( code ) hk_decr->m_KeyCode = code; - break; - } - } - } - fclose(cfgfile); - return 1; + /* Get the key name */ + strtok( NULL, "\"\n\r" ); + keyname = strtok( NULL, "\"\n\r" ); + strtok( NULL, "\"\n\r" ); + /* Get the command name */ + fctname = strtok( NULL, "\"\n\r" ); + msg = CONV_FROM_UTF8( fctname ); + /* search the hotkey in current hotkey list */ + for( Ki_HotkeyInfo** List = CurrentHotkeyList; *List != NULL; List++ ) + { + Ki_HotkeyInfo* hk_decr = *List; + if( hk_decr->m_InfoMsg == msg ) + { + msg = CONV_FROM_UTF8( keyname ); + int code = ReturnKeyCodeFromKeyName( msg ); + if( code ) + hk_decr->m_KeyCode = code; + break; + } + } + } + + fclose( cfgfile ); + return 1; } diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp index 04a0de79b8..0e9a7f8e28 100644 --- a/eeschema/controle.cpp +++ b/eeschema/controle.cpp @@ -294,6 +294,9 @@ void WinEDA_DrawFrame::GeneralControle( wxDC* DC, wxPoint MousePositionInPixels switch( g_KeyPressed ) { + case 0: + break; + case EDA_PANNING_UP_KEY: OnZoom( ID_ZOOM_PANNING_UP ); curpos = m_CurrentScreen->m_Curseur; @@ -315,23 +318,16 @@ void WinEDA_DrawFrame::GeneralControle( wxDC* DC, wxPoint MousePositionInPixels break; case EDA_ZOOM_IN_FROM_MOUSE: - case WXK_F1: OnZoom( ID_ZOOM_PLUS_KEY ); curpos = m_CurrentScreen->m_Curseur; break; case EDA_ZOOM_OUT_FROM_MOUSE: - case WXK_F2: OnZoom( ID_ZOOM_MOINS_KEY ); curpos = m_CurrentScreen->m_Curseur; break; - case WXK_F3: - OnZoom( ID_ZOOM_REDRAW_KEY ); - break; - case EDA_ZOOM_CENTER_FROM_MOUSE: - case WXK_F4: OnZoom( ID_ZOOM_CENTER_KEY ); curpos = m_CurrentScreen->m_Curseur; break; diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp index 2e63d0808c..f048c91976 100644 --- a/eeschema/eeschema.cpp +++ b/eeschema/eeschema.cpp @@ -1,6 +1,6 @@ - /***********************************/ - /* eeschema.cpp - module principal */ - /***********************************/ +/***********************************/ +/* eeschema.cpp - module principal */ +/***********************************/ #ifdef __GNUG__ #pragma implementation @@ -26,51 +26,57 @@ /* Routines locales */ -static void CreateScreens(void); +static void CreateScreens( void ); // Global variables -wxString g_Main_Title( wxT("EESchema") ); +wxString g_Main_Title( wxT( "EESchema" ) ); - /************************************/ - /* Called to initialize the program */ - /************************************/ +/************************************/ +/* Called to initialize the program */ +/************************************/ // Create a new application object: this macro will allow wxWindows to create // the application object during program execution (it's better than using a // static object for many reasons) and also declares the accessor function // wxGetApp() which will return the reference of the right type (i.e. MyApp and // not wxApp) -IMPLEMENT_APP(WinEDA_App) +IMPLEMENT_APP( WinEDA_App ) -bool WinEDA_App::OnInit(void) +bool WinEDA_App::OnInit( void ) { -wxString FFileName; - EDA_Appl = this; + wxString FFileName; - g_DebugLevel = 0; // Debug level */ + EDA_Appl = this; - InitEDA_Appl( wxT("eeschema") ); + g_DebugLevel = 0; // Debug level */ - if ( m_Checker && m_Checker->IsAnotherRunning() ) + InitEDA_Appl( wxT( "eeschema" ) ); + + if( m_Checker && m_Checker->IsAnotherRunning() ) { - if ( ! IsOK(NULL, _("Eeschema is already running, Continue?") ) ) - return false; + if( !IsOK( NULL, _( "Eeschema is already running, Continue?" ) ) ) + return false; } - if(argc > 1 ) FFileName = argv[1]; + if( argc > 1 ) + FFileName = argv[1]; - CreateScreens(); + CreateScreens(); - /* init EESCHEMA */ - GetSettings(); // read current setup - SeedLayers(); + /* init EESCHEMA */ + GetSettings(); // read current setup + SeedLayers(); + Read_Hotkey_Config( SchematicFrame, false ); /* Must be called before creating the main frame + * in order to display the real hotkeys in menus + * or tool tips */ - // Create main frame (schematic frame) : - SchematicFrame = new WinEDA_SchematicFrame(NULL, this, - wxT("EESchema"), wxPoint(0,0), wxSize(600,400) ); + // Create main frame (schematic frame) : + SchematicFrame = new WinEDA_SchematicFrame( NULL, this, + wxT( "EESchema" ), + wxPoint( 0, 0 ), wxSize( 600, 400 ) ); - SetTopWindow(SchematicFrame); - SchematicFrame->Show(TRUE); + SetTopWindow( SchematicFrame ); + SchematicFrame->Show( TRUE ); if( CreateServer( SchematicFrame, KICAD_SCH_PORT_SERVICE_NUMBER ) ) { @@ -78,49 +84,47 @@ wxString FFileName; // sends EESCHEMA a command SetupServerFunction( RemoteCommand ); } - - SchematicFrame->Zoom_Automatique(TRUE); - Read_Hotkey_Config(SchematicFrame, false); - /* Load file specified in the command line. */ - if( ! FFileName.IsEmpty() ) - { - ChangeFileNameExt(FFileName, g_SchExtBuffer); - wxSetWorkingDirectory( wxPathOnly(FFileName) ); - if ( SchematicFrame->DrawPanel ) - if ( SchematicFrame->LoadOneEEProject(FFileName, FALSE) <= 0 ) - SchematicFrame->DrawPanel->Refresh(TRUE); // File not found or error - } + SchematicFrame->Zoom_Automatique( TRUE ); - else - { - Read_Config(wxEmptyString, TRUE); // Read config file ici si pas de fichier a charger - if ( SchematicFrame->DrawPanel ) - SchematicFrame->DrawPanel->Refresh(TRUE); - } + /* Load file specified in the command line. */ + if( !FFileName.IsEmpty() ) + { + ChangeFileNameExt( FFileName, g_SchExtBuffer ); + wxSetWorkingDirectory( wxPathOnly( FFileName ) ); + if( SchematicFrame->DrawPanel ) + if( SchematicFrame->LoadOneEEProject( FFileName, FALSE ) <= 0 ) + SchematicFrame->DrawPanel->Refresh( TRUE ); // File not found or error + } + else + { + Read_Config( wxEmptyString, TRUE ); // Read config file ici si pas de fichier a charger + if( SchematicFrame->DrawPanel ) + SchematicFrame->DrawPanel->Refresh( TRUE ); + } - return TRUE; + return TRUE; } /******************************/ -static void CreateScreens(void) +static void CreateScreens( void ) /******************************/ + /* - Fonction d'init des écrans utilisés dans EESchema: -*/ + * Fonction d'init des écrans utilisés dans EESchema: + */ { - /* creation des ecrans Sch , Lib */ + /* creation des ecrans Sch , Lib */ - if(ScreenSch == NULL ) - ScreenSch = new SCH_SCREEN(SCHEMATIC_FRAME); - ScreenSch->m_FileName = g_DefaultSchematicFileName; - ScreenSch->m_Date = GenDate(); - ActiveScreen = ScreenSch; + if( ScreenSch == NULL ) + ScreenSch = new SCH_SCREEN( SCHEMATIC_FRAME ); + ScreenSch->m_FileName = g_DefaultSchematicFileName; + ScreenSch->m_Date = GenDate(); + ActiveScreen = ScreenSch; - if(ScreenLib == NULL ) - ScreenLib = new SCH_SCREEN(LIBEDITOR_FRAME); - ScreenLib->SetZoom(4); - ScreenLib->m_UndoRedoCountMax = 10; + if( ScreenLib == NULL ) + ScreenLib = new SCH_SCREEN( LIBEDITOR_FRAME ); + ScreenLib->SetZoom( 4 ); + ScreenLib->m_UndoRedoCountMax = 10; } - diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index da97498587..104da0921c 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -1,6 +1,6 @@ - /***************/ - /* hotkeys.cpp */ - /***************/ +/***************/ +/* hotkeys.cpp */ +/***************/ #include "fctsys.h" @@ -13,318 +13,370 @@ #include "id.h" -#include "hotkeys_basic.h" +#include "hotkeys.h" #include "protos.h" -enum hotkey_id_commnand { - HK_NOT_FOUND = 0, - HK_RESET_LOCAL_COORD, - HK_HELP, - HK_ZOOM_IN, - HK_ZOOM_OUT, - HK_ZOOM_REDRAW, - HK_ZOOM_CENTER, - HK_NEXT_SEARCH, - HK_DELETE, - HK_REPEAT_LAST, - HK_MOVEBLOCK_TO_DRAGBLOCK, - HK_ROTATE_COMPONENT, - HK_MIRROR_X_COMPONENT, - HK_MIRROR_Y_COMPONENT, - HK_ORIENT_NORMAL_COMPONENT, - HK_MOVE_COMPONENT, - HK_ADD_NEW_COMPONENT, - HK_BEGIN_WIRE -}; +/* How to add a new hotkey: + * add a new id in the enum hotkey_id_commnand like MY_NEW_ID_FUNCTION (see hotkeys.h). + * add a new Ki_HotkeyInfo entry like: + * static Ki_HotkeyInfo HkMyNewEntry(wxT("Command Label"), MY_NEW_ID_FUNCTION, default key value); + * "Command Label" is the name used in hotkey list display, and the identifier in the hotkey list file + * MY_NEW_ID_FUNCTION is an equivalent id function used in the switch in OnHotKey() function. + * default key value is the default hotkey for this command. Can be overrided by the user hotkey list file + * add the HkMyNewEntry pointer in the s_Schematic_Hotkey_List list ( or/and the s_LibEdit_Hotkey_List list) + * Add the new code in the switch in OnHotKey() function. + * when the variable PopupOn is true, an item is currently edited. + * This can be usefull if the new function cannot be executed while an item is currently being edited + * ( For example, one cannot start a new wire when a component is moving.) + * + * Note: If an hotkey is a special key be sure the corresponding wxWidget keycode (WXK_XXXX) + * is handled in the hotkey_name_descr s_Hotkey_Name_List list (see hotkeys_basic.cpp) + * and see this list for some ascii keys (space ...) + */ /* local variables */ /* Hotkey list: */ -static Ki_HotkeyInfo HkBeginWire(wxT("begin Wire"), HK_BEGIN_WIRE, 'W'); -static Ki_HotkeyInfo HkAddComponent(wxT("Add Component"), HK_ADD_NEW_COMPONENT, 'A'); -static Ki_HotkeyInfo HkMirrorYComponent(wxT("Mirror Y Component"), HK_MIRROR_Y_COMPONENT, 'Y'); -static Ki_HotkeyInfo HkMirrorXComponent(wxT("Mirror X Component"), HK_MIRROR_X_COMPONENT, 'X'); -static Ki_HotkeyInfo HkOrientNormalComponent(wxT("Orient Normal Component"), HK_ORIENT_NORMAL_COMPONENT, 'N'); -static Ki_HotkeyInfo HkRotateComponent(wxT("Rotate Component"), HK_ROTATE_COMPONENT, 'R'); -static Ki_HotkeyInfo HkMoveComponent(wxT("Move Component"), HK_MOVE_COMPONENT, 'M'); -static Ki_HotkeyInfo HkMove2Drag(wxT("Switch move block to drag block"), HK_MOVEBLOCK_TO_DRAGBLOCK, '\t'); -static Ki_HotkeyInfo HkInsert(wxT("Repeat Last Item"), HK_REPEAT_LAST, WXK_INSERT); -static Ki_HotkeyInfo HkDelete(wxT("Delete Item"), HK_DELETE, WXK_DELETE); -static Ki_HotkeyInfo HkResetLocalCoord(wxT("Reset local coord."), HK_RESET_LOCAL_COORD, ' '); -static Ki_HotkeyInfo HkNextSearch(wxT("Next Search"), HK_NEXT_SEARCH, WXK_F5); -static Ki_HotkeyInfo HkZoomCenter(wxT("Zoom Center"), HK_ZOOM_CENTER, WXK_F4); -static Ki_HotkeyInfo HkZoomRedraw(wxT("Zoom Redraw"), HK_ZOOM_REDRAW, WXK_F3); -static Ki_HotkeyInfo HkZoomOut(wxT("Zoom Out"), HK_ZOOM_OUT, WXK_F2); -static Ki_HotkeyInfo HkZoomIn(wxT("Zoom In"), HK_ZOOM_IN, WXK_F1); -static Ki_HotkeyInfo HkHelp(wxT("Help: this message"), HK_HELP, '?'); +static Ki_HotkeyInfo HkBeginWire( wxT( "begin Wire" ), HK_BEGIN_WIRE, 'W' ); +static Ki_HotkeyInfo HkAddComponent( wxT( "Add Component" ), HK_ADD_NEW_COMPONENT, 'A' ); +static Ki_HotkeyInfo HkMirrorYComponent( wxT( + "Mirror Y Component" ), HK_MIRROR_Y_COMPONENT, 'Y' ); +static Ki_HotkeyInfo HkMirrorXComponent( wxT( + "Mirror X Component" ), HK_MIRROR_X_COMPONENT, 'X' ); +static Ki_HotkeyInfo HkOrientNormalComponent( wxT( + "Orient Normal Component" ), + HK_ORIENT_NORMAL_COMPONENT, 'N' ); +static Ki_HotkeyInfo HkRotateComponent( wxT( "Rotate Component" ), HK_ROTATE_COMPONENT, 'R' ); +static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M' ); +static Ki_HotkeyInfo HkMove2Drag( wxT( + "Switch move block to drag block" ), + HK_MOVEBLOCK_TO_DRAGBLOCK, '\t' ); +static Ki_HotkeyInfo HkInsert( wxT( "Repeat Last Item" ), HK_REPEAT_LAST, WXK_INSERT ); +static Ki_HotkeyInfo HkDelete( wxT( "Delete Item" ), HK_DELETE, WXK_DELETE ); +static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ), HK_RESET_LOCAL_COORD, ' ' ); +static Ki_HotkeyInfo HkNextSearch( wxT( "Next Search" ), HK_NEXT_SEARCH, WXK_F5 ); +static Ki_HotkeyInfo HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4 ); +static Ki_HotkeyInfo HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3 ); +static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 ); +static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 ); +static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' ); // List of hotkey descriptors for schematic -Ki_HotkeyInfo *s_Schematic_Hotkey_List[] = { - &HkHelp, - &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, - &HkNextSearch, &HkResetLocalCoord, - &HkDelete, &HkInsert, &HkMove2Drag, - &HkMoveComponent, &HkAddComponent, - &HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, & HkOrientNormalComponent, - &HkBeginWire, - NULL +Ki_HotkeyInfo* s_Schematic_Hotkey_List[] = { + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkNextSearch, &HkResetLocalCoord, + &HkDelete, &HkInsert, &HkMove2Drag, + &HkMoveComponent, &HkAddComponent, + &HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, &HkOrientNormalComponent, + &HkBeginWire, + NULL }; // Library editor: -static Ki_HotkeyInfo HkInsertPin(wxT("Repeat Pin"), HK_REPEAT_LAST, WXK_INSERT); +static Ki_HotkeyInfo HkInsertPin( wxT( "Repeat Pin" ), HK_REPEAT_LAST, WXK_INSERT ); // List of hotkey descriptors for libray editor -Ki_HotkeyInfo *s_LibEdit_Hotkey_List[] = +Ki_HotkeyInfo* s_LibEdit_Hotkey_List[] = { - &HkHelp, - &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, - &HkResetLocalCoord, - &HkInsertPin, - NULL + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkResetLocalCoord, + &HkInsertPin, + NULL }; /***********************************************************/ -void WinEDA_SchematicFrame::OnHotKey(wxDC * DC, int hotkey, - EDA_BaseStruct * DrawStruct) +void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, + EDA_BaseStruct* DrawStruct ) /***********************************************************/ + /* Hot keys. Some commands are relatives to the item under the mouse cursor - Commands are case insensitive - Zoom commands are not managed here -*/ + * Commands are case insensitive + */ { -bool PopupOn = m_CurrentScreen->GetCurItem() && - m_CurrentScreen->GetCurItem()->m_Flags; -bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified - - if ( hotkey == 0 ) return; + bool PopupOn = m_CurrentScreen->GetCurItem() + && m_CurrentScreen->GetCurItem()->m_Flags; + bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified -wxPoint MousePos = m_CurrentScreen->m_MousePosition; + if( hotkey == 0 ) + return; + + wxPoint MousePos = m_CurrentScreen->m_MousePosition; + + // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) + if( (hotkey & GR_KB_CTRL) != 0 ) + hotkey += 'A' - 1; + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) + hotkey += 'A' - 'a'; + + // Search command from key : + int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Schematic_Hotkey_List ); - // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) - if ( (hotkey & GR_KB_CTRL) != 0 ) hotkey += 'A' - 1; - /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ - if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; - - // Search command from key : - int CommandCode = GetCommandCodeFromHotkey(hotkey, s_Schematic_Hotkey_List); switch( CommandCode ) - { - default: - case HK_NOT_FOUND: - return; - break; - - case HK_HELP: // Display Current hotkey list - DisplayHotkeyList(this, s_Schematic_Hotkey_List); - break; + { + default: + case HK_NOT_FOUND: + return; + break; - case HK_RESET_LOCAL_COORD: /* Reset the relative coord */ - m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur; - break; + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList( this, s_Schematic_Hotkey_List ); + break; - case HK_ZOOM_IN: - case HK_ZOOM_OUT: - case HK_ZOOM_REDRAW: - case HK_ZOOM_CENTER: - break; + case HK_RESET_LOCAL_COORD: /* Reset the relative coord */ + m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur; + break; - case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving - HandleBlockEndByPopUp(BLOCK_DRAG, DC); - break; + case HK_ZOOM_IN: + OnZoom( ID_ZOOM_PLUS_KEY ); + break; - case HK_DELETE: - if ( PopupOn ) break; - RefreshToolBar = LocateAndDeleteItem(this, DC); - m_CurrentScreen->SetModify(); - m_CurrentScreen->SetCurItem( NULL); - TestDanglingEnds(m_CurrentScreen->EEDrawList, DC); - break; + case HK_ZOOM_OUT: + OnZoom( ID_ZOOM_MOINS_KEY ); + break; - case HK_REPEAT_LAST: - if ( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) ) - { - RepeatDrawItem(DC); - } - else wxBell(); - break; + case HK_ZOOM_REDRAW: + OnZoom( ID_ZOOM_REDRAW_KEY ); + break; - case HK_NEXT_SEARCH : - if ( g_LastSearchIsMarker ) WinEDA_SchematicFrame::FindMarker(1); - else FindSchematicItem(wxEmptyString, 2); - break; + case HK_ZOOM_CENTER: + OnZoom( ID_ZOOM_CENTER_KEY ); + break; - case HK_ADD_NEW_COMPONENT: // Add component - if ( DrawStruct && DrawStruct->m_Flags ) break; - // switch to m_ID_current_state = ID_COMPONENT_BUTT; - if ( m_ID_current_state != ID_COMPONENT_BUTT ) SetToolID( ID_COMPONENT_BUTT, wxCURSOR_PENCIL, _("Add Component")); - OnLeftClick(DC, MousePos); - break; + case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving + HandleBlockEndByPopUp( BLOCK_DRAG, DC ); + break; - case HK_BEGIN_WIRE: // Add wire - if ( DrawStruct ) // An item is selected. If edited and not a wire, a new command is not possible - { - if ( DrawStruct->m_Flags ) // Item selected and edition in progress - { - if (DrawStruct->m_StructType == DRAW_SEGMENT_STRUCT_TYPE ) - { - EDA_DrawLineStruct * segment = (EDA_DrawLineStruct *)DrawStruct; - if ( segment->m_Layer != LAYER_WIRE ) break; - } - else break; - } - } - // switch to m_ID_current_state = ID_WIRE_BUTT; - if ( m_ID_current_state != ID_WIRE_BUTT ) SetToolID( ID_WIRE_BUTT, wxCURSOR_PENCIL, _("Add Wire")); - OnLeftClick(DC, MousePos); + case HK_DELETE: + if( PopupOn ) + break; + RefreshToolBar = LocateAndDeleteItem( this, DC ); + m_CurrentScreen->SetModify(); + m_CurrentScreen->SetCurItem( NULL ); + TestDanglingEnds( m_CurrentScreen->EEDrawList, DC ); + break; + + case HK_REPEAT_LAST: + if( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) ) + { + RepeatDrawItem( DC ); + } + else + wxBell(); + break; + + case HK_NEXT_SEARCH: + if( g_LastSearchIsMarker ) + WinEDA_SchematicFrame::FindMarker( 1 ); + else + FindSchematicItem( wxEmptyString, 2 ); + break; + + case HK_ADD_NEW_COMPONENT: // Add component + if( DrawStruct && DrawStruct->m_Flags ) break; - case HK_ROTATE_COMPONENT: // Component Rotation - if ( DrawStruct == NULL ) - { - DrawStruct = PickStruct( GetScreen()->m_Curseur, - GetScreen()->EEDrawList, LIBITEM|TEXTITEM|LABELITEM ); - if ( DrawStruct == NULL ) break; - if ( DrawStruct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE ) - DrawStruct = LocateSmallestComponent( GetScreen() ); - if ( DrawStruct == NULL ) break; - } - switch (DrawStruct->m_StructType) - { - case DRAW_LIB_ITEM_STRUCT_TYPE: - if ( DrawStruct->m_Flags == 0 ) - { - SaveCopyInUndoList(DrawStruct, IS_CHANGED); - RefreshToolBar = TRUE; - } - - CmpRotationMiroir( - (EDA_SchComponentStruct *) DrawStruct, DC, CMP_ROTATE_COUNTERCLOCKWISE ); - break; + // switch to m_ID_current_state = ID_COMPONENT_BUTT; + if( m_ID_current_state != ID_COMPONENT_BUTT ) + SetToolID( ID_COMPONENT_BUTT, wxCURSOR_PENCIL, _( "Add Component" ) ); + OnLeftClick( DC, MousePos ); + break; - case DRAW_TEXT_STRUCT_TYPE: - case DRAW_LABEL_STRUCT_TYPE: - case DRAW_GLOBAL_LABEL_STRUCT_TYPE: - if ( DrawStruct->m_Flags == 0 ) - { - SaveCopyInUndoList(DrawStruct, IS_CHANGED); - RefreshToolBar = TRUE; - } - ChangeTextOrient( (DrawTextStruct*)DrawStruct, DC); - break; - - default:; - } - break; + case HK_BEGIN_WIRE: // Add wire + if( DrawStruct ) // An item is selected. If edited and not a wire, a new command is not possible + { + if( DrawStruct->m_Flags ) // Item selected and edition in progress + { + if( DrawStruct->m_StructType == DRAW_SEGMENT_STRUCT_TYPE ) + { + EDA_DrawLineStruct* segment = (EDA_DrawLineStruct*) DrawStruct; + if( segment->m_Layer != LAYER_WIRE ) + break; + } + else + break; + } + } - case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component) - if ( DrawStruct == NULL ) - DrawStruct = LocateSmallestComponent( GetScreen() ); - if ( DrawStruct ) - { - if ( DrawStruct->m_Flags == 0 ) - { - SaveCopyInUndoList(DrawStruct, IS_CHANGED); - RefreshToolBar = TRUE; - } - CmpRotationMiroir( - (EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_Y ); - } - break; + // switch to m_ID_current_state = ID_WIRE_BUTT; + if( m_ID_current_state != ID_WIRE_BUTT ) + SetToolID( ID_WIRE_BUTT, wxCURSOR_PENCIL, _( "Add Wire" ) ); + OnLeftClick( DC, MousePos ); + break; - case HK_MIRROR_X_COMPONENT: // Mirror X (Component) - if ( DrawStruct == NULL ) - DrawStruct = LocateSmallestComponent( GetScreen() ); - if ( DrawStruct ) - { - if ( DrawStruct->m_Flags == 0 ) - { - SaveCopyInUndoList(DrawStruct, IS_CHANGED); - RefreshToolBar = TRUE; - } - CmpRotationMiroir( - (EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_X ); - } - break; + case HK_ROTATE_COMPONENT: // Component Rotation + if( DrawStruct == NULL ) + { + DrawStruct = PickStruct( GetScreen()->m_Curseur, + GetScreen()->EEDrawList, LIBITEM | TEXTITEM | LABELITEM ); + if( DrawStruct == NULL ) + break; + if( DrawStruct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE ) + DrawStruct = LocateSmallestComponent( GetScreen() ); + if( DrawStruct == NULL ) + break; + } - case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component) - if ( DrawStruct == NULL ) - DrawStruct = LocateSmallestComponent( GetScreen() ); - if ( DrawStruct ) - { - if ( DrawStruct->m_Flags == 0 ) - { - SaveCopyInUndoList(DrawStruct, IS_CHANGED); - RefreshToolBar = TRUE; - } - CmpRotationMiroir( - (EDA_SchComponentStruct *) DrawStruct, DC, CMP_NORMAL ); - TestDanglingEnds(m_CurrentScreen->EEDrawList, DC); - } - break; + switch( DrawStruct->m_StructType ) + { + case DRAW_LIB_ITEM_STRUCT_TYPE: + if( DrawStruct->m_Flags == 0 ) + { + SaveCopyInUndoList( DrawStruct, IS_CHANGED ); + RefreshToolBar = TRUE; + } - case HK_MOVE_COMPONENT: // Start move Component - if ( PopupOn ) break; - if ( DrawStruct == NULL ) - DrawStruct = LocateSmallestComponent( GetScreen() ); - if ( DrawStruct && (DrawStruct->m_Flags ==0) ) - { - m_CurrentScreen->SetCurItem(DrawStruct); - Process_Move_Item(m_CurrentScreen->GetCurItem(), DC); - } - break; - } - - if ( RefreshToolBar ) SetToolbars(); + CmpRotationMiroir( + (EDA_SchComponentStruct*) DrawStruct, DC, CMP_ROTATE_COUNTERCLOCKWISE ); + break; + + case DRAW_TEXT_STRUCT_TYPE: + case DRAW_LABEL_STRUCT_TYPE: + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + if( DrawStruct->m_Flags == 0 ) + { + SaveCopyInUndoList( DrawStruct, IS_CHANGED ); + RefreshToolBar = TRUE; + } + ChangeTextOrient( (DrawTextStruct*) DrawStruct, DC ); + break; + + default: + ; + } + + break; + + case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component) + if( DrawStruct == NULL ) + DrawStruct = LocateSmallestComponent( GetScreen() ); + if( DrawStruct ) + { + if( DrawStruct->m_Flags == 0 ) + { + SaveCopyInUndoList( DrawStruct, IS_CHANGED ); + RefreshToolBar = TRUE; + } + CmpRotationMiroir( + (EDA_SchComponentStruct*) DrawStruct, DC, CMP_MIROIR_Y ); + } + break; + + case HK_MIRROR_X_COMPONENT: // Mirror X (Component) + if( DrawStruct == NULL ) + DrawStruct = LocateSmallestComponent( GetScreen() ); + if( DrawStruct ) + { + if( DrawStruct->m_Flags == 0 ) + { + SaveCopyInUndoList( DrawStruct, IS_CHANGED ); + RefreshToolBar = TRUE; + } + CmpRotationMiroir( + (EDA_SchComponentStruct*) DrawStruct, DC, CMP_MIROIR_X ); + } + break; + + case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component) + if( DrawStruct == NULL ) + DrawStruct = LocateSmallestComponent( GetScreen() ); + if( DrawStruct ) + { + if( DrawStruct->m_Flags == 0 ) + { + SaveCopyInUndoList( DrawStruct, IS_CHANGED ); + RefreshToolBar = TRUE; + } + CmpRotationMiroir( + (EDA_SchComponentStruct*) DrawStruct, DC, CMP_NORMAL ); + TestDanglingEnds( m_CurrentScreen->EEDrawList, DC ); + } + break; + + case HK_MOVE_COMPONENT: // Start move Component + if( PopupOn ) + break; + if( DrawStruct == NULL ) + DrawStruct = LocateSmallestComponent( GetScreen() ); + if( DrawStruct && (DrawStruct->m_Flags ==0) ) + { + m_CurrentScreen->SetCurItem( DrawStruct ); + Process_Move_Item( m_CurrentScreen->GetCurItem(), DC ); + } + break; + } + + if( RefreshToolBar ) + SetToolbars(); } /***********************************************************/ -void WinEDA_LibeditFrame::OnHotKey(wxDC * DC, int hotkey, - EDA_BaseStruct * DrawStruct) +void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, + EDA_BaseStruct* DrawStruct ) /***********************************************************/ + /* Hot keys for the component editot. Some commands are relatives to the item under the mouse cursor - Commands are case insensitive - Zoom commands are not managed here -*/ + * Commands are case insensitive + */ { -bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified - - if ( hotkey == 0 ) return; + bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified -wxPoint MousePos = m_CurrentScreen->m_MousePosition; + if( hotkey == 0 ) + return; + + wxPoint MousePos = m_CurrentScreen->m_MousePosition; + + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) + hotkey += 'A' - 'a'; + int CommandCode = GetCommandCodeFromHotkey( hotkey, s_LibEdit_Hotkey_List ); - /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ - if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; - int CommandCode = GetCommandCodeFromHotkey(hotkey, s_LibEdit_Hotkey_List); switch( CommandCode ) - { - default: - case HK_NOT_FOUND: - return; - break; - - case HK_HELP: // Display Current hotkey list - DisplayHotkeyList(this, s_LibEdit_Hotkey_List); - break; + { + default: + case HK_NOT_FOUND: + return; + break; - case HK_ZOOM_IN: - case HK_ZOOM_OUT: - case HK_ZOOM_REDRAW: - case HK_ZOOM_CENTER: - case HK_RESET_LOCAL_COORD: - break; + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList( this, s_LibEdit_Hotkey_List ); + break; - case HK_REPEAT_LAST: - if ( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0) && - (LibItemToRepeat->m_StructType == COMPONENT_PIN_DRAW_TYPE) ) - { - RepeatPinItem(DC, (LibDrawPin*) LibItemToRepeat); - } - else wxBell(); - break; - } + case HK_RESET_LOCAL_COORD: /* Reset the relative coord */ + m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur; + break; - if ( RefreshToolBar ) SetToolbars(); + case HK_ZOOM_IN: + OnZoom( ID_ZOOM_PLUS_KEY ); + break; + + case HK_ZOOM_OUT: + OnZoom( ID_ZOOM_MOINS_KEY ); + break; + + case HK_ZOOM_REDRAW: + OnZoom( ID_ZOOM_REDRAW_KEY ); + break; + + case HK_ZOOM_CENTER: + OnZoom( ID_ZOOM_CENTER_KEY ); + break; + + case HK_REPEAT_LAST: + if( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0) + && (LibItemToRepeat->m_StructType == COMPONENT_PIN_DRAW_TYPE) ) + { + RepeatPinItem( DC, (LibDrawPin*) LibItemToRepeat ); + } + else + wxBell(); + break; + } + + if( RefreshToolBar ) + SetToolbars(); } - diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h new file mode 100644 index 0000000000..c5c0a30141 --- /dev/null +++ b/eeschema/hotkeys.h @@ -0,0 +1,35 @@ +/***************/ +/* hotkeys.h */ +/***************/ +#ifndef KOTKEYS_H +#define KOTKEYS_H + +#include "hotkeys_basic.h" + +enum hotkey_id_commnand { + HK_NOT_FOUND = 0, + HK_RESET_LOCAL_COORD, + HK_HELP, + HK_ZOOM_IN, + HK_ZOOM_OUT, + HK_ZOOM_REDRAW, + HK_ZOOM_CENTER, + HK_NEXT_SEARCH, + HK_DELETE, + HK_REPEAT_LAST, + HK_MOVEBLOCK_TO_DRAGBLOCK, + HK_ROTATE_COMPONENT, + HK_MIRROR_X_COMPONENT, + HK_MIRROR_Y_COMPONENT, + HK_ORIENT_NORMAL_COMPONENT, + HK_MOVE_COMPONENT, + HK_ADD_NEW_COMPONENT, + HK_BEGIN_WIRE +}; + +// List of hotkey descriptors for schematic +extern Ki_HotkeyInfo* s_Schematic_Hotkey_List[]; +// List of hotkey descriptors for libray editor +extern Ki_HotkeyInfo* s_LibEdit_Hotkey_List[]; + +#endif // KOTKEYS_H diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index a6bc5551d4..429c3deeee 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -16,6 +16,7 @@ #include "protos.h" #include "id.h" +#include "hotkeys.h" #include "bitmaps.h" @@ -272,24 +273,31 @@ void AddMenusForComponent( wxMenu* PopMenu, EDA_SchComponentStruct* Component ) /* Add menu commands for a component */ { + wxString msg; + EDA_LibComponentStruct* LibEntry; LibEntry = FindLibPart( Component->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); if( !Component->m_Flags ) { + msg = AddHotkeyName( _( "Move Component" ), s_Schematic_Hotkey_List, HK_MOVE_COMPONENT ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_CMP_REQUEST, - _( "Move Component (M)" ), move_xpm ); + msg, move_xpm ); } // add menu orient et sous menu: wxMenu* orientmenu = new wxMenu; + msg = AddHotkeyName( _( "Rotate +" ), s_Schematic_Hotkey_List, HK_ROTATE_COMPONENT ); ADD_MENUITEM( orientmenu, ID_POPUP_SCH_ROTATE_CMP_COUNTERCLOCKWISE, - _( "Rotate + (R)" ), rotate_pos_xpm ); + msg, rotate_pos_xpm ); ADD_MENUITEM( orientmenu, ID_POPUP_SCH_ROTATE_CMP_CLOCKWISE, _( "Rotate -" ), rotate_neg_xpm ); - ADD_MENUITEM( orientmenu, ID_POPUP_SCH_MIROR_X_CMP, _( "Mirror -- (X)" ), mirror_V_xpm ); - ADD_MENUITEM( orientmenu, ID_POPUP_SCH_MIROR_Y_CMP, _( "Mirror || (Y)" ), mirror_H_xpm ); - ADD_MENUITEM( orientmenu, ID_POPUP_SCH_ORIENT_NORMAL_CMP, _( "Normal (N)" ), normal_xpm ); + msg = AddHotkeyName( _( "Mirror --" ), s_Schematic_Hotkey_List, HK_MIRROR_X_COMPONENT ); + ADD_MENUITEM( orientmenu, ID_POPUP_SCH_MIROR_X_CMP, msg, mirror_V_xpm ); + msg = AddHotkeyName( _( "Mirror ||" ), s_Schematic_Hotkey_List, HK_MIRROR_Y_COMPONENT ); + ADD_MENUITEM( orientmenu, ID_POPUP_SCH_MIROR_Y_CMP, msg, mirror_H_xpm ); + msg = AddHotkeyName( _( "Normal" ), s_Schematic_Hotkey_List, HK_ORIENT_NORMAL_COMPONENT ); + ADD_MENUITEM( orientmenu, ID_POPUP_SCH_ORIENT_NORMAL_CMP, msg, normal_xpm ); ADD_MENUITEM_WITH_SUBMENU( PopMenu, orientmenu, ID_POPUP_SCH_GENERIC_ORIENT_CMP, _( "Orient Component" ), orient_xpm ); diff --git a/eeschema/tool_lib.cpp b/eeschema/tool_lib.cpp index 001ba070ce..4805824e30 100644 --- a/eeschema/tool_lib.cpp +++ b/eeschema/tool_lib.cpp @@ -1,6 +1,6 @@ - /********************************************/ - /* tool_lib.cpp: construction des toolbars */ - /********************************************/ +/********************************************/ +/* tool_lib.cpp: construction des toolbars */ +/********************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -11,6 +11,7 @@ #include "general.h" #include "protos.h" +#include "hotkeys.h" #define BITMAP wxBitmap @@ -34,243 +35,245 @@ /****************************************************/ -void WinEDA_LibeditFrame::ReCreateVToolbar(void) +void WinEDA_LibeditFrame::ReCreateVToolbar( void ) /****************************************************/ { - if( m_VToolBar == NULL ) - { - m_VToolBar = new WinEDA_Toolbar(TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE); + if( m_VToolBar == NULL ) + { + m_VToolBar = new WinEDA_Toolbar( TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE ); - // Set up toolbar - m_VToolBar->AddTool(ID_NO_SELECT_BUTT, wxEmptyString, - BITMAP(cursor_xpm), - _("deselect current tool"), wxITEM_CHECK ); - m_VToolBar->ToggleTool(ID_NO_SELECT_BUTT, TRUE); + // Set up toolbar + m_VToolBar->AddTool( ID_NO_SELECT_BUTT, wxEmptyString, + BITMAP( cursor_xpm ), + _( "deselect current tool" ), wxITEM_CHECK ); + m_VToolBar->ToggleTool( ID_NO_SELECT_BUTT, TRUE ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LIBEDIT_PIN_BUTT, wxEmptyString, - BITMAP(pin_xpm), - _("Add Pins"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LIBEDIT_PIN_BUTT, wxEmptyString, + BITMAP( pin_xpm ), + _( "Add Pins" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_BODY_TEXT_BUTT, wxEmptyString, - BITMAP(add_text_xpm), - _("Add graphic text"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_BODY_TEXT_BUTT, wxEmptyString, + BITMAP( add_text_xpm ), + _( "Add graphic text" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_BODY_RECT_BUTT, wxEmptyString, - BITMAP(add_rectangle_xpm), - _("Add rectangles"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_BODY_RECT_BUTT, wxEmptyString, + BITMAP( add_rectangle_xpm ), + _( "Add rectangles" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_BODY_CIRCLE_BUTT, wxEmptyString, - BITMAP(add_circle_xpm), - _("Add circles"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_BODY_CIRCLE_BUTT, wxEmptyString, + BITMAP( add_circle_xpm ), + _( "Add circles" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_BODY_ARC_BUTT, wxEmptyString, - BITMAP(add_arc_xpm), - _("Add arcs"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_BODY_ARC_BUTT, wxEmptyString, + BITMAP( add_arc_xpm ), + _( "Add arcs" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_BODY_LINE_BUTT, wxEmptyString, - BITMAP(add_polygon_xpm), - _( "Add lines and polygons"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_BODY_LINE_BUTT, wxEmptyString, + BITMAP( add_polygon_xpm ), + _( "Add lines and polygons" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LIBEDIT_ANCHOR_ITEM_BUTT, wxEmptyString, - BITMAP(anchor_xpm), - _("Move part anchor"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LIBEDIT_ANCHOR_ITEM_BUTT, wxEmptyString, + BITMAP( anchor_xpm ), + _( "Move part anchor" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LIBEDIT_IMPORT_BODY_BUTT, wxEmptyString, - BITMAP(import_xpm), - _("Import existing drawings"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LIBEDIT_IMPORT_BODY_BUTT, wxEmptyString, + BITMAP( import_xpm ), + _( "Import existing drawings" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LIBEDIT_EXPORT_BODY_BUTT, wxEmptyString, - BITMAP(export_xpm), - _("Export current drawing"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LIBEDIT_EXPORT_BODY_BUTT, wxEmptyString, + BITMAP( export_xpm ), + _( "Export current drawing" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LIBEDIT_DELETE_ITEM_BUTT, wxEmptyString, - BITMAP(delete_body_xpm), - _("Delete items"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LIBEDIT_DELETE_ITEM_BUTT, wxEmptyString, + BITMAP( delete_body_xpm ), + _( "Delete items" ), wxITEM_CHECK ); - m_VToolBar->Realize(); - } + m_VToolBar->Realize(); + } - SetToolbars(); + SetToolbars(); } +/*************************************************/ +void WinEDA_LibeditFrame::ReCreateHToolbar( void ) +/*************************************************/ -/*************************************************/ -void WinEDA_LibeditFrame::ReCreateHToolbar(void) -/*************************************************/ +/* Create or update the main Horizontal Toolbar for the schematic library editor + */ { -int ii; + int ii; + wxString msg; - // Create the toolbar if not exists - if ( m_HToolBar == NULL ) - { - m_HToolBar = new WinEDA_Toolbar(TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE); - SetToolBar(m_HToolBar); + // Create the toolbar if not exists + if( m_HToolBar == NULL ) + { + m_HToolBar = new WinEDA_Toolbar( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE ); + SetToolBar( m_HToolBar ); - // Set up toolbar - m_HToolBar->AddTool(ID_LIBEDIT_SAVE_CURRENT_LIB, wxEmptyString, BITMAP(save_library_xpm), - _("Save current loaded library on disk (file update)") ); + // Set up toolbar + m_HToolBar->AddTool( ID_LIBEDIT_SAVE_CURRENT_LIB, wxEmptyString, BITMAP( save_library_xpm ), + _( "Save current loaded library on disk (file update)" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_SELECT_CURRENT_LIB, wxEmptyString, BITMAP(library_xpm), - _("Select working library") ); + m_HToolBar->AddTool( ID_LIBEDIT_SELECT_CURRENT_LIB, wxEmptyString, BITMAP( library_xpm ), + _( "Select working library" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_DELETE_PART, wxEmptyString, BITMAP(delete_xpm), - _("Delete part in current library") ); + m_HToolBar->AddTool( ID_LIBEDIT_DELETE_PART, wxEmptyString, BITMAP( delete_xpm ), + _( "Delete part in current library" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_NEW_PART, wxEmptyString, BITMAP(new_component_xpm), - _("New part") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_NEW_PART, wxEmptyString, BITMAP( new_component_xpm ), + _( "New part" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_SELECT_PART, BITMAP(add_component_xpm), - _("Select part to edit") ); + m_HToolBar->AddTool( ID_LIBEDIT_SELECT_PART, BITMAP( add_component_xpm ), + _( "Select part to edit" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_SAVE_CURRENT_PART, wxEmptyString, - BITMAP(save_part_in_mem_xpm), - _("Save current part into current loaded library (in memory)") ); + m_HToolBar->AddTool( ID_LIBEDIT_SAVE_CURRENT_PART, wxEmptyString, + BITMAP( save_part_in_mem_xpm ), + _( "Save current part into current loaded library (in memory)" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_IMPORT_PART, wxEmptyString, BITMAP(import_xpm), - _("import part")); + m_HToolBar->AddTool( ID_LIBEDIT_IMPORT_PART, wxEmptyString, BITMAP( import_xpm ), + _( "import part" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_EXPORT_PART, wxEmptyString, BITMAP(export_xpm), - _("export part")); + m_HToolBar->AddTool( ID_LIBEDIT_EXPORT_PART, wxEmptyString, BITMAP( export_xpm ), + _( "export part" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART, - wxEmptyString, BITMAP(new_library_xpm), - _("Create a new library an save current part into")); + m_HToolBar->AddTool( ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART, + wxEmptyString, BITMAP( new_library_xpm ), + _( "Create a new library an save current part into" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_UNDO, wxEmptyString, BITMAP(undo_xpm), - _("Undo last edition")); - m_HToolBar->AddTool(ID_LIBEDIT_REDO, wxEmptyString, BITMAP(redo_xpm), - _("Redo the last undo command")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_UNDO, wxEmptyString, BITMAP( undo_xpm ), + _( "Undo last edition" ) ); + m_HToolBar->AddTool( ID_LIBEDIT_REDO, wxEmptyString, BITMAP( redo_xpm ), + _( "Redo the last undo command" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_GET_FRAME_EDIT_PART, BITMAP(part_properties_xpm), - wxNullBitmap, - FALSE, - -1, -1, (wxObject *) NULL, - _("Edit Part Properties")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_GET_FRAME_EDIT_PART, BITMAP( part_properties_xpm ), + wxNullBitmap, + FALSE, + -1, -1, (wxObject*) NULL, + _( "Edit Part Properties" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_CHECK_PART, BITMAP(erc_xpm), - wxNullBitmap, - FALSE, - -1, -1, (wxObject *) NULL, - _("Test duplicate pins")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_CHECK_PART, BITMAP( erc_xpm ), + wxNullBitmap, + FALSE, + -1, -1, (wxObject*) NULL, + _( "Test duplicate pins" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_ZOOM_PLUS_BUTT, BITMAP(zoom_in_xpm), - wxNullBitmap, - FALSE, - -1, -1, (wxObject *) NULL, - _("zoom + (F1)")); + m_HToolBar->AddSeparator(); + msg = AddHotkeyName( _( "zoom +" ), s_LibEdit_Hotkey_List, HK_ZOOM_IN ); + m_HToolBar->AddTool( ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP( zoom_in_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_MOINS_BUTT, wxEmptyString, - BITMAP(zoom_out_xpm), - _("zoom - (F2)")); + msg = AddHotkeyName( _( "zoom -" ), s_LibEdit_Hotkey_List, HK_ZOOM_OUT ); + m_HToolBar->AddTool( ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP( zoom_out_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_REDRAW_BUTT, wxEmptyString, - BITMAP(repaint_xpm), - _("redraw (F3)")); + msg = AddHotkeyName( _( "redraw" ), s_LibEdit_Hotkey_List, HK_ZOOM_REDRAW ); + m_HToolBar->AddTool( ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP( repaint_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_PAGE_BUTT, wxEmptyString, - BITMAP(zoom_optimal_xpm), - _("auto zoom") ); + m_HToolBar->AddTool( ID_ZOOM_PAGE_BUTT, wxEmptyString, + BITMAP( zoom_optimal_xpm ), + _( "auto zoom" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_DE_MORGAN_NORMAL_BUTT, wxEmptyString, - BITMAP(morgan1_xpm), - _("show as \"De Morgan\" normal part"), wxITEM_CHECK); - m_HToolBar->ToggleTool(ID_DE_MORGAN_NORMAL_BUTT, - (CurrentConvert <= 1) ? TRUE : FALSE); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_DE_MORGAN_NORMAL_BUTT, wxEmptyString, + BITMAP( morgan1_xpm ), + _( "show as \"De Morgan\" normal part" ), wxITEM_CHECK ); + m_HToolBar->ToggleTool( ID_DE_MORGAN_NORMAL_BUTT, + (CurrentConvert <= 1) ? TRUE : FALSE ); - m_HToolBar->AddTool(ID_DE_MORGAN_CONVERT_BUTT, wxEmptyString, - BITMAP(morgan2_xpm), - _("show as \"De Morgan\" convert part"), wxITEM_CHECK); - m_HToolBar->ToggleTool(ID_DE_MORGAN_CONVERT_BUTT, - (CurrentConvert >= 2) ? TRUE : FALSE ); + m_HToolBar->AddTool( ID_DE_MORGAN_CONVERT_BUTT, wxEmptyString, + BITMAP( morgan2_xpm ), + _( "show as \"De Morgan\" convert part" ), wxITEM_CHECK ); + m_HToolBar->ToggleTool( ID_DE_MORGAN_CONVERT_BUTT, + (CurrentConvert >= 2) ? TRUE : FALSE ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_VIEW_DOC, BITMAP(datasheet_xpm), - wxNullBitmap, - FALSE, - -1, -1, (wxObject *) NULL, - _("Documents")); - m_HToolBar->EnableTool(ID_LIBEDIT_VIEW_DOC, FALSE); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_VIEW_DOC, BITMAP( datasheet_xpm ), + wxNullBitmap, + FALSE, + -1, -1, (wxObject*) NULL, + _( "Documents" ) ); + m_HToolBar->EnableTool( ID_LIBEDIT_VIEW_DOC, FALSE ); - m_HToolBar->AddSeparator(); - m_SelpartBox = new WinEDAChoiceBox(m_HToolBar, ID_LIBEDIT_SELECT_PART_NUMBER, - wxDefaultPosition, wxSize(LISTBOX_WIDTH, -1)); - m_HToolBar->AddControl(m_SelpartBox); + m_HToolBar->AddSeparator(); + m_SelpartBox = new WinEDAChoiceBox( m_HToolBar, ID_LIBEDIT_SELECT_PART_NUMBER, + wxDefaultPosition, wxSize( LISTBOX_WIDTH, -1 ) ); + m_HToolBar->AddControl( m_SelpartBox ); - m_SelAliasBox = new WinEDAChoiceBox(m_HToolBar, ID_LIBEDIT_SELECT_ALIAS, - wxDefaultPosition, wxSize(LISTBOX_WIDTH, -1)); - m_HToolBar->AddControl(m_SelAliasBox); + m_SelAliasBox = new WinEDAChoiceBox( m_HToolBar, ID_LIBEDIT_SELECT_ALIAS, + wxDefaultPosition, wxSize( LISTBOX_WIDTH, -1 ) ); + m_HToolBar->AddControl( m_SelAliasBox ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_EDIT_PIN_BY_PIN, BITMAP(pin2pin_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Edit pins part per part (Carefully use!)")); - m_HToolBar->ToggleTool(ID_LIBEDIT_EDIT_PIN_BY_PIN, g_EditPinByPinIsOn); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_EDIT_PIN_BY_PIN, BITMAP( pin2pin_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Edit pins part per part (Carefully use!)" ) ); + m_HToolBar->ToggleTool( ID_LIBEDIT_EDIT_PIN_BY_PIN, g_EditPinByPinIsOn ); - // after adding the buttons to the toolbar, must call Realize() to reflect - // the changes - m_HToolBar->Realize(); - } + // after adding the buttons to the toolbar, must call Realize() to reflect the changes + m_HToolBar->Realize(); + } + else /* Toolbar already created, it only must be updated */ + { + m_SelAliasBox->Clear(); + m_SelpartBox->Clear(); + } - else /* Toolbar deja créé, mise a jour des affichages */ - { - m_SelAliasBox->Clear(); - m_SelpartBox->Clear(); - } + /* Update the part selection box */ + int jj = 1; + if( CurrentLibEntry ) + jj = CurrentLibEntry->m_UnitCount; + if( jj > 1 ) + for( ii = 0; ii < jj; ii++ ) + { + wxString msg; + msg.Printf( _( "Part %c" ), 'A' + ii ); + m_SelpartBox->Append( msg ); + } - /* Update the part selection box */ - int jj = 1; - if( CurrentLibEntry ) jj = CurrentLibEntry->m_UnitCount; - if ( jj > 1 ) - for ( ii = 0; ii < jj ; ii ++ ) - { - wxString msg; - msg.Printf(_("Part %c"), 'A' + ii); - m_SelpartBox->Append(msg); - } - else m_SelpartBox->Append( wxEmptyString ); - m_SelpartBox->SetSelection( ( CurrentUnit > 0 ) ? CurrentUnit-1 : 0); - - if( CurrentLibEntry) - { - if ( CurrentLibEntry->m_UnitCount > 1 ) m_SelpartBox->Enable(TRUE); - else m_SelpartBox->Enable(FALSE); - m_SelAliasBox->Append(CurrentLibEntry->m_Name.m_Text); - m_SelAliasBox->SetSelection( 0 ); - int count = CurrentLibEntry->m_AliasList.GetCount(); - if ( count > 0 ) /* Update the part selection box */ - { - m_SelAliasBox->Enable(TRUE); - for ( ii = 0, jj = 1; ii < count; ii += ALIAS_NEXT, jj++ ) - { - m_SelAliasBox->Append(CurrentLibEntry->m_AliasList[ii]); - if ( CurrentAliasName == CurrentLibEntry->m_AliasList[ii]) - m_SelAliasBox->SetSelection( jj ); - } - } - else m_SelAliasBox->Enable(FALSE); - } - else - { - m_SelAliasBox->Enable(FALSE); - m_SelpartBox->Enable(FALSE); - } + else + m_SelpartBox->Append( wxEmptyString ); + m_SelpartBox->SetSelection( ( CurrentUnit > 0 ) ? CurrentUnit - 1 : 0 ); - // Doit etre placé apres Realize(): - SetToolbars(); + if( CurrentLibEntry ) + { + if( CurrentLibEntry->m_UnitCount > 1 ) + m_SelpartBox->Enable( TRUE ); + else + m_SelpartBox->Enable( FALSE ); + m_SelAliasBox->Append( CurrentLibEntry->m_Name.m_Text ); + m_SelAliasBox->SetSelection( 0 ); + int count = CurrentLibEntry->m_AliasList.GetCount(); + if( count > 0 ) /* Update the part selection box */ + { + m_SelAliasBox->Enable( TRUE ); + for( ii = 0, jj = 1; ii < count; ii += ALIAS_NEXT, jj++ ) + { + m_SelAliasBox->Append( CurrentLibEntry->m_AliasList[ii] ); + if( CurrentAliasName == CurrentLibEntry->m_AliasList[ii] ) + m_SelAliasBox->SetSelection( jj ); + } + } + else + m_SelAliasBox->Enable( FALSE ); + } + else + { + m_SelAliasBox->Enable( FALSE ); + m_SelpartBox->Enable( FALSE ); + } + // Must be called AFTER Realize(): + SetToolbars(); } - - diff --git a/eeschema/tool_sch.cpp b/eeschema/tool_sch.cpp index 17fe42914c..a1d0fda630 100644 --- a/eeschema/tool_sch.cpp +++ b/eeschema/tool_sch.cpp @@ -1,6 +1,6 @@ - /*****************************************************/ - /* toolsch.cpp; vreate toolbars for schematic frame */ - /*****************************************************/ +/*****************************************************/ +/* toolsch.cpp; vreate toolbars for schematic frame */ +/*****************************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -11,10 +11,11 @@ #include "general.h" #include "protos.h" +#include "hotkeys.h" #define BITMAP wxBitmap -#include "bitmaps.h" /* general bitmaps */ +#include "bitmaps.h" /* general bitmaps */ /* Specific bitmaps */ #include "cvpcb.xpm" @@ -36,292 +37,300 @@ /**************************************************************/ -void WinEDA_SchematicFrame::ReCreateHToolbar(void) +void WinEDA_SchematicFrame::ReCreateHToolbar( void ) /**************************************************************/ -/* Create Horizontal (main) Toolbar -*/ + +/* Create the main Horizontal Toolbar for the schematic editor + */ { - if ( m_HToolBar != NULL ) return; + if( m_HToolBar != NULL ) + return; - m_HToolBar = new WinEDA_Toolbar(TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE); - SetToolBar(m_HToolBar); + wxString msg; + m_HToolBar = new WinEDA_Toolbar( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE ); + SetToolBar( m_HToolBar ); - // Set up toolbar - m_HToolBar->AddTool(ID_NEW_PROJECT, wxEmptyString, BITMAP(new_xpm), - _("New schematic project")); + // Set up toolbar + m_HToolBar->AddTool( ID_NEW_PROJECT, wxEmptyString, BITMAP( new_xpm ), + _( "New schematic project" ) ); - m_HToolBar->AddTool(ID_LOAD_PROJECT, wxEmptyString, BITMAP(open_xpm), - _("Open schematic project")); + m_HToolBar->AddTool( ID_LOAD_PROJECT, wxEmptyString, BITMAP( open_xpm ), + _( "Open schematic project" ) ); - m_HToolBar->AddTool(ID_SAVE_PROJECT, wxEmptyString, BITMAP(save_project_xpm), - _("Save schematic project")); + m_HToolBar->AddTool( ID_SAVE_PROJECT, wxEmptyString, BITMAP( save_project_xpm ), + _( "Save schematic project" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_SHEET_SET, wxEmptyString, BITMAP(sheetset_xpm), - _("page settings (size, texts)") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_SHEET_SET, wxEmptyString, BITMAP( sheetset_xpm ), + _( "page settings (size, texts)" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_TO_LIBRARY, wxEmptyString, BITMAP(libedit_xpm), - _("go to library editor") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_TO_LIBRARY, wxEmptyString, BITMAP( libedit_xpm ), + _( "go to library editor" ) ); - m_HToolBar->AddTool(ID_TO_LIBVIEW, wxEmptyString, BITMAP(library_browse_xpm), - _("go to library browse") ); + m_HToolBar->AddTool( ID_TO_LIBVIEW, wxEmptyString, BITMAP( library_browse_xpm ), + _( "go to library browse" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_HIERARCHY, wxEmptyString, BITMAP(hierarchy_nav_xpm), - _("Schematic Hierarchy Navigator") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_HIERARCHY, wxEmptyString, BITMAP( hierarchy_nav_xpm ), + _( "Schematic Hierarchy Navigator" ) ); - m_HToolBar->AddSeparator(); + m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(wxID_CUT, wxEmptyString, BITMAP(cut_button), - _("Cut selected item") ); + m_HToolBar->AddTool( wxID_CUT, wxEmptyString, BITMAP( cut_button ), + _( "Cut selected item" ) ); - m_HToolBar->AddTool(wxID_COPY, wxEmptyString, BITMAP(copy_button), - _("Copy selected item") ); + m_HToolBar->AddTool( wxID_COPY, wxEmptyString, BITMAP( copy_button ), + _( "Copy selected item" ) ); - m_HToolBar->AddTool(wxID_PASTE, wxEmptyString, BITMAP(paste_xpm), - _("Paste") ); + m_HToolBar->AddTool( wxID_PASTE, wxEmptyString, BITMAP( paste_xpm ), + _( "Paste" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_SCHEMATIC_UNDO, wxEmptyString, BITMAP(undo_xpm), - _("Undo last edition")); - m_HToolBar->AddTool(ID_SCHEMATIC_REDO, wxEmptyString, BITMAP(redo_xpm), - _("Redo the last undo command")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_SCHEMATIC_UNDO, wxEmptyString, BITMAP( undo_xpm ), + _( "Undo last edition" ) ); + m_HToolBar->AddTool( ID_SCHEMATIC_REDO, wxEmptyString, BITMAP( redo_xpm ), + _( "Redo the last undo command" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_GEN_PRINT, wxEmptyString, BITMAP(print_button), - _("Print schematic") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_GEN_PRINT, wxEmptyString, BITMAP( print_button ), + _( "Print schematic" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_TO_CVPCB, wxEmptyString, BITMAP(cvpcb_xpm), - _("Run Cvpcb") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_TO_CVPCB, wxEmptyString, BITMAP( cvpcb_xpm ), + _( "Run Cvpcb" ) ); - m_HToolBar->AddTool(ID_TO_PCB, wxEmptyString, BITMAP(pcbnew_xpm), - _("Run Pcbnew") ); + m_HToolBar->AddTool( ID_TO_PCB, wxEmptyString, BITMAP( pcbnew_xpm ), + _( "Run Pcbnew" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP(zoom_in_xpm), - _("zoom + (F1)")); + m_HToolBar->AddSeparator(); + msg = AddHotkeyName( _( "zoom +" ), s_Schematic_Hotkey_List, HK_ZOOM_IN ); + m_HToolBar->AddTool( ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP( zoom_in_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP(zoom_out_xpm), - _("zoom - (F2)")); + msg = AddHotkeyName( _( "zoom -" ), s_Schematic_Hotkey_List, HK_ZOOM_OUT ); + m_HToolBar->AddTool( ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP( zoom_out_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP(repaint_xpm), - _("redraw (F3)") ); + msg = AddHotkeyName( _( "redraw" ), s_Schematic_Hotkey_List, HK_ZOOM_REDRAW ); + m_HToolBar->AddTool( ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP( repaint_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP(zoom_optimal_xpm), - _("auto zoom") ); + m_HToolBar->AddTool( ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP( zoom_optimal_xpm ), + _( "auto zoom" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_FIND_ITEMS, wxEmptyString, BITMAP(find_xpm), - _("Find components and texts") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_FIND_ITEMS, wxEmptyString, BITMAP( find_xpm ), + _( "Find components and texts" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_GET_NETLIST, wxEmptyString, BITMAP(netlist_xpm), - _("Netlist generation") ); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, BITMAP( netlist_xpm ), + _( "Netlist generation" ) ); - m_HToolBar->AddTool(ID_GET_ANNOTATE, wxEmptyString, BITMAP(annotate_xpm), - _("Schematic Annotation") ); + m_HToolBar->AddTool( ID_GET_ANNOTATE, wxEmptyString, BITMAP( annotate_xpm ), + _( "Schematic Annotation" ) ); - m_HToolBar->AddTool(ID_GET_ERC, wxEmptyString, BITMAP(erc_xpm), - _("Schematic Electric Rules Check") ); + m_HToolBar->AddTool( ID_GET_ERC, wxEmptyString, BITMAP( erc_xpm ), + _( "Schematic Electric Rules Check" ) ); - m_HToolBar->AddTool(ID_GET_TOOLS, wxEmptyString, BITMAP(tools_xpm), - _("Bill of material and/or Crossreferences") ); + m_HToolBar->AddTool( ID_GET_TOOLS, wxEmptyString, BITMAP( tools_xpm ), + _( "Bill of material and/or Crossreferences" ) ); - // after adding the buttons to the toolbar, must call Realize() to reflect - // the changes - m_HToolBar->Realize(); - SetToolbars(); + // after adding the tools to the toolbar, must call Realize() to reflect the changes + m_HToolBar->Realize(); + SetToolbars(); } + /*************************************************/ -void WinEDA_SchematicFrame::ReCreateVToolbar(void) +void WinEDA_SchematicFrame::ReCreateVToolbar( void ) /*************************************************/ + /* Create Vertical Right Toolbar -*/ + */ { - if( m_VToolBar ) return; - m_VToolBar = new WinEDA_Toolbar(TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE); + if( m_VToolBar ) + return; + m_VToolBar = new WinEDA_Toolbar( TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE ); - // Set up toolbar - m_VToolBar->AddTool(ID_NO_SELECT_BUTT, wxEmptyString, - BITMAP(cursor_xpm), wxEmptyString, wxITEM_CHECK ); - m_VToolBar->ToggleTool(ID_NO_SELECT_BUTT, TRUE); + // Set up toolbar + m_VToolBar->AddTool( ID_NO_SELECT_BUTT, wxEmptyString, + BITMAP( cursor_xpm ), wxEmptyString, wxITEM_CHECK ); + m_VToolBar->ToggleTool( ID_NO_SELECT_BUTT, TRUE ); - m_VToolBar->AddTool(ID_HIERARCHY_PUSH_POP_BUTT, wxEmptyString, - BITMAP(hierarchy_cursor_xpm), - _("Hierarchy Push/Pop"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_HIERARCHY_PUSH_POP_BUTT, wxEmptyString, + BITMAP( hierarchy_cursor_xpm ), + _( "Hierarchy Push/Pop" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_COMPONENT_BUTT, wxEmptyString, - BITMAP(add_component_xpm), - _("Add components"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_COMPONENT_BUTT, wxEmptyString, + BITMAP( add_component_xpm ), + _( "Add components" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_PLACE_POWER_BUTT, wxEmptyString, - BITMAP(add_power_xpm), - _("Add powers"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_PLACE_POWER_BUTT, wxEmptyString, + BITMAP( add_power_xpm ), + _( "Add powers" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_WIRE_BUTT, wxEmptyString, - BITMAP(add_line_xpm), - _("Add wires"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_WIRE_BUTT, wxEmptyString, + BITMAP( add_line_xpm ), + _( "Add wires" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_BUS_BUTT, wxEmptyString, - BITMAP(add_bus_xpm), - _("Add bus"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_BUS_BUTT, wxEmptyString, + BITMAP( add_bus_xpm ), + _( "Add bus" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_WIRETOBUS_ENTRY_BUTT, wxEmptyString, - BITMAP(add_line2bus_xpm), - _("Add wire to bus entry"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_WIRETOBUS_ENTRY_BUTT, wxEmptyString, + BITMAP( add_line2bus_xpm ), + _( "Add wire to bus entry" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_BUSTOBUS_ENTRY_BUTT, wxEmptyString, - BITMAP(add_bus2bus_xpm), - _("Add bus to bus entry"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_BUSTOBUS_ENTRY_BUTT, wxEmptyString, + BITMAP( add_bus2bus_xpm ), + _( "Add bus to bus entry" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_NOCONN_BUTT, wxEmptyString, - BITMAP(noconn_button), - _("Add no connect flag"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_NOCONN_BUTT, wxEmptyString, + BITMAP( noconn_button ), + _( "Add no connect flag" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_LABEL_BUTT, wxEmptyString, - BITMAP(add_line_label_xpm), - _("Add wire or bus label"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_LABEL_BUTT, wxEmptyString, + BITMAP( add_line_label_xpm ), + _( "Add wire or bus label" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_GLABEL_BUTT, wxEmptyString, - BITMAP(add_glabel_xpm), - _("Add global label"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_GLABEL_BUTT, wxEmptyString, + BITMAP( add_glabel_xpm ), + _( "Add global label" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_JUNCTION_BUTT, wxEmptyString, - BITMAP(add_junction_xpm), - _("Add junction"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_JUNCTION_BUTT, wxEmptyString, + BITMAP( add_junction_xpm ), + _( "Add junction" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_SHEET_SYMBOL_BUTT, wxEmptyString, - BITMAP(add_hierar_symbol_xpm), - _("Add hierarchical symbol (sheet)") , wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_SHEET_SYMBOL_BUTT, wxEmptyString, + BITMAP( add_hierar_symbol_xpm ), + _( "Add hierarchical symbol (sheet)" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_IMPORT_GLABEL_BUTT, wxEmptyString, - BITMAP(import_glabel_xpm), - _("import glabel from sheet & create pinsheet"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_IMPORT_GLABEL_BUTT, wxEmptyString, + BITMAP( import_glabel_xpm ), + _( "import glabel from sheet & create pinsheet" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_SHEET_LABEL_BUTT, wxEmptyString, - BITMAP(add_hierar_pin_xpm), - _("Add hierachical pin to sheet"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_SHEET_LABEL_BUTT, wxEmptyString, + BITMAP( add_hierar_pin_xpm ), + _( "Add hierachical pin to sheet" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LINE_COMMENT_BUTT, wxEmptyString, - BITMAP(add_dashed_line_xpm), - _("Add graphic line or polygon") , wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LINE_COMMENT_BUTT, wxEmptyString, + BITMAP( add_dashed_line_xpm ), + _( "Add graphic line or polygon" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_TEXT_COMMENT_BUTT, wxEmptyString, - BITMAP(add_text_xpm), - _("Add graphic text (comment)"), wxITEM_CHECK ); + m_VToolBar->AddTool( ID_TEXT_COMMENT_BUTT, wxEmptyString, + BITMAP( add_text_xpm ), + _( "Add graphic text (comment)" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_SCHEMATIC_DELETE_ITEM_BUTT, wxEmptyString, - BITMAP(delete_body_xpm), - _("Delete items"), wxITEM_CHECK ); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_SCHEMATIC_DELETE_ITEM_BUTT, wxEmptyString, + BITMAP( delete_body_xpm ), + _( "Delete items" ), wxITEM_CHECK ); - m_VToolBar->Realize(); - SetToolbars(); + m_VToolBar->Realize(); + SetToolbars(); } /****************************************************************/ -void WinEDA_SchematicFrame::ReCreateOptToolbar(void) +void WinEDA_SchematicFrame::ReCreateOptToolbar( void ) /****************************************************************/ + /* Create Vertical Left Toolbar (Option Toolbar) -*/ + */ { + if( m_OptionsToolBar ) + return; - if ( m_OptionsToolBar ) return; + // creation du tool bar options + m_OptionsToolBar = new WinEDA_Toolbar( TOOLBAR_OPTION, this, ID_OPT_TOOLBAR, FALSE ); - // creation du tool bar options - m_OptionsToolBar = new WinEDA_Toolbar(TOOLBAR_OPTION, this, ID_OPT_TOOLBAR, FALSE); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_GRID, wxEmptyString, + BITMAP( grid_xpm ), + _( "Display Grid OFF" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_GRID, wxEmptyString, - BITMAP(grid_xpm), - _("Display Grid OFF"), wxITEM_CHECK ); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, + BITMAP( unit_inch_xpm ), + _( "Units = Inch" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, - BITMAP(unit_inch_xpm), - _("Units = Inch"), wxITEM_CHECK ); - - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, - BITMAP(unit_mm_xpm), - _("Units = mm"), wxITEM_CHECK ); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, + BITMAP( unit_mm_xpm ), + _( "Units = mm" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString, - BITMAP(cursor_shape_xpm), - _("Change Cursor Shape"), wxITEM_CHECK ); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString, + BITMAP( cursor_shape_xpm ), + _( "Change Cursor Shape" ), wxITEM_CHECK ); - m_OptionsToolBar->AddSeparator(); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_HIDDEN_PINS, wxEmptyString, - BITMAP(hidden_pin_xpm), - _("Show Hidden Pins"), wxITEM_CHECK ); + m_OptionsToolBar->AddSeparator(); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_HIDDEN_PINS, wxEmptyString, + BITMAP( hidden_pin_xpm ), + _( "Show Hidden Pins" ), wxITEM_CHECK ); - m_OptionsToolBar->AddSeparator(); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_BUS_WIRES_ORIENT, wxEmptyString, - BITMAP(lines90_xpm), - _("HV orientation for Wires and Bus"), wxITEM_CHECK ); + m_OptionsToolBar->AddSeparator(); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_BUS_WIRES_ORIENT, wxEmptyString, + BITMAP( lines90_xpm ), + _( "HV orientation for Wires and Bus" ), wxITEM_CHECK ); - m_OptionsToolBar->Realize(); + m_OptionsToolBar->Realize(); - SetToolbars(); + SetToolbars(); } /*******************************************************************************************/ -void WinEDA_SchematicFrame::OnSelectOptionToolbar(wxCommandEvent& event) +void WinEDA_SchematicFrame::OnSelectOptionToolbar( wxCommandEvent& event ) /*******************************************************************************************/ { - if ( DrawPanel == NULL ) return; + if( DrawPanel == NULL ) + return; -int id = event.GetId(); -wxClientDC dc(DrawPanel); + int id = event.GetId(); + wxClientDC dc( DrawPanel ); - DrawPanel->PrepareGraphicContext(&dc); - switch ( id ) - { - case ID_TB_OPTIONS_SHOW_GRID: - g_ShowGrid = m_Draw_Grid = m_OptionsToolBar->GetToolState(id); - ReDrawPanel(); - break; + DrawPanel->PrepareGraphicContext( &dc ); - case ID_TB_OPTIONS_SELECT_UNIT_MM: - g_UnitMetric = MILLIMETRE; - Affiche_Status_Box(); /* Reaffichage des coord curseur */ - break; + switch( id ) + { + case ID_TB_OPTIONS_SHOW_GRID: + g_ShowGrid = m_Draw_Grid = m_OptionsToolBar->GetToolState( id ); + ReDrawPanel(); + break; - case ID_TB_OPTIONS_SELECT_UNIT_INCH: - g_UnitMetric = INCHES; - Affiche_Status_Box(); /* Reaffichage des coord curseur */ - break; + case ID_TB_OPTIONS_SELECT_UNIT_MM: + g_UnitMetric = MILLIMETRE; + Affiche_Status_Box(); /* Reaffichage des coord curseur */ + break; - case ID_TB_OPTIONS_SELECT_CURSOR: - DrawPanel->CursorOff(&dc); - g_CursorShape = m_OptionsToolBar->GetToolState(id); - DrawPanel->CursorOn(&dc); - break; + case ID_TB_OPTIONS_SELECT_UNIT_INCH: + g_UnitMetric = INCHES; + Affiche_Status_Box(); /* Reaffichage des coord curseur */ + break; - case ID_TB_OPTIONS_HIDDEN_PINS: - g_ShowAllPins = m_OptionsToolBar->GetToolState(id); - DrawPanel->ReDraw(&dc, TRUE); - break; + case ID_TB_OPTIONS_SELECT_CURSOR: + DrawPanel->CursorOff( &dc ); + g_CursorShape = m_OptionsToolBar->GetToolState( id ); + DrawPanel->CursorOn( &dc ); + break; - case ID_TB_OPTIONS_BUS_WIRES_ORIENT: - g_HVLines = m_OptionsToolBar->GetToolState(id); - break; + case ID_TB_OPTIONS_HIDDEN_PINS: + g_ShowAllPins = m_OptionsToolBar->GetToolState( id ); + DrawPanel->ReDraw( &dc, TRUE ); + break; - default: - DisplayError(this, wxT("OnSelectOptionToolbar() error") ); - break; - } + case ID_TB_OPTIONS_BUS_WIRES_ORIENT: + g_HVLines = m_OptionsToolBar->GetToolState( id ); + break; - SetToolbars(); + default: + DisplayError( this, wxT( "OnSelectOptionToolbar() error" ) ); + break; + } + + SetToolbars(); } - - - diff --git a/include/build_version.h b/include/build_version.h index 396abeaae5..05e18d33fc 100644 --- a/include/build_version.h +++ b/include/build_version.h @@ -5,7 +5,7 @@ COMMON_GLOBL wxString g_BuildVersion #ifdef EDA_BASE - (wxT("(2007-08-21)")) + (wxT("(2007-08-30)")) #endif ; diff --git a/include/hotkeys_basic.h b/include/hotkeys_basic.h index a53dbe5cf3..e14ff52885 100644 --- a/include/hotkeys_basic.h +++ b/include/hotkeys_basic.h @@ -1,43 +1,44 @@ - /*******************/ - /* hotkeys_basic.h */ - /*******************/ +/*******************/ +/* hotkeys_basic.h */ +/*******************/ /* Some functions to handle hotkeys in kicad -*/ + */ #ifndef HOTKEYS_BASIC_H #define HOTKEYS_BASIC_H -#define DEFAULT_HOTKEY_FILENAME_EXT wxT(".key") +#define DEFAULT_HOTKEY_FILENAME_EXT wxT( ".key" ) /* define default path for config key file */ #ifdef __WINDOWS__ -#define DEFAULT_HOTKEY_FILENAME_PATH EDA_Appl->m_BinDir + wxT("../template/") +#define DEFAULT_HOTKEY_FILENAME_PATH EDA_Appl->m_BinDir + wxT( "../template/" ) #else -#define DEFAULT_HOTKEY_FILENAME_PATH wxGetHomeDir() + wxT("/") +#define DEFAULT_HOTKEY_FILENAME_PATH wxGetHomeDir() + wxT( "/" ) #endif /* Class to handle hotkey commnands. hotkeys have a default value -This class allows (for the future..) the real key code changed by user(from a key code list file, TODO) -*/ + * This class allows (for the future..) the real key code changed by user(from a key code list file, TODO) + */ class Ki_HotkeyInfo { public: - int m_KeyCode; // Key code (ascii value for ascii keys or wxWidgets code for function key - wxString m_InfoMsg; // info message. - int m_Idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) + int m_KeyCode; // Key code (ascii value for ascii keys or wxWidgets code for function key + wxString m_InfoMsg; // info message. + int m_Idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) public: - Ki_HotkeyInfo(const wxChar * infomsg, int idcommand, int keycode); + Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode ); }; /* Functions: -*/ -wxString ReturnKeyNameFromKeyCode(int keycode); -void DisplayHotkeyList(WinEDA_DrawFrame * frame, Ki_HotkeyInfo ** List); -int GetCommandCodeFromHotkey(int key, Ki_HotkeyInfo ** List); + */ +wxString ReturnKeyNameFromKeyCode( int keycode ); +wxString ReturnKeyNameFromCommandId( Ki_HotkeyInfo** List, int CommandId ); +wxString AddHotkeyName( const wxString& text, Ki_HotkeyInfo** List, int CommandId ); +void DisplayHotkeyList( WinEDA_DrawFrame* frame, Ki_HotkeyInfo** List ); +int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List ); #endif // HOTKEYS_BASIC_H - diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index 21d145e7c3c41dd4459ea41e3eb4275ea8d24e99..fab801ffdede8693d568cc405ecdbdc2c99cb587 100644 GIT binary patch delta 46272 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 z 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 UsCc0TXqNvuPHyDhE}cyO0;ek#^#A|> delta 46229 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 R%Poe?)YKGHFnO5S@E\n" "MIME-Version: 1.0\n" @@ -132,8 +132,8 @@ msgstr "Ok" #: eeschema/libedit_onrightclick.cpp:83 #: eeschema/sheetlab.cpp:105 #: eeschema/optionsframe.cpp:155 -#: eeschema/onrightclick.cpp:113 -#: eeschema/onrightclick.cpp:128 +#: eeschema/onrightclick.cpp:114 +#: eeschema/onrightclick.cpp:129 #: eeschema/options.cpp:114 #: eeschema/libedpart.cpp:219 #: gerbview/options.cpp:175 @@ -197,6 +197,7 @@ msgstr "Orientation" #: pcbnew/dialog_edit_module.cpp:291 #: eeschema/dialog_options.cpp:229 #: eeschema/editpart.cpp:323 +#: eeschema/onrightclick.cpp:299 #: eeschema/options.cpp:177 #: eeschema/dialog_edit_component_in_schematic.cpp:182 msgid "Normal" @@ -372,7 +373,7 @@ msgid "Do not Show Zones" msgstr "Ne pas monter Zones" #: pcbnew/pcbframe.cpp:420 -#: pcbnew/tool_pcb.cpp:352 +#: pcbnew/tool_pcb.cpp:361 #: pcbnew/set_color.cpp:387 msgid "Show Zones" msgstr "Monter Zones" @@ -398,7 +399,7 @@ msgid "Normal Contrast Mode Display" msgstr "Mode d'affichage Contraste normal" #: pcbnew/pcbframe.cpp:441 -#: pcbnew/tool_pcb.cpp:365 +#: pcbnew/tool_pcb.cpp:374 msgid "Hight Contrast Mode Display" msgstr "Mode d'affichage Haut Contraste" @@ -563,7 +564,7 @@ msgid "Import Module:" msgstr "Importer Module:" #: pcbnew/librairi.cpp:62 -#: pcbnew/files.cpp:184 +#: pcbnew/files.cpp:183 #: cvpcb/readschematicnetlist.cpp:51 #: cvpcb/rdpcad.cpp:45 #, c-format @@ -641,7 +642,7 @@ msgstr "Module [%s] non trouv #: eeschema/plothpgl.cpp:560 #: cvpcb/genequiv.cpp:42 #: gerbview/export_to_pcbnew.cpp:58 -#: common/hotkeys_basic.cpp:261 +#: common/hotkeys_basic.cpp:341 msgid "Unable to create " msgstr "Impossible de créer " @@ -866,7 +867,7 @@ msgstr "Ajouter Pastilles" #: pcbnew/globaleditpad.cpp:96 #: pcbnew/menubarpcb.cpp:215 #: pcbnew/menubarmodedit.cpp:45 -#: pcbnew/tool_modedit.cpp:125 +#: pcbnew/tool_modedit.cpp:133 msgid "Pad Settings" msgstr "Caract pads" @@ -876,7 +877,7 @@ msgid "Add Drawing" msgstr "Ajout d'éléments graphiques" #: pcbnew/modedit.cpp:330 -#: pcbnew/tool_modedit.cpp:175 +#: pcbnew/tool_modedit.cpp:185 msgid "Place anchor" msgstr "Place Ancre" @@ -900,7 +901,7 @@ msgstr "Forme" #: pcbnew/classpcb.cpp:186 #: pcbnew/dialog_pad_edit.cpp:176 -#: pcbnew/dialog_pad_edit.cpp:198 +#: pcbnew/dialog_pad_edit.cpp:196 #: pcbnew/class_track.cpp:680 msgid "Circle" msgstr "Cercle" @@ -921,7 +922,7 @@ msgstr "Segment" #: pcbnew/class_text_mod.cpp:349 #: pcbnew/class_pcb_text.cpp:167 #: pcbnew/class_module.cpp:1116 -#: pcbnew/class_pad.cpp:909 +#: pcbnew/class_pad.cpp:907 #: pcbnew/class_track.cpp:710 #: gerbview/affiche.cpp:109 msgid "Layer" @@ -1112,7 +1113,7 @@ msgid "Add Tracks" msgstr "Addition de pistes" #: pcbnew/edit.cpp:574 -#: pcbnew/tool_pcb.cpp:420 +#: pcbnew/tool_pcb.cpp:429 msgid "Add Zones" msgstr "Addition de Zones" @@ -1133,8 +1134,8 @@ msgid "Add Graphic" msgstr "Addition éléments graphiques" #: pcbnew/edit.cpp:597 -#: pcbnew/tool_pcb.cpp:437 -#: pcbnew/tool_modedit.cpp:170 +#: pcbnew/tool_pcb.cpp:446 +#: pcbnew/tool_modedit.cpp:180 #: eeschema/schedit.cpp:313 #: eeschema/libframe.cpp:487 #: gerbview/tool_gerber.cpp:361 @@ -1146,7 +1147,7 @@ msgid "Add Modules" msgstr "Addition de Modules" #: pcbnew/edit.cpp:605 -#: pcbnew/tool_pcb.cpp:442 +#: pcbnew/tool_pcb.cpp:451 msgid "Add Cotation" msgstr "Addition de Cotations" @@ -1320,7 +1321,7 @@ msgstr "Largeur Texte Module" #: pcbnew/dialog_initpcb.cpp:161 #: pcbnew/dialog_display_options.cpp:280 #: pcbnew/set_grid.cpp:171 -#: pcbnew/dialog_pad_edit.cpp:221 +#: pcbnew/dialog_pad_edit.cpp:217 #: pcbnew/dialog_track_options.cpp:181 #: pcbnew/dialog_general_options.cpp:364 #: eeschema/sheet.cpp:221 @@ -1343,7 +1344,7 @@ msgstr "&OK" #: pcbnew/dialog_display_options.cpp:284 #: pcbnew/zones.cpp:216 #: pcbnew/set_grid.cpp:176 -#: pcbnew/dialog_pad_edit.cpp:225 +#: pcbnew/dialog_pad_edit.cpp:221 #: pcbnew/dialog_track_options.cpp:185 #: pcbnew/dialog_general_options.cpp:368 #: eeschema/sheet.cpp:216 @@ -1366,7 +1367,7 @@ msgstr "Fenetre 3D d msgid "3D Viewer" msgstr "Visu 3D" -#: pcbnew/tool_pcb.cpp:50 +#: pcbnew/tool_pcb.cpp:52 msgid "" "Show active layer selections\n" "and select layer pair for route and place via" @@ -1374,182 +1375,171 @@ msgstr "" "Affiche selections couche active\n" "et selection paire de couches pour routage and placement via" -#: pcbnew/tool_pcb.cpp:236 +#: pcbnew/tool_pcb.cpp:239 msgid "New Board" msgstr "Nouveau Circuit Imprimé" -#: pcbnew/tool_pcb.cpp:238 +#: pcbnew/tool_pcb.cpp:241 msgid "Open existing Board" msgstr "Ouvrir C.I. existant" -#: pcbnew/tool_pcb.cpp:239 +#: pcbnew/tool_pcb.cpp:242 msgid "Save Board" msgstr "Sauver Circuit Imprimé" -#: pcbnew/tool_pcb.cpp:243 -#: eeschema/tool_sch.cpp:61 +#: pcbnew/tool_pcb.cpp:246 +#: eeschema/tool_sch.cpp:65 #: gerbview/tool_gerber.cpp:217 msgid "page settings (size, texts)" msgstr "Ajustage de la feuille de dessin (dimensions, textes)" -#: pcbnew/tool_pcb.cpp:247 +#: pcbnew/tool_pcb.cpp:250 msgid "Open Module Editor" msgstr "Ouvrir Editeur de modules" -#: pcbnew/tool_pcb.cpp:250 -#: eeschema/tool_sch.cpp:77 +#: pcbnew/tool_pcb.cpp:253 +#: eeschema/tool_sch.cpp:81 #: gerbview/tool_gerber.cpp:228 msgid "Cut selected item" msgstr "Suppression des éléments sélectionnés" -#: pcbnew/tool_pcb.cpp:254 -#: eeschema/tool_sch.cpp:80 +#: pcbnew/tool_pcb.cpp:257 +#: eeschema/tool_sch.cpp:84 #: gerbview/tool_gerber.cpp:233 msgid "Copy selected item" msgstr "Copie des éléments sélectionnés" -#: pcbnew/tool_pcb.cpp:256 -#: eeschema/tool_sch.cpp:83 +#: pcbnew/tool_pcb.cpp:259 +#: eeschema/tool_sch.cpp:87 #: gerbview/tool_gerber.cpp:239 msgid "Paste" msgstr "Copie des éléments sauvegardés" -#: pcbnew/tool_pcb.cpp:259 +#: pcbnew/tool_pcb.cpp:262 #: gerbview/tool_gerber.cpp:246 msgid "Undelete" msgstr "Annulation du dernier effacement" -#: pcbnew/tool_pcb.cpp:262 +#: pcbnew/tool_pcb.cpp:265 msgid "Print Board" msgstr "Imprimer C.I." -#: pcbnew/tool_pcb.cpp:264 +#: pcbnew/tool_pcb.cpp:267 #: pcbnew/menubarpcb.cpp:93 msgid "Plot (HPGL, PostScript, or GERBER format)" msgstr "Tracer en format HPGL, POSTSCRIPT ou GERBER" -#: pcbnew/tool_pcb.cpp:268 -#: pcbnew/tool_modedit.cpp:111 -#: eeschema/tool_sch.cpp:104 -#: eeschema/tool_lib.cpp:170 -#: eeschema/tool_viewlib.cpp:70 -#: cvpcb/displayframe.cpp:118 -#: gerbview/tool_gerber.cpp:260 -#: 3d-viewer/3d_toolbar.cpp:43 -msgid "zoom + (F1)" -msgstr "zoom + (F1)" - #: pcbnew/tool_pcb.cpp:270 -#: pcbnew/tool_modedit.cpp:114 +#: pcbnew/tool_modedit.cpp:115 #: eeschema/tool_sch.cpp:107 +#: eeschema/tool_lib.cpp:170 +msgid "zoom +" +msgstr "zoom +" + +#: pcbnew/tool_pcb.cpp:274 +#: pcbnew/tool_modedit.cpp:119 +#: eeschema/tool_sch.cpp:111 #: eeschema/tool_lib.cpp:174 -#: eeschema/tool_viewlib.cpp:74 -#: cvpcb/displayframe.cpp:121 -#: gerbview/tool_gerber.cpp:266 -#: 3d-viewer/3d_toolbar.cpp:46 -msgid "zoom - (F2)" -msgstr "zoom - (F2)" +msgid "zoom -" +msgstr "zoom -" -#: pcbnew/tool_pcb.cpp:272 -#: pcbnew/tool_modedit.cpp:117 -#: eeschema/tool_sch.cpp:110 +#: pcbnew/tool_pcb.cpp:278 +#: pcbnew/tool_modedit.cpp:123 +#: eeschema/tool_sch.cpp:115 #: eeschema/tool_lib.cpp:178 -#: eeschema/tool_viewlib.cpp:78 -#: cvpcb/displayframe.cpp:124 -#: gerbview/tool_gerber.cpp:272 -#: 3d-viewer/3d_toolbar.cpp:49 -msgid "redraw (F3)" -msgstr "Redessin (F3)" +msgid "redraw" +msgstr "Redessin" -#: pcbnew/tool_pcb.cpp:275 -#: pcbnew/tool_modedit.cpp:120 -#: eeschema/tool_sch.cpp:113 -#: eeschema/tool_lib.cpp:182 +#: pcbnew/tool_pcb.cpp:283 +#: pcbnew/tool_modedit.cpp:128 +#: eeschema/tool_sch.cpp:120 +#: eeschema/tool_lib.cpp:184 #: gerbview/tool_gerber.cpp:278 #: 3d-viewer/3d_toolbar.cpp:52 msgid "auto zoom" msgstr "Zoom automatique" -#: pcbnew/tool_pcb.cpp:279 -msgid "Find components and texts (Ctrl-F)" -msgstr "Recherche de composants et textes (Ctrl F)" +#: pcbnew/tool_pcb.cpp:286 +#: eeschema/tool_sch.cpp:124 +msgid "Find components and texts" +msgstr "Recherche de composants et textes" -#: pcbnew/tool_pcb.cpp:283 +#: pcbnew/tool_pcb.cpp:292 msgid "Read Netlist" msgstr "Lire Netliste" -#: pcbnew/tool_pcb.cpp:285 +#: pcbnew/tool_pcb.cpp:294 msgid "Pcb Design Rules Check" msgstr "Controle des règles de conception" -#: pcbnew/tool_pcb.cpp:296 +#: pcbnew/tool_pcb.cpp:305 msgid "Mode Module: Manual and Automatic Move or Place for modules" msgstr "Mode Module: Déplacements ou Placement Manuel ou Automatique des modules" -#: pcbnew/tool_pcb.cpp:299 +#: pcbnew/tool_pcb.cpp:308 msgid "Mode Track and Autorouting" msgstr "Mode Pistes and Autoroutage" -#: pcbnew/tool_pcb.cpp:323 +#: pcbnew/tool_pcb.cpp:332 msgid "Drc OFF" msgstr "Drc DESACTIVEE" -#: pcbnew/tool_pcb.cpp:325 -#: pcbnew/tool_modedit.cpp:201 -#: eeschema/tool_sch.cpp:246 +#: pcbnew/tool_pcb.cpp:334 +#: pcbnew/tool_modedit.cpp:212 +#: eeschema/tool_sch.cpp:256 #: gerbview/tool_gerber.cpp:389 msgid "Display Grid OFF" msgstr "Suppression de l'affichage de la grille" -#: pcbnew/tool_pcb.cpp:328 -#: pcbnew/tool_modedit.cpp:205 +#: pcbnew/tool_pcb.cpp:337 +#: pcbnew/tool_modedit.cpp:216 #: gerbview/tool_gerber.cpp:395 msgid "Display Polar Coord ON" msgstr "Activer affichage coord Polaires" -#: pcbnew/tool_pcb.cpp:330 -#: pcbnew/tool_modedit.cpp:209 -#: eeschema/tool_sch.cpp:250 +#: pcbnew/tool_pcb.cpp:339 +#: pcbnew/tool_modedit.cpp:220 +#: eeschema/tool_sch.cpp:260 #: gerbview/tool_gerber.cpp:399 msgid "Units = Inch" msgstr "Unités = pouce" -#: pcbnew/tool_pcb.cpp:332 -#: pcbnew/tool_modedit.cpp:213 -#: eeschema/tool_sch.cpp:254 +#: pcbnew/tool_pcb.cpp:341 +#: pcbnew/tool_modedit.cpp:224 +#: eeschema/tool_sch.cpp:264 #: gerbview/tool_gerber.cpp:403 msgid "Units = mm" msgstr "Unités = mm" -#: pcbnew/tool_pcb.cpp:335 -#: pcbnew/tool_modedit.cpp:219 -#: eeschema/tool_sch.cpp:258 +#: pcbnew/tool_pcb.cpp:344 +#: pcbnew/tool_modedit.cpp:230 +#: eeschema/tool_sch.cpp:268 #: gerbview/tool_gerber.cpp:409 msgid "Change Cursor Shape" msgstr "Sélection de la forme du curseur" -#: pcbnew/tool_pcb.cpp:340 +#: pcbnew/tool_pcb.cpp:349 msgid "Show General Ratsnest" msgstr "Monter le chevelu général" -#: pcbnew/tool_pcb.cpp:343 +#: pcbnew/tool_pcb.cpp:352 msgid "Show Module Ratsnest when moving" msgstr "Monter le chevelu du module pendant déplacement" -#: pcbnew/tool_pcb.cpp:348 +#: pcbnew/tool_pcb.cpp:357 msgid "Enable Auto Del Track" msgstr "Autoriser l'effacement automatique des pistes" -#: pcbnew/tool_pcb.cpp:357 -#: pcbnew/tool_modedit.cpp:227 +#: pcbnew/tool_pcb.cpp:366 +#: pcbnew/tool_modedit.cpp:238 msgid "Show Pads Sketch" msgstr "Afficher pastilles en contour" -#: pcbnew/tool_pcb.cpp:361 +#: pcbnew/tool_pcb.cpp:370 msgid "Show Tracks Sketch" msgstr "Afficher pistes en contour" -#: pcbnew/tool_pcb.cpp:374 +#: pcbnew/tool_pcb.cpp:383 msgid "" "Display auxiliary vertical toolbar (tools for micro wave applications)\n" " This is a very experimental feature (under development)" @@ -1557,98 +1547,98 @@ msgstr "" "Affiche toolbar vertical auxiliaire (outils pour applications micro-ondes)\n" "C'est un outil expérimental (en cours de développement)" -#: pcbnew/tool_pcb.cpp:403 +#: pcbnew/tool_pcb.cpp:412 msgid "Net highlight" msgstr "Surbrillance des équipotentielles" -#: pcbnew/tool_pcb.cpp:407 +#: pcbnew/tool_pcb.cpp:416 msgid "Display local ratsnest (pad or module)" msgstr "Afficher le chevelu local (pastilles ou modules)" -#: pcbnew/tool_pcb.cpp:412 +#: pcbnew/tool_pcb.cpp:421 msgid "Add modules" msgstr "Addition de Modules" -#: pcbnew/tool_pcb.cpp:416 +#: pcbnew/tool_pcb.cpp:425 msgid "Add Tracks an vias" msgstr "Ajouter pistes et vias" -#: pcbnew/tool_pcb.cpp:425 -#: pcbnew/tool_modedit.cpp:158 -#: eeschema/tool_sch.cpp:216 +#: pcbnew/tool_pcb.cpp:434 +#: pcbnew/tool_modedit.cpp:168 +#: eeschema/tool_sch.cpp:225 msgid "Add graphic line or polygon" msgstr "Addition de lignes ou polygones graphiques" -#: pcbnew/tool_pcb.cpp:429 -#: pcbnew/tool_modedit.cpp:162 +#: pcbnew/tool_pcb.cpp:438 +#: pcbnew/tool_modedit.cpp:172 msgid "Add graphic circle" msgstr "Addition de graphiques (Cercle)" -#: pcbnew/tool_pcb.cpp:433 -#: pcbnew/tool_modedit.cpp:166 +#: pcbnew/tool_pcb.cpp:442 +#: pcbnew/tool_modedit.cpp:176 msgid "Add graphic arc" msgstr "Addition de graphiques (Arc de Cercle)" -#: pcbnew/tool_pcb.cpp:446 +#: pcbnew/tool_pcb.cpp:455 #: gerbview/tool_gerber.cpp:354 msgid "Add Mires" msgstr "Addition de Mires de superposition" -#: pcbnew/tool_pcb.cpp:451 -#: pcbnew/tool_modedit.cpp:180 -#: eeschema/tool_sch.cpp:225 -#: eeschema/tool_lib.cpp:92 +#: pcbnew/tool_pcb.cpp:460 +#: pcbnew/tool_modedit.cpp:190 +#: eeschema/tool_sch.cpp:234 +#: eeschema/tool_lib.cpp:93 #: gerbview/tool_gerber.cpp:369 msgid "Delete items" msgstr "Suppression d'éléments" -#: pcbnew/tool_pcb.cpp:456 +#: pcbnew/tool_pcb.cpp:465 msgid "Offset adjust for drill and place files" msgstr "Ajuste offset pour fichier de perçage et placement" -#: pcbnew/tool_pcb.cpp:481 +#: pcbnew/tool_pcb.cpp:490 msgid "Create line of specified length for microwave applications" msgstr "Creation de lignes de longueur spécifiée (pour applications micro-ondes)" -#: pcbnew/tool_pcb.cpp:487 +#: pcbnew/tool_pcb.cpp:496 msgid "Create gap of specified length for microwave applications" msgstr "Creation de gaps de longueur spécifiée (pour applications micro-ondes)" -#: pcbnew/tool_pcb.cpp:495 +#: pcbnew/tool_pcb.cpp:504 msgid "Create stub of specified length for microwave applications" msgstr "Creation de stub de longueur spécifiée (pour applications micro-ondes)" -#: pcbnew/tool_pcb.cpp:501 +#: pcbnew/tool_pcb.cpp:510 msgid "Create stub (arc) of specified length for microwave applications" msgstr "Creation de stub (arc) de longueur spécifiée (pour applications micro-ondes)" -#: pcbnew/tool_pcb.cpp:508 +#: pcbnew/tool_pcb.cpp:517 msgid "Create a polynomial shape for microwave applications" msgstr "Creation de formes polynomiales (pour applications micro-ondes)" -#: pcbnew/tool_pcb.cpp:558 -#: pcbnew/tool_modedit.cpp:273 +#: pcbnew/tool_pcb.cpp:567 +#: pcbnew/tool_modedit.cpp:285 #: eeschema/plotps.cpp:169 #: share/zoom.cpp:368 msgid "Auto" msgstr "Auto" -#: pcbnew/tool_pcb.cpp:562 +#: pcbnew/tool_pcb.cpp:571 msgid "Zoom " msgstr "Zoom " -#: pcbnew/tool_pcb.cpp:576 +#: pcbnew/tool_pcb.cpp:585 #: pcbnew/set_color.cpp:378 #: gerbview/set_color.h:246 msgid "Grid" msgstr "Grille" -#: pcbnew/tool_pcb.cpp:592 -#: pcbnew/tool_modedit.cpp:299 +#: pcbnew/tool_pcb.cpp:601 +#: pcbnew/tool_modedit.cpp:314 msgid "User Grid" msgstr "Grille perso" -#: pcbnew/tool_pcb.cpp:645 +#: pcbnew/tool_pcb.cpp:654 msgid "+/- to switch" msgstr "+/- pour commuter" @@ -1661,18 +1651,18 @@ msgstr "Valeur incorrecte pour per msgid "Delete Pad (module %s %s) " msgstr "Effacer Pad (module %s %s) " -#: pcbnew/hotkeys.cpp:263 +#: pcbnew/hotkeys.cpp:372 #, c-format msgid "Footprint %s found, but locked" msgstr "Module %s trouvé, mais verrouillé" -#: pcbnew/hotkeys.cpp:409 +#: pcbnew/hotkeys.cpp:532 msgid "Delete module?" msgstr "Effacer Module?" #: pcbnew/dialog_netlist.cpp:133 #: eeschema/editpart.cpp:741 -#: eeschema/onrightclick.cpp:303 +#: eeschema/onrightclick.cpp:311 #: eeschema/dialog_create_component.cpp:164 #: eeschema/eelayer.cpp:99 #: eeschema/edit_component_in_schematic.cpp:744 @@ -1921,7 +1911,7 @@ msgstr "Via %.3f" #: pcbnew/onrightclick.cpp:169 #: pcbnew/modedit_onclick.cpp:205 #: eeschema/libedit_onrightclick.cpp:73 -#: eeschema/onrightclick.cpp:117 +#: eeschema/onrightclick.cpp:118 #: gerbview/onrightclick.cpp:42 msgid "End Tool" msgstr "Fin Outil" @@ -2105,7 +2095,7 @@ msgstr "Lire Donn #: pcbnew/onrightclick.cpp:486 #: pcbnew/modedit_onclick.cpp:215 #: eeschema/libedit_onrightclick.cpp:251 -#: eeschema/onrightclick.cpp:567 +#: eeschema/onrightclick.cpp:575 #: gerbview/onrightclick.cpp:51 msgid "Cancel Block" msgstr "Annuler Bloc" @@ -2119,7 +2109,7 @@ msgstr "Zoom Bloc (drag+bouton milieu)" #: pcbnew/onrightclick.cpp:491 #: pcbnew/modedit_onclick.cpp:220 #: eeschema/libedit_onrightclick.cpp:259 -#: eeschema/onrightclick.cpp:575 +#: eeschema/onrightclick.cpp:583 #: gerbview/onrightclick.cpp:54 msgid "Place Block" msgstr "Place Bloc" @@ -2127,7 +2117,7 @@ msgstr "Place Bloc" #: pcbnew/onrightclick.cpp:493 #: pcbnew/modedit_onclick.cpp:222 #: eeschema/libedit_onrightclick.cpp:265 -#: eeschema/onrightclick.cpp:584 +#: eeschema/onrightclick.cpp:592 msgid "Copy Block (shift + drag mouse)" msgstr "Copie Bloc (shift + drag mouse)" @@ -2295,7 +2285,7 @@ msgid "Rotate + (R)" msgstr "Rotation + (R)" #: pcbnew/onrightclick.cpp:659 -#: eeschema/onrightclick.cpp:289 +#: eeschema/onrightclick.cpp:294 msgid "Rotate -" msgstr "Rotation -" @@ -2307,7 +2297,7 @@ msgstr "Change face (S)" #: pcbnew/onrightclick.cpp:712 #: pcbnew/onrightclick.cpp:785 #: pcbnew/modedit_onclick.cpp:315 -#: eeschema/onrightclick.cpp:298 +#: eeschema/onrightclick.cpp:306 msgid "Edit" msgstr "Editer" @@ -2395,11 +2385,11 @@ msgstr "Diam per msgid "Pad Orient (0.1 deg)" msgstr "Orient Pad (0.1 deg)" -#: pcbnew/editpads.cpp:339 +#: pcbnew/editpads.cpp:333 msgid "Incorrect value for pad drill: pad drill bigger than pad size" msgstr "Valeur incorrecte pour diametre de perçage.percage plus grand que la taille du pad" -#: pcbnew/editpads.cpp:345 +#: pcbnew/editpads.cpp:339 msgid "Incorrect value for pad offset" msgstr "Valeur incorrecte pour offset du pad" @@ -2794,7 +2784,7 @@ msgid "Current Value" msgstr "Valeur courante" #: pcbnew/xchgmod.cpp:156 -#: pcbnew/tool_modedit.cpp:65 +#: pcbnew/tool_modedit.cpp:70 msgid "New Module" msgstr "Nouveau Module" @@ -2938,15 +2928,15 @@ msgid "Pad Net Name :" msgstr "NetName Pad:" #: pcbnew/dialog_pad_edit.cpp:177 -#: pcbnew/dialog_pad_edit.cpp:199 +#: pcbnew/dialog_pad_edit.cpp:197 msgid "Oval" msgstr "Ovale" -#: pcbnew/dialog_pad_edit.cpp:179 +#: pcbnew/dialog_pad_edit.cpp:178 msgid "Drill Shape:" msgstr "Forme du perçage:" -#: pcbnew/dialog_pad_edit.cpp:187 +#: pcbnew/dialog_pad_edit.cpp:186 #: pcbnew/clean.cpp:422 #: eeschema/dialog_erc.cpp:192 #: eeschema/dialog_erc.cpp:196 @@ -2954,120 +2944,120 @@ msgstr "Forme du per msgid "0" msgstr "0" -#: pcbnew/dialog_pad_edit.cpp:188 +#: pcbnew/dialog_pad_edit.cpp:187 msgid "90" msgstr "90" -#: pcbnew/dialog_pad_edit.cpp:189 +#: pcbnew/dialog_pad_edit.cpp:188 #: eeschema/dialog_edit_component_in_schematic.cpp:175 msgid "-90" msgstr "-90" -#: pcbnew/dialog_pad_edit.cpp:190 +#: pcbnew/dialog_pad_edit.cpp:189 #: eeschema/dialog_edit_component_in_schematic.cpp:174 msgid "180" msgstr "180" -#: pcbnew/dialog_pad_edit.cpp:191 +#: pcbnew/dialog_pad_edit.cpp:190 #: pcbnew/dialog_edit_module.cpp:245 msgid "User" msgstr "User" -#: pcbnew/dialog_pad_edit.cpp:193 +#: pcbnew/dialog_pad_edit.cpp:191 msgid "Pad Orient:" msgstr "Orient pad:" -#: pcbnew/dialog_pad_edit.cpp:200 +#: pcbnew/dialog_pad_edit.cpp:198 msgid "Rect" msgstr "Rect" -#: pcbnew/dialog_pad_edit.cpp:201 +#: pcbnew/dialog_pad_edit.cpp:199 msgid "Trapezoidal" msgstr "Trapezoidal" -#: pcbnew/dialog_pad_edit.cpp:203 +#: pcbnew/dialog_pad_edit.cpp:200 msgid "Pad Shape:" msgstr "Forme Pad:" -#: pcbnew/dialog_pad_edit.cpp:208 +#: pcbnew/dialog_pad_edit.cpp:205 #: pcbnew/class_track.cpp:682 msgid "Standard" msgstr "Standard" -#: pcbnew/dialog_pad_edit.cpp:209 +#: pcbnew/dialog_pad_edit.cpp:206 msgid "SMD" msgstr "CMS" -#: pcbnew/dialog_pad_edit.cpp:210 +#: pcbnew/dialog_pad_edit.cpp:207 #: eeschema/netlist.cpp:146 msgid "Conn" msgstr "Conn" -#: pcbnew/dialog_pad_edit.cpp:211 +#: pcbnew/dialog_pad_edit.cpp:208 msgid "Hole" msgstr "Hole" -#: pcbnew/dialog_pad_edit.cpp:212 +#: pcbnew/dialog_pad_edit.cpp:209 msgid "Mechanical" msgstr "Mechanical" -#: pcbnew/dialog_pad_edit.cpp:214 +#: pcbnew/dialog_pad_edit.cpp:210 msgid "Pad Type:" msgstr "Type Pad:" -#: pcbnew/dialog_pad_edit.cpp:229 +#: pcbnew/dialog_pad_edit.cpp:225 msgid "Layers:" msgstr "Couches:" -#: pcbnew/dialog_pad_edit.cpp:233 +#: pcbnew/dialog_pad_edit.cpp:229 msgid "Copper layer" msgstr "Couches Cuivre" -#: pcbnew/dialog_pad_edit.cpp:237 +#: pcbnew/dialog_pad_edit.cpp:233 msgid "Comp layer" msgstr "Couche Cmp" -#: pcbnew/dialog_pad_edit.cpp:243 +#: pcbnew/dialog_pad_edit.cpp:239 msgid "Adhesive Cmp" msgstr "Adhesive Cmp" -#: pcbnew/dialog_pad_edit.cpp:247 +#: pcbnew/dialog_pad_edit.cpp:243 msgid "Adhesive Copper" msgstr "Adhesive Cu" -#: pcbnew/dialog_pad_edit.cpp:251 +#: pcbnew/dialog_pad_edit.cpp:247 msgid "Solder paste Cmp" msgstr "Pate à souder Cmp" -#: pcbnew/dialog_pad_edit.cpp:255 +#: pcbnew/dialog_pad_edit.cpp:251 msgid "Solder paste Copper" msgstr "Pate à souder cuivre" -#: pcbnew/dialog_pad_edit.cpp:259 +#: pcbnew/dialog_pad_edit.cpp:255 msgid "Silkscreen Cmp" msgstr "Sérigr Cmp" -#: pcbnew/dialog_pad_edit.cpp:263 +#: pcbnew/dialog_pad_edit.cpp:259 msgid "Silkscreen Copper" msgstr "Sérigr Cu " -#: pcbnew/dialog_pad_edit.cpp:267 +#: pcbnew/dialog_pad_edit.cpp:263 msgid "Solder mask Cmp" msgstr "Masque soudure Cmp" -#: pcbnew/dialog_pad_edit.cpp:271 +#: pcbnew/dialog_pad_edit.cpp:267 msgid "Solder mask Copper" msgstr "Masque soudure cuivre" -#: pcbnew/dialog_pad_edit.cpp:275 +#: pcbnew/dialog_pad_edit.cpp:271 msgid "E.C.O.1 layer" msgstr "couche E.C.O.1" -#: pcbnew/dialog_pad_edit.cpp:279 +#: pcbnew/dialog_pad_edit.cpp:275 msgid "E.C.O.2 layer" msgstr "couche E.C.O.2" -#: pcbnew/dialog_pad_edit.cpp:283 +#: pcbnew/dialog_pad_edit.cpp:279 msgid "Draft layer" msgstr "Couche dessin" @@ -3430,7 +3420,7 @@ msgstr "Ouvrir Editeur de modules" #: pcbnew/dialog_edit_module.cpp:195 #: eeschema/fieldedi.cpp:283 -#: eeschema/onrightclick.cpp:334 +#: eeschema/onrightclick.cpp:342 #: eeschema/dialog_edit_component_in_lib.cpp:203 #: eeschema/libedpart.cpp:246 msgid "Doc" @@ -3449,7 +3439,7 @@ msgid "Add Field" msgstr "Ajouter Champ" #: pcbnew/dialog_edit_module.cpp:224 -#: eeschema/onrightclick.cpp:264 +#: eeschema/onrightclick.cpp:265 msgid "Edit Field" msgstr "Editer Champ" @@ -3470,7 +3460,7 @@ msgstr "Cuivre" #: pcbnew/class_text_mod.cpp:359 #: pcbnew/class_pcb_text.cpp:178 #: pcbnew/class_module.cpp:1139 -#: pcbnew/class_pad.cpp:955 +#: pcbnew/class_pad.cpp:949 #: eeschema/affiche.cpp:117 #: gerbview/affiche.cpp:49 msgid "Orient" @@ -3737,7 +3727,7 @@ msgstr "Outils" #: pcbnew/gendrill.cpp:400 #: pcbnew/gendrill.cpp:1009 #: pcbnew/gendrill.cpp:1522 -#: pcbnew/class_pad.cpp:936 +#: pcbnew/class_pad.cpp:930 #: pcbnew/class_track.cpp:725 #: pcbnew/class_track.cpp:730 msgid "Drill" @@ -3772,7 +3762,7 @@ msgstr "Ref." #: pcbnew/class_edge_mod.cpp:286 #: eeschema/editpart.cpp:776 #: eeschema/component_class.cpp:50 -#: eeschema/onrightclick.cpp:302 +#: eeschema/onrightclick.cpp:310 #: eeschema/eelayer.cpp:105 #: eeschema/edit_component_in_schematic.cpp:783 msgid "Value" @@ -3786,21 +3776,21 @@ msgstr "Texte" #: pcbnew/class_text_mod.cpp:326 #: pcbnew/class_edge_mod.cpp:285 #: pcbnew/class_module.cpp:1142 -#: pcbnew/class_pad.cpp:820 +#: pcbnew/class_pad.cpp:818 #: cvpcb/setvisu.cpp:29 msgid "Module" msgstr "Module" #: pcbnew/class_text_mod.cpp:365 #: pcbnew/class_pcb_text.cpp:184 -#: pcbnew/class_pad.cpp:926 +#: pcbnew/class_pad.cpp:920 #: gerbview/affiche.cpp:55 msgid "H Size" msgstr "Taille H" #: pcbnew/class_text_mod.cpp:368 #: pcbnew/class_pcb_text.cpp:187 -#: pcbnew/class_pad.cpp:930 +#: pcbnew/class_pad.cpp:924 #: gerbview/affiche.cpp:58 msgid "V Size" msgstr "Taille V" @@ -4169,19 +4159,17 @@ msgid "Read options from a selected config file" msgstr "Lire options d'un fichier de configuration choisi" #: pcbnew/menubarpcb.cpp:186 -#: eeschema/menubar.cpp:150 -msgid "Create Eeschema &Hotkey config file" -msgstr "Créer les fichiers configuration des &Hotkeys de Eeschema " +msgid "Create Pcbnew &Hotkey config file" +msgstr "Créer les fichiers configuration des &Hotkeys de Pcbnew" #: pcbnew/menubarpcb.cpp:187 #: eeschema/menubar.cpp:151 msgid "Create or Recreate the hotkey config file from current hotkey list" -msgstr "Créer ou recréer les fichiers configuration des Hotkeys de Eeschema " +msgstr "Créer ou recréer les fichiers configuration des Hotkeys a partir de la liste courante" #: pcbnew/menubarpcb.cpp:190 -#: eeschema/menubar.cpp:154 -msgid "Reread &Eeschema Hotkey config file" -msgstr "Relire les fichiers configuration des Hotkeys de &Eeschema " +msgid "Reread &Pcbnew Hotkey config file" +msgstr "Relire les fichiers configuration des Hotkeys de &Pcbnew" #: pcbnew/menubarpcb.cpp:191 #: eeschema/menubar.cpp:155 @@ -4407,27 +4395,27 @@ msgstr "Connect" msgid "NoConn" msgstr "Non Conn" -#: pcbnew/class_pad.cpp:734 +#: pcbnew/class_pad.cpp:732 msgid "Unknown Pad shape" msgstr "Forme pad inconnue" -#: pcbnew/class_pad.cpp:823 +#: pcbnew/class_pad.cpp:821 msgid "RefP" msgstr "RefP" -#: pcbnew/class_pad.cpp:826 +#: pcbnew/class_pad.cpp:824 msgid "Net" msgstr "Net" -#: pcbnew/class_pad.cpp:944 +#: pcbnew/class_pad.cpp:938 msgid "Drill X / Y" msgstr "Perçage X/Y" -#: pcbnew/class_pad.cpp:959 +#: pcbnew/class_pad.cpp:953 msgid "X Pos" msgstr "X Pos" -#: pcbnew/class_pad.cpp:963 +#: pcbnew/class_pad.cpp:957 msgid "Y pos" msgstr "Y pos" @@ -4727,95 +4715,95 @@ msgstr " Pads magn msgid "control the capture of the pcb cursor when the mouse cursor enters a pad area" msgstr "Controle la capture du curseur pcb quand le curseuir souris est sur le pad" -#: pcbnew/tool_modedit.cpp:48 -#: eeschema/tool_lib.cpp:119 +#: pcbnew/tool_modedit.cpp:53 +#: eeschema/tool_lib.cpp:123 msgid "Select working library" msgstr "Sélection de la librairie de travail" -#: pcbnew/tool_modedit.cpp:51 +#: pcbnew/tool_modedit.cpp:56 msgid "Save Module in working library" msgstr "Sauver Module en librairie de travail" -#: pcbnew/tool_modedit.cpp:55 +#: pcbnew/tool_modedit.cpp:60 msgid "Create new library and save current module" msgstr "Créer une nouvelle librairie et y sauver le composant" -#: pcbnew/tool_modedit.cpp:60 -#: eeschema/tool_lib.cpp:122 +#: pcbnew/tool_modedit.cpp:65 +#: eeschema/tool_lib.cpp:126 msgid "Delete part in current library" msgstr "Supprimer composant en librairie de travail" -#: pcbnew/tool_modedit.cpp:69 +#: pcbnew/tool_modedit.cpp:74 msgid "Load module from lib" msgstr "Charger un module a partir d'une librairie" -#: pcbnew/tool_modedit.cpp:74 +#: pcbnew/tool_modedit.cpp:79 msgid "Load module from current board" msgstr "Charger module a partir du C.I." -#: pcbnew/tool_modedit.cpp:78 +#: pcbnew/tool_modedit.cpp:83 msgid "Update module in current board" msgstr "Remplacer module dans le C.I." -#: pcbnew/tool_modedit.cpp:82 +#: pcbnew/tool_modedit.cpp:87 msgid "Insert module into current board" msgstr "Placer module dans le C.I." -#: pcbnew/tool_modedit.cpp:87 +#: pcbnew/tool_modedit.cpp:92 msgid "import module" msgstr "Importer Module" -#: pcbnew/tool_modedit.cpp:91 +#: pcbnew/tool_modedit.cpp:96 msgid "export module" msgstr "Exporter Module" -#: pcbnew/tool_modedit.cpp:96 -#: eeschema/tool_sch.cpp:87 -#: eeschema/tool_lib.cpp:147 +#: pcbnew/tool_modedit.cpp:101 +#: eeschema/tool_sch.cpp:91 +#: eeschema/tool_lib.cpp:151 msgid "Undo last edition" msgstr "Defait dernière édition" -#: pcbnew/tool_modedit.cpp:98 -#: eeschema/tool_sch.cpp:89 -#: eeschema/tool_lib.cpp:149 +#: pcbnew/tool_modedit.cpp:103 +#: eeschema/tool_sch.cpp:93 +#: eeschema/tool_lib.cpp:153 msgid "Redo the last undo command" msgstr "Refait la dernière commande defaite" -#: pcbnew/tool_modedit.cpp:103 +#: pcbnew/tool_modedit.cpp:108 msgid "Module Properties" msgstr "Propriétés du Module" -#: pcbnew/tool_modedit.cpp:107 +#: pcbnew/tool_modedit.cpp:112 msgid "Print Module" msgstr "Imprimer Module" -#: pcbnew/tool_modedit.cpp:129 +#: pcbnew/tool_modedit.cpp:137 msgid "Module Check" msgstr "Test module" -#: pcbnew/tool_modedit.cpp:153 +#: pcbnew/tool_modedit.cpp:163 msgid "Add Pads" msgstr "Addition de \"pins\"" -#: pcbnew/tool_modedit.cpp:234 +#: pcbnew/tool_modedit.cpp:245 msgid "Show Texts Sketch" msgstr "Afficher textes en contour" -#: pcbnew/tool_modedit.cpp:241 +#: pcbnew/tool_modedit.cpp:252 msgid "Show Edges Sketch" msgstr "Afficher Modules en contour" -#: pcbnew/tool_modedit.cpp:277 +#: pcbnew/tool_modedit.cpp:289 #, c-format msgid "Zoom %d" msgstr "Zoom %d" -#: pcbnew/tool_modedit.cpp:294 +#: pcbnew/tool_modedit.cpp:308 #, c-format msgid "Grid %.1f" msgstr "Grille %.1f" -#: pcbnew/tool_modedit.cpp:296 +#: pcbnew/tool_modedit.cpp:310 #, c-format msgid "Grid %.3f" msgstr "Grille %.3f" @@ -5050,7 +5038,7 @@ msgid "Rect Delete" msgstr "Supprimer Rect" #: eeschema/libedit_onrightclick.cpp:148 -#: eeschema/onrightclick.cpp:398 +#: eeschema/onrightclick.cpp:406 msgid "Move Text" msgstr "Déplacer Texte" @@ -5087,7 +5075,7 @@ msgid "Segment Delete" msgstr "Supprimer segment" #: eeschema/libedit_onrightclick.cpp:192 -#: eeschema/onrightclick.cpp:262 +#: eeschema/onrightclick.cpp:263 msgid "Move Field" msgstr "Déplace Champ" @@ -5140,7 +5128,7 @@ msgid "Pin Num Size to others" msgstr "Change taille Num pin autres pins" #: eeschema/libedit_onrightclick.cpp:255 -#: eeschema/onrightclick.cpp:573 +#: eeschema/onrightclick.cpp:581 msgid "Win. Zoom (Midd butt drag mouse)" msgstr "Win. Zoom (Midd butt drag mouse)" @@ -5153,146 +5141,142 @@ msgid "Mirror Block (ctrl + drag mouse)" msgstr "Bloc Miroir (ctrl + drag mouse)" #: eeschema/libedit_onrightclick.cpp:268 -#: eeschema/onrightclick.cpp:588 +#: eeschema/onrightclick.cpp:596 msgid "Del. Block (shift+ctrl + drag mouse)" msgstr "Effacement Bloc (shift+ctrl + drag mouse)" -#: eeschema/hotkeys.cpp:160 +#: eeschema/hotkeys.cpp:184 #: eeschema/schedit.cpp:337 msgid "Add Component" msgstr "Ajout Composant" -#: eeschema/hotkeys.cpp:178 +#: eeschema/hotkeys.cpp:206 #: eeschema/schedit.cpp:289 msgid "Add Wire" msgstr "Ajouter Fils" -#: eeschema/tool_sch.cpp:51 +#: eeschema/tool_sch.cpp:55 msgid "New schematic project" msgstr "Nouveau Projet schématique" -#: eeschema/tool_sch.cpp:54 +#: eeschema/tool_sch.cpp:58 msgid "Open schematic project" msgstr "Ouvrir un Projet schématique" -#: eeschema/tool_sch.cpp:57 +#: eeschema/tool_sch.cpp:61 msgid "Save schematic project" msgstr "Sauver le Projet schématique" -#: eeschema/tool_sch.cpp:65 +#: eeschema/tool_sch.cpp:69 msgid "go to library editor" msgstr "Appel de l'editeur de librairies et de composants" -#: eeschema/tool_sch.cpp:68 +#: eeschema/tool_sch.cpp:72 msgid "go to library browse" msgstr "Appel du visualisateur des contenus de librairies" -#: eeschema/tool_sch.cpp:72 +#: eeschema/tool_sch.cpp:76 msgid "Schematic Hierarchy Navigator" msgstr "Navigation dans la hierarchie" -#: eeschema/tool_sch.cpp:93 +#: eeschema/tool_sch.cpp:97 msgid "Print schematic" msgstr "Impression des feuilles de schéma" -#: eeschema/tool_sch.cpp:97 +#: eeschema/tool_sch.cpp:101 msgid "Run Cvpcb" msgstr "Appel de CvPcb (Gestion des associations composants/module)" -#: eeschema/tool_sch.cpp:100 +#: eeschema/tool_sch.cpp:104 msgid "Run Pcbnew" msgstr "Appel de Pcbnew (Editeur de Circuits Imprimés)" -#: eeschema/tool_sch.cpp:117 -msgid "Find components and texts" -msgstr "Recherche de composants et textes" - -#: eeschema/tool_sch.cpp:121 +#: eeschema/tool_sch.cpp:128 msgid "Netlist generation" msgstr "Génération de la netliste" -#: eeschema/tool_sch.cpp:124 +#: eeschema/tool_sch.cpp:131 msgid "Schematic Annotation" msgstr "Annotation des composants" -#: eeschema/tool_sch.cpp:127 +#: eeschema/tool_sch.cpp:134 msgid "Schematic Electric Rules Check" msgstr "Controle des regles électriques" -#: eeschema/tool_sch.cpp:130 +#: eeschema/tool_sch.cpp:137 msgid "Bill of material and/or Crossreferences" msgstr "Liste des composants et références croisées" -#: eeschema/tool_sch.cpp:155 +#: eeschema/tool_sch.cpp:164 msgid "Hierarchy Push/Pop" msgstr "Navigation dans la hierarchie" -#: eeschema/tool_sch.cpp:160 +#: eeschema/tool_sch.cpp:169 msgid "Add components" msgstr "Ajouter composants" -#: eeschema/tool_sch.cpp:164 +#: eeschema/tool_sch.cpp:173 msgid "Add powers" msgstr "Add Alims" -#: eeschema/tool_sch.cpp:169 +#: eeschema/tool_sch.cpp:178 msgid "Add wires" msgstr "Addition de fils de connexion" -#: eeschema/tool_sch.cpp:173 +#: eeschema/tool_sch.cpp:182 msgid "Add bus" msgstr "Addition de Bus" -#: eeschema/tool_sch.cpp:177 +#: eeschema/tool_sch.cpp:186 msgid "Add wire to bus entry" msgstr "Addition d'entrées de bus (type fil vers bus)" -#: eeschema/tool_sch.cpp:181 +#: eeschema/tool_sch.cpp:190 msgid "Add bus to bus entry" msgstr "Addition d'entrées de bus (type bus vers bus)" -#: eeschema/tool_sch.cpp:186 +#: eeschema/tool_sch.cpp:195 msgid "Add no connect flag" msgstr "Addition de symboles de non connexion" -#: eeschema/tool_sch.cpp:190 +#: eeschema/tool_sch.cpp:199 msgid "Add wire or bus label" msgstr "Addition de labels sur fils ou bus" -#: eeschema/tool_sch.cpp:194 -#: eeschema/onrightclick.cpp:477 -#: eeschema/onrightclick.cpp:509 +#: eeschema/tool_sch.cpp:203 +#: eeschema/onrightclick.cpp:485 +#: eeschema/onrightclick.cpp:517 msgid "Add global label" msgstr "Addition de labels globaux" -#: eeschema/tool_sch.cpp:198 -#: eeschema/onrightclick.cpp:471 -#: eeschema/onrightclick.cpp:503 +#: eeschema/tool_sch.cpp:207 +#: eeschema/onrightclick.cpp:479 +#: eeschema/onrightclick.cpp:511 msgid "Add junction" msgstr "Addition de jonctions" -#: eeschema/tool_sch.cpp:203 +#: eeschema/tool_sch.cpp:212 msgid "Add hierarchical symbol (sheet)" msgstr "Addition d'un symbole de feuille de hiérarchie" -#: eeschema/tool_sch.cpp:207 +#: eeschema/tool_sch.cpp:216 msgid "import glabel from sheet & create pinsheet" msgstr "Importation de labels globaux et création des pins correspondantes" -#: eeschema/tool_sch.cpp:211 +#: eeschema/tool_sch.cpp:220 msgid "Add hierachical pin to sheet" msgstr "Addition de pins de hierarchie dans les symboles de hierarchie" -#: eeschema/tool_sch.cpp:220 +#: eeschema/tool_sch.cpp:229 msgid "Add graphic text (comment)" msgstr "Addition de textes graphiques (commentaires)" -#: eeschema/tool_sch.cpp:263 +#: eeschema/tool_sch.cpp:273 #: eeschema/schframe.cpp:275 msgid "Show Hidden Pins" msgstr "Force affichage des pins invisibles" -#: eeschema/tool_sch.cpp:268 +#: eeschema/tool_sch.cpp:278 msgid "HV orientation for Wires and Bus" msgstr "Force direction H, V et X pour les fils et bus" @@ -5320,99 +5304,99 @@ msgstr "Commun aux Unit msgid "Common to convert" msgstr "Commun a converti" -#: eeschema/tool_lib.cpp:47 +#: eeschema/tool_lib.cpp:48 msgid "deselect current tool" msgstr "Désélection outil courant" -#: eeschema/tool_lib.cpp:53 +#: eeschema/tool_lib.cpp:54 msgid "Add Pins" msgstr "Addition de \"pins\"" -#: eeschema/tool_lib.cpp:57 +#: eeschema/tool_lib.cpp:58 msgid "Add graphic text" msgstr "Addition de textes graphiques (commentaires)" -#: eeschema/tool_lib.cpp:61 +#: eeschema/tool_lib.cpp:62 msgid "Add rectangles" msgstr "Addition de rectangles" -#: eeschema/tool_lib.cpp:65 +#: eeschema/tool_lib.cpp:66 msgid "Add circles" msgstr "Addition de cercles" -#: eeschema/tool_lib.cpp:69 +#: eeschema/tool_lib.cpp:70 msgid "Add arcs" msgstr "Addition d'arc" -#: eeschema/tool_lib.cpp:73 +#: eeschema/tool_lib.cpp:74 msgid "Add lines and polygons" msgstr "Addition de lignes ou polygones graphiques" -#: eeschema/tool_lib.cpp:78 +#: eeschema/tool_lib.cpp:79 msgid "Move part anchor" msgstr "Positionner l'ancre du composant" -#: eeschema/tool_lib.cpp:83 +#: eeschema/tool_lib.cpp:84 msgid "Import existing drawings" msgstr "Importer des dessins existants" -#: eeschema/tool_lib.cpp:87 +#: eeschema/tool_lib.cpp:88 msgid "Export current drawing" msgstr "Exporter le dessin en cours" -#: eeschema/tool_lib.cpp:116 +#: eeschema/tool_lib.cpp:120 msgid "Save current loaded library on disk (file update)" msgstr "Sauver librairie chargée courante sur disque (mise à jour du fichier)" -#: eeschema/tool_lib.cpp:126 +#: eeschema/tool_lib.cpp:130 msgid "New part" msgstr "Nouveau composant" -#: eeschema/tool_lib.cpp:129 +#: eeschema/tool_lib.cpp:133 msgid "Select part to edit" msgstr "Sélectionner le composant a éditer" -#: eeschema/tool_lib.cpp:133 +#: eeschema/tool_lib.cpp:137 msgid "Save current part into current loaded library (in memory)" msgstr "Sauver le composant courant en librairie courante (en mémoire)" -#: eeschema/tool_lib.cpp:136 +#: eeschema/tool_lib.cpp:140 msgid "import part" msgstr "Importer un composant" -#: eeschema/tool_lib.cpp:139 +#: eeschema/tool_lib.cpp:143 msgid "export part" msgstr "Exporter un composant" -#: eeschema/tool_lib.cpp:143 +#: eeschema/tool_lib.cpp:147 msgid "Create a new library an save current part into" msgstr "Créer une nouvelle librairie et y sauver le composant" -#: eeschema/tool_lib.cpp:156 +#: eeschema/tool_lib.cpp:160 msgid "Edit Part Properties" msgstr "Editer les propriétés du composant" -#: eeschema/tool_lib.cpp:163 +#: eeschema/tool_lib.cpp:167 msgid "Test duplicate pins" msgstr "Test duplicate pins" -#: eeschema/tool_lib.cpp:187 +#: eeschema/tool_lib.cpp:189 msgid "show as \"De Morgan\" normal part" msgstr "Afficher sous représentation normale" -#: eeschema/tool_lib.cpp:193 +#: eeschema/tool_lib.cpp:195 msgid "show as \"De Morgan\" convert part" msgstr "Afficher sous présentation \" De Morgan\"" -#: eeschema/tool_lib.cpp:202 +#: eeschema/tool_lib.cpp:204 msgid "Documents" msgstr "Documents" -#: eeschema/tool_lib.cpp:219 +#: eeschema/tool_lib.cpp:221 msgid "Edit pins part per part (Carefully use!)" msgstr "Editer pins unité par unité (Utiliser en connaissance de cause)" -#: eeschema/tool_lib.cpp:240 +#: eeschema/tool_lib.cpp:241 #: eeschema/tool_viewlib.cpp:131 #, c-format msgid "Part %c" @@ -5853,7 +5837,7 @@ msgstr "Le composant %s existe, Le changer ?" msgid "Component %s saved in %s" msgstr "Composant %s sauvé en %s" -#: eeschema/eeschema.cpp:56 +#: eeschema/eeschema.cpp:57 msgid "Eeschema is already running, Continue?" msgstr "Eeschema est est cours d'exécution. Continuer ?" @@ -5932,7 +5916,7 @@ msgid "Pos" msgstr "Pos" #: eeschema/editpart.cpp:293 -#: eeschema/onrightclick.cpp:319 +#: eeschema/onrightclick.cpp:327 #: eeschema/affiche.cpp:172 msgid "Unit" msgstr "Unité" @@ -5948,6 +5932,7 @@ msgid "Orient:" msgstr "Orient:" #: eeschema/editpart.cpp:323 +#: eeschema/onrightclick.cpp:295 #: eeschema/dialog_edit_component_in_schematic.cpp:183 msgid "Mirror --" msgstr "Miroir--" @@ -5962,7 +5947,7 @@ msgid "Mirror:" msgstr "Miroir:" #: eeschema/editpart.cpp:336 -#: eeschema/onrightclick.cpp:306 +#: eeschema/onrightclick.cpp:314 #: eeschema/affiche.cpp:182 #: eeschema/dialog_edit_component_in_schematic.cpp:193 msgid "Convert" @@ -6093,253 +6078,245 @@ msgstr " Convert" msgid " Normal" msgstr " Normal" -#: eeschema/onrightclick.cpp:139 +#: eeschema/onrightclick.cpp:140 msgid "Leave Sheet" msgstr "Quitter sous-feuille" -#: eeschema/onrightclick.cpp:155 +#: eeschema/onrightclick.cpp:156 msgid "delete noconn" msgstr "Supprimer non connexion" -#: eeschema/onrightclick.cpp:165 +#: eeschema/onrightclick.cpp:166 msgid "Move bus entry" msgstr "Déplacer entrée de bus" -#: eeschema/onrightclick.cpp:167 +#: eeschema/onrightclick.cpp:168 msgid "set bus entry /" msgstr "Entrée de bus /" -#: eeschema/onrightclick.cpp:169 +#: eeschema/onrightclick.cpp:170 msgid "set bus entry \\" msgstr "Entrée de bus \\" -#: eeschema/onrightclick.cpp:171 +#: eeschema/onrightclick.cpp:172 msgid "delete bus entry" msgstr "Supprimer entrée de bus" -#: eeschema/onrightclick.cpp:175 +#: eeschema/onrightclick.cpp:176 msgid "delete Marker" msgstr "Supprimer Marqueur" -#: eeschema/onrightclick.cpp:225 +#: eeschema/onrightclick.cpp:226 msgid "End drawing" msgstr "Fin tracé" -#: eeschema/onrightclick.cpp:227 +#: eeschema/onrightclick.cpp:228 msgid "Delete drawing" msgstr "Supprimer Tracé" -#: eeschema/onrightclick.cpp:263 +#: eeschema/onrightclick.cpp:264 msgid "Rotate Field" msgstr "Rotation Champ" -#: eeschema/onrightclick.cpp:282 -msgid "Move Component (M)" -msgstr "Déplace Composant \t(M)" - -#: eeschema/onrightclick.cpp:288 -msgid "Rotate + (R)" -msgstr "Rotation + (R)" - -#: eeschema/onrightclick.cpp:290 -msgid "Mirror -- (X)" -msgstr "Miroir-- (X)" +#: eeschema/onrightclick.cpp:284 +msgid "Move Component" +msgstr "Déplace Composant" #: eeschema/onrightclick.cpp:291 -msgid "Mirror || (Y)" -msgstr "Miroir || (Y)" +msgid "Rotate +" +msgstr "Rotation +" -#: eeschema/onrightclick.cpp:292 -msgid "Normal (N)" -msgstr "Normal (N)" +#: eeschema/onrightclick.cpp:297 +msgid "Mirror ||" +msgstr "Miroir ||" -#: eeschema/onrightclick.cpp:295 +#: eeschema/onrightclick.cpp:303 msgid "Orient Component" msgstr "Oriente Composant" -#: eeschema/onrightclick.cpp:313 +#: eeschema/onrightclick.cpp:321 #, c-format msgid "Unit %d %c" msgstr "Unité %d %c" -#: eeschema/onrightclick.cpp:324 +#: eeschema/onrightclick.cpp:332 msgid "Edit Component" msgstr "Edite Composant" -#: eeschema/onrightclick.cpp:328 +#: eeschema/onrightclick.cpp:336 msgid "Copy Component" msgstr "Copie composant" -#: eeschema/onrightclick.cpp:329 +#: eeschema/onrightclick.cpp:337 msgid "Delete Component" msgstr "Supprime Composant" -#: eeschema/onrightclick.cpp:348 +#: eeschema/onrightclick.cpp:356 msgid "Move Glabel" msgstr "Déplace Label Global" -#: eeschema/onrightclick.cpp:349 +#: eeschema/onrightclick.cpp:357 msgid "Rotate GLabel (R)" msgstr "Rot. Label Global (R)" -#: eeschema/onrightclick.cpp:350 +#: eeschema/onrightclick.cpp:358 msgid "Edit GLabel" msgstr "Editer Label Global" -#: eeschema/onrightclick.cpp:351 +#: eeschema/onrightclick.cpp:359 msgid "Delete Glabel" msgstr "Supprimer Label Global" -#: eeschema/onrightclick.cpp:355 -#: eeschema/onrightclick.cpp:405 +#: eeschema/onrightclick.cpp:363 +#: eeschema/onrightclick.cpp:413 msgid "Change to Label" msgstr "Change en Label" -#: eeschema/onrightclick.cpp:357 -#: eeschema/onrightclick.cpp:382 +#: eeschema/onrightclick.cpp:365 +#: eeschema/onrightclick.cpp:390 msgid "Change to Text" msgstr "Change en Texte" -#: eeschema/onrightclick.cpp:359 -#: eeschema/onrightclick.cpp:384 -#: eeschema/onrightclick.cpp:409 +#: eeschema/onrightclick.cpp:367 +#: eeschema/onrightclick.cpp:392 +#: eeschema/onrightclick.cpp:417 msgid "Change Type" msgstr "Change Type" -#: eeschema/onrightclick.cpp:373 +#: eeschema/onrightclick.cpp:381 msgid "Move Label" msgstr "Déplace Label" -#: eeschema/onrightclick.cpp:374 +#: eeschema/onrightclick.cpp:382 msgid "Rotate Label (R)" msgstr "Rot. Label (R)" -#: eeschema/onrightclick.cpp:375 +#: eeschema/onrightclick.cpp:383 msgid "Edit Label" msgstr "Editer Label" -#: eeschema/onrightclick.cpp:376 +#: eeschema/onrightclick.cpp:384 msgid "Delete Label" msgstr "Supprimer Label:" -#: eeschema/onrightclick.cpp:380 -#: eeschema/onrightclick.cpp:407 +#: eeschema/onrightclick.cpp:388 +#: eeschema/onrightclick.cpp:415 msgid "Change to Glabel" msgstr "Change en Label Global" -#: eeschema/onrightclick.cpp:399 +#: eeschema/onrightclick.cpp:407 msgid "Rotate Text (R)" msgstr "Rot. Texte (R)" -#: eeschema/onrightclick.cpp:400 +#: eeschema/onrightclick.cpp:408 msgid "Edit Text" msgstr "Editer Texte" -#: eeschema/onrightclick.cpp:401 +#: eeschema/onrightclick.cpp:409 msgid "Delete Text" msgstr "Supprimer Texte" -#: eeschema/onrightclick.cpp:427 -#: eeschema/onrightclick.cpp:467 +#: eeschema/onrightclick.cpp:435 +#: eeschema/onrightclick.cpp:475 msgid "Break Wire" msgstr "Briser fil" -#: eeschema/onrightclick.cpp:430 +#: eeschema/onrightclick.cpp:438 msgid "delete junction" msgstr "Supprimer jonction" -#: eeschema/onrightclick.cpp:435 -#: eeschema/onrightclick.cpp:461 +#: eeschema/onrightclick.cpp:443 +#: eeschema/onrightclick.cpp:469 msgid "Delete node" msgstr "Supprimer Noeud" -#: eeschema/onrightclick.cpp:437 -#: eeschema/onrightclick.cpp:463 +#: eeschema/onrightclick.cpp:445 +#: eeschema/onrightclick.cpp:471 msgid "Delete connection" msgstr "Supprimer connexion" -#: eeschema/onrightclick.cpp:454 +#: eeschema/onrightclick.cpp:462 msgid "End Wire" msgstr "Fin Fil" -#: eeschema/onrightclick.cpp:456 +#: eeschema/onrightclick.cpp:464 msgid "Delete Wire" msgstr "Supprimer Fil" -#: eeschema/onrightclick.cpp:472 -#: eeschema/onrightclick.cpp:504 +#: eeschema/onrightclick.cpp:480 +#: eeschema/onrightclick.cpp:512 msgid "Add label" msgstr "Ajout Label" -#: eeschema/onrightclick.cpp:493 +#: eeschema/onrightclick.cpp:501 msgid "End Bus" msgstr "Fin Bus" -#: eeschema/onrightclick.cpp:496 +#: eeschema/onrightclick.cpp:504 msgid "Delete Bus" msgstr "Supprimer Bus" -#: eeschema/onrightclick.cpp:500 +#: eeschema/onrightclick.cpp:508 msgid "Break Bus" msgstr "Briser Bus" -#: eeschema/onrightclick.cpp:522 +#: eeschema/onrightclick.cpp:530 msgid "Enter Sheet" msgstr "Enter dans Feuille" -#: eeschema/onrightclick.cpp:524 +#: eeschema/onrightclick.cpp:532 msgid "Move Sheet" msgstr "Déplace Feuille" -#: eeschema/onrightclick.cpp:529 +#: eeschema/onrightclick.cpp:537 msgid "Place Sheet" msgstr "Place Feuille" -#: eeschema/onrightclick.cpp:533 +#: eeschema/onrightclick.cpp:541 msgid "Edit Sheet" msgstr "Edite Feuille" -#: eeschema/onrightclick.cpp:534 +#: eeschema/onrightclick.cpp:542 msgid "Resize Sheet" msgstr "Redimensionne feuille" -#: eeschema/onrightclick.cpp:537 +#: eeschema/onrightclick.cpp:545 msgid "Cleanup PinSheets" msgstr "Nettoyage de la feuille" -#: eeschema/onrightclick.cpp:538 +#: eeschema/onrightclick.cpp:546 msgid "Delete Sheet" msgstr "Supprimer Feuille" -#: eeschema/onrightclick.cpp:551 +#: eeschema/onrightclick.cpp:559 msgid "Move PinSheet" msgstr "Déplace Connecteur de hiérarchie" -#: eeschema/onrightclick.cpp:553 +#: eeschema/onrightclick.cpp:561 msgid "Edit PinSheet" msgstr "Edit Connecteur de hiérarchie" -#: eeschema/onrightclick.cpp:556 +#: eeschema/onrightclick.cpp:564 msgid "Delete PinSheet" msgstr "Supprimer Connecteur de hiérarchie" -#: eeschema/onrightclick.cpp:581 +#: eeschema/onrightclick.cpp:589 msgid "Other block commands" msgstr "Autres commandes de bloc" -#: eeschema/onrightclick.cpp:582 +#: eeschema/onrightclick.cpp:590 msgid "Save Block" msgstr "Sauver Bloc" -#: eeschema/onrightclick.cpp:586 +#: eeschema/onrightclick.cpp:594 msgid "Drag Block (ctrl + drag mouse)" msgstr "Drag Bloc (ctrl + drag mouse)" -#: eeschema/onrightclick.cpp:590 +#: eeschema/onrightclick.cpp:598 msgid "Mirror Block ||" msgstr "Miroir Bloc ||" -#: eeschema/onrightclick.cpp:594 +#: eeschema/onrightclick.cpp:602 msgid "Copy to Clipboard" msgstr "Copie dans Presse papier" @@ -6741,6 +6718,27 @@ msgstr "Afficher composant pr msgid "Display next part" msgstr "Afficher composant suivant" +#: eeschema/tool_viewlib.cpp:70 +#: cvpcb/displayframe.cpp:118 +#: gerbview/tool_gerber.cpp:260 +#: 3d-viewer/3d_toolbar.cpp:43 +msgid "zoom + (F1)" +msgstr "zoom + (F1)" + +#: eeschema/tool_viewlib.cpp:74 +#: cvpcb/displayframe.cpp:121 +#: gerbview/tool_gerber.cpp:266 +#: 3d-viewer/3d_toolbar.cpp:46 +msgid "zoom - (F2)" +msgstr "zoom - (F2)" + +#: eeschema/tool_viewlib.cpp:78 +#: cvpcb/displayframe.cpp:124 +#: gerbview/tool_gerber.cpp:272 +#: 3d-viewer/3d_toolbar.cpp:49 +msgid "redraw (F3)" +msgstr "Redessin (F3)" + #: eeschema/tool_viewlib.cpp:82 #: cvpcb/displayframe.cpp:127 #: cvpcb/displayframe.cpp:131 @@ -8011,6 +8009,14 @@ msgstr "&Sauver Eeschema Options" msgid "Save options in .pro" msgstr "Sauver les options en .pro" +#: eeschema/menubar.cpp:150 +msgid "Create Eeschema &Hotkey config file" +msgstr "Créer les fichiers configuration des &Hotkeys de Eeschema " + +#: eeschema/menubar.cpp:154 +msgid "Reread &Eeschema Hotkey config file" +msgstr "Relire les fichiers configuration des Hotkeys de &Eeschema " + #: eeschema/menubar.cpp:162 msgid "Open the eeschema manual" msgstr "Ouvrir la documentation de eeschema" @@ -9411,7 +9417,7 @@ msgstr "Contour Pcb" msgid "--- " msgstr "--- " -#: common/hotkeys_basic.cpp:191 +#: common/hotkeys_basic.cpp:262 msgid "" "Current hotkey list:\n" "\n" @@ -9419,20 +9425,20 @@ msgstr "" "Liste des Hotkeys courantes:\n" "\n" -#: common/hotkeys_basic.cpp:195 +#: common/hotkeys_basic.cpp:267 msgid "key " msgstr "touche: " -#: common/hotkeys_basic.cpp:243 -#: common/hotkeys_basic.cpp:336 +#: common/hotkeys_basic.cpp:322 +#: common/hotkeys_basic.cpp:424 msgid "Hotkey configuration file:" msgstr "Fichier configuration des Hotkeys:" -#: common/hotkeys_basic.cpp:274 +#: common/hotkeys_basic.cpp:354 msgid "Allowed keys:\n" msgstr "Touches autorisées:\n" -#: common/hotkeys_basic.cpp:354 +#: common/hotkeys_basic.cpp:443 msgid "Unable to read " msgstr "Impossible de lire " @@ -9894,7 +9900,7 @@ msgstr "Propri msgid "Fill Zones Options" msgstr "Options de remplissage de Zone" -#: pcbnew/dialog_pad_edit.h:44 +#: pcbnew/dialog_pad_edit.h:62 msgid "Pad properties" msgstr "Propriétés des Pads" diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 2865af2903..217384bef3 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -25,16 +25,16 @@ /* classe D_PAD : constructeur */ /*******************************/ -D_PAD::D_PAD( MODULE* parent ) : +D_PAD::D_PAD( MODULE* parent ) : BOARD_ITEM( parent, TYPEPAD ) { - m_NumPadName = 0; - m_Masque_Layer = CUIVRE_LAYER; - m_NetCode = 0; /* Numero de net pour comparaisons rapides */ - m_DrillShape = CIRCLE; // Drill shape = circle - + m_NumPadName = 0; + m_Masque_Layer = CUIVRE_LAYER; + m_NetCode = 0; /* Numero de net pour comparaisons rapides */ + m_DrillShape = CIRCLE; // Drill shape = circle + m_Size.x = m_Size.y = 500; - + if( m_Parent && (m_Parent->m_StructType == TYPEMODULE) ) { m_Pos = ( (MODULE*) m_Parent )->m_Pos; @@ -73,7 +73,6 @@ void D_PAD::ComputeRayon( void ) break; case RECT: - case SPECIAL_PAD: case TRAPEZE: m_Rayon = (int) (sqrt( (float) m_Size.y * m_Size.y + (float) m_Size.x * m_Size.x ) / 2); @@ -90,16 +89,16 @@ const wxPoint D_PAD::ReturnShapePos( void ) { if( (m_Offset.x == 0) && (m_Offset.y == 0) ) return m_Pos; - + wxPoint shape_pos; int dX, dY; - - dX = m_Offset.x; + + dX = m_Offset.x; dY = m_Offset.y; - + RotatePoint( &dX, &dY, m_Orient ); - - shape_pos.x = m_Pos.x + dX; + + shape_pos.x = m_Pos.x + dX; shape_pos.y = m_Pos.y + dY; return shape_pos; @@ -410,7 +409,6 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int break; case RECT: - case SPECIAL_PAD: case TRAPEZE: { int ddx, ddy; @@ -464,7 +462,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int } } break; - + default: break; @@ -486,7 +484,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int switch( m_DrillShape ) { case CIRCLE: - if( (hole / zoom) > 1 ) /* draw hole if its size is enought */ + if( (hole / zoom) > 1 ) /* draw hole if its size is enought */ GRFilledCircle( &panel->m_ClipBox, DC, cx0, cy0, hole, 0, color, color ); break; @@ -517,7 +515,7 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int } GRSetDrawMode( DC, draw_mode ); - + /* Trace du symbole "No connect" ( / ou \ ou croix en X) si necessaire : */ if( m_Netname.IsEmpty() && DisplayOpt.DisplayPadNoConn ) { @@ -531,26 +529,26 @@ void D_PAD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int GRLine( &panel->m_ClipBox, DC, cx0 + dx0, cy0 - dx0, cx0 - dx0, cy0 + dx0, 0, nc_color ); } - + /* Trace de la reference */ if( !frame->m_DisplayPadNum ) return; - + dx = MIN( m_Size.x, m_Size.y ); /* dx = text size */ if( (dx / zoom) > 12 ) /* size must be enought to draw 2 chars */ { wxString buffer; - + ReturnStringPadName( buffer ); dy = buffer.Len(); - + /* Draw text with an angle between -90 deg and + 90 deg */ NORMALIZE_ANGLE_90( angle ); if( dy < 2 ) dy = 2; /* text min size is 2 char */ - + dx = (dx * 9 ) / (dy * 13 ); /* Text size ajusted to pad size */ - + DrawGraphicText( panel, DC, wxPoint( ux0, uy0 ), WHITE, buffer, angle, wxSize( dx, dx ), GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER ); @@ -795,7 +793,7 @@ void D_PAD::Display_Infos( WinEDA_DrawFrame* frame ) MODULE* Module; wxString Line; int pos = 1; - + /* Pad messages */ static const wxString Msg_Pad_Shape[6] = { wxT( "??? " ), wxT( "Circ" ), wxT( "Rect" ), wxT( "Oval" ), wxT( "trap" ), wxT( "spec" ) }; @@ -805,7 +803,7 @@ void D_PAD::Display_Infos( WinEDA_DrawFrame* frame ) wxT( "??? " ), wxT( "cmp " ), wxT( "cu " ), wxT( "cmp+cu " ), wxT( "int " ), wxT( "cmp+int " ), wxT( "cu+int " ), wxT( "all " ), wxT( "No copp" ) }; - + static const wxString Msg_Pad_Attribut[5] = { wxT( "norm" ), wxT( "smd " ), wxT( "conn" ), wxT( "hole" ), wxT( "????" ) }; @@ -910,16 +908,12 @@ void D_PAD::Display_Infos( WinEDA_DrawFrame* frame ) pos += 6; Affiche_1_Parametre( frame, pos, Msg_Pad_Shape[m_PadShape], wxEmptyString, DARKGREEN ); - /* Affichage en couleur diff si pad stack ou non */ - if( m_Attribut & PAD_STACK ) - Affiche_1_Parametre( frame, -1, wxEmptyString, Msg_Pad_Attribut[m_Attribut & 15], RED ); - else - Affiche_1_Parametre( frame, - -1, - wxEmptyString, - Msg_Pad_Attribut[m_Attribut & 15], - DARKGREEN ); + Affiche_1_Parametre( frame, + -1, + wxEmptyString, + Msg_Pad_Attribut[m_Attribut & 15], + DARKGREEN ); valeur_param( m_Size.x, Line ); pos += 6; @@ -978,12 +972,12 @@ bool D_PAD::HitTest( const wxPoint& ref_pos ) wxPoint shape_pos = ReturnShapePos(); - deltaX = ref_pos.x - shape_pos.x; + deltaX = ref_pos.x - shape_pos.x; deltaY = ref_pos.y - shape_pos.y; /* Test rapide: le point a tester doit etre a l'interieur du cercle exinscrit ... */ if( (abs( deltaX ) > m_Rayon ) - || (abs( deltaY ) > m_Rayon) ) + || (abs( deltaY ) > m_Rayon) ) return false; /* calcul des demi dim dx et dy */ @@ -1006,35 +1000,38 @@ bool D_PAD::HitTest( const wxPoint& ref_pos ) return true; break; } - + return false; } -#if defined(DEBUG) +#if defined (DEBUG) + /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ void D_PAD::Show( int nestLevel, std::ostream& os ) { char padname[5] = { m_Padname[0], m_Padname[1], m_Padname[2], m_Padname[3], 0 }; - + char layerMask[16]; + sprintf( layerMask, "0x%08X", m_Masque_Layer ); - + // for now, make it look like XML: NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << - " num=\"" << padname << '"' << - " net=\"" << m_Netname.mb_str() << '"' << - " layerMask=\"" << layerMask << '"' << m_Pos << "/>\n"; - + " num=\"" << padname << '"' << + " net=\"" << m_Netname.mb_str() << '"' << + " layerMask=\"" << layerMask << '"' << m_Pos << "/>\n"; + // NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n'; - + // NestedSpace( nestLevel, os ) << "\n"; } + #endif diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 1c5f45c3ed..b8ca8336a5 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -4,20 +4,19 @@ class Pcb3D_GLCanvas; -/* forme des pastilles : (parametre .forme) */ +/* Pad shape id : ( .m_PadShape member) */ #define CIRCLE 1 #define RECT 2 #define OVALE 3 -#define TRAPEZE 4 // trapeze: traversante ou surfacique -#define SPECIAL_PAD 5 // description libre +#define TRAPEZE 4 // trapezoid -/* Attributs des PADS */ -#define STANDARD 0 // pad classique -#define SMD 1 // surfacique, generation d'un masque d'empatement -#define CONN 2 // surfacique, peut etre dore +/* PADS attributes */ +#define STANDARD 0 // Usual pad +#define SMD 1 // Smd pad, appears on the layer paste (default) +#define CONN 2 // Like smd, does not appear on the layer paste (default) +// reserved, but not yet really used: #define P_HOLE 3 // trou simple, utile sur pad stack #define MECA 4 // PAD "mecanique" (fixation, zone cuivre...) -#define PAD_STACK 0x80 // bit 7 de .attrib (flag) /* Definition type Structure d'un pad */ class D_PAD : public BOARD_ITEM @@ -26,41 +25,41 @@ public: union { unsigned long m_NumPadName; - char m_Padname[4]; /* nom (numero) de la pastille (assimilable a un long)*/ + char m_Padname[4]; /* Pad name (4 char) or a long identifier + * (used in pad name comparisons because this is faster than string comparison) + */ }; - - wxString m_Netname; /* Net Name */ - - int m_Masque_Layer; // (Bit a Bit :1= cuivre, 15= cmp, - // 2..14 = interne - // 16 .. 31 = couches non cuivre - - int m_PadShape; // forme CERCLE, RECT, OVALE, TRAPEZE ou libre - int m_DrillShape; // forme CERCLE, OVAL - - wxPoint m_Pos; // Position de reference du pad - - wxSize m_Drill; // Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL) - // for drill shape = CIRCLE, drill diam = m_Drill.x - - wxSize m_Offset; // Offset de la forme (pastilles excentrees) - wxSize m_Size; // Dimensions X et Y ( si orient 0 x = axe X - // y = axe Y - - wxSize m_DeltaSize; // delta sur formes rectangle -> trapezes - - wxPoint m_Pos0; // Coord relatives a l'ancre du pad en orientation 0 - - int m_Rayon; // rayon du cercle exinscrit du pad - int m_Attribut; // NORMAL, SMD, CONN, Bit 7 = STACK - int m_Orient; // en 1/10 degres - int m_NetCode; /* Numero de net pour comparaisons rapides */ - int m_logical_connexion; // variable utilisee lors du calcul du chevelu: - // contient de numero de block pour une connexion type ratsnet - - int m_physical_connexion; // variable utilisee lors du calcul de la connexit� - // contient de numero de block pour une connexion type piste + wxString m_Netname; /* Net Name */ + + int m_Masque_Layer; // Bitwise layer :1= copper layer, 15= cmp, + // 2..14 = internal layers + // 16 .. 31 = technical layers + + int m_PadShape; // Shape: CIRCLE, RECT, OVAL, TRAPEZOID + int m_DrillShape; // Shape CIRCLE, OVAL + + wxPoint m_Pos; // pad Position on board + wxSize m_Drill; // Drill diam (drill shape = CIRCLE) or drill size(shape = OVAL) + // for drill shape = CIRCLE, drill diam = m_Drill.x + + wxSize m_Offset; // Offset de la forme (pastilles excentrees) + wxSize m_Size; // X and Y size ( relative to orient 0) + + wxSize m_DeltaSize; // delta sur formes rectangle -> trapezes + + wxPoint m_Pos0; // Initial Pad position (i.e. pas position relative to the module anchor, orientation 0 + + int m_Rayon; // rayon du cercle exinscrit du pad + int m_Attribut; // NORMAL, SMD, CONN + int m_Orient; // in 1/10 degrees + + int m_NetCode; // Net number for fast comparisons + int m_logical_connexion; // variable used in rastnest computations + // handle block number in ratsnet connection + + int m_physical_connexion; // variable used in rastnest computations + // handle block number in track connection public: D_PAD( MODULE* parent ); @@ -69,9 +68,9 @@ public: void Copy( D_PAD* source ); - D_PAD* Next( void ) { return (D_PAD*) Pnext; } + D_PAD* Next( void ) { return (D_PAD*) Pnext; } - /* supprime du chainage la structure Struct */ + /* remove from linked list */ void UnLink( void ); /* Reading and writing data on files */ @@ -82,11 +81,11 @@ public: void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode ); void Draw3D( Pcb3D_GLCanvas* glcanvas ); - // autres + // others void SetPadName( const wxString& name ); // Change pad name wxString ReturnStringPadName( void ); // Return pad name as string in a wxString void ReturnStringPadName( wxString& text ); // Return pad name as string in a buffer - void ComputeRayon( void ); // met a jour m_Rayon, rayon du cercle exinscrit + void ComputeRayon( void ); // compute m_Rayon, rayon du cercle exinscrit const wxPoint ReturnShapePos( void ); // retourne la position /** @@ -95,9 +94,9 @@ public: * about this object into the frame's message panel. * Is virtual from EDA_BaseStruct. * @param frame A WinEDA_BasePcbFrame in which to print status information. - */ + */ void Display_Infos( WinEDA_DrawFrame* frame ); - + /** * Function HitTest * tests if the given wxPoint is within the bounds of this object. @@ -105,8 +104,9 @@ public: * @return bool - true if a hit, else false */ bool HitTest( const wxPoint& refPos ); - -#if defined(DEBUG) + +#if defined (DEBUG) + /** * Function GetClass * returns the class name. @@ -117,16 +117,17 @@ public: return wxT( "PAD" ); } + /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ virtual void Show( int nestLevel, std::ostream& os ); + #endif - }; typedef class D_PAD * LISTE_PAD; diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index 02651976a7..5af4772b64 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -215,51 +215,6 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) switch( g_KeyPressed ) { - case WXK_NUMPAD_SUBTRACT: - case WXK_SUBTRACT: - case '-': - ll = GetScreen()->m_Active_Layer; - if( ll > CMP_N ) - break; - if( ll <= CUIVRE_N ) - break; - if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer - ll = CUIVRE_N; - if( ll == CMP_N ) - ll = MAX( CUIVRE_N, m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 ); - else if( ll > CUIVRE_N ) - ll--; - GetScreen()->m_Active_Layer = ll; - if( DisplayOpt.ContrastModeDisplay ) - DrawPanel->Refresh( TRUE ); - break; - - case WXK_NUMPAD_ADD: - case WXK_ADD: - case '+': - ll = GetScreen()->m_Active_Layer; - if( ll >= CMP_N ) - break; - ll++; - if( ll >= m_Pcb->m_BoardSettings->m_CopperLayerCount - 1 ) - ll = CMP_N; - if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer - ll = CUIVRE_N; - GetScreen()->m_Active_Layer = ll; - if( DisplayOpt.ContrastModeDisplay ) - DrawPanel->Refresh( TRUE ); - break; - - case WXK_NUMPAD0: - case WXK_PAGEUP: - SwitchLayer( DC, CMP_N ); - break; - - case WXK_NUMPAD9: - case WXK_PAGEDOWN: - SwitchLayer( DC, CUIVRE_N ); - break; - case EDA_PANNING_UP_KEY: OnZoom( ID_ZOOM_PANNING_UP ); curpos = m_CurrentScreen->m_Curseur; @@ -281,51 +236,20 @@ void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) break; case EDA_ZOOM_IN_FROM_MOUSE: - case WXK_F1: OnZoom( ID_ZOOM_PLUS_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; case EDA_ZOOM_OUT_FROM_MOUSE: - case WXK_F2: OnZoom( ID_ZOOM_MOINS_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; - case WXK_F3: - OnZoom( ID_ZOOM_REDRAW_KEY ); - break; - case EDA_ZOOM_CENTER_FROM_MOUSE: - case WXK_F4: OnZoom( ID_ZOOM_CENTER_KEY ); oldpos = curpos = GetScreen()->m_Curseur; break; - case WXK_F5: - SwitchLayer( DC, LAYER_N_2 ); - break; - - case WXK_F6: - SwitchLayer( DC, LAYER_N_3 ); - break; - - case WXK_F7: - SwitchLayer( DC, LAYER_N_4 ); - break; - - case WXK_F8: - SwitchLayer( DC, LAYER_N_5 ); - break; - - case WXK_F9: - SwitchLayer( DC, LAYER_N_6 ); - break; - - case WXK_F10: - SwitchLayer( DC, LAYER_N_7 ); - break; - case WXK_NUMPAD8: /* Deplacement curseur vers le haut */ case WXK_UP: Mouse.y -= delta.y; diff --git a/pcbnew/dialog_pad_edit.cpp b/pcbnew/dialog_pad_edit.cpp index 1b327f253b..81a37aece4 100644 --- a/pcbnew/dialog_pad_edit.cpp +++ b/pcbnew/dialog_pad_edit.cpp @@ -123,7 +123,7 @@ bool WinEDA_PadPropertiesFrame::Create( wxWindow* parent, wxWindowID id, const w ////@end WinEDA_PadPropertiesFrame member initialisation ////@begin WinEDA_PadPropertiesFrame creation - SetExtraStyle(GetExtraStyle()|wxWS_EX_BLOCK_EVENTS); + SetExtraStyle(wxWS_EX_BLOCK_EVENTS); wxDialog::Create( parent, id, caption, pos, size, style ); CreateControls(); @@ -144,7 +144,7 @@ void WinEDA_PadPropertiesFrame::CreateControls() { SetFont(*g_DialogFont); ////@begin WinEDA_PadPropertiesFrame content construction - // Generated by DialogBlocks, 03/08/2006 10:35:29 (unregistered) + // Generated by DialogBlocks, 27/08/2007 21:03:59 (unregistered) WinEDA_PadPropertiesFrame* itemDialog1 = this; @@ -172,46 +172,42 @@ void WinEDA_PadPropertiesFrame::CreateControls() m_DrillShapeBoxSizer = new wxBoxSizer(wxVERTICAL); itemBoxSizer2->Add(m_DrillShapeBoxSizer, 0, wxGROW|wxTOP, 5); - wxString m_DrillShapeCtrlStrings[] = { - _("Circle"), - _("Oval") - }; - m_DrillShapeCtrl = new wxRadioBox( itemDialog1, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, 2, m_DrillShapeCtrlStrings, 1, wxRA_SPECIFY_COLS ); + wxArrayString m_DrillShapeCtrlStrings; + m_DrillShapeCtrlStrings.Add(_("Circle")); + m_DrillShapeCtrlStrings.Add(_("Oval")); + m_DrillShapeCtrl = new wxRadioBox( itemDialog1, ID_RADIOBOX_DRILL_SHAPE, _("Drill Shape:"), wxDefaultPosition, wxDefaultSize, m_DrillShapeCtrlStrings, 1, wxRA_SPECIFY_COLS ); m_DrillShapeCtrl->SetSelection(0); m_DrillShapeBoxSizer->Add(m_DrillShapeCtrl, 0, wxGROW|wxALL, 5); m_PadOptSizer = new wxBoxSizer(wxVERTICAL); itemBoxSizer2->Add(m_PadOptSizer, 0, wxGROW|wxALL, 5); - wxString m_PadOrientStrings[] = { - _("0"), - _("90"), - _("-90"), - _("180"), - _("User") - }; - m_PadOrient = new wxRadioBox( itemDialog1, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, 5, m_PadOrientStrings, 1, wxRA_SPECIFY_COLS ); + wxArrayString m_PadOrientStrings; + m_PadOrientStrings.Add(_("0")); + m_PadOrientStrings.Add(_("90")); + m_PadOrientStrings.Add(_("-90")); + m_PadOrientStrings.Add(_("180")); + m_PadOrientStrings.Add(_("User")); + m_PadOrient = new wxRadioBox( itemDialog1, ID_LISTBOX_ORIENT_PAD, _("Pad Orient:"), wxDefaultPosition, wxDefaultSize, m_PadOrientStrings, 1, wxRA_SPECIFY_COLS ); m_PadOrient->SetSelection(0); m_PadOptSizer->Add(m_PadOrient, 0, wxGROW|wxALL, 5); - wxString m_PadShapeStrings[] = { - _("Circle"), - _("Oval"), - _("Rect"), - _("Trapezoidal") - }; - m_PadShape = new wxRadioBox( itemDialog1, ID_LISTBOX_SHAPE_PAD, _("Pad Shape:"), wxDefaultPosition, wxDefaultSize, 4, m_PadShapeStrings, 1, wxRA_SPECIFY_COLS ); + wxArrayString m_PadShapeStrings; + m_PadShapeStrings.Add(_("Circle")); + m_PadShapeStrings.Add(_("Oval")); + m_PadShapeStrings.Add(_("Rect")); + m_PadShapeStrings.Add(_("Trapezoidal")); + m_PadShape = new wxRadioBox( itemDialog1, ID_LISTBOX_SHAPE_PAD, _("Pad Shape:"), wxDefaultPosition, wxDefaultSize, m_PadShapeStrings, 1, wxRA_SPECIFY_COLS ); m_PadShape->SetSelection(0); m_PadOptSizer->Add(m_PadShape, 0, wxGROW|wxALL, 5); - wxString m_PadTypeStrings[] = { - _("Standard"), - _("SMD"), - _("Conn"), - _("Hole"), - _("Mechanical") - }; - m_PadType = new wxRadioBox( itemDialog1, ID_LISTBOX_TYPE_PAD, _("Pad Type:"), wxDefaultPosition, wxDefaultSize, 5, m_PadTypeStrings, 1, wxRA_SPECIFY_COLS ); + wxArrayString m_PadTypeStrings; + m_PadTypeStrings.Add(_("Standard")); + m_PadTypeStrings.Add(_("SMD")); + m_PadTypeStrings.Add(_("Conn")); + m_PadTypeStrings.Add(_("Hole")); + m_PadTypeStrings.Add(_("Mechanical")); + m_PadType = new wxRadioBox( itemDialog1, ID_LISTBOX_TYPE_PAD, _("Pad Type:"), wxDefaultPosition, wxDefaultSize, m_PadTypeStrings, 1, wxRA_SPECIFY_COLS ); m_PadType->SetSelection(0); m_PadOptSizer->Add(m_PadType, 0, wxGROW|wxALL, 5); @@ -228,61 +224,61 @@ void WinEDA_PadPropertiesFrame::CreateControls() wxStaticBox* itemStaticBoxSizer18Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Layers:")); wxStaticBoxSizer* itemStaticBoxSizer18 = new wxStaticBoxSizer(itemStaticBoxSizer18Static, wxVERTICAL); - itemBoxSizer15->Add(itemStaticBoxSizer18, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + itemBoxSizer15->Add(itemStaticBoxSizer18, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT, 5); m_PadLayerCu = new wxCheckBox( itemDialog1, ID_CHECKBOX, _("Copper layer"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerCu->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerCu, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerCu, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); m_PadLayerCmp = new wxCheckBox( itemDialog1, ID_CHECKBOX1, _("Comp layer"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerCmp->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerCmp, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerCmp, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); itemStaticBoxSizer18->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); m_PadLayerAdhCmp = new wxCheckBox( itemDialog1, ID_CHECKBOX2, _("Adhesive Cmp"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerAdhCmp->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerAdhCmp, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerAdhCmp, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); m_PadLayerAdhCu = new wxCheckBox( itemDialog1, ID_CHECKBOX3, _("Adhesive Copper"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerAdhCu->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerAdhCu, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerAdhCu, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerPateCmp = new wxCheckBox( itemDialog1, ID_CHECKBOX4, _("Solder paste Cmp"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerPateCmp->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerPateCmp, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerPateCmp, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerPateCu = new wxCheckBox( itemDialog1, ID_CHECKBOX5, _("Solder paste Copper"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerPateCu->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerPateCu, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerPateCu, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerSilkCmp = new wxCheckBox( itemDialog1, ID_CHECKBOX6, _("Silkscreen Cmp"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerSilkCmp->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerSilkCmp, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerSilkCmp, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerSilkCu = new wxCheckBox( itemDialog1, ID_CHECKBOX7, _("Silkscreen Copper"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerSilkCu->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerSilkCu, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerSilkCu, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerMaskCmp = new wxCheckBox( itemDialog1, ID_CHECKBOX8, _("Solder mask Cmp"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerMaskCmp->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerMaskCmp, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerMaskCmp, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerMaskCu = new wxCheckBox( itemDialog1, ID_CHECKBOX9, _("Solder mask Copper"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerMaskCu->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerMaskCu, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerMaskCu, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerECO1 = new wxCheckBox( itemDialog1, ID_CHECKBOX10, _("E.C.O.1 layer"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerECO1->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerECO1, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerECO1, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerECO2 = new wxCheckBox( itemDialog1, ID_CHECKBOX11, _("E.C.O.2 layer"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerECO2->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerECO2, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerECO2, 0, wxGROW|wxLEFT|wxRIGHT, 5); m_PadLayerDraft = new wxCheckBox( itemDialog1, ID_CHECKBOX12, _("Draft layer"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_PadLayerDraft->SetValue(false); - itemStaticBoxSizer18->Add(m_PadLayerDraft, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer18->Add(m_PadLayerDraft, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); ////@end WinEDA_PadPropertiesFrame content construction @@ -381,11 +377,6 @@ void WinEDA_PadPropertiesFrame::OnListboxShapePadSelected( wxCommandEvent& event m_PadDeltaSizeCtrl->Enable(TRUE, TRUE); m_PadSizeCtrl->Enable(TRUE, TRUE); break; - - case 4: //SPECIAL_PAD: - m_PadDeltaSizeCtrl->Enable(FALSE, FALSE); - m_PadSizeCtrl->Enable(TRUE, TRUE); - break; } } diff --git a/pcbnew/dialog_pad_edit.h b/pcbnew/dialog_pad_edit.h index 8fe44b3932..fa205366e7 100644 --- a/pcbnew/dialog_pad_edit.h +++ b/pcbnew/dialog_pad_edit.h @@ -39,12 +39,6 @@ class wxBoxSizer; ////@begin control identifiers #define ID_DIALOG 10000 -// #define SYMBOL_WINEDA_PADPROPERTIESFRAME_STYLE wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX -#define SYMBOL_WINEDA_PADPROPERTIESFRAME_STYLE wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX -#define SYMBOL_WINEDA_PADPROPERTIESFRAME_TITLE _("Pad properties") -#define SYMBOL_WINEDA_PADPROPERTIESFRAME_IDNAME ID_DIALOG -#define SYMBOL_WINEDA_PADPROPERTIESFRAME_SIZE wxSize(400, 300) -#define SYMBOL_WINEDA_PADPROPERTIESFRAME_POSITION wxDefaultPosition #define ID_TEXTCTRL_PADNUM 10001 #define ID_TEXTCTRL_NETNAME 10002 #define ID_RADIOBOX_DRILL_SHAPE 10019 @@ -64,6 +58,11 @@ class wxBoxSizer; #define ID_CHECKBOX10 10016 #define ID_CHECKBOX11 10017 #define ID_CHECKBOX12 10018 +#define SYMBOL_WINEDA_PADPROPERTIESFRAME_STYLE wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX +#define SYMBOL_WINEDA_PADPROPERTIESFRAME_TITLE _("Pad properties") +#define SYMBOL_WINEDA_PADPROPERTIESFRAME_IDNAME ID_DIALOG +#define SYMBOL_WINEDA_PADPROPERTIESFRAME_SIZE wxSize(400, 300) +#define SYMBOL_WINEDA_PADPROPERTIESFRAME_POSITION wxDefaultPosition ////@end control identifiers /*! diff --git a/pcbnew/dialog_pad_edit.pjd b/pcbnew/dialog_pad_edit.pjd index 2e178b8ad8..4698377c9f 100644 --- a/pcbnew/dialog_pad_edit.pjd +++ b/pcbnew/dialog_pad_edit.pjd @@ -1,4 +1,4 @@ - +
0 @@ -6,7 +6,6 @@ "" "" "" - 39 "" 0 0 @@ -18,6 +17,7 @@ "License GNU" "" 0 + 0 "<All platforms>" "<Any>" "///////////////////////////////////////////////////////////////////////////// @@ -43,12 +43,6 @@ // Licence: ///////////////////////////////////////////////////////////////////////////// -" - " -/*! - * %BODY% - */ - " "///////////////////////////////////////////////////////////////////////////// // Name: %SYMBOLS-FILENAME% @@ -82,6 +76,14 @@ #include "wx/wx.h" #endif +" + " /// %BODY% +" + " +/*! + * %BODY% + */ + " "app_resources.h" "app_resources.cpp" @@ -93,17 +95,20 @@ "" "<None>" "<System>" + "utf-8" "<System>" "" 0 0 4 + " " "" 0 0 1 1 1 + 0 1
@@ -181,7 +186,7 @@ 1 1 0 - 0 + 1 "Windows" "html-document" @@ -205,6 +210,8 @@ 10000 0 "" + 0 + "" 0 "ID_DIALOG" 10000 @@ -258,6 +265,7 @@ -1 400 300 + 0 "" "wxBoxSizer H" @@ -314,6 +322,11 @@ "wxID_STATIC" 5105 "wxStaticText" + "wxStaticText" + 1 + 0 + "" + "" "" "Pad Num :" -1 @@ -373,6 +386,11 @@ "ID_TEXTCTRL_PADNUM" 10001 "wxTextCtrl" + "wxTextCtrl" + 1 + 0 + "" + "" "m_PadNumCtrl" "" 0 @@ -399,7 +417,7 @@ 0 0 0 - 0 + 0 0 0 0 @@ -428,6 +446,7 @@ 0 "" "" + 0 "wxStaticText: wxID_STATIC" @@ -443,6 +462,11 @@ "wxID_STATIC" 5105 "wxStaticText" + "wxStaticText" + 1 + 0 + "" + "" "" "Pad Net Name :" -1 @@ -502,6 +526,11 @@ "ID_TEXTCTRL_NETNAME" 10002 "wxTextCtrl" + "wxTextCtrl" + 1 + 0 + "" + "" "m_PadNetNameCtrl" "" 0 @@ -528,7 +557,7 @@ 0 0 0 - 0 + 0 0 0 0 @@ -557,6 +586,7 @@ 0 "" "" + 0 "wxBoxSizer V" @@ -625,6 +655,11 @@ "ID_RADIOBOX_DRILL_SHAPE" 10019 "wxRadioBox" + "wxRadioBox" + 1 + 0 + "" + "" "m_DrillShapeCtrl" "Drill Shape:" 1 @@ -705,6 +740,11 @@ "ID_LISTBOX_ORIENT_PAD" 10003 "wxRadioBox" + "wxRadioBox" + 1 + 0 + "" + "" "m_PadOrient" "Pad Orient:" 1 @@ -759,6 +799,11 @@ "ID_LISTBOX_SHAPE_PAD" 10004 "wxRadioBox" + "wxRadioBox" + 1 + 0 + "" + "" "m_PadShape" "Pad Shape:" 1 @@ -813,6 +858,11 @@ "ID_LISTBOX_TYPE_PAD" 10005 "wxRadioBox" + "wxRadioBox" + 1 + 0 + "" + "" "m_PadType" "Pad Type:" 1 @@ -893,6 +943,11 @@ "wxID_OK" 5100 "wxButton" + "wxButton" + 1 + 0 + "" + "" "" "&OK" 0 @@ -947,6 +1002,11 @@ "wxID_CANCEL" 5101 "wxButton" + "wxButton" + 1 + 0 + "" + "" "" "&Cancel" 0 @@ -1000,21 +1060,22 @@ "wxID_ANY" "-1" "Layers:" + "" "" "" "" 0 1 + "wxStaticBox" "Vertical" - "" "Centre" "Centre" 0 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1033,6 +1094,11 @@ "ID_CHECKBOX" 10006 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerCu" "Copper layer" 0 @@ -1065,7 +1131,7 @@ 1 1 1 - 1 + 0 0 0 0 @@ -1086,6 +1152,11 @@ "ID_CHECKBOX1" 10007 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerCmp" "Comp layer" 0 @@ -1117,7 +1188,7 @@ 5 1 1 - 1 + 0 1 0 0 @@ -1165,6 +1236,11 @@ "ID_CHECKBOX2" 10008 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerAdhCmp" "Adhesive Cmp" 0 @@ -1197,7 +1273,7 @@ 1 1 1 - 1 + 0 0 0 0 @@ -1218,6 +1294,11 @@ "ID_CHECKBOX3" 10009 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerAdhCu" "Adhesive Copper" 0 @@ -1249,8 +1330,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1271,6 +1352,11 @@ "ID_CHECKBOX4" 10010 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerPateCmp" "Solder paste Cmp" 0 @@ -1302,8 +1388,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1324,6 +1410,11 @@ "ID_CHECKBOX5" 10011 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerPateCu" "Solder paste Copper" 0 @@ -1355,8 +1446,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1377,6 +1468,11 @@ "ID_CHECKBOX6" 10012 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerSilkCmp" "Silkscreen Cmp" 0 @@ -1408,8 +1504,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1430,6 +1526,11 @@ "ID_CHECKBOX7" 10013 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerSilkCu" "Silkscreen Copper" 0 @@ -1461,8 +1562,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1483,6 +1584,11 @@ "ID_CHECKBOX8" 10014 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerMaskCmp" "Solder mask Cmp" 0 @@ -1514,8 +1620,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1536,6 +1642,11 @@ "ID_CHECKBOX9" 10015 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerMaskCu" "Solder mask Copper" 0 @@ -1567,8 +1678,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1589,6 +1700,11 @@ "ID_CHECKBOX10" 10016 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerECO1" "E.C.O.1 layer" 0 @@ -1620,8 +1736,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1642,6 +1758,11 @@ "ID_CHECKBOX11" 10017 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerECO2" "E.C.O.2 layer" 0 @@ -1673,8 +1794,8 @@ 5 1 1 - 1 - 1 + 0 + 0 0 0 0 @@ -1695,6 +1816,11 @@ "ID_CHECKBOX12" 10018 "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" "m_PadLayerDraft" "Draft layer" 0 @@ -1726,7 +1852,7 @@ 5 1 1 - 1 + 0 1 0 0 diff --git a/pcbnew/editpads.cpp b/pcbnew/editpads.cpp index d2fbb12541..69c5c22c14 100644 --- a/pcbnew/editpads.cpp +++ b/pcbnew/editpads.cpp @@ -160,12 +160,6 @@ int tmp; m_PadSizeCtrl->Enable(TRUE, TRUE); m_PadShape->SetSelection(3); break; - - case SPECIAL_PAD: - m_PadDeltaSizeCtrl->Enable(FALSE, FALSE); - m_PadSizeCtrl->Enable(TRUE, TRUE); - m_PadShape->SetSelection(4); - break; } // Selection du type @@ -416,9 +410,6 @@ bool error = FALSE; case TRAPEZE: break; - - case SPECIAL_PAD: - break; } switch ( CurrentPad->m_Attribut ) diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 98e6304d0a..be5c056108 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -174,9 +174,8 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo else GetScreen()->m_FileName = FullFileName; - ///////////////////////// - /* Lecture Fichier PCB */ - ///////////////////////// + /* Start read PCB file + */ source = wxFopen( GetScreen()->m_FileName, wxT( "rt" ) ); if( source == NULL ) @@ -187,7 +186,7 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo } - /* Lecture de l'entete et TEST si PCB format ASCII */ + /* Read header and TEST if it is a PCB file format */ GetLine( source, cbuf, &ii ); if( strncmp( cbuf, "PCBNEW-BOARD", 12 ) != 0 ) { @@ -199,7 +198,7 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo SetTitle( GetScreen()->m_FileName ); SetLastProject( GetScreen()->m_FileName ); - // Rechargement de la configuration: + // Reload the corresponding configuration file: wxSetWorkingDirectory( wxPathOnly( GetScreen()->m_FileName ) ); if( Append ) ReadPcbFile( DC, source, TRUE ); @@ -207,7 +206,7 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo { Read_Config( GetScreen()->m_FileName ); - // Mise a jour du toolbar d'options + // Update the option toolbar m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill; m_DisplayModText = DisplayOpt.DisplayModText; m_DisplayModEdge = DisplayOpt.DisplayModEdge; @@ -227,11 +226,12 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo wxGetCwd().GetData(), DIR_SEP, PcbExtBuffer.GetData() ); } - /* liste des pads recalculee avec Affichage des messages d'erreur */ + /* Rebuild the new pad list (for drc and ratsnet control ...) */ build_liste_pads(); m_Pcb->Display_Infos( this ); + /* reset the auto save timer */ g_SaveTime = time( NULL ); diff --git a/pcbnew/hotkeys.cpp b/pcbnew/hotkeys.cpp index 3426e8c9c6..269a7342bd 100644 --- a/pcbnew/hotkeys.cpp +++ b/pcbnew/hotkeys.cpp @@ -9,78 +9,110 @@ #include "common.h" #include "pcbnew.h" #include "id.h" -#include "hotkeys_basic.h" +#include "hotkeys.h" #include "protos.h" -/* Routines locales */ - -enum hotkey_id_commnand { - HK_NOT_FOUND = 0, - HK_RESET_LOCAL_COORD, - HK_HELP, - HK_ZOOM_IN, - HK_ZOOM_OUT, - HK_ZOOM_REDRAW, - HK_ZOOM_CENTER, - HK_DELETE, - HK_BACK_SPACE, - HK_ROTATE_FOOTPRINT, - HK_MOVE_FOOTPRINT, - HK_DRAG_FOOTPRINT, - HK_FLIP_FOOTPRINT, - HK_LOCK_UNLOCK_FOOTPRINT, - HK_ADD_VIA, HK_END_TRACK, - HK_SAVE_BOARD, HK_LOAD_BOARD, - HK_SWITCH_UNITS, HK_SWITCH_TRACK_DISPLAY_MODE, - HK_FIND_ITEM -}; - +/* How to add a new hotkey: + * add a new id in the enum hotkey_id_commnand like MY_NEW_ID_FUNCTION. + * add a new Ki_HotkeyInfo entry like: + * static Ki_HotkeyInfo HkMyNewEntry(wxT("Command Label"), MY_NEW_ID_FUNCTION, default key value); + * "Command Label" is the name used in hotkey list display, and the identifier in the hotkey list file + * MY_NEW_ID_FUNCTION is an equivalent id function used in the switch in OnHotKey() function. + * default key value is the default hotkey for this command. Can be overrided by the user hotkey list file + * add the HkMyNewEntry pointer in the s_board_edit_Hotkey_List list ( or/and the s_module_edit_Hotkey_List list) + * Add the new code in the switch in OnHotKey() function. + * when the variable PopupOn is true, an item is currently edited. + * This can be usefull if the new function cannot be executed while an item is currently being edited + * ( For example, one cannot start a new wire when a component is moving.) + * + * Note: If an hotkey is a special key be sure the corresponding wxWidget keycode (WXK_XXXX) + * is handled in the hotkey_name_descr s_Hotkey_Name_List list (see hotkeys_basic.cpp) + * and see this list for some ascii keys (space ...) + */ /* local variables */ /* Hotkey list: */ -static Ki_HotkeyInfo HkSavefile(wxT("Save board"), HK_SAVE_BOARD, 'S' + GR_KB_CTRL); -static Ki_HotkeyInfo HkLoadfile(wxT("Load board"), HK_LOAD_BOARD, 'L' + GR_KB_CTRL); -static Ki_HotkeyInfo HkFindItem(wxT("Find Item"), HK_FIND_ITEM, 'F' + GR_KB_CTRL); -static Ki_HotkeyInfo HkBackspace(wxT("Delete track segment"), HK_BACK_SPACE, WXK_BACK); -static Ki_HotkeyInfo HkAddVia(wxT("Add Via"), HK_ADD_VIA, 'V'); -static Ki_HotkeyInfo HkEndTrack(wxT("End Track"), HK_END_TRACK, WXK_END); -static Ki_HotkeyInfo HkFlipFootprint(wxT("Flip Footprint"), HK_FLIP_FOOTPRINT, 'F'); -static Ki_HotkeyInfo HkRotateFootprint(wxT("Rotate Footprint"), HK_ROTATE_FOOTPRINT, 'R'); -static Ki_HotkeyInfo HkMoveFootprint(wxT("Move Footprint"), HK_MOVE_FOOTPRINT, 'M'); -static Ki_HotkeyInfo HkDragFootprint(wxT("Drag Footprint"), HK_DRAG_FOOTPRINT, 'G'); -static Ki_HotkeyInfo HkLock_Unlock_Footprint(wxT("Lock/Unlock Footprint"), HK_LOCK_UNLOCK_FOOTPRINT, 'L'); -static Ki_HotkeyInfo HkDelete(wxT("Delete Track or Footprint"), HK_DELETE, WXK_DELETE); -static Ki_HotkeyInfo HkResetLocalCoord(wxT("Reset local coord."), HK_RESET_LOCAL_COORD, ' '); -static Ki_HotkeyInfo HkZoomCenter(wxT("Zoom Center"), HK_ZOOM_CENTER, WXK_F4); -static Ki_HotkeyInfo HkZoomRedraw(wxT("Zoom Redraw"), HK_ZOOM_REDRAW, WXK_F3); -static Ki_HotkeyInfo HkZoomOut(wxT("Zoom Out"), HK_ZOOM_OUT, WXK_F2); -static Ki_HotkeyInfo HkZoomIn(wxT("Zoom In"), HK_ZOOM_IN, WXK_F1); -static Ki_HotkeyInfo HkHelp(wxT("Help: this message"), HK_HELP, '?'); -static Ki_HotkeyInfo HkSwitchUnits(wxT("Switch Units"), HK_SWITCH_UNITS, 'U'); -static Ki_HotkeyInfo HkTrackDisplayMode(wxT("Track Display Mode"), HK_SWITCH_TRACK_DISPLAY_MODE, 'F'); +static Ki_HotkeyInfo HkSwitch2CopperLayer( wxT( + "Switch to Copper layer" ), + HK_SWITCH_LAYER_TO_COPPER, '-' ); +static Ki_HotkeyInfo HkSwitch2ComponentLayer( wxT( + "Switch to Component layer" ), + HK_SWITCH_LAYER_TO_COMPONENT, '+' ); +static Ki_HotkeyInfo HkSwitch2InnerLayer1( wxT( + "Switch to Inner layer 1" ), + HK_SWITCH_LAYER_TO_INNER1, WXK_F5 ); +static Ki_HotkeyInfo HkSwitch2InnerLayer2( wxT( + "Switch to Inner layer 2" ), + HK_SWITCH_LAYER_TO_INNER2, WXK_F6 ); +static Ki_HotkeyInfo HkSwitch2InnerLayer3( wxT( + "Switch to Inner layer 3" ), + HK_SWITCH_LAYER_TO_INNER3, WXK_F7 ); +static Ki_HotkeyInfo HkSwitch2InnerLayer4( wxT( + "Switch to Inner layer 4" ), + HK_SWITCH_LAYER_TO_INNER4, WXK_F8 ); +static Ki_HotkeyInfo HkSwitch2InnerLayer5( wxT( + "Switch to Inner layer 5" ), + HK_SWITCH_LAYER_TO_INNER5, WXK_F9 ); +static Ki_HotkeyInfo HkSwitch2InnerLayer6( wxT( + "Switch to Inner layer 6" ), + HK_SWITCH_LAYER_TO_INNER6, WXK_F10 ); + +static Ki_HotkeyInfo HkSavefile( wxT( "Save board" ), HK_SAVE_BOARD, 'S' + GR_KB_CTRL ); +static Ki_HotkeyInfo HkLoadfile( wxT( "Load board" ), HK_LOAD_BOARD, 'L' + GR_KB_CTRL ); +static Ki_HotkeyInfo HkFindItem( wxT( "Find Item" ), HK_FIND_ITEM, 'F' + GR_KB_CTRL ); +static Ki_HotkeyInfo HkBackspace( wxT( "Delete track segment" ), HK_BACK_SPACE, WXK_BACK ); +static Ki_HotkeyInfo HkAddVia( wxT( "Add Via" ), HK_ADD_VIA, 'V' ); +static Ki_HotkeyInfo HkEndTrack( wxT( "End Track" ), HK_END_TRACK, WXK_END ); +static Ki_HotkeyInfo HkFlipFootprint( wxT( "Flip Footprint" ), HK_FLIP_FOOTPRINT, 'F' ); +static Ki_HotkeyInfo HkRotateFootprint( wxT( "Rotate Footprint" ), HK_ROTATE_FOOTPRINT, 'R' ); +static Ki_HotkeyInfo HkMoveFootprint( wxT( "Move Footprint" ), HK_MOVE_FOOTPRINT, 'M' ); +static Ki_HotkeyInfo HkDragFootprint( wxT( "Drag Footprint" ), HK_DRAG_FOOTPRINT, 'G' ); +static Ki_HotkeyInfo HkLock_Unlock_Footprint( wxT( + "Lock/Unlock Footprint" ), + HK_LOCK_UNLOCK_FOOTPRINT, 'L' ); +static Ki_HotkeyInfo HkDelete( wxT( "Delete Track or Footprint" ), HK_DELETE, WXK_DELETE ); +static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ), HK_RESET_LOCAL_COORD, ' ' ); +static Ki_HotkeyInfo HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4 ); +static Ki_HotkeyInfo HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3 ); +static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 ); +static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 ); +static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' ); +static Ki_HotkeyInfo HkSwitchUnits( wxT( "Switch Units" ), HK_SWITCH_UNITS, 'U' ); +static Ki_HotkeyInfo HkTrackDisplayMode( wxT( + "Track Display Mode" ), + HK_SWITCH_TRACK_DISPLAY_MODE, 'F' ); // List of hotkey descriptors for pcbnew -Ki_HotkeyInfo *s_board_edit_Hotkey_List[] = { - &HkHelp, - &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, - &HkResetLocalCoord, &HkSwitchUnits, &HkTrackDisplayMode, - &HkDelete, &HkBackspace, - &HkAddVia, &HkEndTrack, - &HkMoveFootprint, &HkFlipFootprint, - &HkRotateFootprint, &HkDragFootprint, - &HkLock_Unlock_Footprint, - &HkSavefile, &HkLoadfile, &HkFindItem, - NULL +Ki_HotkeyInfo* s_board_edit_Hotkey_List[] = { + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkResetLocalCoord, &HkSwitchUnits, &HkTrackDisplayMode, + &HkDelete, &HkBackspace, + &HkAddVia, &HkEndTrack, + &HkMoveFootprint, &HkFlipFootprint, + &HkRotateFootprint, &HkDragFootprint, + &HkLock_Unlock_Footprint, + &HkSavefile, &HkLoadfile, &HkFindItem, + &HkSwitch2CopperLayer, + &HkSwitch2InnerLayer1, + &HkSwitch2InnerLayer2, + &HkSwitch2InnerLayer3, + &HkSwitch2InnerLayer4, + &HkSwitch2InnerLayer5, + &HkSwitch2InnerLayer6, + &HkSwitch2ComponentLayer, + NULL }; -Ki_HotkeyInfo *s_module_edit_Hotkey_List[] = { - &HkHelp, - &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, - &HkSwitchUnits, &HkResetLocalCoord, - &HkDelete, &HkBackspace, - NULL +// List of hotkey descriptors for the module editor +Ki_HotkeyInfo* s_module_edit_Hotkey_List[] = { + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkSwitchUnits, &HkResetLocalCoord, + &HkDelete, &HkBackspace, + NULL }; @@ -88,16 +120,19 @@ Ki_HotkeyInfo *s_module_edit_Hotkey_List[] = { void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct ) /***********************************************************/ + /* Hot keys. Some commands are relatives to the item under the mouse cursor - Commands are case insensitive - Zoom commands are not managed here -*/ + * Commands are case insensitive + * Zoom commands are not managed here + * @param DC = current device context + * @param hotkey = hothey code (ascii or wxWidget code for special keys) + * @param DrawStruct = NULL or pointer on a EDA_BaseStruct under the mouse cursor + */ { - bool PopupOn = GetScreen()->GetCurItem() && GetScreen()->GetCurItem()->m_Flags; - + bool ItemFree = (GetScreen()->GetCurItem() == 0 ) || (GetScreen()->GetCurItem()->m_Flags == 0); @@ -106,214 +141,290 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, MODULE* module = NULL; - // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) - if ( (hotkey & GR_KB_CTRL) != 0 ) hotkey += 'A' - 1; - /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ - if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; - - int CommandCode = GetCommandCodeFromHotkey(hotkey, s_board_edit_Hotkey_List); + // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) + if( (hotkey & GR_KB_CTRL) != 0 ) + hotkey += 'A' - 1; + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) + hotkey += 'A' - 'a'; + + int CommandCode = GetCommandCodeFromHotkey( hotkey, s_board_edit_Hotkey_List ); + int ll; + switch( CommandCode ) { - default: - case HK_NOT_FOUND: - return; - break; - - case HK_HELP: // Display Current hotkey list - DisplayHotkeyList(this, s_board_edit_Hotkey_List); - break; + default: + case HK_NOT_FOUND: + return; + break; - case HK_ZOOM_IN: - case HK_ZOOM_OUT: - case HK_ZOOM_REDRAW: - case HK_ZOOM_CENTER: - break; + case HK_SWITCH_LAYER_TO_PREVIOUS: + ll = GetScreen()->m_Active_Layer; + if( ll > CMP_N ) + break; + if( ll <= CUIVRE_N ) + break; + if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer + ll = CUIVRE_N; + if( ll == CMP_N ) + ll = MAX( CUIVRE_N, m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 ); + else if( ll > CUIVRE_N ) + ll--; + SwitchLayer( DC, ll ); + break; - case HK_RESET_LOCAL_COORD: /*Reset the relative coord */ - GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; - break; + case HK_SWITCH_LAYER_TO_NEXT: + ll = GetScreen()->m_Active_Layer; + if( ll >= CMP_N ) + break; + ll++; + if( ll >= m_Pcb->m_BoardSettings->m_CopperLayerCount - 1 ) + ll = CMP_N; + if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer + ll = CUIVRE_N; + SwitchLayer( DC, ll ); + break; + + case HK_SWITCH_LAYER_TO_COMPONENT: + SwitchLayer( DC, CMP_N ); + break; + + case HK_SWITCH_LAYER_TO_COPPER: + SwitchLayer( DC, CUIVRE_N ); + break; + + case HK_SWITCH_LAYER_TO_INNER1: + SwitchLayer( DC, LAYER_N_2 ); + break; + + case HK_SWITCH_LAYER_TO_INNER2: + SwitchLayer( DC, LAYER_N_3 ); + break; + + case HK_SWITCH_LAYER_TO_INNER3: + SwitchLayer( DC, LAYER_N_4 ); + break; + + case HK_SWITCH_LAYER_TO_INNER4: + SwitchLayer( DC, LAYER_N_5 ); + break; + + case HK_SWITCH_LAYER_TO_INNER5: + SwitchLayer( DC, LAYER_N_6 ); + break; + + case HK_SWITCH_LAYER_TO_INNER6: + SwitchLayer( DC, LAYER_N_7 ); + break; + + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList( this, s_board_edit_Hotkey_List ); + break; + + case HK_ZOOM_IN: + OnZoom( ID_ZOOM_PLUS_KEY ); + break; + + case HK_ZOOM_OUT: + OnZoom( ID_ZOOM_MOINS_KEY ); + break; + + case HK_ZOOM_REDRAW: + OnZoom( ID_ZOOM_REDRAW_KEY ); + break; + + case HK_ZOOM_CENTER: + OnZoom( ID_ZOOM_CENTER_KEY ); + break; - case HK_SWITCH_UNITS: - g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; - break; + case HK_RESET_LOCAL_COORD: /*Reset the relative coord */ + GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; + break; - case HK_SWITCH_TRACK_DISPLAY_MODE: - DisplayOpt.DisplayPcbTrackFill ^= 1; DisplayOpt.DisplayPcbTrackFill &= 1; - GetScreen()->SetRefreshReq(); - break; - case HK_DELETE: - OnHotkeyDeleteItem( DC, DrawStruct ); - break; + case HK_SWITCH_UNITS: + g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; + break; - case HK_BACK_SPACE: - if( m_ID_current_state == ID_TRACK_BUTT && GetScreen()->m_Active_Layer <= CMP_N ) - { - bool ItemFree = (GetScreen()->GetCurItem() == NULL ) - || (GetScreen()->GetCurItem()->m_Flags == 0); - if( ItemFree ) - { - // no track is currently being edited - select a segment and remove it. - DrawStruct = PcbGeneralLocateAndDisplay(); + case HK_SWITCH_TRACK_DISPLAY_MODE: + DisplayOpt.DisplayPcbTrackFill ^= 1; DisplayOpt.DisplayPcbTrackFill &= 1; + GetScreen()->SetRefreshReq(); + break; - // don't let backspace delete modules!! - if( DrawStruct && (DrawStruct->m_StructType == TYPETRACK - || DrawStruct->m_StructType == TYPEVIA) ) - Delete_Segment( DC, (TRACK*) DrawStruct ); - GetScreen()->SetModify(); - } - else if( GetScreen()->GetCurItem()->m_StructType == TYPETRACK ) - { - // then an element is being edited - remove the last segment. - GetScreen()->SetCurItem(Delete_Segment( DC, (TRACK*) GetScreen()->GetCurItem() ) ); - GetScreen()->SetModify(); - } - } - break; + case HK_DELETE: + OnHotkeyDeleteItem( DC, DrawStruct ); + break; - case HK_END_TRACK: - DrawPanel->MouseToCursorSchema(); - End_Route( (TRACK*) (GetScreen()->GetCurItem()), DC ); - break; + case HK_BACK_SPACE: + if( m_ID_current_state == ID_TRACK_BUTT && GetScreen()->m_Active_Layer <= CMP_N ) + { + bool ItemFree = (GetScreen()->GetCurItem() == NULL ) + || (GetScreen()->GetCurItem()->m_Flags == 0); + if( ItemFree ) + { + // no track is currently being edited - select a segment and remove it. + DrawStruct = PcbGeneralLocateAndDisplay(); - case HK_FIND_ITEM: - { - wxCommandEvent evt; - evt.SetId( ID_FIND_ITEMS ); - Process_Special_Functions( evt ); - } - break; + // don't let backspace delete modules!! + if( DrawStruct && (DrawStruct->m_StructType == TYPETRACK + || DrawStruct->m_StructType == TYPEVIA) ) + Delete_Segment( DC, (TRACK*) DrawStruct ); + GetScreen()->SetModify(); + } + else if( GetScreen()->GetCurItem()->m_StructType == TYPETRACK ) + { + // then an element is being edited - remove the last segment. + GetScreen()->SetCurItem( Delete_Segment( DC, (TRACK*) GetScreen()->GetCurItem() ) ); + GetScreen()->SetModify(); + } + } + break; - case HK_LOAD_BOARD: - { - // try not to duplicate save, load code etc. - wxCommandEvent evt; - evt.SetId( ID_LOAD_FILE ); - Files_io( evt ); - } - break; + case HK_END_TRACK: + DrawPanel->MouseToCursorSchema(); + End_Route( (TRACK*) ( GetScreen()->GetCurItem() ), DC ); + break; - case HK_SAVE_BOARD: - { - // try not to duplicate save, load code etc. - wxCommandEvent evt; - evt.SetId( ID_SAVE_BOARD ); - Files_io( evt ); - } - break; + case HK_FIND_ITEM: + { + wxCommandEvent evt; + evt.SetId( ID_FIND_ITEMS ); + Process_Special_Functions( evt ); + } + break; - case HK_ADD_VIA: // Switch to alternate layer and Place a via if a track is in progress - if( m_ID_current_state != ID_TRACK_BUTT ) - return; - if( ItemFree ) - { - Other_Layer_Route( NULL, DC ); - break; - } - if( GetScreen()->GetCurItem()->m_StructType != TYPETRACK ) - return; - if( (GetScreen()->GetCurItem()->m_Flags & IS_NEW) == 0 ) - return; - Other_Layer_Route( (TRACK*) GetScreen()->GetCurItem(), DC ); - if( DisplayOpt.ContrastModeDisplay ) - GetScreen()->SetRefreshReq(); - break; + case HK_LOAD_BOARD: + { + // try not to duplicate save, load code etc. + wxCommandEvent evt; + evt.SetId( ID_LOAD_FILE ); + Files_io( evt ); + } + break; - // Footprint edition: - case HK_LOCK_UNLOCK_FOOTPRINT: // toggle module "MODULE_is_LOCKED" status: - // get any module, locked or not locked and toggle its locked status - if( ItemFree ) - module = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE | VISIBLE_ONLY ); - else if( GetScreen()->GetCurItem()->m_StructType == TYPEMODULE ) - module = (MODULE*) GetScreen()->GetCurItem(); - if( module ) - { - GetScreen()->SetCurItem(module); - module->SetLocked( !module->IsLocked() ); - module->Display_Infos( this ); - } - break; + case HK_SAVE_BOARD: + { + // try not to duplicate save, load code etc. + wxCommandEvent evt; + evt.SetId( ID_SAVE_BOARD ); + Files_io( evt ); + } + break; - case HK_DRAG_FOOTPRINT: // Start move (and drag) module - case HK_MOVE_FOOTPRINT: // Start move module - if( PopupOn ) - break; + case HK_ADD_VIA: // Switch to alternate layer and Place a via if a track is in progress + if( m_ID_current_state != ID_TRACK_BUTT ) + return; + if( ItemFree ) + { + Other_Layer_Route( NULL, DC ); + break; + } + if( GetScreen()->GetCurItem()->m_StructType != TYPETRACK ) + return; + if( (GetScreen()->GetCurItem()->m_Flags & IS_NEW) == 0 ) + return; + Other_Layer_Route( (TRACK*) GetScreen()->GetCurItem(), DC ); + if( DisplayOpt.ContrastModeDisplay ) + GetScreen()->SetRefreshReq(); + break; - case HK_ROTATE_FOOTPRINT: // Rotation - case HK_FLIP_FOOTPRINT: // move to other side - if( ItemFree ) - { - module = Locate_Prefered_Module( m_Pcb, - CURSEUR_OFF_GRILLE | IGNORE_LOCKED | VISIBLE_ONLY - #if defined (USE_MATCH_LAYER) - | MATCH_LAYER - #endif - ); - if( module == NULL ) // no footprint found - { - module = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE ); - if( module ) - { - // a footprint is found, but locked or on an other layer - if( module->IsLocked() ) - { - wxString msg; - - msg.Printf( _("Footprint %s found, but locked"), - module->m_Reference->m_Text.GetData() ); - - DisplayInfo( this, msg ); - } - module = NULL; - } - } - } - else if( GetScreen()->GetCurItem()->m_StructType == TYPEMODULE ) - { - module = (MODULE*) GetScreen()->GetCurItem(); + // Footprint edition: + case HK_LOCK_UNLOCK_FOOTPRINT: // toggle module "MODULE_is_LOCKED" status: + // get any module, locked or not locked and toggle its locked status + if( ItemFree ) + module = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE | VISIBLE_ONLY ); + else if( GetScreen()->GetCurItem()->m_StructType == TYPEMODULE ) + module = (MODULE*) GetScreen()->GetCurItem(); + if( module ) + { + GetScreen()->SetCurItem( module ); + module->SetLocked( !module->IsLocked() ); + module->Display_Infos( this ); + } + break; - // @todo: might need to add a layer check in if() below - if( (GetScreen()->GetCurItem()->m_Flags == 0) - && module->IsLocked() ) - module = NULL; // do not move, rotate ... it. - } - if( module == NULL ) - break; + case HK_DRAG_FOOTPRINT: // Start move (and drag) module + case HK_MOVE_FOOTPRINT: // Start move module + if( PopupOn ) + break; - /* I'd like to make sending to EESCHEMA edge triggered, but the - simple mouse click on a module when the arrow icon is in play - does not set GetCurItem() at this time, nor does a mouse click - when the local ratsnest icon is in play set GetCurItem(), and these - actions also call SendMessageToEESCHEMA(). - if( GetScreen()->GetCurItem() != module ) - */ - { - // Send the module via socket to EESCHEMA's search facility. - SendMessageToEESCHEMA( module ); - - GetScreen()->SetCurItem(module); - } + case HK_ROTATE_FOOTPRINT: // Rotation + case HK_FLIP_FOOTPRINT: // move to other side + if( ItemFree ) + { + module = Locate_Prefered_Module( m_Pcb, + CURSEUR_OFF_GRILLE | IGNORE_LOCKED | VISIBLE_ONLY + #if defined (USE_MATCH_LAYER) + | MATCH_LAYER + #endif + ); + if( module == NULL ) // no footprint found + { + module = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE ); + if( module ) + { + // a footprint is found, but locked or on an other layer + if( module->IsLocked() ) + { + wxString msg; - switch( CommandCode ) - { - case HK_ROTATE_FOOTPRINT: // Rotation - Rotate_Module( DC, module, 900, TRUE ); - break; + msg.Printf( _( "Footprint %s found, but locked" ), + module->m_Reference->m_Text.GetData() ); - case HK_FLIP_FOOTPRINT: // move to other side - Change_Side_Module( module, DC ); - break; + DisplayInfo( this, msg ); + } + module = NULL; + } + } + } + else if( GetScreen()->GetCurItem()->m_StructType == TYPEMODULE ) + { + module = (MODULE*) GetScreen()->GetCurItem(); - case HK_DRAG_FOOTPRINT: // Start move (and drag) module - g_Drag_Pistes_On = TRUE; - // fall through - case HK_MOVE_FOOTPRINT: // Start move module - StartMove_Module( module, DC ); - break; - } - module->Display_Infos( this ); - break; + // @todo: might need to add a layer check in if() below + if( (GetScreen()->GetCurItem()->m_Flags == 0) + && module->IsLocked() ) + module = NULL; // do not move, rotate ... it. + } + if( module == NULL ) + break; + + /* I'd like to make sending to EESCHEMA edge triggered, but the + * simple mouse click on a module when the arrow icon is in play + * does not set GetCurItem() at this time, nor does a mouse click + * when the local ratsnest icon is in play set GetCurItem(), and these + * actions also call SendMessageToEESCHEMA(). + * if( GetScreen()->GetCurItem() != module ) + */ + { + // Send the module via socket to EESCHEMA's search facility. + SendMessageToEESCHEMA( module ); + + GetScreen()->SetCurItem( module ); + } + + switch( CommandCode ) + { + case HK_ROTATE_FOOTPRINT: // Rotation + Rotate_Module( DC, module, 900, TRUE ); + break; + + case HK_FLIP_FOOTPRINT: // move to other side + Change_Side_Module( module, DC ); + break; + + case HK_DRAG_FOOTPRINT: // Start move (and drag) module + g_Drag_Pistes_On = TRUE; + + // fall through + case HK_MOVE_FOOTPRINT: // Start move module + StartMove_Module( module, DC ); + break; + } + + module->Display_Infos( this ); + break; } } @@ -331,35 +442,47 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* DC, int hotkey, if( hotkey == 0 ) return; - /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ - if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) + hotkey += 'A' - 'a'; + + int CommandCode = GetCommandCodeFromHotkey( hotkey, s_module_edit_Hotkey_List ); - int CommandCode = GetCommandCodeFromHotkey(hotkey, s_module_edit_Hotkey_List); switch( CommandCode ) { - default: - case HK_NOT_FOUND: - return; - break; - - case HK_HELP: // Display Current hotkey list - DisplayHotkeyList(this, s_module_edit_Hotkey_List); - break; + default: + case HK_NOT_FOUND: + return; + break; - case HK_RESET_LOCAL_COORD: /*Reset the relative coord */ - GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; - break; + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList( this, s_module_edit_Hotkey_List ); + break; + + case HK_RESET_LOCAL_COORD: /*Reset the relative coord */ + GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; + break; - case HK_SWITCH_UNITS: - g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; - break; + case HK_SWITCH_UNITS: + g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; + break; - case HK_ZOOM_IN: - case HK_ZOOM_OUT: - case HK_ZOOM_REDRAW: - case HK_ZOOM_CENTER: - break; + case HK_ZOOM_IN: + OnZoom( ID_ZOOM_PLUS_KEY ); + break; + + case HK_ZOOM_OUT: + OnZoom( ID_ZOOM_MOINS_KEY ); + break; + + case HK_ZOOM_REDRAW: + OnZoom( ID_ZOOM_REDRAW_KEY ); + break; + + case HK_ZOOM_CENTER: + OnZoom( ID_ZOOM_CENTER_KEY ); + break; } } @@ -419,6 +542,6 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) } GetScreen()->SetModify(); - GetScreen()->SetCurItem(NULL); + GetScreen()->SetCurItem( NULL ); return TRUE; } diff --git a/pcbnew/hotkeys.h b/pcbnew/hotkeys.h new file mode 100644 index 0000000000..973617affa --- /dev/null +++ b/pcbnew/hotkeys.h @@ -0,0 +1,45 @@ +/***************/ +/* hotkeys.h */ +/***************/ +#ifndef KOTKEYS_H +#define KOTKEYS_H + +#include "hotkeys_basic.h" + +enum hotkey_id_commnand { + HK_NOT_FOUND = 0, + HK_RESET_LOCAL_COORD, + HK_HELP, + HK_ZOOM_IN, + HK_ZOOM_OUT, + HK_ZOOM_REDRAW, + HK_ZOOM_CENTER, + HK_DELETE, + HK_BACK_SPACE, + HK_ROTATE_FOOTPRINT, + HK_MOVE_FOOTPRINT, + HK_DRAG_FOOTPRINT, + HK_FLIP_FOOTPRINT, + HK_LOCK_UNLOCK_FOOTPRINT, + HK_ADD_VIA, HK_END_TRACK, + HK_SAVE_BOARD, HK_LOAD_BOARD, + HK_SWITCH_UNITS, HK_SWITCH_TRACK_DISPLAY_MODE, + HK_FIND_ITEM, + HK_SWITCH_LAYER_TO_COPPER, + HK_SWITCH_LAYER_TO_COMPONENT, + HK_SWITCH_LAYER_TO_NEXT, + HK_SWITCH_LAYER_TO_PREVIOUS, + HK_SWITCH_LAYER_TO_INNER1, + HK_SWITCH_LAYER_TO_INNER2, + HK_SWITCH_LAYER_TO_INNER3, + HK_SWITCH_LAYER_TO_INNER4, + HK_SWITCH_LAYER_TO_INNER5, + HK_SWITCH_LAYER_TO_INNER6 +}; + +// List of hotkey descriptors for pcbnew +extern Ki_HotkeyInfo* s_board_edit_Hotkey_List[]; +// List of hotkey descriptors for the module editor +extern Ki_HotkeyInfo* s_module_edit_Hotkey_List[]; + +#endif // KOTKEYS_H diff --git a/pcbnew/menubarpcb.cpp b/pcbnew/menubarpcb.cpp index a65bbc9aeb..75863007a0 100644 --- a/pcbnew/menubarpcb.cpp +++ b/pcbnew/menubarpcb.cpp @@ -183,11 +183,11 @@ wxMenuBar * menuBar = GetMenuBar(); configmenu->Append(item); configmenu->AppendSeparator(); - item = new wxMenuItem(configmenu, ID_PREFERENCES_CREATE_CONFIG_HOTKEYS, _("Create Eeschema &Hotkey config file"), + item = new wxMenuItem(configmenu, ID_PREFERENCES_CREATE_CONFIG_HOTKEYS, _("Create Pcbnew &Hotkey config file"), _("Create or Recreate the hotkey config file from current hotkey list") ); item->SetBitmap(save_setup_xpm); configmenu->Append(item); - item = new wxMenuItem(configmenu, ID_PREFERENCES_READ_CONFIG_HOTKEYS, _("Reread &Eeschema Hotkey config file"), + item = new wxMenuItem(configmenu, ID_PREFERENCES_READ_CONFIG_HOTKEYS, _("Reread &Pcbnew Hotkey config file"), _("Reread the hotkey config file") ); item->SetBitmap( reload_xpm); configmenu->Append(item); diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index c924e596cd..2a200a03fb 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -58,6 +58,10 @@ bool WinEDA_App::OnInit( void ) Read_Config( FFileName ); g_DrawBgColor = BLACK; + Read_Hotkey_Config( m_PcbFrame, false ); /* Must be called before creating the main frame + * in order to display the real hotkeys + * in menus or tool tips */ + /* allocation de la memoire pour le fichier et autres buffers: */ /* On reserve BUFMEMSIZE octets de ram pour calcul */ @@ -79,7 +83,6 @@ bool WinEDA_App::OnInit( void ) SetTopWindow( m_PcbFrame ); m_PcbFrame->Show( TRUE ); - Read_Hotkey_Config(m_PcbFrame, false); if( CreateServer( m_PcbFrame, KICAD_PCB_PORT_SERVICE_NUMBER ) ) { diff --git a/pcbnew/tool_modedit.cpp b/pcbnew/tool_modedit.cpp index 14cdcb24f4..d3b87753e8 100644 --- a/pcbnew/tool_modedit.cpp +++ b/pcbnew/tool_modedit.cpp @@ -1,6 +1,6 @@ - /*****************************************************************/ - /* too_modeit.cpp: construction du menu de l'editeur de modules */ - /*****************************************************************/ +/*****************************************************************/ +/* too_modeit.cpp: construction du menu de l'editeur de modules */ +/*****************************************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -16,6 +16,8 @@ #include "id.h" +#include "hotkeys.h" + #include "Module_Check.xpm" #include "Import_Module.xpm" #include "Export_Module.xpm" @@ -32,277 +34,284 @@ #endif /***************************************************/ -void WinEDA_ModuleEditFrame::ReCreateHToolbar(void) +void WinEDA_ModuleEditFrame::ReCreateHToolbar( void ) /***************************************************/ +/* Create the main horizontal toolbar for the footprint editor */ { - // Cecreate the toolbar - if ( m_HToolBar != NULL ) return; + if( m_HToolBar != NULL ) + return; - m_HToolBar = new WinEDA_Toolbar(TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE); + wxString msg; - SetToolBar(m_HToolBar); + m_HToolBar = new WinEDA_Toolbar( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE ); - // Set up toolbar - m_HToolBar->AddTool(ID_LIBEDIT_SELECT_CURRENT_LIB, wxEmptyString, - BITMAP(open_library_xpm), - _("Select working library")); + SetToolBar( m_HToolBar ); - m_HToolBar->AddTool(ID_MODEDIT_SAVE_LIBMODULE, wxEmptyString, BITMAP(save_library_xpm), - _("Save Module in working library")); + // Set up toolbar + m_HToolBar->AddTool( ID_LIBEDIT_SELECT_CURRENT_LIB, wxEmptyString, + BITMAP( open_library_xpm ), + _( "Select working library" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART, wxEmptyString, - BITMAP(new_library_xpm), - _("Create new library and save current module")); + m_HToolBar->AddTool( ID_MODEDIT_SAVE_LIBMODULE, wxEmptyString, BITMAP( save_library_xpm ), + _( "Save Module in working library" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_DELETE_PART, wxEmptyString, - BITMAP(delete_xpm), - _("Delete part in current library")); + m_HToolBar->AddTool( ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART, wxEmptyString, + BITMAP( new_library_xpm ), + _( "Create new library and save current module" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_NEW_MODULE, wxEmptyString, - BITMAP(new_footprint_xpm), - _("New Module")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_DELETE_PART, wxEmptyString, + BITMAP( delete_xpm ), + _( "Delete part in current library" ) ); - m_HToolBar->AddTool(ID_MODEDIT_LOAD_MODULE, wxEmptyString, - BITMAP(module_xpm), - _("Load module from lib")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_NEW_MODULE, wxEmptyString, + BITMAP( new_footprint_xpm ), + _( "New Module" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_LOAD_MODULE_FROM_BOARD, wxEmptyString, - BITMAP(load_module_board_xpm), - _("Load module from current board")); + m_HToolBar->AddTool( ID_MODEDIT_LOAD_MODULE, wxEmptyString, + BITMAP( module_xpm ), + _( "Load module from lib" ) ); - m_HToolBar->AddTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD, wxEmptyString, - BITMAP(update_module_board_xpm), - _("Update module in current board")); - - m_HToolBar->AddTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD, wxEmptyString, - BITMAP(insert_module_board_xpm), - _("Insert module into current board")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_LOAD_MODULE_FROM_BOARD, wxEmptyString, + BITMAP( load_module_board_xpm ), + _( "Load module from current board" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_LIBEDIT_IMPORT_PART, wxEmptyString, - BITMAP(import_module_xpm), - _("import module")); + m_HToolBar->AddTool( ID_MODEDIT_UPDATE_MODULE_IN_BOARD, wxEmptyString, + BITMAP( update_module_board_xpm ), + _( "Update module in current board" ) ); - m_HToolBar->AddTool(ID_LIBEDIT_EXPORT_PART, wxEmptyString, - BITMAP(export_module_xpm), - _("export module")); + m_HToolBar->AddTool( ID_MODEDIT_INSERT_MODULE_IN_BOARD, wxEmptyString, + BITMAP( insert_module_board_xpm ), + _( "Insert module into current board" ) ); + + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_LIBEDIT_IMPORT_PART, wxEmptyString, + BITMAP( import_module_xpm ), + _( "import module" ) ); + + m_HToolBar->AddTool( ID_LIBEDIT_EXPORT_PART, wxEmptyString, + BITMAP( export_module_xpm ), + _( "export module" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_UNDO, wxEmptyString, BITMAP(undo_xpm), - _("Undo last edition")); - m_HToolBar->AddTool(ID_MODEDIT_REDO, wxEmptyString, BITMAP(redo_xpm), - _("Redo the last undo command")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_UNDO, wxEmptyString, BITMAP( undo_xpm ), + _( "Undo last edition" ) ); + m_HToolBar->AddTool( ID_MODEDIT_REDO, wxEmptyString, BITMAP( redo_xpm ), + _( "Redo the last undo command" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_EDIT_MODULE_PROPERTIES, wxEmptyString, - BITMAP(module_options_xpm), - _("Module Properties")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_EDIT_MODULE_PROPERTIES, wxEmptyString, + BITMAP( module_options_xpm ), + _( "Module Properties" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_GEN_PRINT, wxEmptyString, BITMAP(print_button), - _("Print Module")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_GEN_PRINT, wxEmptyString, BITMAP( print_button ), + _( "Print Module" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP(zoom_in_xpm), - _("zoom + (F1)")); + m_HToolBar->AddSeparator(); + msg = AddHotkeyName( _( "zoom +" ), s_module_edit_Hotkey_List, HK_ZOOM_IN ); + m_HToolBar->AddTool( ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP( zoom_in_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_MOINS_BUTT, wxEmptyString,BITMAP(zoom_out_xpm), - _("zoom - (F2)")); + msg = AddHotkeyName( _( "zoom -" ), s_module_edit_Hotkey_List, HK_ZOOM_OUT ); + m_HToolBar->AddTool( ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP( zoom_out_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_REDRAW_BUTT, wxEmptyString,BITMAP(repaint_xpm), - _("redraw (F3)")); + msg = AddHotkeyName( _( "redraw" ), s_module_edit_Hotkey_List, HK_ZOOM_REDRAW ); + m_HToolBar->AddTool( ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP( repaint_xpm ), + msg ); - m_HToolBar->AddTool(ID_ZOOM_PAGE_BUTT, wxEmptyString,BITMAP(zoom_optimal_xpm), - _("auto zoom")); + m_HToolBar->AddTool( ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP( zoom_optimal_xpm ), + _( "auto zoom" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_PAD_SETTINGS, wxEmptyString, - BITMAP(options_pad_xpm), - _("Pad Settings")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_PAD_SETTINGS, wxEmptyString, + BITMAP( options_pad_xpm ), + _( "Pad Settings" ) ); - m_HToolBar->AddSeparator(); - m_HToolBar->AddTool(ID_MODEDIT_CHECK, wxEmptyString, BITMAP(module_check_xpm), - _("Module Check")); + m_HToolBar->AddSeparator(); + m_HToolBar->AddTool( ID_MODEDIT_CHECK, wxEmptyString, BITMAP( module_check_xpm ), + _( "Module Check" ) ); - // after adding the buttons to the toolbar, must call Realize() to reflect - // the changes - m_HToolBar->Realize(); - SetToolbars(); + // after adding the buttons to the toolbar, must call Realize() to reflect + // the changes + m_HToolBar->Realize(); + SetToolbars(); } + /********************************************************/ -void WinEDA_ModuleEditFrame::ReCreateVToolbar(void) +void WinEDA_ModuleEditFrame::ReCreateVToolbar( void ) /********************************************************/ { - if( m_VToolBar ) return; + if( m_VToolBar ) + return; - m_VToolBar = new WinEDA_Toolbar(TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE); + m_VToolBar = new WinEDA_Toolbar( TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE ); - // Set up toolbar - m_VToolBar->AddTool(ID_NO_SELECT_BUTT, wxEmptyString, - BITMAP(cursor_xpm), wxEmptyString, wxITEM_CHECK ); - m_VToolBar->ToggleTool(ID_NO_SELECT_BUTT, TRUE); + // Set up toolbar + m_VToolBar->AddTool( ID_NO_SELECT_BUTT, wxEmptyString, + BITMAP( cursor_xpm ), wxEmptyString, wxITEM_CHECK ); + m_VToolBar->ToggleTool( ID_NO_SELECT_BUTT, TRUE ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_MODEDIT_ADD_PAD, wxEmptyString, - BITMAP(pad_xpm), - _("Add Pads"), wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_MODEDIT_ADD_PAD, wxEmptyString, + BITMAP( pad_xpm ), + _( "Add Pads" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_LINE_COMMENT_BUTT, wxEmptyString, - BITMAP(add_polygon_xpm), - _("Add graphic line or polygon"), wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_LINE_COMMENT_BUTT, wxEmptyString, + BITMAP( add_polygon_xpm ), + _( "Add graphic line or polygon" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_PCB_CIRCLE_BUTT, wxEmptyString, - BITMAP(add_circle_xpm), - _("Add graphic circle"), wxITEM_CHECK); + m_VToolBar->AddTool( ID_PCB_CIRCLE_BUTT, wxEmptyString, + BITMAP( add_circle_xpm ), + _( "Add graphic circle" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_PCB_ARC_BUTT, wxEmptyString, - BITMAP(add_arc_xpm), - _("Add graphic arc"), wxITEM_CHECK); + m_VToolBar->AddTool( ID_PCB_ARC_BUTT, wxEmptyString, + BITMAP( add_arc_xpm ), + _( "Add graphic arc" ), wxITEM_CHECK ); - m_VToolBar->AddTool(ID_TEXT_COMMENT_BUTT, wxEmptyString, - BITMAP(add_text_xpm), - _("Add Text"), wxITEM_CHECK); + m_VToolBar->AddTool( ID_TEXT_COMMENT_BUTT, wxEmptyString, + BITMAP( add_text_xpm ), + _( "Add Text" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_MODEDIT_PLACE_ANCHOR, wxEmptyString, - BITMAP(anchor_xpm), - _("Place anchor"), wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_MODEDIT_PLACE_ANCHOR, wxEmptyString, + BITMAP( anchor_xpm ), + _( "Place anchor" ), wxITEM_CHECK ); - m_VToolBar->AddSeparator(); - m_VToolBar->AddTool(ID_MODEDIT_DELETE_ITEM_BUTT, wxEmptyString, - BITMAP(delete_body_xpm), - _("Delete items"), wxITEM_CHECK); + m_VToolBar->AddSeparator(); + m_VToolBar->AddTool( ID_MODEDIT_DELETE_ITEM_BUTT, wxEmptyString, + BITMAP( delete_body_xpm ), + _( "Delete items" ), wxITEM_CHECK ); - m_VToolBar->Realize(); + m_VToolBar->Realize(); - SetToolbars(); + SetToolbars(); } + /*********************************************************/ -void WinEDA_ModuleEditFrame::ReCreateOptToolbar(void) +void WinEDA_ModuleEditFrame::ReCreateOptToolbar( void ) /*********************************************************/ { + if( m_OptionsToolBar ) + return; - if ( m_OptionsToolBar ) return; + // creation du tool bar options + m_OptionsToolBar = new WinEDA_Toolbar( TOOLBAR_OPTION, this, ID_OPT_TOOLBAR, FALSE ); - // creation du tool bar options - m_OptionsToolBar = new WinEDA_Toolbar(TOOLBAR_OPTION, this, ID_OPT_TOOLBAR, FALSE); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_GRID, BITMAP( grid_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Display Grid OFF" ) ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_GRID, BITMAP(grid_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Display Grid OFF")); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_POLAR_COORD, wxEmptyString, + BITMAP( polar_coord_xpm ), + _( "Display Polar Coord ON" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_POLAR_COORD, wxEmptyString, - BITMAP(polar_coord_xpm), - _("Display Polar Coord ON"), wxITEM_CHECK); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, + BITMAP( unit_inch_xpm ), + _( "Units = Inch" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString, - BITMAP(unit_inch_xpm), - _("Units = Inch"), wxITEM_CHECK ); - - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, - BITMAP(unit_mm_xpm), - _("Units = mm"), wxITEM_CHECK ); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString, + BITMAP( unit_mm_xpm ), + _( "Units = mm" ), wxITEM_CHECK ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SELECT_CURSOR, BITMAP(cursor_shape_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Change Cursor Shape")); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, BITMAP( cursor_shape_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Change Cursor Shape" ) ); - m_OptionsToolBar->AddSeparator(); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_PADS_SKETCH, - BITMAP(pad_sketch_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Show Pads Sketch")); + m_OptionsToolBar->AddSeparator(); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_PADS_SKETCH, + BITMAP( pad_sketch_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Show Pads Sketch" ) ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, - BITMAP(text_sketch_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Show Texts Sketch")); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, + BITMAP( text_sketch_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Show Texts Sketch" ) ); - m_OptionsToolBar->AddTool(ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, - BITMAP(show_mod_edge_xpm), - wxNullBitmap, - TRUE, - -1, -1, (wxObject *) NULL, - _("Show Edges Sketch")); + m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, + BITMAP( show_mod_edge_xpm ), + wxNullBitmap, + TRUE, + -1, -1, (wxObject*) NULL, + _( "Show Edges Sketch" ) ); - m_OptionsToolBar->Realize(); + m_OptionsToolBar->Realize(); - SetToolbars(); + SetToolbars(); } + /*********************************************************/ -void WinEDA_ModuleEditFrame::ReCreateAuxiliaryToolbar(void) +void WinEDA_ModuleEditFrame::ReCreateAuxiliaryToolbar( void ) /*********************************************************/ { -int ii; -wxString msg; + int ii; + wxString msg; - if ( m_AuxiliaryToolBar == NULL ) - { - m_AuxiliaryToolBar = new WinEDA_Toolbar(TOOLBAR_AUX, this, ID_AUX_TOOLBAR, TRUE); + if( m_AuxiliaryToolBar == NULL ) + { + m_AuxiliaryToolBar = new WinEDA_Toolbar( TOOLBAR_AUX, this, ID_AUX_TOOLBAR, TRUE ); - // Set up toolbar - m_AuxiliaryToolBar->AddSeparator(); + // Set up toolbar + m_AuxiliaryToolBar->AddSeparator(); - // Boite de selection du pas de grille - m_SelGridBox = new WinEDAChoiceBox(m_AuxiliaryToolBar, - ID_ON_GRID_SELECT, - wxPoint(-1,-1), wxSize(LISTBOX_WIDTH , -1)); - m_AuxiliaryToolBar->AddControl( m_SelGridBox); + // Boite de selection du pas de grille + m_SelGridBox = new WinEDAChoiceBox( m_AuxiliaryToolBar, + ID_ON_GRID_SELECT, + wxPoint( -1, -1 ), wxSize( LISTBOX_WIDTH, -1 ) ); + m_AuxiliaryToolBar->AddControl( m_SelGridBox ); - // Boite de selection du Zoom - m_AuxiliaryToolBar->AddSeparator(); - m_SelZoomBox = new WinEDAChoiceBox(m_AuxiliaryToolBar, - ID_ON_ZOOM_SELECT, - wxPoint(-1,-1), wxSize(LISTBOX_WIDTH , -1)); - msg = _("Auto"); - m_SelZoomBox->Append(msg); - for ( int jj = 0, ii = 1; ii <= m_ZoomMaxValue; ii <<= 1, jj++ ) - { - msg.Printf(_("Zoom %d"), ii); - m_SelZoomBox->Append(msg); - } - m_SelZoomBox->Append(wxT("")); + // Boite de selection du Zoom + m_AuxiliaryToolBar->AddSeparator(); + m_SelZoomBox = new WinEDAChoiceBox( m_AuxiliaryToolBar, + ID_ON_ZOOM_SELECT, + wxPoint( -1, -1 ), wxSize( LISTBOX_WIDTH, -1 ) ); + msg = _( "Auto" ); + m_SelZoomBox->Append( msg ); + for( int jj = 0, ii = 1; ii <= m_ZoomMaxValue; ii <<= 1, jj++ ) + { + msg.Printf( _( "Zoom %d" ), ii ); + m_SelZoomBox->Append( msg ); + } - m_AuxiliaryToolBar->AddControl( m_SelZoomBox); - // after adding the buttons to the toolbar, must call Realize() to reflect - // the changes - m_AuxiliaryToolBar->Realize(); - } + m_SelZoomBox->Append( wxT( "" ) ); - // mise a jour des affichages - m_SelGridBox->Clear(); - for ( ii = 0; g_GridList[ii].x > 0; ii++ ) - { - double value = To_User_Unit(g_UnitMetric, g_GridList[ii].x, PCB_INTERNAL_UNIT); - if ( g_UnitMetric == INCHES ) - msg.Printf(_("Grid %.1f"), value * 1000); - else - msg.Printf(_("Grid %.3f"), value); - m_SelGridBox->Append(msg); - } - m_SelGridBox->Append( _("User Grid") ); + m_AuxiliaryToolBar->AddControl( m_SelZoomBox ); - SetToolbars(); + // after adding the buttons to the toolbar, must call Realize() to reflect + // the changes + m_AuxiliaryToolBar->Realize(); + } + + // mise a jour des affichages + m_SelGridBox->Clear(); + for( ii = 0; g_GridList[ii].x > 0; ii++ ) + { + double value = To_User_Unit( g_UnitMetric, g_GridList[ii].x, PCB_INTERNAL_UNIT ); + if( g_UnitMetric == INCHES ) + msg.Printf( _( "Grid %.1f" ), value * 1000 ); + else + msg.Printf( _( "Grid %.3f" ), value ); + m_SelGridBox->Append( msg ); + } + + m_SelGridBox->Append( _( "User Grid" ) ); + + SetToolbars(); } - - - - - - diff --git a/pcbnew/tool_pcb.cpp b/pcbnew/tool_pcb.cpp index fd3c49d564..2f97a5743b 100644 --- a/pcbnew/tool_pcb.cpp +++ b/pcbnew/tool_pcb.cpp @@ -25,6 +25,8 @@ #include "wx/ownerdrw.h" #include "wx/menuitem.h" +#include "hotkeys.h" + #define MUWAVE_ENBL #include "mw_Add_Stub.xpm" @@ -50,7 +52,7 @@ "Show active layer selections\nand select layer pair for route and place via" ) /* Data to build the layer pair indicator button */ -static wxBitmap* LayerPairBitmap = NULL; +static wxBitmap* LayerPairBitmap = NULL; static const char s_BitmapLayerIcon[16][16] = { // 0 = draw pixel with active layer color // 1 = draw pixel with top layer color (top/bottom layer used in autoroute and place via) @@ -166,7 +168,7 @@ void WinEDA_PcbFrame::PrepareLayerIndicator( void ) ColorRefs[color].m_Red, ColorRefs[color].m_Green, ColorRefs[color].m_Blue - ); + ); iconDC.SetPen( pen ); } iconDC.DrawPoint( jj, ii ); @@ -199,9 +201,10 @@ void WinEDA_PcbFrame::PrepareLayerIndicator( void ) void WinEDA_PcbFrame::ReCreateHToolbar( void ) /******************************************/ -// Create the main horizontal toolbar +/* Create the main horizontal toolbar for the board editor */ { - int ii; + int ii; + wxString msg; if( m_HToolBar != NULL ) { // simple mise a jour de la liste des fichiers anciens @@ -264,19 +267,25 @@ void WinEDA_PcbFrame::ReCreateHToolbar( void ) _( "Plot (HPGL, PostScript, or GERBER format)" ) ); m_HToolBar->AddSeparator(); + msg = AddHotkeyName( _( "zoom +" ), s_board_edit_Hotkey_List, HK_ZOOM_IN ); m_HToolBar->AddTool( ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP( zoom_in_xpm ), - _( "zoom + (F1)" ) ); + msg ); + + msg = AddHotkeyName( _( "zoom -" ), s_board_edit_Hotkey_List, HK_ZOOM_OUT ); m_HToolBar->AddTool( ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP( zoom_out_xpm ), - _( "zoom - (F2)" ) ); + msg ); + + msg = AddHotkeyName( _( "redraw" ), s_board_edit_Hotkey_List, HK_ZOOM_REDRAW ); m_HToolBar->AddTool( ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP( repaint_xpm ), - _( "redraw (F3)" ) ); + msg ); m_HToolBar->AddTool( ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP( zoom_optimal_xpm ), _( "auto zoom" ) ); m_HToolBar->AddSeparator(); + msg = AddHotkeyName( _( "Find components and texts" ), s_board_edit_Hotkey_List, HK_FIND_ITEM ); m_HToolBar->AddTool( ID_FIND_ITEMS, wxEmptyString, BITMAP( find_xpm ), - _( "Find components and texts (Ctrl-F)" ) ); + msg ); m_HToolBar->AddSeparator(); m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, BITMAP( netlist_xpm ), @@ -499,7 +508,7 @@ void WinEDA_PcbFrame::ReCreateAuxVToolbar( void ) wxNullBitmap, TRUE, -1, -1, (wxObject*) NULL, _( "Create stub (arc) of specified length for microwave applications" ) - ); + ); m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD, BITMAP( mw_Add_Shape_xpm ),