From 34728bec7031f7a8978bd36e2aa7ea910e8fc4f2 Mon Sep 17 00:00:00 2001 From: charras Date: Sat, 9 Jan 2010 08:50:30 +0000 Subject: [PATCH] Eeschema: added Copy option in labels and component in pop up menu (and 'C' hotkey) --- eeschema/CMakeLists.txt | 1 + eeschema/eeschema_id.h | 3 +- eeschema/events_called_functions_for_edit.cpp | 60 +++++++++++++++++++ eeschema/hotkeys.cpp | 25 ++++++-- eeschema/hotkeys.h | 1 + eeschema/onrightclick.cpp | 57 +++++++++++++++--- eeschema/schedit.cpp | 21 ------- eeschema/schframe.cpp | 2 + include/wxEeschemaStruct.h | 3 + 9 files changed, 137 insertions(+), 36 deletions(-) create mode 100644 eeschema/events_called_functions_for_edit.cpp diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 857ce73a15..c57ea55aed 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -79,6 +79,7 @@ set(EESCHEMA_SRCS eeschema.cpp eeschema_config.cpp erc.cpp + events_called_functions_for_edit.cpp files-io.cpp find.cpp getpart.cpp diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 06f6738305..a62308cd39 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -45,6 +45,8 @@ enum id_eeschema_frm ID_SCHEMATIC_VERTICAL_TOOLBAR_END, /* Schematic editor context menu IDs. */ + ID_POPUP_SCH_COPY_ITEM, + ID_POPUP_START_RANGE, ID_POPUP_SCH_DELETE, ID_POPUP_SCH_BREAK_WIRE, @@ -84,7 +86,6 @@ enum id_eeschema_frm ID_POPUP_SCH_EDIT_REF_CMP, ID_POPUP_SCH_EDIT_FOOTPRINT_CMP, ID_POPUP_SCH_EDIT_CONVERT_CMP, - ID_POPUP_SCH_COPY_COMPONENT_CMP, ID_POPUP_SCH_SELECT_UNIT_CMP, ID_POPUP_SCH_SELECT_UNIT1, ID_POPUP_SCH_SELECT_UNIT2, diff --git a/eeschema/events_called_functions_for_edit.cpp b/eeschema/events_called_functions_for_edit.cpp new file mode 100644 index 0000000000..2b31d434bd --- /dev/null +++ b/eeschema/events_called_functions_for_edit.cpp @@ -0,0 +1,60 @@ +/* + * events_called_functions.cpp + * some events functions + */ +#include "fctsys.h" +#include "gr_basic.h" +#include "common.h" +#include "class_drawpanel.h" +#include "program.h" +#include "general.h" +#include "kicad_device_context.h" + +#include "protos.h" + +/** Event function WinEDA_SchematicFrame::OnCopySchematicItemRequest + * duplicate the current located item + */ +void WinEDA_SchematicFrame::OnCopySchematicItemRequest( wxCommandEvent& event ) +{ + SCH_ITEM * curr_item = GetScreen()->GetCurItem(); + + if( !curr_item || curr_item->m_Flags ) + return; + + INSTALL_DC( dc, DrawPanel ); + + switch( curr_item->Type() ) + { + case TYPE_SCH_COMPONENT: + { + SCH_COMPONENT* newitem; + newitem = ((SCH_COMPONENT*) curr_item)->GenCopy(); + newitem->m_TimeStamp = GetTimeStamp(); + newitem->ClearAnnotation( NULL ); + newitem->m_Flags = IS_NEW; + StartMovePart( newitem, &dc ); + + /* Redraw the original part, because StartMovePart() erased + * it from screen */ + RedrawOneStruct( DrawPanel, &dc, curr_item, GR_DEFAULT_DRAWMODE ); + } + break; + + case TYPE_SCH_TEXT: + case TYPE_SCH_LABEL: + case TYPE_SCH_GLOBALLABEL: + case TYPE_SCH_HIERLABEL: + { + SCH_TEXT* newitem = ((SCH_TEXT*) curr_item)->GenCopy(); + newitem->m_Flags = IS_NEW; + StartMoveTexte( newitem, &dc ); + /* Redraw the original part in XOR mode */ + RedrawOneStruct( DrawPanel, &dc, curr_item, g_XorMode ); + } + break; + + default: + break; + } +} diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 13fe793ef0..964d91190e 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -83,9 +83,14 @@ static Ki_HotkeyInfo HkEditComponentValue( wxT( "Edit Component Value" ), static Ki_HotkeyInfo HkEditComponentFootprint( wxT( "Edit Component Footprint" ), HK_EDIT_COMPONENT_FOOTPRINT, 'F' ); -static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component or Label" ), +static Ki_HotkeyInfo HkMoveComponentOrText( wxT( "Move Component or Label" ), HK_MOVE_COMPONENT_OR_LABEL, 'M', ID_POPUP_SCH_MOVE_CMP_REQUEST ); + +static Ki_HotkeyInfo HkCopyComponentOrText( wxT( "Copy Component or Label" ), + HK_COPY_COMPONENT_OR_LABEL, 'C', + ID_POPUP_SCH_COPY_ITEM ); + static Ki_HotkeyInfo HkDragComponent( wxT( "Drag Component" ), HK_DRAG_COMPONENT, 'G', ID_POPUP_SCH_DRAG_CMP_REQUEST ); @@ -122,7 +127,8 @@ Ki_HotkeyInfo* s_Schematic_Hotkey_List[] = { &HkNextSearch, &HkDelete, &HkInsert, &HkMove2Drag, - &HkMoveComponent, &HkDragComponent, &HkAddComponent, + &HkMoveComponentOrText, &HkCopyComponentOrText, + &HkDragComponent, &HkAddComponent, &HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, &HkOrientNormalComponent, &HkEditComponent,&HkEditComponentValue,&HkEditComponentFootprint, @@ -415,9 +421,10 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, } break; - case HK_DRAG_COMPONENT: // Start drag Component - case HK_MOVE_COMPONENT_OR_LABEL: // Start move Component - if( ItemInEdit ) + case HK_DRAG_COMPONENT: // Start drag component + case HK_MOVE_COMPONENT_OR_LABEL: // Start move component or text/label + case HK_COPY_COMPONENT_OR_LABEL: // Duplicate component or text/label + if( ItemInEdit ) break; if( DrawStruct == NULL ) @@ -433,6 +440,14 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, break; } + if( HK_Descr->m_Idcommand == HK_COPY_COMPONENT_OR_LABEL ) + { + GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct ); + wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, + HK_Descr->m_IdMenuEvent ); + wxPostEvent( this, event ); + break; + } switch( DrawStruct->Type() ) { diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index 9045949bdb..456fb6764c 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -32,6 +32,7 @@ enum hotkey_id_commnand { HK_MIRROR_Y_COMPONENT, HK_ORIENT_NORMAL_COMPONENT, HK_MOVE_COMPONENT_OR_LABEL, + HK_COPY_COMPONENT_OR_LABEL, HK_DRAG_COMPONENT, HK_ADD_NEW_COMPONENT, HK_BEGIN_WIRE diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 1fd1e3f796..64a3374841 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -342,10 +342,15 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) if( !Component->m_Flags ) { - ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_COMPONENT_CMP, - _( "Copy Component" ), import_xpm ); + msg = AddHotkeyName( _( "Copy Component" ), + s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, + msg, copy_button ); + msg = AddHotkeyName( _( "Delete Component" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE_CMP, - _( "Delete Component" ), delete_xpm ); + msg, delete_xpm ); } if( libEntry && !libEntry->GetDocFileName().IsEmpty() ) @@ -365,6 +370,11 @@ void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ) s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm ); + msg = AddHotkeyName( _( "Copy Global Label" ), + s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, + msg, copy_button ); } msg = AddHotkeyName( _( "Rotate Global Label" ), s_Schematic_Hokeys_Descr, HK_ROTATE_COMPONENT_OR_LABEL ); @@ -374,8 +384,10 @@ void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ) HK_EDIT_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT, msg, edit_text_xpm ); + msg = AddHotkeyName( _( "Delete Global Label" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, - _( "Delete Global Label" ), delete_text_xpm ); + msg, delete_text_xpm ); // add menu change type text (to label, glabel, text): ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL, @@ -402,6 +414,11 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel ) HK_MOVE_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm ); + msg = AddHotkeyName( _( "Copy Hierarchical Label" ), + s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, + msg, copy_button ); } msg = AddHotkeyName( _( "Rotate Hierarchical Label" ), s_Schematic_Hokeys_Descr, HK_ROTATE_COMPONENT_OR_LABEL ); @@ -411,8 +428,10 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel ) HK_EDIT_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT, _( "Edit Hierarchical Label" ), edit_text_xpm ); + msg = AddHotkeyName( _( "Delete Hierarchical Label" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, - _( "Delete Hierarchical label" ), delete_text_xpm ); + msg, delete_text_xpm ); // add menu change type text (to label, glabel, text): ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL, @@ -438,6 +457,11 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ) HK_MOVE_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm ); + msg = AddHotkeyName( _( "Copy Label" ), + s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, + msg, copy_button ); } msg = AddHotkeyName( _( "Rotate Label" ), s_Schematic_Hokeys_Descr, HK_ROTATE_COMPONENT_OR_LABEL ); @@ -447,8 +471,10 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ) HK_EDIT_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT, msg, edit_text_xpm ); + msg = AddHotkeyName( _( "Delete Label" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, - _( "Delete Label" ), delete_text_xpm ); + msg, delete_text_xpm ); // add menu change type text (to label, glabel, text): ADD_MENUITEM( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL, @@ -475,6 +501,11 @@ void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) HK_MOVE_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm ); + msg = AddHotkeyName( _( "Copy Text" ), + s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, + msg, copy_button ); } msg = AddHotkeyName( _( "Rotate Text" ), s_Schematic_Hokeys_Descr, HK_ROTATE_COMPONENT_OR_LABEL ); @@ -484,7 +515,9 @@ void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) HK_EDIT_COMPONENT_OR_LABEL ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT, msg, edit_text_xpm ); - ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete Text" ), + msg = AddHotkeyName( _( "Delete Text" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, msg, delete_text_xpm ); /* add menu change type text (to label, glabel, text), @@ -512,6 +545,7 @@ void AddMenusForJunction( wxMenu* PopMenu, SCH_JUNCTION* Junction, WinEDA_SchematicFrame* frame ) { bool is_new = (Junction->m_Flags & IS_NEW) ? TRUE : FALSE; + wxString msg; if( !is_new ) { @@ -521,7 +555,9 @@ void AddMenusForJunction( wxMenu* PopMenu, SCH_JUNCTION* Junction, _( "Break Wire" ), break_line_xpm ); } - ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete Junction" ), + msg = AddHotkeyName( _( "Delete Junction" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, msg, delete_xpm ); if( PickStruct( frame->GetScreen()->m_Curseur, frame->GetScreen(), @@ -540,6 +576,7 @@ void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, { bool is_new = (Wire->m_Flags & IS_NEW) ? TRUE : FALSE; wxPoint pos = frame->GetScreen()->m_Curseur; + wxString msg; if( is_new ) { @@ -550,7 +587,9 @@ void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_WIRE_REQUEST, _( "Drag Wire" ), move_track_xpm ); PopMenu->AppendSeparator(); - ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete Wire" ), delete_xpm ); + msg = AddHotkeyName( _( "Delete Wire" ), s_Schematic_Hokeys_Descr, + HK_DELETE ); + ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE, msg, delete_xpm ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE_NODE, _( "Delete Node" ), delete_node_xpm ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE_CONNECTION, diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 25e911bd7a..cf1d2c7940 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -564,27 +564,6 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) &dc ); break; - case ID_POPUP_SCH_COPY_COMPONENT_CMP: - DrawPanel->MouseToCursorSchema(); - { - SCH_COMPONENT* olditem, * newitem; - if( screen->GetCurItem()->Type() != TYPE_SCH_COMPONENT ) - screen->SetCurItem( LocateSmallestComponent( screen ) ); - olditem = (SCH_COMPONENT*) screen->GetCurItem(); - if( olditem == NULL ) - break; - newitem = olditem->GenCopy(); - newitem->m_TimeStamp = GetTimeStamp(); - newitem->ClearAnnotation(NULL); - newitem->m_Flags = IS_NEW; - StartMovePart( newitem, &dc ); - - /* Redraw the original part, because StartMovePart() has erase - * it from screen */ - RedrawOneStruct( DrawPanel, &dc, olditem, GR_DEFAULT_DRAWMODE ); - } - break; - case ID_POPUP_SCH_SELECT_UNIT1: case ID_POPUP_SCH_SELECT_UNIT2: case ID_POPUP_SCH_SELECT_UNIT3: diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 6cca99bd89..c8e382355b 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -58,6 +58,8 @@ BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, WinEDA_DrawFrame ) EVT_MENU( ID_GEN_COPY_BLOCK_TO_CLIPBOARD, WinEDA_DrawFrame::CopyToClipboard ) EVT_MENU( ID_EXIT, WinEDA_SchematicFrame::OnExit ) + EVT_MENU( ID_POPUP_SCH_COPY_ITEM, WinEDA_SchematicFrame::OnCopySchematicItemRequest ) + EVT_MENU_RANGE( ID_CONFIG_AND_PREFERENCES_START, ID_CONFIG_AND_PREFERENCES_END, WinEDA_SchematicFrame::Process_Config ) diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 0f960c286b..1cf1ac3854 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -271,6 +271,9 @@ private: void OnOpenLibraryEditor( wxCommandEvent& event ); void OnSetOptions( wxCommandEvent& event ); + /* edition events functions */ + void OnCopySchematicItemRequest( wxCommandEvent& event ); + /* User interface update event handlers. */ void OnUpdateBlockSelected( wxUpdateUIEvent& event ); void OnUpdatePaste( wxUpdateUIEvent& event );