Initial schematic search pane
This commit is contained in:
parent
34ba343754
commit
1adcb86e0b
|
@ -229,6 +229,8 @@ set( EESCHEMA_WIDGETS
|
|||
widgets/pin_shape_combobox.cpp
|
||||
widgets/pin_type_combobox.cpp
|
||||
widgets/symbol_diff_widget.cpp
|
||||
widgets/sch_search_pane.cpp
|
||||
widgets/search_handlers.cpp
|
||||
widgets/symbol_preview_widget.cpp
|
||||
widgets/symbol_tree_pane.cpp
|
||||
)
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <sch_painter.h>
|
||||
#include <schematic.h>
|
||||
#include <widgets/hierarchy_pane.h>
|
||||
#include <widgets/sch_search_pane.h>
|
||||
#include <settings/app_settings.h>
|
||||
#include <settings/settings_manager.h>
|
||||
#include <symbol_lib_table.h>
|
||||
|
@ -172,37 +173,41 @@ void SCH_EDIT_FRAME::SaveProjectLocalSettings()
|
|||
void SCH_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
|
||||
{
|
||||
// For now, axes are forced off in Eeschema even if turned on in config
|
||||
eeconfig()->m_Window.grid.axes_enabled = false;
|
||||
EESCHEMA_SETTINGS* cfg = eeconfig();
|
||||
cfg->m_Window.grid.axes_enabled = false;
|
||||
|
||||
SCH_BASE_FRAME::LoadSettings( eeconfig() );
|
||||
SCH_BASE_FRAME::LoadSettings( cfg );
|
||||
|
||||
SCH_SEARCH_DATA* searchData = dynamic_cast<SCH_SEARCH_DATA*>( m_findReplaceData.get() );
|
||||
|
||||
if( searchData )
|
||||
{
|
||||
searchData->replaceReferences = eeconfig()->m_FindReplaceExtra.replace_references;
|
||||
searchData->searchAllFields = eeconfig()->m_FindReplaceExtra.search_all_fields;
|
||||
searchData->searchAllPins = eeconfig()->m_FindReplaceExtra.search_all_pins;
|
||||
searchData->searchCurrentSheetOnly = eeconfig()->m_FindReplaceExtra.search_current_sheet_only;
|
||||
searchData->searchSelectedOnly = eeconfig()->m_FindReplaceExtra.search_selected_only;
|
||||
searchData->replaceReferences = cfg->m_FindReplaceExtra.replace_references;
|
||||
searchData->searchAllFields = cfg->m_FindReplaceExtra.search_all_fields;
|
||||
searchData->searchAllPins = cfg->m_FindReplaceExtra.search_all_pins;
|
||||
searchData->searchCurrentSheetOnly = cfg->m_FindReplaceExtra.search_current_sheet_only;
|
||||
searchData->searchSelectedOnly = cfg->m_FindReplaceExtra.search_selected_only;
|
||||
}
|
||||
|
||||
m_show_search = cfg->m_AuiPanels.show_search;
|
||||
|
||||
GetRenderSettings()->m_ShowPinsElectricalType = false;
|
||||
GetRenderSettings()->m_ShowPinNumbers = false;
|
||||
GetRenderSettings()->SetDefaultFont( eeconfig()->m_Appearance.default_font );
|
||||
GetRenderSettings()->SetDefaultFont( cfg->m_Appearance.default_font );
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
|
||||
{
|
||||
SCH_BASE_FRAME::SaveSettings( eeconfig() );
|
||||
EESCHEMA_SETTINGS* cfg = eeconfig();
|
||||
SCH_BASE_FRAME::SaveSettings( cfg );
|
||||
wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() );
|
||||
|
||||
if( eeconfig() )
|
||||
if( cfg )
|
||||
{
|
||||
eeconfig()->m_System.units = static_cast<int>( GetUserUnits() );
|
||||
eeconfig()->m_AuiPanels.show_schematic_hierarchy = hierarchy_pane.IsShown();
|
||||
eeconfig()->m_AuiPanels.schematic_hierarchy_float = hierarchy_pane.IsFloating();
|
||||
cfg->m_System.units = static_cast<int>( GetUserUnits() );
|
||||
cfg->m_AuiPanels.show_schematic_hierarchy = hierarchy_pane.IsShown();
|
||||
cfg->m_AuiPanels.schematic_hierarchy_float = hierarchy_pane.IsFloating();
|
||||
// Other parameters (hierarchy_panel_float_width, hierarchy_panel_float_height,
|
||||
// and hierarchy_panel_docked_width should have been updated when resizing the
|
||||
// hierarchy panel
|
||||
|
@ -211,13 +216,17 @@ void SCH_EDIT_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
|
|||
|
||||
if( searchData )
|
||||
{
|
||||
eeconfig()->m_FindReplaceExtra.replace_references = searchData->replaceReferences;
|
||||
eeconfig()->m_FindReplaceExtra.search_all_fields = searchData->searchAllFields;
|
||||
eeconfig()->m_FindReplaceExtra.search_all_pins = searchData->searchAllPins;
|
||||
eeconfig()->m_FindReplaceExtra.search_current_sheet_only =
|
||||
cfg->m_FindReplaceExtra.replace_references = searchData->replaceReferences;
|
||||
cfg->m_FindReplaceExtra.search_all_fields = searchData->searchAllFields;
|
||||
cfg->m_FindReplaceExtra.search_all_pins = searchData->searchAllPins;
|
||||
cfg->m_FindReplaceExtra.search_current_sheet_only =
|
||||
searchData->searchCurrentSheetOnly;
|
||||
eeconfig()->m_FindReplaceExtra.search_selected_only = searchData->searchSelectedOnly;
|
||||
cfg->m_FindReplaceExtra.search_selected_only = searchData->searchSelectedOnly;
|
||||
}
|
||||
|
||||
m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown();
|
||||
cfg->m_AuiPanels.show_search = m_show_search;
|
||||
cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -170,6 +170,12 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
|
|||
m_params.emplace_back( new PARAM<bool>( "aui.schematic_hierarchy_float",
|
||||
&m_AuiPanels.schematic_hierarchy_float, false ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<int>( "aui.search_panel_height",
|
||||
&m_AuiPanels.search_panel_height, -1 ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "aui.show_search",
|
||||
&m_AuiPanels.show_search, false ) );
|
||||
|
||||
m_params.emplace_back( new PARAM<bool>( "autoplace_fields.enable",
|
||||
&m_AutoplaceFields.enable, true ) );
|
||||
|
||||
|
|
|
@ -77,8 +77,10 @@ public:
|
|||
int hierarchy_panel_docked_width; // width of hierarchy tree panel and pane when docked
|
||||
int hierarchy_panel_float_width; // width of hierarchy tree panel when floating
|
||||
int hierarchy_panel_float_height; // height of hierarchy tree panel when floating
|
||||
int search_panel_height; // height of the search panel
|
||||
bool schematic_hierarchy_float; // show hierarchy tree panel as floating
|
||||
bool show_schematic_hierarchy; // show hierarchy tree pane
|
||||
bool show_search; // show the search panel
|
||||
};
|
||||
|
||||
struct AUTOPLACE_FIELDS
|
||||
|
|
|
@ -171,6 +171,7 @@ void SCH_EDIT_FRAME::doReCreateMenuBar()
|
|||
ACTION_MENU* viewMenu = new ACTION_MENU( false, selTool );
|
||||
|
||||
viewMenu->Add( ACTIONS::showSymbolBrowser );
|
||||
viewMenu->Add( ACTIONS::showSearch, ACTION_MENU::CHECK );
|
||||
viewMenu->Add( EE_ACTIONS::showHierarchy, ACTION_MENU::CHECK );
|
||||
viewMenu->Add( EE_ACTIONS::navigateBack );
|
||||
viewMenu->Add( EE_ACTIONS::navigateUp );
|
||||
|
|
|
@ -80,6 +80,7 @@
|
|||
#include <view/view_controls.h>
|
||||
#include <widgets/wx_infobar.h>
|
||||
#include <widgets/hierarchy_pane.h>
|
||||
#include <widgets/sch_search_pane.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <wx/cmdline.h>
|
||||
#include <wx/app.h>
|
||||
|
@ -115,6 +116,7 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, SCH_BASE_FRAME )
|
|||
EVT_DROP_FILES( SCH_EDIT_FRAME::OnDropFiles )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxDEFINE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
|
||||
|
||||
SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||
SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH, wxT( "Eeschema" ), wxDefaultPosition,
|
||||
|
@ -130,6 +132,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
m_supportsAutoSave = true;
|
||||
m_syncingPcbToSchSelection = false;
|
||||
m_aboutTitle = _HKI( "KiCad Schematic Editor" );
|
||||
m_show_search = false;
|
||||
|
||||
m_findReplaceDialog = nullptr;
|
||||
|
||||
|
@ -169,6 +172,8 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
m_pageSetupData.GetPrintData().SetBin( wxPRINTBIN_AUTO );
|
||||
m_pageSetupData.GetPrintData().SetNoCopies( 1 );
|
||||
|
||||
m_searchPane = new SCH_SEARCH_PANE( this );
|
||||
|
||||
m_auimgr.SetManagedWindow( this );
|
||||
|
||||
CreateInfoBar();
|
||||
|
@ -201,6 +206,19 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) )
|
||||
.Center() );
|
||||
|
||||
m_auimgr.AddPane( m_searchPane, EDA_PANE()
|
||||
.Name( SearchPaneName() )
|
||||
.Bottom()
|
||||
.Caption( _( "Search" ) )
|
||||
.PaneBorder( false )
|
||||
.MinSize( 180, -1 )
|
||||
.BestSize( 180, -1 )
|
||||
.FloatingSize( 480, 200 )
|
||||
.CloseButton( true )
|
||||
.DestroyOnClose( false )
|
||||
.Show( m_show_search ) );
|
||||
|
||||
|
||||
FinishAUIInitialization();
|
||||
|
||||
resolveCanvasType();
|
||||
|
@ -227,6 +245,12 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
if( cfg->m_AuiPanels.schematic_hierarchy_float )
|
||||
hierarchy_pane.Float();
|
||||
|
||||
if( cfg->m_AuiPanels.search_panel_height > 0 )
|
||||
{
|
||||
wxAuiPaneInfo& searchPane = m_auimgr.GetPane( SearchPaneName() );
|
||||
SetAuiPaneSize( m_auimgr, searchPane, -1, cfg->m_AuiPanels.search_panel_height );
|
||||
}
|
||||
|
||||
if( cfg->m_AuiPanels.hierarchy_panel_docked_width > 0 )
|
||||
{
|
||||
SetAuiPaneSize( m_auimgr, hierarchy_pane,
|
||||
|
@ -721,6 +745,24 @@ void SCH_EDIT_FRAME::CreateScreens()
|
|||
SCH_SCREEN* screen = new SCH_SCREEN( m_schematic );
|
||||
SetScreen( screen );
|
||||
}
|
||||
|
||||
wxCommandEvent e( EDA_EVT_SCHEMATIC_CHANGED );
|
||||
ProcessEventLocally( e );
|
||||
|
||||
|
||||
for( wxEvtHandler* listener : m_schematicChangeListeners )
|
||||
{
|
||||
wxCHECK2( listener, continue );
|
||||
|
||||
// Use the windows variant when handling event messages in case there is any special
|
||||
// event handler pre and/or post processing specific to windows.
|
||||
wxWindow* win = dynamic_cast<wxWindow*>( listener );
|
||||
|
||||
if( win )
|
||||
win->HandleWindowEvent( e );
|
||||
else
|
||||
listener->SafelyProcessEvent( e );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -933,6 +975,9 @@ void SCH_EDIT_FRAME::doCloseWindow()
|
|||
|
||||
Schematic().Reset();
|
||||
|
||||
// Prevents any rouge events from continuing (i.e. search panel tries to redraw)
|
||||
Show( false );
|
||||
|
||||
Destroy();
|
||||
}
|
||||
|
||||
|
@ -2238,3 +2283,25 @@ void SCH_EDIT_FRAME::onCloseErcDialog( wxCommandEvent& aEvent )
|
|||
m_ercDialog = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::AddSchematicChangeListener( wxEvtHandler* aListener )
|
||||
{
|
||||
auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
|
||||
aListener );
|
||||
|
||||
// Don't add duplicate listeners.
|
||||
if( it == m_schematicChangeListeners.end() )
|
||||
m_schematicChangeListeners.push_back( aListener );
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::RemoveSchematicChangeListener( wxEvtHandler* aListener )
|
||||
{
|
||||
auto it = std::find( m_schematicChangeListeners.begin(), m_schematicChangeListeners.end(),
|
||||
aListener );
|
||||
|
||||
// Don't add duplicate listeners.
|
||||
if( it != m_schematicChangeListeners.end() )
|
||||
m_schematicChangeListeners.erase( it );
|
||||
}
|
|
@ -93,6 +93,8 @@ enum SCH_CLEANUP_FLAGS
|
|||
};
|
||||
|
||||
|
||||
wxDECLARE_EVENT( EDA_EVT_SCHEMATIC_CHANGED, wxCommandEvent );
|
||||
|
||||
/**
|
||||
* Schematic editor (Eeschema) main window.
|
||||
*/
|
||||
|
@ -817,6 +819,11 @@ public:
|
|||
*/
|
||||
void ToggleSchematicHierarchy();
|
||||
|
||||
/**
|
||||
* Toggle the show/hide state of Search pane
|
||||
*/
|
||||
void ToggleSearch();
|
||||
|
||||
DIALOG_BOOK_REPORTER* GetSymbolDiffDialog();
|
||||
|
||||
DIALOG_ERC* GetErcDialog();
|
||||
|
@ -829,6 +836,27 @@ public:
|
|||
return wxT( "SchematicHierarchy" );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the name of the wxAuiPaneInfo managing the Search panel
|
||||
*/
|
||||
static const wxString SearchPaneName() { return wxT( "Search" ); }
|
||||
|
||||
/**
|
||||
* Add \a aListener to post #EDA_EVT_SCHEMATIC_CHANGED command events to.
|
||||
*
|
||||
* @warning The caller is reponsible for removing any listeners that are no long valid.
|
||||
*
|
||||
* @note This only gets called when the schematic editor is in stand alone mode. Changing
|
||||
* projects in the project manager closes the schematic editor when a new project is
|
||||
* loaded.
|
||||
*/
|
||||
void AddSchematicChangeListener( wxEvtHandler* aListener );
|
||||
|
||||
/**
|
||||
* Remove \a aListener to from the schematic changed listener list.
|
||||
*/
|
||||
void RemoveSchematicChangeListener( wxEvtHandler* aListener );
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
protected:
|
||||
|
@ -948,6 +976,10 @@ private:
|
|||
HIERARCHY_PANE* m_hierarchy;
|
||||
|
||||
bool m_syncingPcbToSchSelection; // Recursion guard when synchronizing selection from PCB
|
||||
|
||||
bool m_show_search;
|
||||
|
||||
std::vector<wxEvtHandler*> m_schematicChangeListeners;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <tools/ee_selection_tool.h>
|
||||
#include <widgets/hierarchy_pane.h>
|
||||
#include <widgets/wx_aui_utils.h>
|
||||
#include <widgets/sch_search_pane.h>
|
||||
|
||||
/* Create the main Horizontal Toolbar for the schematic editor
|
||||
*/
|
||||
|
@ -225,6 +226,31 @@ void SCH_EDIT_FRAME::ReCreateOptToolbar()
|
|||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::ToggleSearch()
|
||||
{
|
||||
EESCHEMA_SETTINGS* cfg = eeconfig();
|
||||
|
||||
// Ensure m_show_search is up to date (the pane can be closed outside the menu)
|
||||
m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown();
|
||||
|
||||
m_show_search = !m_show_search;
|
||||
|
||||
wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
|
||||
searchPaneInfo.Show( m_show_search );
|
||||
|
||||
if( m_show_search )
|
||||
{
|
||||
SetAuiPaneSize( m_auimgr, searchPaneInfo, -1, cfg->m_AuiPanels.search_panel_height );
|
||||
m_searchPane->FocusSearch();
|
||||
}
|
||||
else
|
||||
{
|
||||
cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
|
||||
m_auimgr.Update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::ToggleSchematicHierarchy()
|
||||
{
|
||||
EESCHEMA_SETTINGS* cfg = eeconfig();
|
||||
|
|
|
@ -2061,6 +2061,13 @@ int SCH_EDITOR_CONTROL::DrawSheetOnClipboard( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
int SCH_EDITOR_CONTROL::ShowSearch( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
getEditFrame<SCH_EDIT_FRAME>()->ToggleSearch();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int SCH_EDITOR_CONTROL::ShowHierarchy( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
getEditFrame<SCH_EDIT_FRAME>()->ToggleSchematicHierarchy();
|
||||
|
@ -2351,6 +2358,7 @@ void SCH_EDITOR_CONTROL::setTransitions()
|
|||
Go( &SCH_EDITOR_CONTROL::GenerateBOM, EE_ACTIONS::generateBOM.MakeEvent() );
|
||||
Go( &SCH_EDITOR_CONTROL::DrawSheetOnClipboard, EE_ACTIONS::drawSheetOnClipboard.MakeEvent() );
|
||||
|
||||
Go( &SCH_EDITOR_CONTROL::ShowSearch, EE_ACTIONS::showSearch.MakeEvent() );
|
||||
Go( &SCH_EDITOR_CONTROL::ShowHierarchy, EE_ACTIONS::showHierarchy.MakeEvent() );
|
||||
|
||||
Go( &SCH_EDITOR_CONTROL::ToggleHiddenPins, EE_ACTIONS::toggleHiddenPins.MakeEvent() );
|
||||
|
|
|
@ -123,6 +123,7 @@ public:
|
|||
int GenerateBOM( const TOOL_EVENT& aEvent );
|
||||
int DrawSheetOnClipboard( const TOOL_EVENT& aEvent );
|
||||
|
||||
int ShowSearch( const TOOL_EVENT& aEvent );
|
||||
int ShowHierarchy( const TOOL_EVENT& aEvent );
|
||||
|
||||
int ToggleHiddenPins( const TOOL_EVENT& aEvent );
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <sch_edit_frame.h>
|
||||
#include "sch_search_pane.h"
|
||||
#include "search_handlers.h"
|
||||
|
||||
|
||||
SCH_SEARCH_PANE::SCH_SEARCH_PANE( SCH_EDIT_FRAME* aFrame ) :
|
||||
SEARCH_PANE( aFrame ), m_schFrame( aFrame )
|
||||
{
|
||||
m_sch = &(m_schFrame->Schematic());
|
||||
|
||||
if( m_sch != nullptr )
|
||||
m_sch->AddListener( this );
|
||||
|
||||
m_schFrame->Connect( EDA_EVT_UNITS_CHANGED,
|
||||
wxCommandEventHandler( SCH_SEARCH_PANE::onUnitsChanged ), nullptr, this );
|
||||
|
||||
m_schFrame->Connect( EDA_EVT_SCHEMATIC_CHANGED,
|
||||
wxCommandEventHandler( SCH_SEARCH_PANE::onSchChanged ), nullptr, this );
|
||||
|
||||
wxFont infoFont = KIUI::GetDockedPaneFont( this );
|
||||
SetFont( infoFont );
|
||||
m_notebook->SetFont( infoFont );
|
||||
|
||||
AddSearcher( new SYMBOL_SEARCH_HANDLER( aFrame ) );
|
||||
AddSearcher( new TEXT_SEARCH_HANDLER( aFrame ) );
|
||||
AddSearcher( new LABEL_SEARCH_HANDLER( aFrame ) );
|
||||
}
|
||||
|
||||
|
||||
SCH_SEARCH_PANE::~SCH_SEARCH_PANE()
|
||||
{
|
||||
m_schFrame->Disconnect( EDA_EVT_UNITS_CHANGED,
|
||||
wxCommandEventHandler( SCH_SEARCH_PANE::onUnitsChanged ), nullptr,
|
||||
this );
|
||||
m_schFrame->Disconnect( EDA_EVT_SCHEMATIC_CHANGED,
|
||||
wxCommandEventHandler( SCH_SEARCH_PANE::onSchChanged ), nullptr,
|
||||
this );
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_PANE::onUnitsChanged( wxCommandEvent& event )
|
||||
{
|
||||
ClearAllResults();
|
||||
RefreshSearch();
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_PANE::onSchChanged( wxCommandEvent& event )
|
||||
{
|
||||
ClearAllResults();
|
||||
RefreshSearch();
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_PANE::OnSchItemsAdded( SCHEMATIC& aBoard, std::vector<SCH_ITEM*>& aBoardItems )
|
||||
{
|
||||
if( !IsShown() )
|
||||
return;
|
||||
|
||||
RefreshSearch();
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_PANE::OnSchItemsRemoved( SCHEMATIC& aBoard, std::vector<SCH_ITEM*>& aBoardItems )
|
||||
{
|
||||
if( !IsShown() )
|
||||
return;
|
||||
|
||||
RefreshSearch();
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_PANE::OnSchItemsChanged( SCHEMATIC& aBoard, std::vector<SCH_ITEM*>& aBoardItems )
|
||||
{
|
||||
if( !IsShown() )
|
||||
return;
|
||||
|
||||
RefreshSearch();
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SCH_SEARCH_PANE_H
|
||||
#define SCH_SEARCH_PANE_H
|
||||
|
||||
#include <schematic.h>
|
||||
#include <widgets/search_pane.h>
|
||||
|
||||
class SCH_EDIT_FRAME;
|
||||
|
||||
class SCH_SEARCH_PANE : public SEARCH_PANE, public SCHEMATIC_LISTENER
|
||||
{
|
||||
public:
|
||||
SCH_SEARCH_PANE( SCH_EDIT_FRAME* aFrame );
|
||||
virtual ~SCH_SEARCH_PANE();
|
||||
|
||||
virtual void OnSchItemsAdded( SCHEMATIC& aBoard, std::vector<SCH_ITEM*>& aBoardItems ) override;
|
||||
virtual void OnSchItemsRemoved( SCHEMATIC& aBoard,
|
||||
std::vector<SCH_ITEM*>& aBoardItems ) override;
|
||||
virtual void OnSchItemsChanged( SCHEMATIC& aBoard,
|
||||
std::vector<SCH_ITEM*>& aBoardItems ) override;
|
||||
|
||||
private:
|
||||
void onUnitsChanged( wxCommandEvent& event );
|
||||
void onSchChanged( wxCommandEvent& event );
|
||||
|
||||
SCH_EDIT_FRAME* m_schFrame;
|
||||
SCHEMATIC* m_sch;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,352 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2022 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <ee_actions.h>
|
||||
#include <sch_edit_frame.h>
|
||||
#include <sch_painter.h>
|
||||
#include <sch_symbol.h>
|
||||
#include <sch_label.h>
|
||||
#include <sch_text.h>
|
||||
#include <sch_textbox.h>
|
||||
#include <schematic.h>
|
||||
#include <string_utils.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include "search_handlers.h"
|
||||
|
||||
|
||||
SCH_SEARCH_HANDLER::SCH_SEARCH_HANDLER( wxString aName, SCH_EDIT_FRAME* aFrame ) :
|
||||
SEARCH_HANDLER( aName ), m_frame( aFrame )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_HANDLER::ActivateItem( long aItemRow )
|
||||
{
|
||||
std::vector<long> item = { aItemRow };
|
||||
SelectItems( item );
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_HANDLER::FindAll( const std::function<bool( SCH_ITEM*, SCH_SHEET_PATH* )>& aCollector )
|
||||
{
|
||||
SCH_SCREENS screens( m_frame->Schematic().Root() );
|
||||
std::vector<SCH_SHEET_PATH*> paths;
|
||||
|
||||
m_hitlist.clear();
|
||||
|
||||
screens.BuildClientSheetPathList();
|
||||
|
||||
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
|
||||
{
|
||||
for( SCH_SHEET_PATH& sheet : screen->GetClientSheetPaths() )
|
||||
paths.push_back( &sheet );
|
||||
}
|
||||
|
||||
for( SCH_SHEET_PATH* sheet : paths )
|
||||
{
|
||||
for( SCH_ITEM* item : sheet->LastScreen()->Items() )
|
||||
{
|
||||
if( aCollector( item, sheet ) )
|
||||
{
|
||||
m_hitlist.push_back( { item, sheet } );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SCH_SEARCH_HANDLER::SelectItems( std::vector<long>& aItemRows )
|
||||
{
|
||||
EDA_ITEMS selectedItems;
|
||||
std::vector<SCH_SEARCH_HIT> selectedHits;
|
||||
|
||||
for( long row : aItemRows )
|
||||
{
|
||||
if( row >= 0 && row < (long) m_hitlist.size() )
|
||||
{
|
||||
selectedHits.emplace_back( m_hitlist[row] );
|
||||
selectedItems.emplace_back( m_hitlist[row].item );
|
||||
}
|
||||
}
|
||||
|
||||
bool allHitsOnSamePage = std::all_of( selectedHits.begin() + 1, selectedHits.end(),
|
||||
[&]( const SCH_SEARCH_HIT& r )
|
||||
{
|
||||
return r.sheetPath == selectedHits.front().sheetPath;
|
||||
} );
|
||||
|
||||
m_frame->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
|
||||
|
||||
if( allHitsOnSamePage )
|
||||
{
|
||||
m_frame->SetCurrentSheet( *selectedHits.front().sheetPath );
|
||||
m_frame->DisplayCurrentSheet();
|
||||
|
||||
if( selectedItems.size() )
|
||||
m_frame->GetToolManager()->RunAction( EE_ACTIONS::addItemsToSel, true, &selectedItems );
|
||||
|
||||
m_frame->GetCanvas()->Refresh( false );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SYMBOL_SEARCH_HANDLER::SYMBOL_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame ) :
|
||||
SCH_SEARCH_HANDLER( wxT( "Symbols" ), aFrame )
|
||||
{
|
||||
m_columns.emplace_back( wxT( "Reference" ), 1 );
|
||||
m_columns.emplace_back( wxT( "Value" ), 3 );
|
||||
m_columns.emplace_back( wxT( "Footprint" ), 3 );
|
||||
m_columns.emplace_back( wxT( "Page" ), 1 );
|
||||
m_columns.emplace_back( wxT( "X" ), 2 );
|
||||
m_columns.emplace_back( wxT( "Y" ), 2 );
|
||||
}
|
||||
|
||||
|
||||
int SYMBOL_SEARCH_HANDLER::Search( const wxString& aQuery )
|
||||
{
|
||||
m_hitlist.clear();
|
||||
SCHEMATIC& sch = m_frame->Schematic();
|
||||
|
||||
SCH_SEARCH_DATA frp;
|
||||
frp.findString = aQuery;
|
||||
frp.matchMode = EDA_SEARCH_MATCH_MODE::WILDCARD;
|
||||
frp.searchCurrentSheetOnly = false;
|
||||
|
||||
auto search = [frp]( SCH_ITEM* item, SCH_SHEET_PATH* sheet )
|
||||
{
|
||||
if( item->Type() == SCH_SYMBOL_T )
|
||||
{
|
||||
SCH_SYMBOL* sym = dynamic_cast<SCH_SYMBOL*>( item );
|
||||
if( sym->IsPower() )
|
||||
return false;
|
||||
|
||||
bool hit = false;
|
||||
for( SCH_FIELD& field : sym->GetFields() )
|
||||
{
|
||||
if( field.Matches( frp, sheet ) )
|
||||
{
|
||||
hit = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( hit )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
FindAll( search );
|
||||
|
||||
return (int) m_hitlist.size();
|
||||
}
|
||||
|
||||
|
||||
wxString SYMBOL_SEARCH_HANDLER::GetResultCell( int aRow, int aCol )
|
||||
{
|
||||
SCH_SEARCH_HIT hit = m_hitlist[aRow];
|
||||
SCH_SYMBOL* sym = dynamic_cast<SCH_SYMBOL*>( hit.item );
|
||||
|
||||
if( !sym )
|
||||
return wxEmptyString;
|
||||
|
||||
if( aCol == 0 )
|
||||
return sym->GetRef( hit.sheetPath, true );
|
||||
else if( aCol == 1 )
|
||||
return sym->GetField( VALUE_FIELD )->GetShownText( hit.sheetPath, false );
|
||||
else if( aCol == 2 )
|
||||
return sym->GetField( FOOTPRINT_FIELD )->GetShownText( hit.sheetPath, false );
|
||||
else if( aCol == 3 )
|
||||
return hit.sheetPath->GetPageNumber();
|
||||
else if( aCol == 4 )
|
||||
return m_frame->MessageTextFromValue( sym->GetPosition().x );
|
||||
else if( aCol == 5 )
|
||||
return m_frame->MessageTextFromValue( sym->GetPosition().y );
|
||||
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
TEXT_SEARCH_HANDLER::TEXT_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame ) :
|
||||
SCH_SEARCH_HANDLER( wxT( "Text" ), aFrame )
|
||||
{
|
||||
m_columns.emplace_back( wxT( "Type" ), 1 );
|
||||
m_columns.emplace_back( wxT( "Text" ), 5 );
|
||||
m_columns.emplace_back( wxT( "Page" ), 1 );
|
||||
m_columns.emplace_back( wxT( "X" ), 2 );
|
||||
m_columns.emplace_back( wxT( "Y" ), 2 );
|
||||
}
|
||||
|
||||
|
||||
int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
|
||||
{
|
||||
m_hitlist.clear();
|
||||
|
||||
SCH_SEARCH_DATA frp;
|
||||
frp.findString = aQuery;
|
||||
frp.matchMode = EDA_SEARCH_MATCH_MODE::WILDCARD;
|
||||
frp.searchCurrentSheetOnly = false;
|
||||
|
||||
auto search = [frp]( SCH_ITEM* item, SCH_SHEET_PATH* sheet )
|
||||
{
|
||||
if( item->Type() == SCH_TEXT_T )
|
||||
{
|
||||
SCH_TEXT* text = dynamic_cast<SCH_TEXT*>( item );
|
||||
if( text->Matches( frp, sheet ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if( item->Type() == SCH_TEXTBOX_T )
|
||||
{
|
||||
SCH_TEXTBOX* text = dynamic_cast<SCH_TEXTBOX*>( item );
|
||||
if( text->Matches( frp, sheet ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
FindAll( search );
|
||||
|
||||
return (int) m_hitlist.size();
|
||||
}
|
||||
|
||||
|
||||
wxString TEXT_SEARCH_HANDLER::GetResultCell( int aRow, int aCol )
|
||||
{
|
||||
SCH_SEARCH_HIT hit = m_hitlist[aRow];
|
||||
|
||||
if( hit.item->Type() == SCH_TEXT_T )
|
||||
{
|
||||
SCH_TEXT* txt = dynamic_cast<SCH_TEXT*>( hit.item );
|
||||
|
||||
if( !txt )
|
||||
return wxEmptyString;
|
||||
|
||||
if( aCol == 0 )
|
||||
return wxS( "Text" );
|
||||
else if( aCol == 1 )
|
||||
return txt->GetShownText( false );
|
||||
else if( aCol == 2 )
|
||||
return hit.sheetPath->GetPageNumber();
|
||||
else if( aCol == 3 )
|
||||
return m_frame->MessageTextFromValue( txt->GetPosition().x );
|
||||
else if( aCol == 4 )
|
||||
return m_frame->MessageTextFromValue( txt->GetPosition().y );
|
||||
}
|
||||
else if( hit.item->Type() == SCH_TEXTBOX_T )
|
||||
{
|
||||
SCH_TEXTBOX* txt = dynamic_cast<SCH_TEXTBOX*>( hit.item );
|
||||
|
||||
if( !txt )
|
||||
return wxEmptyString;
|
||||
|
||||
if( aCol == 0 )
|
||||
return wxS( "Text" );
|
||||
else if( aCol == 1 )
|
||||
return txt->GetShownText( false );
|
||||
else if( aCol == 2 )
|
||||
return hit.sheetPath->GetPageNumber();
|
||||
else if( aCol == 3 )
|
||||
return m_frame->MessageTextFromValue( txt->GetPosition().x );
|
||||
else if( aCol == 4 )
|
||||
return m_frame->MessageTextFromValue( txt->GetPosition().y );
|
||||
}
|
||||
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
LABEL_SEARCH_HANDLER::LABEL_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame ) :
|
||||
SCH_SEARCH_HANDLER( wxT( "Labels" ), aFrame )
|
||||
{
|
||||
m_columns.emplace_back( wxT( "Type" ), 1 );
|
||||
m_columns.emplace_back( wxT( "Name" ), 4 );
|
||||
m_columns.emplace_back( wxT( "Page" ), 1 );
|
||||
m_columns.emplace_back( wxT( "X" ), 2 );
|
||||
m_columns.emplace_back( wxT( "Y" ), 2 );
|
||||
}
|
||||
|
||||
|
||||
int LABEL_SEARCH_HANDLER::Search( const wxString& aQuery )
|
||||
{
|
||||
m_hitlist.clear();
|
||||
|
||||
SCH_SEARCH_DATA frp;
|
||||
frp.findString = aQuery;
|
||||
frp.matchMode = EDA_SEARCH_MATCH_MODE::WILDCARD;
|
||||
frp.searchCurrentSheetOnly = false;
|
||||
|
||||
auto search = [frp]( SCH_ITEM* item, SCH_SHEET_PATH* sheet )
|
||||
{
|
||||
if( item->Type() == SCH_LABEL_T || item->Type() == SCH_GLOBAL_LABEL_T
|
||||
|| item->Type() == SCH_HIER_LABEL_T )
|
||||
{
|
||||
SCH_LABEL_BASE* lbl = dynamic_cast<SCH_LABEL_BASE*>( item );
|
||||
if( lbl->Matches( frp, sheet ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
FindAll( search );
|
||||
|
||||
return (int) m_hitlist.size();
|
||||
}
|
||||
|
||||
|
||||
wxString LABEL_SEARCH_HANDLER::GetResultCell( int aRow, int aCol )
|
||||
{
|
||||
SCH_SEARCH_HIT hit = m_hitlist[aRow];
|
||||
|
||||
SCH_LABEL_BASE* lbl = dynamic_cast<SCH_LABEL_BASE*>( hit.item );
|
||||
|
||||
if( !lbl )
|
||||
return wxEmptyString;
|
||||
|
||||
if (aCol == 0)
|
||||
{
|
||||
if(lbl->Type() == SCH_LABEL_T)
|
||||
return wxS( "Local" );
|
||||
else if( lbl->Type() == SCH_GLOBAL_LABEL_T )
|
||||
return wxS( "Global" );
|
||||
else if( lbl->Type() == SCH_HIER_LABEL_T )
|
||||
return wxS( "Hierarchal" );
|
||||
}
|
||||
else if( aCol == 1 )
|
||||
return lbl->GetShownText( false );
|
||||
else if( aCol == 2 )
|
||||
return hit.sheetPath->GetPageNumber();
|
||||
else if( aCol == 3 )
|
||||
return m_frame->MessageTextFromValue( lbl->GetPosition().x );
|
||||
else if( aCol == 4 )
|
||||
return m_frame->MessageTextFromValue( lbl->GetPosition().y );
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2022 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
|
||||
*/
|
||||
|
||||
#ifndef SEARCH_HANDLERS_H
|
||||
#define SEARCH_HANDLERS_H
|
||||
|
||||
#include <functional>
|
||||
#include <widgets/search_pane.h>
|
||||
|
||||
class SCH_ITEM;
|
||||
class SCH_TEXT;
|
||||
class SCH_EDIT_FRAME;
|
||||
|
||||
struct SCH_SEARCH_HIT
|
||||
{
|
||||
SCH_ITEM* item;
|
||||
SCH_SHEET_PATH* sheetPath;
|
||||
};
|
||||
|
||||
class SCH_SEARCH_HANDLER : public SEARCH_HANDLER
|
||||
{
|
||||
public:
|
||||
SCH_SEARCH_HANDLER( wxString aName, SCH_EDIT_FRAME* aFrame );
|
||||
void ActivateItem( long aItemRow ) override;
|
||||
|
||||
void FindAll( const std::function<bool( SCH_ITEM*, SCH_SHEET_PATH* )>& aCollector );
|
||||
void SelectItems( std::vector<long>& aItemRows ) override;
|
||||
|
||||
protected:
|
||||
SCH_EDIT_FRAME* m_frame;
|
||||
std::vector<SCH_SEARCH_HIT> m_hitlist;
|
||||
};
|
||||
|
||||
class SYMBOL_SEARCH_HANDLER : public SCH_SEARCH_HANDLER
|
||||
{
|
||||
public:
|
||||
SYMBOL_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame );
|
||||
|
||||
int Search( const wxString& aQuery ) override;
|
||||
wxString GetResultCell( int aRow, int aCol ) override;
|
||||
|
||||
};
|
||||
|
||||
class TEXT_SEARCH_HANDLER : public SCH_SEARCH_HANDLER
|
||||
{
|
||||
public:
|
||||
TEXT_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame );
|
||||
|
||||
int Search( const wxString& aQuery ) override;
|
||||
wxString GetResultCell( int aRow, int aCol ) override;
|
||||
|
||||
};
|
||||
|
||||
class LABEL_SEARCH_HANDLER : public SCH_SEARCH_HANDLER
|
||||
{
|
||||
public:
|
||||
LABEL_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame );
|
||||
|
||||
int Search( const wxString& aQuery ) override;
|
||||
wxString GetResultCell( int aRow, int aCol ) override;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue