kicad-source/include/dialogs/panel_assign_component_classes.h

435 lines
15 KiB
C
Raw Normal View History

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright The 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 PANEL_ASSIGN_COMPONENT_CLASSES_H
#define PANEL_ASSIGN_COMPONENT_CLASSES_H
#include <panel_assign_component_classes_base.h>
#include <unordered_set>
#include <vector>
#include <dialog_shim.h>
#include <pcb_edit_frame.h>
#include <project/component_class_settings.h>
/**************************************************************************************************
*
* PANEL_ASSIGN_COMPONENT_CLASSES
*
*************************************************************************************************/
/**
* Top-level panel for dynamic component class assignment configuration. Nests a
* PANEL_COMPONENT_CLASS_ASSIGNMENT panel for each set of component class assignment conditions
*/
class PANEL_COMPONENT_CLASS_ASSIGNMENT;
class PANEL_ASSIGN_COMPONENT_CLASSES : public PANEL_ASSIGN_COMPONENT_CLASSES_BASE
{
public:
PANEL_ASSIGN_COMPONENT_CLASSES( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
std::shared_ptr<COMPONENT_CLASS_SETTINGS> aSettings,
DIALOG_SHIM* aDlg );
~PANEL_ASSIGN_COMPONENT_CLASSES() override;
/// Loads current component class assignments from the board settings
bool TransferDataToWindow() override;
/// Saves the component class assignments to the board settings
bool TransferDataFromWindow() override;
/// Loads component class assignments from the given settings object
void ImportSettingsFrom( const std::shared_ptr<COMPONENT_CLASS_SETTINGS>& aOtherSettings );
/// Adds a new component class assignment rule
void OnAddAssignmentClick( wxCommandEvent& event ) override;
/// Removes a given component class assignment rule
void RemoveAssignment( PANEL_COMPONENT_CLASS_ASSIGNMENT* aPanel );
/// Returns references for all currently selected footprints
const std::vector<wxString>& GetSelectionRefs() const { return m_selectionRefs; }
/// Returns names of all fields present in footprints
const std::vector<wxString>& GetFieldNames() const { return m_fieldNames; }
/// Returns names of all sheets present in footprints
const std::vector<wxString>& GetSheetNames() const { return m_sheetNames; }
/// Gets the active edit frame
PCB_EDIT_FRAME* GetFrame() const { return m_frame; }
/// Validates that all assignment rules can compile successfully
bool Validate() override;
private:
/// Adds a new component class assignment rule
PANEL_COMPONENT_CLASS_ASSIGNMENT* addAssignment();
/// Scrolls the panel to specified assignment rule
void scrollToAssignment( const PANEL_COMPONENT_CLASS_ASSIGNMENT* aAssignment ) const;
/// The parent dialog
DIALOG_SHIM* m_dlg;
/// The active edit frame
PCB_EDIT_FRAME* m_frame;
/// Vector of all currently displayed assignment rules
std::vector<PANEL_COMPONENT_CLASS_ASSIGNMENT*> m_assignments;
/// The active settings object
std::shared_ptr<COMPONENT_CLASS_SETTINGS> m_componentClassSettings;
/// All currently selected footprint references
std::vector<wxString> m_selectionRefs;
/// All footprint fields names present on the board
std::vector<wxString> m_fieldNames;
/// All sheet names present on the board
std::vector<wxString> m_sheetNames;
/// The list of all currently present component class assignments
wxBoxSizer* m_assignmentsList;
};
/**************************************************************************************************
*
* CONDITION_DATA
*
*************************************************************************************************/
/**
* Class used to provide a unified interface from condition panels
* Handles determining the type of condition in use, and getting and settings the field data
*/
class CONDITION_DATA
{
public:
CONDITION_DATA( const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition,
wxTextEntry* aPrimary, wxTextEntry* aSecondary = nullptr ) :
m_conditionType( aCondition ), m_primaryCtrl( aPrimary ), m_secondaryCtrl( aSecondary )
{
}
virtual ~CONDITION_DATA() {};
/// Gets the type of condition (e.g. Reference, Side) this data represents
virtual COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE GetConditionType() const
{
return m_conditionType;
}
/// Gets the primary data member for the condition (e.g. Reference, Side)
virtual wxString GetPrimaryField() const;
/// Sets the primary data member for the condition (e.g. Reference, Side)
virtual void SetPrimaryField( const wxString& aVal );
/// Gets the primary data member for the condition (e.g. FOOTPRITNT field value)
virtual wxString GetSecondaryField() const;
/// Sets the primary data member for the condition (e.g. FOOTPRITNT field
/// value)
virtual void SetSecondaryField( const wxString& aVal );
private:
/// The type of condition being referenced
COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE m_conditionType;
/// The primary data field in the condition panel
wxTextEntry* m_primaryCtrl;
/// The Secondary data field in the condition panel
wxTextEntry* m_secondaryCtrl;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_ASSIGNMENT
*
*************************************************************************************************/
/**
* Panel which configures a set of conditions for a component class assignment rule
*/
class PANEL_COMPONENT_CLASS_ASSIGNMENT : public PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE
{
public:
/// IDs for match type popup menu
enum ADD_MATCH_POPUP
{
ID_REFERENCE = wxID_HIGHEST + 1,
ID_FOOTPRINT,
ID_SIDE,
ID_ROTATION,
ID_FOOTPRINT_FIELD,
ID_SHEET_NAME,
ID_CUSTOM
};
PANEL_COMPONENT_CLASS_ASSIGNMENT( wxWindow* aParent,
PANEL_ASSIGN_COMPONENT_CLASSES* aPanelParent,
DIALOG_SHIM* aDlg );
~PANEL_COMPONENT_CLASS_ASSIGNMENT();
/// Deletes this component class assignment rule
void OnDeleteAssignmentClick( wxCommandEvent& event ) override;
/// Adds a match condition to this component class assignment rule
void OnAddConditionClick( wxCommandEvent& event ) override;
/// Highlights footprints matching this set of conditions
void OnHighlightItemsClick( wxCommandEvent& event ) override;
/// Adds a condition to this component class assignment rule
CONDITION_DATA* AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition );
/// Removes a given condition from this component class assignment rule (note: called from the child
/// condition panel)
void RemoveCondition( wxPanel* aMatch );
const std::vector<CONDITION_DATA*>& GetConditions() const { return m_matches; }
/// Sets the resulting component class for this assignment
void SetComponentClass( const wxString& aComponentClass ) const;
/// Gets the resulting component class for this assignment
const wxString GetComponentClass() const;
/// Sets the boolean operator applied to all assignment conditions
void
SetConditionsOperator( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR aCondition ) const;
/// Gets the boolean operator applied to all assignment conditions
COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR GetConditionsOperator() const;
/// Converts the UI representation in to the internal assignment data representation
COMPONENT_CLASS_ASSIGNMENT_DATA GenerateAssignmentData() const;
protected:
/// Handles add match condition popup menu selections
void onMenu( wxCommandEvent& aEvent );
/// The top-level configuration panel which owns this assignment rule
PANEL_ASSIGN_COMPONENT_CLASSES* m_parentPanel;
/// The sizer containing match condition panels
wxStaticBoxSizer* m_matchesList;
/// Set containing all currently configured match condition types
std::unordered_set<COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE> m_conditionTypes;
/// The parent configuration dialog
DIALOG_SHIM* m_dlg;
/// All match conditions for this component class assignment rule
std::vector<CONDITION_DATA*> m_matches;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
*
*************************************************************************************************/
/**
* Configures matching based on footprint reference
*/
class PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
: public PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE,
public CONDITION_DATA
{
public:
/// IDs for match type popup menu
enum IMPORT_POPUP_IDS
{
ID_IMPORT_REFS = wxID_HIGHEST + 1
};
explicit PANEL_COMPONENT_CLASS_CONDITION_REFERENCE( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
void OnImportRefsClick( wxCommandEvent& event ) override;
void SetSelectionRefs( const std::vector<wxString>& aRefs ) { m_selectionRefs = aRefs; }
protected:
/// Handles import references popup menu selections
void onMenu( wxCommandEvent& aEvent );
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
std::vector<wxString> m_selectionRefs;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
*
*************************************************************************************************/
/**
* Configures matching based on footprint library identifier
*/
class PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
: public PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT( wxWindow* aParent, DIALOG_SHIM* aDlg );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
void OnShowLibraryClick( wxCommandEvent& event ) override;
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
DIALOG_SHIM* m_dlg;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_SIDE
*
*************************************************************************************************/
/**
* Configures matching based on which side of the board a footprint is on
*/
class PANEL_COMPONENT_CLASS_CONDITION_SIDE : public PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_SIDE( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_ROTATION
*
*************************************************************************************************/
/**
* Configures matching based on footprint rotation
*/
class PANEL_COMPONENT_CLASS_CONDITION_ROTATION
: public PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_ROTATION( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_FIELD
*
*************************************************************************************************/
/**
* Configures matching based on footprint field contents
*/
class PANEL_COMPONENT_CLASS_CONDITION_FIELD : public PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_FIELD( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
void SetFieldsList( const std::vector<wxString>& aFields );
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_CONDITION_CUSTOM
*
*************************************************************************************************/
/**
* Configures matching based on a custom DRC expression
*/
class PANEL_COMPONENT_CLASS_CONDITION_CUSTOM : public PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_CUSTOM( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
};
/**************************************************************************************************
*
* PANEL_COMPONENT_CLASS_SHEET
*
*************************************************************************************************/
/**
* Configures matching based on a custom DRC expression
*/
class PANEL_COMPONENT_CLASS_CONDITION_SHEET : public PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE,
public CONDITION_DATA
{
public:
explicit PANEL_COMPONENT_CLASS_CONDITION_SHEET( wxWindow* aParent );
void OnDeleteConditionClick( wxCommandEvent& event ) override;
void SetSheetsList( const std::vector<wxString>& aSheets );
protected:
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
};
#endif //PANEL_ASSIGN_COMPONENT_CLASSES_H