Add selection filter to footprint editor

This commit is contained in:
Jon Evans 2020-08-15 16:42:11 -04:00
parent 57c3d8e8d8
commit 2f604b4494
3 changed files with 85 additions and 9 deletions

View File

@ -24,6 +24,7 @@
#include <board_design_settings.h> #include <board_design_settings.h>
#include <settings/app_settings.h> #include <settings/app_settings.h>
#include <pcbnew_settings.h> #include <pcbnew_settings.h>
#include <project/board_project_settings.h>
class FOOTPRINT_EDITOR_SETTINGS : public APP_SETTINGS_BASE class FOOTPRINT_EDITOR_SETTINGS : public APP_SETTINGS_BASE
@ -66,6 +67,8 @@ public:
wxString m_FootprintTextShownColumns; wxString m_FootprintTextShownColumns;
SELECTION_FILTER_OPTIONS m_SelectionFilter;
protected: protected:
virtual std::string getLegacyFrameName() const override { return "ModEditFrame"; } virtual std::string getLegacyFrameName() const override { return "ModEditFrame"; }

View File

@ -69,6 +69,7 @@
#include <widgets/infobar.h> #include <widgets/infobar.h>
#include <widgets/lib_tree.h> #include <widgets/lib_tree.h>
#include <widgets/paged_dialog.h> #include <widgets/paged_dialog.h>
#include <widgets/panel_selection_filter.h>
#include <widgets/progress_reporter.h> #include <widgets/progress_reporter.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
@ -134,11 +135,6 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas(), true ); m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas(), true );
// LoadSettings() *after* creating m_LayersManager, because LoadSettings() initialize
// parameters in m_LayersManager
// NOTE: KifaceSettings() will return PCBNEW_SETTINGS if we started from pcbnew
LoadSettings( GetSettings() );
// In modedit, the default net clearance is not known (it depends on the actual board). // In modedit, the default net clearance is not known (it depends on the actual board).
// So we do not show the default clearance, by setting it to 0. // So we do not show the default clearance, by setting it to 0.
// The footprint or pad specific clearance will be shown. // The footprint or pad specific clearance will be shown.
@ -186,6 +182,13 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
ReCreateVToolbar(); ReCreateVToolbar();
ReCreateOptToolbar(); ReCreateOptToolbar();
m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
// LoadSettings() *after* creating m_LayersManager, because LoadSettings() initialize
// parameters in m_LayersManager
// NOTE: KifaceSettings() will return PCBNEW_SETTINGS if we started from pcbnew
LoadSettings( GetSettings() );
m_Layers->ReFill(); m_Layers->ReFill();
m_Layers->ReFillRender(); m_Layers->ReFillRender();
@ -197,6 +200,7 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_infoBar = new WX_INFOBAR( this, &m_auimgr ); m_infoBar = new WX_INFOBAR( this, &m_auimgr );
m_auimgr.SetManagedWindow( this ); m_auimgr.SetManagedWindow( this );
m_auimgr.SetFlags( wxAUI_MGR_DEFAULT | wxAUI_MGR_LIVE_RESIZE );
// Horizontal items; layers 4 - 6 // Horizontal items; layers 4 - 6
m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) ); m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
@ -215,6 +219,14 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
.Caption( _( "Layers Manager" ) ).PaneBorder( false ) .Caption( _( "Layers Manager" ) ).PaneBorder( false )
.MinSize( 80, -1 ).BestSize( m_Layers->GetBestSize() ) ); .MinSize( 80, -1 ).BestSize( m_Layers->GetBestSize() ) );
m_auimgr.AddPane( m_selectionFilterPanel,
EDA_PANE().Palette().Name( "SelectionFilter" ).Right().Layer( 3 )
.Caption( _( "Selection Filter" ) ).PaneBorder( false ).Position( 2 )
.MinSize( 160, -1 ).BestSize( m_selectionFilterPanel->GetBestSize() ) );
// The selection filter doesn't need to grow in the vertical direction when docked
m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() ); m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
ActivateGalCanvas(); ActivateGalCanvas();
@ -249,6 +261,7 @@ FOOTPRINT_EDIT_FRAME::~FOOTPRINT_EDIT_FRAME()
// save the footprint in the PROJECT // save the footprint in the PROJECT
retainLastFootprint(); retainLastFootprint();
delete m_selectionFilterPanel;
delete m_Layers; delete m_Layers;
} }
@ -432,8 +445,9 @@ void FOOTPRINT_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
GetDesignSettings() = cfg->m_DesignSettings; GetDesignSettings() = cfg->m_DesignSettings;
m_DisplayOptions = cfg->m_Display; m_DisplayOptions = cfg->m_Display;
m_defaultLibWidth = cfg->m_LibWidth; m_defaultLibWidth = cfg->m_LibWidth;
m_selectionFilterPanel->SetCheckboxesFromFilter( cfg->m_SelectionFilter );
} }
@ -444,9 +458,10 @@ void FOOTPRINT_EDIT_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
PCB_BASE_FRAME::SaveSettings( cfg ); PCB_BASE_FRAME::SaveSettings( cfg );
cfg->m_DesignSettings = GetDesignSettings(); cfg->m_DesignSettings = GetDesignSettings();
cfg->m_Display = m_DisplayOptions; cfg->m_Display = m_DisplayOptions;
cfg->m_LibWidth = m_treePane->GetSize().x; cfg->m_LibWidth = m_treePane->GetSize().x;
cfg->m_SelectionFilter = GetToolManager()->GetTool<SELECTION_TOOL>()->GetFilter();
} }
@ -534,6 +549,7 @@ void FOOTPRINT_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
// on some platforms (Windows) that generate useless redraw of items in // on some platforms (Windows) that generate useless redraw of items in
// the Layer Manger // the Layer Manger
m_auimgr.GetPane( "LayersManager" ).Show( false ); m_auimgr.GetPane( "LayersManager" ).Show( false );
m_auimgr.GetPane( "SelectionFilter" ).Show( false );
Pgm().GetSettingsManager().FlushAndRelease( GetSettings() ); Pgm().GetSettingsManager().FlushAndRelease( GetSettings() );

