7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-14 13:09:35 +00:00

eda frame: hoist FocusItem calls up a layer

Prep for SCH_GROUPs
This commit is contained in:
Mike Williams 2025-03-31 14:33:39 -04:00
parent f40b24d04a
commit 5fd294cad2
16 changed files with 53 additions and 27 deletions

View File

@ -343,7 +343,7 @@ void DIALOG_ERC::OnCancelClick( wxCommandEvent& aEvent )
return;
}
m_parent->FocusOnItem( nullptr );
m_parent->ClearFocus();
aEvent.Skip();
}
@ -351,7 +351,7 @@ void DIALOG_ERC::OnCancelClick( wxCommandEvent& aEvent )
void DIALOG_ERC::OnCloseErcDialog( wxCloseEvent& aEvent )
{
m_parent->FocusOnItem( nullptr );
m_parent->ClearFocus();
// Dialog is mode-less so let the parent know that it needs to be destroyed.
if( !IsModal() && !IsQuasiModal() )

View File

@ -877,7 +877,7 @@ DIALOG_LIB_EDIT_PIN_TABLE::~DIALOG_LIB_EDIT_PIN_TABLE()
WINDOW_THAWER thawer( m_editFrame );
m_editFrame->FocusOnItem( nullptr );
m_editFrame->ClearFocus();
m_editFrame->GetCanvas()->Refresh();
}

View File

@ -1201,7 +1201,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnTableRangeSelected( wxGridRangeSelectEvent& a
}
else
{
m_parent->FocusOnItem( nullptr );
m_parent->ClearFocus();
}
}
else if( m_radioSelect->GetValue() )
@ -1553,7 +1553,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnClose( wxCloseEvent& aEvent )
}
}
m_parent->FocusOnItem( nullptr );
m_parent->ClearFocus();
wxCommandEvent* evt = new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );

View File

