/* * 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 #include #include #include #include #include /************************************************************************************************** * * 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 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& 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& GetSelectionRefs() const { return m_selectionRefs; } /// Returns names of all fields present in footprints const std::vector& GetFieldNames() const { return m_fieldNames; } /// Returns names of all sheets present in footprints const std::vector& 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 m_assignments; /// The active settings object std::shared_ptr m_componentClassSettings; /// All currently selected footprint references std::vector m_selectionRefs; /// All footprint fields names present on the board std::vector m_fieldNames; /// All sheet names present on the board std::vector 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& 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 m_conditionTypes; /// The parent configuration dialog DIALOG_SHIM* m_dlg; /// All match conditions for this component class assignment rule std::vector 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& aRefs ) { m_selectionRefs = aRefs; } protected: /// Handles import references popup menu selections void onMenu( wxCommandEvent& aEvent ); PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent; std::vector 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& 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& aSheets ); protected: PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent; }; #endif //PANEL_ASSIGN_COMPONENT_CLASSES_H