cvpcb: Fix some issues

* ESC no longer closed the window since it didn't properly generate
  the close event
* Copy/Cut from a context menu did not work due to a focus-loss issue
* Add better error handling for the copy/cut/paste actions to prevent
  text that isn't an FPID from being inserted
This commit is contained in:
Ian McInerney 2019-10-06 12:19:41 +02:00 committed by Jeff Young
parent 1a3f4fb38b
commit a1d3f3486e
3 changed files with 34 additions and 9 deletions

View File

@ -212,8 +212,12 @@ void CVPCB_MAINFRAME::setupTools()
CVPCB_CONTROL* tool = m_toolManager->GetTool<CVPCB_CONTROL>();
// Even though these menus will open with the right-click, we treat them as a normal
// menu instead of a context menu because we don't care about their position and want
// to be able to tell the difference between a menu click and a hotkey activation.
// Create the context menu for the component list box
m_componentContextMenu = new ACTION_MENU( true );
m_componentContextMenu = new ACTION_MENU( false );
m_componentContextMenu->SetTool( tool );
m_componentContextMenu->Add( CVPCB_ACTIONS::showFootprintViewer );
m_componentContextMenu->AppendSeparator();
@ -224,7 +228,7 @@ void CVPCB_MAINFRAME::setupTools()
m_componentContextMenu->Add( CVPCB_ACTIONS::deleteAssoc );
// Create the context menu for the footprint list box
m_footprintContextMenu = new ACTION_MENU( true );
m_footprintContextMenu = new ACTION_MENU( false );
m_footprintContextMenu->SetTool( tool );
m_footprintContextMenu->Add( CVPCB_ACTIONS::showFootprintViewer );
}
@ -248,7 +252,7 @@ void CVPCB_MAINFRAME::setupEventHandlers()
m_saveAndContinue->Bind( wxEVT_COMMAND_BUTTON_CLICKED,
[this]( wxCommandEvent& )
{
// saveAssociations must be run immediatley
// saveAssociations must be run immediately
this->GetToolManager()->RunAction( CVPCB_ACTIONS::saveAssociations, true );
} );
@ -256,7 +260,7 @@ void CVPCB_MAINFRAME::setupEventHandlers()
Bind( wxEVT_BUTTON,
[this]( wxCommandEvent& )
{
// saveAssociations must be run immediatley, before running Close( true )
// saveAssociations must be run immediately, before running Close( true )
this->GetToolManager()->RunAction( CVPCB_ACTIONS::saveAssociations, true );
Close( true );
}, wxID_OK );
@ -446,6 +450,7 @@ void CVPCB_MAINFRAME::AssociateFootprint( const CVPCB_ASSOCIATION& aAssociation,
wxString msg =
wxString::Format( _( "\"%s\" is not a valid footprint." ), fpid.Format().wx_str() );
DisplayErrorMessage( this, msg );
return;
}
// Set the new footprint

View File

@ -50,7 +50,15 @@ int CVPCB_ASSOCIATION_TOOL::CopyAssoc( const TOOL_EVENT& aEvent )
{
COMPONENT* comp;
LIB_ID fpid;
switch( m_frame->GetFocusedControl() )
// Default to using the component control as the source of the copy
CVPCB_MAINFRAME::CONTROL_TYPE copyControl = CVPCB_MAINFRAME::CONTROL_COMPONENT;
// If using the keyboard to copy, find out what control we are in and use that.
if( aEvent.HasPosition() )
copyControl = m_frame->GetFocusedControl();
switch( copyControl )
{
case CVPCB_MAINFRAME::CONTROL_FOOTPRINT:
fpid.Parse( m_frame->GetSelectedFootprint(), LIB_ID::ID_PCB );
@ -84,6 +92,8 @@ int CVPCB_ASSOCIATION_TOOL::CopyAssoc( const TOOL_EVENT& aEvent )
wxTheClipboard->Flush();
wxTheClipboard->Close();
}
else
wxLogDebug( "Failed to open the clipboard" );
return 0;
}
@ -91,8 +101,9 @@ int CVPCB_ASSOCIATION_TOOL::CopyAssoc( const TOOL_EVENT& aEvent )
int CVPCB_ASSOCIATION_TOOL::CutAssoc( const TOOL_EVENT& aEvent )
{
// Only cut when in the component frame
if( m_frame->GetFocusedControl() != CVPCB_MAINFRAME::CONTROL_COMPONENT )
// If using the keyboard, only cut in the component frame
if( aEvent.HasPosition()
&& ( m_frame->GetFocusedControl() != CVPCB_MAINFRAME::CONTROL_COMPONENT ) )
return 0;
// Get the selection, but only use the first one
@ -123,6 +134,11 @@ int CVPCB_ASSOCIATION_TOOL::CutAssoc( const TOOL_EVENT& aEvent )
wxTheClipboard->Flush();
wxTheClipboard->Close();
}
else
{
wxLogDebug( "Failed to open the clipboard" );
return 0;
}
// Remove the association
m_frame->AssociateFootprint( CVPCB_ASSOCIATION( idx.front(), "" ) );
@ -148,6 +164,11 @@ int CVPCB_ASSOCIATION_TOOL::PasteAssoc( const TOOL_EVENT& aEvent )
wxTheClipboard->GetData( data );
wxTheClipboard->Close();
}
else
{
wxLogDebug( "Failed to open the clipboard" );
return 0;
}
if( fpid.Parse( data.GetText(), LIB_ID::ID_PCB ) >= 0 )
return 0;

View File

@ -60,8 +60,7 @@ int CVPCB_CONTROL::Main( const TOOL_EVENT& aEvent )
// The escape key maps to the cancel event, which is used to close the window
if( evt->IsCancel() )
{
wxCloseEvent dummy;
m_frame->OnCloseWindow( dummy );
m_frame->Close( false );
handled = true;
}
else if( evt->IsKeyPressed() )