From 41dd21ac7b9d6ac359817b0c197eeac1a8b6afbe Mon Sep 17 00:00:00 2001 From: Antia Puentes Date: Sat, 29 Dec 2012 13:55:36 +0100 Subject: [PATCH] Eeschema: Allow to edit an schematic item while dragging --- .../dialog_edit_component_in_schematic.cpp | 9 ++ eeschema/onrightclick.cpp | 92 ++++++++++++++++--- eeschema/sch_screen.cpp | 17 +++- eeschema/schedit.cpp | 49 +++++----- 4 files changed, 128 insertions(+), 39 deletions(-) diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp index fed15cbe79..fbbc156f1a 100644 --- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp +++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp @@ -539,6 +539,15 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent copyOptionsToPanel(); + // disable some options inside the edit dialog + // which can cause problems while dragging + if( m_Cmp->IsDragging() ) + { + orientationRadioBox->Disable(); + mirrorRadioBox->Disable(); + chipnameTextCtrl->Disable(); + } + // put focus on the list ctrl fieldListCtrl->SetFocus(); diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 5d2d5b8b32..8bb813179b 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -59,6 +59,7 @@ static void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ); static void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ); static void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ); static void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* GLabel ); +static void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ); static void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ); static void AddMenusForComponentField( wxMenu* PopMenu, SCH_FIELD* Field ); static void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME* aFrame ); @@ -75,6 +76,7 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) { SCH_ITEM* item = GetScreen()->GetCurItem(); bool BlockActive = GetScreen()->IsBlockActive(); + wxString msg; // Do not start a block command on context menu. m_canvas->SetCanStartBlock( -1 ); @@ -83,6 +85,48 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) { AddMenusForBlock( PopMenu, this ); PopMenu->AppendSeparator(); + + // If we have a block containing only one main element + // we append its edition submenu + if( item != NULL ) + { + switch( item->Type() ) + { + case SCH_COMPONENT_T: + AddMenusForEditComponent( PopMenu, (SCH_COMPONENT *) item ); + PopMenu->AppendSeparator(); + break; + + case SCH_TEXT_T: + msg = AddHotkeyName( _( "Edit Text" ), s_Schematic_Hokeys_Descr, HK_EDIT ); + AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); + PopMenu->AppendSeparator(); + break; + + case SCH_LABEL_T: + msg = AddHotkeyName( _( "Edit Label" ), s_Schematic_Hokeys_Descr, HK_EDIT ); + AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); + PopMenu->AppendSeparator(); + break; + + case SCH_GLOBAL_LABEL_T: + msg = AddHotkeyName( _( "Edit Global Label" ), s_Schematic_Hokeys_Descr, + HK_EDIT ); + AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); + PopMenu->AppendSeparator(); + break; + + case SCH_HIERARCHICAL_LABEL_T: + msg = AddHotkeyName( _( "Edit Hierarchical Label" ), s_Schematic_Hokeys_Descr, + HK_EDIT ); + AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); + PopMenu->AppendSeparator(); + break; + + default: + break; + } + } return true; } @@ -295,13 +339,9 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) wxString msg; LIB_ALIAS* libEntry; - LIB_COMPONENT* libComponent = NULL; libEntry = CMP_LIBRARY::FindLibraryEntry( Component->GetLibName() ); - if( libEntry ) - libComponent = libEntry->GetComponent(); - if( !Component->GetFlags() ) { msg = _( "Move Component" ); @@ -327,6 +367,39 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) AddMenuItem( PopMenu, orientmenu, ID_POPUP_SCH_GENERIC_ORIENT_CMP, _( "Orient Component" ), KiBitmap( orient_xpm ) ); + AddMenusForEditComponent( PopMenu, Component ); + + if( !Component->GetFlags() ) + { + msg = AddHotkeyName( _( "Copy Component" ), s_Schematic_Hokeys_Descr, + HK_COPY_COMPONENT_OR_LABEL ); + AddMenuItem( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, KiBitmap( copy_button_xpm ) ); + msg = AddHotkeyName( _( "Delete Component" ), s_Schematic_Hokeys_Descr, HK_DELETE ); + AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_CMP, msg, KiBitmap( delete_xpm ) ); + } + + if( libEntry && !libEntry->GetDocFileName().IsEmpty() ) + AddMenuItem( PopMenu, ID_POPUP_SCH_DISPLAYDOC_CMP, _( "Doc" ), KiBitmap( datasheet_xpm ) ); +} + + +void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) +{ + if( Component->Type() != SCH_COMPONENT_T ) + { + wxASSERT( 0 ); + return; + } + + wxString msg; + LIB_ALIAS* libEntry; + LIB_COMPONENT* libComponent = NULL; + + libEntry = CMP_LIBRARY::FindLibraryEntry( Component->GetLibName() ); + + if( libEntry ) + libComponent = libEntry->GetComponent(); + wxMenu* editmenu = new wxMenu; msg = AddHotkeyName( _( "Edit" ), s_Schematic_Hokeys_Descr, HK_EDIT ); AddMenuItem( editmenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_component_xpm ) ); @@ -384,17 +457,6 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) AddMenuItem( PopMenu, editmenu, ID_SCH_EDIT_ITEM, _( "Edit Component" ), KiBitmap( edit_component_xpm ) ); - if( !Component->GetFlags() ) - { - msg = AddHotkeyName( _( "Copy Component" ), s_Schematic_Hokeys_Descr, - HK_COPY_COMPONENT_OR_LABEL ); - AddMenuItem( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, KiBitmap( copy_button_xpm ) ); - msg = AddHotkeyName( _( "Delete Component" ), s_Schematic_Hokeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_CMP, msg, KiBitmap( delete_xpm ) ); - } - - if( libEntry && !libEntry->GetDocFileName().IsEmpty() ) - AddMenuItem( PopMenu, ID_POPUP_SCH_DISPLAYDOC_CMP, _( "Doc" ), KiBitmap( datasheet_xpm ) ); } diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index cf9f1863c9..3ae61aa2dc 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -774,6 +774,7 @@ void SCH_SCREEN::SelectBlockItems() for( ; ii < last_select_id; ii++ ) { item = (SCH_ITEM*)pickedlist->GetPickedItem( ii ); + item->SetFlags( IS_DRAGGED ); if( item->Type() == SCH_LINE_T ) { @@ -858,6 +859,8 @@ int SCH_SCREEN::UpdatePickList() { ITEM_PICKER picker; EDA_RECT area; + unsigned count; + area.SetOrigin( m_BlockLocate.GetOrigin() ); area.SetSize( m_BlockLocate.GetSize() ); area.Normalize(); @@ -872,7 +875,19 @@ int SCH_SCREEN::UpdatePickList() } } - return m_BlockLocate.GetCount(); + // if the block is composed of one item, + // select it as the current item + count = m_BlockLocate.GetCount(); + if( count == 1 ) + { + SetCurItem( (SCH_ITEM*) m_BlockLocate.GetItem( 0 ) ); + } + else + { + SetCurItem( NULL ); + } + + return count; } diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index d22b7cd6b8..a2f4f9c6d4 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -384,6 +384,12 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent ) SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); + if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) + { + // trying to move an item when there is a block at the same time is not acceptable + return; + } + if( item == NULL ) { // If we didn't get here by a hot key, then something has gone wrong. @@ -725,15 +731,15 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent ) INSTALL_UNBUFFERED_DC( dc, m_canvas ); + // Allows block rotate operation on hot key. + if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) + { + HandleBlockEndByPopUp( BLOCK_ROTATE, &dc ); + return; + } + if( item == NULL ) { - // Allows block rotate operation on hot key. - if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) - { - HandleBlockEndByPopUp( BLOCK_ROTATE, &dc ); - return; - } - // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return; @@ -965,9 +971,6 @@ void SCH_EDIT_FRAME::OnDragItem( wxCommandEvent& aEvent ) wxFAIL_MSG( wxString::Format( wxT( "Cannot drag schematic item type %s." ), GetChars( item->GetClass() ) ) ); } - - // Since the drag is actually a block command, clear the current item. - screen->SetCurItem( NULL ); } @@ -978,21 +981,21 @@ void SCH_EDIT_FRAME::OnOrient( wxCommandEvent& aEvent ) INSTALL_UNBUFFERED_DC( dc, m_canvas ); + // Allows block rotate operation on hot key. + if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) + { + if( aEvent.GetId() == ID_SCH_MIRROR_X ) + HandleBlockEndByPopUp( BLOCK_MIRROR_X, &dc ); + else if( aEvent.GetId() == ID_SCH_MIRROR_Y ) + HandleBlockEndByPopUp( BLOCK_MIRROR_Y, &dc ); + else + wxFAIL_MSG( wxT( "Unknown block oriention command ID." ) ); + + return; + } + if( item == NULL ) { - // Allows block rotate operation on hot key. - if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) - { - if( aEvent.GetId() == ID_SCH_MIRROR_X ) - HandleBlockEndByPopUp( BLOCK_MIRROR_X, &dc ); - else if( aEvent.GetId() == ID_SCH_MIRROR_Y ) - HandleBlockEndByPopUp( BLOCK_MIRROR_Y, &dc ); - else - wxFAIL_MSG( wxT( "Unknown block oriention command ID." ) ); - - return; - } - // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return;