@ -926,7 +926,7 @@ void SCH_EDIT_FRAME::SetCurrentSheet( const SCH_SHEET_PATH& aSheet )
{
if( aSheet != GetCurrentSheet() )
{
FocusOnItem( nullptr );
ClearFocus();
Schematic().SetCurrentSheet( aSheet );
GetCanvas()->DisplaySheet( aSheet.LastScreen() );
@ -950,7 +950,7 @@ void SCH_EDIT_FRAME::HardRedraw()
if( Schematic().Settings().m_IntersheetRefsShow )
RecomputeIntersheetRefs();
FocusOnItem( nullptr );
ClearFocus();
GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
@ -2285,8 +2285,12 @@ bool SCH_EDIT_FRAME::GetShowAllPins() const
}
void SCH_EDIT_FRAME::FocusOnItem( SCH_ITEM* aItem )
void SCH_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem )
{
// nullptr will clear the current focus
if( aItem != nullptr && !aItem->IsSCH_ITEM() )
return;
static KIID lastBrightenedItemID( niluuid );
SCH_SHEET_PATH dummy;

View File

@ -814,7 +814,7 @@ public:
int GetSchematicJunctionSize();
void FocusOnItem( SCH_ITEM* aItem );
void FocusOnItem( EDA_ITEM* aItem ) override;
bool IsSyncingSelection() { return m_syncingPcbToSchSelection; }

View File

@ -1496,12 +1496,16 @@ const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) con
}
void SYMBOL_EDIT_FRAME::FocusOnItem( SCH_ITEM* aItem )
void SYMBOL_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem )
{
static KIID lastBrightenedItemID( niluuid );
SCH_ITEM* lastItem = nullptr;
// nullptr will clear the current focus
if( aItem != nullptr && !aItem->IsSCH_ITEM() )
return;
if( m_symbol )
{
for( SCH_PIN* pin : m_symbol->GetPins() )

View File

@ -372,7 +372,7 @@ public:
void KiwayMailIn( KIWAY_EXPRESS& mail ) override;
void FocusOnItem( SCH_ITEM* aItem );
void FocusOnItem( EDA_ITEM* aItem ) override;
/**
* Load a symbol from the schematic to edit in place.

View File

@ -306,7 +306,7 @@ void SCH_NAVIGATE_TOOL::changeSheet( SCH_SHEET_PATH aPath )
pushToHistory( aPath );
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
m_frame->Schematic().SetCurrentSheet( aPath );
m_frame->DisplayCurrentSheet();
}

View File

@ -471,7 +471,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
m_disambiguateTimer.Stop();
if( SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
schframe->ClearFocus();
// Collect items at the clicked location (doesn't select them yet)
SCH_COLLECTOR collector;
@ -558,7 +558,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// double click? Display the properties window
if( SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
schframe->ClearFocus();
if( m_selection.Empty() )
SelectPoint( evt->Position() );
@ -594,7 +594,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// drag with LMB? Select multiple objects (or at least draw a selection box) or
// drag them
if( SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
schframe->ClearFocus();
SCH_COLLECTOR collector;
@ -940,7 +940,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
getViewControls()->CaptureCursor( false );
if( SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
schframe->ClearFocus();
if( !GetSelection().Empty() )
{
@ -957,7 +957,7 @@ int SCH_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
else if( evt->Action() == TA_UNDO_REDO_PRE )
{
if( SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
schframe->ClearFocus();
}
else if( evt->IsMotion() && !m_isSymbolEditor && evt->FirstResponder() == this )
{

View File

@ -305,6 +305,15 @@ public:
*/
void FocusOnLocation( const VECTOR2I& aPos );
/**
* Focus on a particular canvas item.
*
* @param aItem is the item to focus on. nullptr clears the focus.
*/
virtual void FocusOnItem( EDA_ITEM* aItem ) {}
virtual void ClearFocus() { FocusOnItem( nullptr ); }
/**
* Construct a "basic" menu for a tool, containing only items that apply to all tools
* (e.g. zoom and grid).

View File

@ -216,6 +216,7 @@ public:
EDA_ITEM* GetItem( const KIID& aId ) const override;
void FocusOnItem( EDA_ITEM* aItem ) override;
void FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer = UNDEFINED_LAYER );
void FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer = UNDEFINED_LAYER );

View File

@ -163,7 +163,7 @@ DIALOG_DRC::DIALOG_DRC( PCB_EDIT_FRAME* aEditorFrame, wxWindow* aParent ) :
DIALOG_DRC::~DIALOG_DRC()
{
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
g_lastDRCBoard = m_currentBoard;
g_lastDRCRun = m_drcRun;
@ -1097,7 +1097,7 @@ void DIALOG_DRC::OnCancelClick( wxCommandEvent& aEvent )
return;
}
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
SetReturnCode( wxID_CANCEL );

View File

@ -69,7 +69,7 @@ DIALOG_FOOTPRINT_CHECKER::DIALOG_FOOTPRINT_CHECKER( FOOTPRINT_EDIT_FRAME* aParen
DIALOG_FOOTPRINT_CHECKER::~DIALOG_FOOTPRINT_CHECKER()
{
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
g_lastFootprint = m_frame->GetBoard()->GetFirstFootprint();
g_lastChecksRun = m_checksRun;
@ -364,7 +364,7 @@ void DIALOG_FOOTPRINT_CHECKER::OnSeverity( wxCommandEvent& aEvent )
void DIALOG_FOOTPRINT_CHECKER::OnCancelClick( wxCommandEvent& aEvent )
{
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
SetReturnCode( wxID_CANCEL );

View File

@ -65,7 +65,7 @@ DIALOG_GROUP_PROPERTIES::~DIALOG_GROUP_PROPERTIES()
if( m_brdEditor->IsBeingDeleted() )
return;
m_brdEditor->FocusOnItem( nullptr );
m_brdEditor->ClearFocus();
m_brdEditor->GetCanvas()->Refresh();
}
@ -162,7 +162,7 @@ void DIALOG_GROUP_PROPERTIES::OnRemoveMember( wxCommandEvent& event )
if( selected >= 0 )
m_membersList->Delete( selected );
m_brdEditor->FocusOnItem( nullptr );
m_brdEditor->ClearFocus();
m_brdEditor->GetCanvas()->Refresh();
}

View File

@ -247,6 +247,14 @@ EDA_ITEM* PCB_BASE_FRAME::GetItem( const KIID& aId ) const
return GetBoard()->GetItem( aId );
}
void PCB_BASE_FRAME::FocusOnItem( EDA_ITEM* aItem )
{
// nullptr will clear the current focus
if( aItem != nullptr && !aItem->IsBOARD_ITEM() )
return;
FocusOnItem( static_cast<BOARD_ITEM*>( aItem ), UNDEFINED_LAYER );
}
void PCB_BASE_FRAME::FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer )
{

View File

@ -336,7 +336,7 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
}
else
{
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
selectPoint( evt->Position() );
}
}
@ -377,7 +377,7 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
}
// Double click? Display the properties window
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
if( m_selection.Empty() )
selectPoint( evt->Position() );
@ -429,7 +429,7 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// Drag with LMB? Select multiple objects (or at least draw a selection box)
// or drag them
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
m_toolMgr->ProcessEvent( EVENTS::InhibitSelectionEditing );
GENERAL_COLLECTORS_GUIDE guide = getCollectorsGuide();
@ -539,7 +539,7 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
else if( evt->IsCancel() )
{
m_disambiguateTimer.Stop();
m_frame->FocusOnItem( nullptr );
m_frame->ClearFocus();
if( !GetSelection().Empty() )
{