diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 748d5733d7..36d6a5f2c7 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -168,6 +168,9 @@ static EDA_HOTKEY HkEdit( wxT( "Edit Schematic Item" ), HK_EDIT, 'E', ID_SCH_EDI static EDA_HOTKEY HkEditComponentValue( wxT( "Edit Component Value" ), HK_EDIT_COMPONENT_VALUE, 'V', ID_SCH_EDIT_COMPONENT_VALUE ); +static EDA_HOTKEY HkEditComponentReference( wxT( "Edit Component Reference" ), + HK_EDIT_COMPONENT_REFERENCE, 'U', + ID_SCH_EDIT_COMPONENT_REFERENCE ); static EDA_HOTKEY HkEditComponentFootprint( wxT( "Edit Component Footprint" ), HK_EDIT_COMPONENT_FOOTPRINT, 'F', ID_SCH_EDIT_COMPONENT_FOOTPRINT ); @@ -240,6 +243,7 @@ EDA_HOTKEY* s_Schematic_Hotkey_List[] = &HkOrientNormalComponent, &HkEdit, &HkEditComponentValue, + &HkEditComponentReference, &HkEditComponentFootprint, &HkBeginWire, &HkBeginBus, @@ -490,6 +494,7 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, case HK_MOVE_COMPONENT_OR_ITEM: // Start move schematic item. case HK_EDIT: // Edit schematic item. case HK_EDIT_COMPONENT_VALUE: // Edit component value field. + case HK_EDIT_COMPONENT_REFERENCE: // Edit component value reference. case HK_EDIT_COMPONENT_FOOTPRINT: // Edit component footprint field. { // force a new item search on hot keys at current position, diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index 966b085ede..b434634181 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -23,6 +23,7 @@ enum hotkey_id_commnand { HK_ROTATE, HK_EDIT, HK_EDIT_COMPONENT_VALUE, + HK_EDIT_COMPONENT_REFERENCE, HK_EDIT_COMPONENT_FOOTPRINT, HK_MIRROR_X_COMPONENT, HK_MIRROR_Y_COMPONENT, diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 791561ab7a..62684deed6 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -249,18 +249,37 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) void AddMenusForComponentField( wxMenu* PopMenu, SCH_FIELD* Field ) { - wxString msg; + wxString msg, name; + + switch( Field->GetId() ) + { + case REFERENCE: name = _( "Reference" ); break; + case VALUE: name = _( "Value" ); break; + case FOOTPRINT: name = _( "Footprint Field" ); break; + default: name = _( "Field" ); break; + } if( !Field->GetFlags() ) { - msg = AddHotkeyName( _( "Move Field" ), s_Schematic_Hokeys_Descr, + msg = AddHotkeyName( _( "Move" ) + wxT(" ") + name, s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_text_xpm ) ); } - msg = AddHotkeyName( _( "Rotate Field" ), s_Schematic_Hokeys_Descr, HK_ROTATE ); + msg = AddHotkeyName( _( "Rotate" ) + wxT(" ") + name, s_Schematic_Hokeys_Descr, + HK_ROTATE ); AddMenuItem( PopMenu, ID_SCH_ROTATE_CLOCKWISE, msg, KiBitmap( rotate_field_xpm ) ); - msg = AddHotkeyName( _( "Edit Field" ), s_Schematic_Hokeys_Descr, HK_EDIT ); + + // Ref, value and footprint have specific hotkeys. Show the specific hotkey: + hotkey_id_commnand id; + switch( Field->GetId() ) + { + case REFERENCE: id = HK_EDIT_COMPONENT_REFERENCE; break; + case VALUE: id = HK_EDIT_COMPONENT_VALUE; break; + case FOOTPRINT: id = HK_EDIT_COMPONENT_FOOTPRINT; break; + default: id = HK_EDIT; break; + } + msg = AddHotkeyName( _( "Edit" ) + wxT(" ") + name, s_Schematic_Hokeys_Descr, id ); AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); } @@ -313,13 +332,17 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) if( libComponent && libComponent->IsNormal() ) { - msg = AddHotkeyName( _( "Value " ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_VALUE ); - AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_VALUE, msg, KiBitmap( edit_comp_value_xpm ) ); + msg = AddHotkeyName( _( "Value" ), s_Schematic_Hokeys_Descr, + HK_EDIT_COMPONENT_VALUE ); + AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_VALUE, msg, + KiBitmap( edit_comp_value_xpm ) ); - AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_REFERENCE, _( "Reference" ), + msg = AddHotkeyName( _( "Reference" ), s_Schematic_Hokeys_Descr, + HK_EDIT_COMPONENT_REFERENCE ); + AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_REFERENCE, msg, KiBitmap( edit_comp_ref_xpm ) ); - msg = AddHotkeyName( _( "Footprint " ), s_Schematic_Hokeys_Descr, + msg = AddHotkeyName( _( "Footprint" ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_FOOTPRINT ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_FOOTPRINT, msg, KiBitmap( edit_comp_footprint_xpm ) ); diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index d119a933fb..d435d5a9c4 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -89,6 +89,21 @@ const KICAD_T SCH_COLLECTOR::EditableItems[] = { EOT }; +const KICAD_T SCH_COLLECTOR::CmpFieldValueOnly[] = { + SCH_FIELD_LOCATE_VALUE_T, + EOT +}; + +const KICAD_T SCH_COLLECTOR::CmpFieldReferenceOnly[] = { + SCH_FIELD_LOCATE_REFERENCE_T, + EOT +}; + +const KICAD_T SCH_COLLECTOR::CmpFieldFootprintOnly[] = { + SCH_FIELD_LOCATE_FOOTPRINT_T, + EOT +}; + const KICAD_T SCH_COLLECTOR::MovableItems[] = { SCH_MARKER_T, diff --git a/eeschema/sch_collectors.h b/eeschema/sch_collectors.h index 2299509b77..f279731160 100644 --- a/eeschema/sch_collectors.h +++ b/eeschema/sch_collectors.h @@ -52,6 +52,21 @@ public: */ static const KICAD_T EditableItems[]; + /** + * A scan list for a specific editable field: Value. + */ + static const KICAD_T CmpFieldValueOnly[]; + + /** + * A scan list for a specific editable field: Reference. + */ + static const KICAD_T CmpFieldReferenceOnly[]; + + /** + * A scan list for a specific editable field: Footprint. + */ + static const KICAD_T CmpFieldFootprintOnly[]; + /** * A scan list for all movable schematic items. */ diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index 7b07b8713e..ab18e90097 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -1672,8 +1672,9 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData const KICAD_T aFilterTypes[] ) { KICAD_T stype; + LIB_COMPONENT* component; - for( const KICAD_T* p = aFilterTypes; (stype = *p) != EOT; ++p ) + for( const KICAD_T* p = aFilterTypes; (stype = *p) != EOT; ++p ) { // If caller wants to inspect component type or and component children types. if( stype == Type() ) @@ -1681,31 +1682,50 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData if( SEARCH_QUIT == aInspector->Inspect( this, aTestData ) ) return SEARCH_QUIT; } - else if( stype == SCH_FIELD_T ) + switch( stype ) { - // Test the bounding boxes of fields if they are visible and not empty. - for( int ii = 0; ii < GetFieldCount(); ii++ ) - { - if( SEARCH_QUIT == aInspector->Inspect( GetField( ii ), (void*) this ) ) - return SEARCH_QUIT; - } - } - else if( stype == LIB_PIN_T ) - { - LIB_COMPONENT* component = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); - - if( component != NULL ) - { - LIB_PINS pins; - - component->GetPins( pins, m_unit, m_convert ); - - for( size_t i = 0; i < pins.size(); i++ ) + case SCH_FIELD_T: + // Test the bounding boxes of fields if they are visible and not empty. + for( int ii = 0; ii < GetFieldCount(); ii++ ) { - if( SEARCH_QUIT == aInspector->Inspect( pins[ i ], (void*) this ) ) + if( SEARCH_QUIT == aInspector->Inspect( GetField( ii ), (void*) this ) ) return SEARCH_QUIT; } - } + break; + + case SCH_FIELD_LOCATE_REFERENCE_T: + if( SEARCH_QUIT == aInspector->Inspect( GetField( REFERENCE ), (void*) this ) ) + return SEARCH_QUIT; + break; + + case SCH_FIELD_LOCATE_VALUE_T: + if( SEARCH_QUIT == aInspector->Inspect( GetField( VALUE ), (void*) this ) ) + return SEARCH_QUIT; + break; + + case SCH_FIELD_LOCATE_FOOTPRINT_T: + if( SEARCH_QUIT == aInspector->Inspect( GetField( FOOTPRINT ), (void*) this ) ) + return SEARCH_QUIT; + break; + + + case LIB_PIN_T: + component = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); + + if( component != NULL ) + { + LIB_PINS pins; + component->GetPins( pins, m_unit, m_convert ); + for( size_t i = 0; i < pins.size(); i++ ) + { + if( SEARCH_QUIT == aInspector->Inspect( pins[ i ], (void*) this ) ) + return SEARCH_QUIT; + } + } + break; + + default: + break; } } diff --git a/eeschema/sch_field.h b/eeschema/sch_field.h index 0a66ba2450..0f1cee125b 100644 --- a/eeschema/sch_field.h +++ b/eeschema/sch_field.h @@ -1,8 +1,8 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2004-2011 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2004-2012 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 34ddb1dfd0..d22b7cd6b8 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -807,9 +807,37 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent ) wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); - item = LocateAndShowItem( data->GetPosition(), SCH_COLLECTOR::EditableItems, + // Set the locat filter, according to the edit command + const KICAD_T* filterList = SCH_COLLECTOR::EditableItems; + const KICAD_T* filterListAux = NULL; + switch( aEvent.GetId() ) + { + case ID_SCH_EDIT_COMPONENT_REFERENCE: + filterList = SCH_COLLECTOR::CmpFieldReferenceOnly; + filterListAux = SCH_COLLECTOR::ComponentsOnly; + break; + + case ID_SCH_EDIT_COMPONENT_VALUE: + filterList = SCH_COLLECTOR::CmpFieldValueOnly; + filterListAux = SCH_COLLECTOR::ComponentsOnly; + break; + + case ID_SCH_EDIT_COMPONENT_FOOTPRINT: + filterList = SCH_COLLECTOR::CmpFieldFootprintOnly; + filterListAux = SCH_COLLECTOR::ComponentsOnly; + break; + + default: + break; + } + item = LocateAndShowItem( data->GetPosition(), filterList, aEvent.GetInt() ); + // If no item found, and if an auxiliary filter exists, try to use it + if( !item && filterListAux ) + item = LocateAndShowItem( data->GetPosition(), filterListAux, + aEvent.GetInt() ); + // Exit if no item found at the current location or the item is already being edited. if( (item == NULL) || (item->GetFlags() != 0) ) return; diff --git a/include/base_struct.h b/include/base_struct.h index 3e43ed977c..993201504a 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -94,6 +94,13 @@ enum KICAD_T { SCH_SHEET_PIN_T, SCH_SHEET_T, + // Be prudent with these 3 types: + // they should be used only to locate a specific field type + // among SCH_FIELD_T items types + SCH_FIELD_LOCATE_REFERENCE_T, + SCH_FIELD_LOCATE_VALUE_T, + SCH_FIELD_LOCATE_FOOTPRINT_T, + // General SCH_SCREEN_T, diff --git a/pcbnew/dialogs/dialog_freeroute_exchange.cpp b/pcbnew/dialogs/dialog_freeroute_exchange.cpp index 5e1c1a8dff..7c51b8d50c 100644 --- a/pcbnew/dialogs/dialog_freeroute_exchange.cpp +++ b/pcbnew/dialogs/dialog_freeroute_exchange.cpp @@ -1,6 +1,30 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: dialog_freeroute.cpp -///////////////////////////////////////////////////////////////////////////// +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +/** + * @file dialog_freeroute.cpp + * Dialog to access to FreeRoute, the web bases free router, export/import files + * to/from FreeRoute + */ #include #include