View File

@ -214,6 +214,63 @@ FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS() :
m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic", m_params.emplace_back( new PARAM<bool>( "design_settings.others_text_italic",
&m_DesignSettings.m_TextItalic[ LAYER_CLASS_OTHERS ], false ) ); &m_DesignSettings.m_TextItalic[ LAYER_CLASS_OTHERS ], false ) );
m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>( "editing.selection_filter",
[&]() -> nlohmann::json
{
nlohmann::json ret;
ret["lockedItems"] = m_SelectionFilter.lockedItems;
ret["footprints"] = m_SelectionFilter.footprints;
ret["text"] = m_SelectionFilter.text;
ret["tracks"] = m_SelectionFilter.tracks;
ret["vias"] = m_SelectionFilter.vias;
ret["pads"] = m_SelectionFilter.pads;
ret["graphics"] = m_SelectionFilter.graphics;
ret["zones"] = m_SelectionFilter.zones;
ret["keepouts"] = m_SelectionFilter.keepouts;
ret["dimensions"] = m_SelectionFilter.dimensions;
ret["otherItems"] = m_SelectionFilter.otherItems;
return ret;
},
[&]( const nlohmann::json& aVal )
{
if( aVal.empty() || !aVal.is_object() )
return;
auto setIfPresent =
[&aVal]( const std::string& aKey, bool& aTarget )
{
if( aVal.contains( aKey ) && aVal.at( aKey ).is_boolean() )
aTarget = aVal.at( aKey ).get<bool>();
};
setIfPresent( "lockedItems", m_SelectionFilter.lockedItems );
setIfPresent( "footprints", m_SelectionFilter.footprints );
setIfPresent( "text", m_SelectionFilter.text );
setIfPresent( "tracks", m_SelectionFilter.tracks );
setIfPresent( "vias", m_SelectionFilter.vias );
setIfPresent( "pads", m_SelectionFilter.pads );
setIfPresent( "graphics", m_SelectionFilter.graphics );
setIfPresent( "zones", m_SelectionFilter.zones );
setIfPresent( "keepouts", m_SelectionFilter.keepouts );
setIfPresent( "dimensions", m_SelectionFilter.dimensions );
setIfPresent( "otherItems", m_SelectionFilter.otherItems );
},
{
{ "lockedItems", true },
{ "footprints", true },
{ "text", true },
{ "tracks", true },
{ "vias", true },
{ "pads", true },
{ "graphics", true },
{ "zones", true },
{ "keepouts", true },
{ "dimensions", true },
{ "otherItems", true }
} ) );
} }