/* * 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 */ #include "layer_pairs.h" #include wxDEFINE_EVENT( PCB_LAYER_PAIR_PRESETS_CHANGED, wxCommandEvent ); wxDEFINE_EVENT( PCB_CURRENT_LAYER_PAIR_CHANGED, wxCommandEvent ); static bool IsAnEnabledPreset( const LAYER_PAIR& aPair, const LAYER_PAIR_SETTINGS& aSettings ) { const auto presets = aSettings.GetLayerPairs(); const auto matcher = [&aPair]( const LAYER_PAIR_INFO& aPreset ) { return aPreset.GetLayerPair().HasSameLayers( aPair ) && aPreset.IsEnabled(); }; return std::any_of( presets.begin(), presets.end(), matcher ); } LAYER_PAIR_SETTINGS::LAYER_PAIR_SETTINGS( const LAYER_PAIR_SETTINGS& aOther ) { m_pairs = aOther.m_pairs; m_currentPair = aOther.m_currentPair; } bool LAYER_PAIR_SETTINGS::addLayerPairInternal( LAYER_PAIR_INFO aPairInfo ) { const LAYER_PAIR& newPair = aPairInfo.GetLayerPair(); const auto pairMatcher = [&]( const LAYER_PAIR_INFO& aExistingPair ) { return newPair.HasSameLayers( aExistingPair.GetLayerPair() ); }; const bool alreadyExists = std::any_of( m_pairs.begin(), m_pairs.end(), pairMatcher ); if( alreadyExists ) { return false; } // If we're adding a pair that matches the last manual pair // we no longer need the manual one if( m_lastManualPair && m_lastManualPair->HasSameLayers( newPair ) ) { m_lastManualPair.reset(); } m_pairs.push_back( std::move( aPairInfo ) ); return true; } bool LAYER_PAIR_SETTINGS::AddLayerPair( LAYER_PAIR_INFO aPair ) { bool ret = addLayerPairInternal( std::move( aPair ) ); wxCommandEvent* evt = new wxCommandEvent( PCB_LAYER_PAIR_PRESETS_CHANGED, wxID_ANY ); QueueEvent( evt ); return ret; } bool LAYER_PAIR_SETTINGS::removeLayerPairInternal( const LAYER_PAIR& aPair ) { const auto pairMatcher = [&aPair]( const LAYER_PAIR_INFO& aPairInfo ) { return aPairInfo.GetLayerPair().HasSameLayers( aPair ); }; const auto pairToRemoveIt = std::find_if( m_pairs.begin(), m_pairs.end(), pairMatcher ); if( pairToRemoveIt == m_pairs.end() ) { return false; } m_pairs.erase( pairToRemoveIt ); return true; } bool LAYER_PAIR_SETTINGS::RemoveLayerPair( const LAYER_PAIR& aPair ) { bool ret = removeLayerPairInternal( aPair ); wxCommandEvent* evt = new wxCommandEvent( PCB_LAYER_PAIR_PRESETS_CHANGED, wxID_ANY ); QueueEvent( evt ); return ret; } std::span LAYER_PAIR_SETTINGS::GetLayerPairs() const { return m_pairs; } std::span LAYER_PAIR_SETTINGS::GetLayerPairs() { return m_pairs; } std::vector LAYER_PAIR_SETTINGS::GetEnabledLayerPairs( int& aCurrent ) const { std::vector enabledPairs; aCurrent = -1; if( m_lastManualPair ) { enabledPairs.emplace_back( LAYER_PAIR_INFO{ *m_lastManualPair, true, _( "Manual" ), } ); if( m_currentPair.HasSameLayers( *m_lastManualPair ) ) { aCurrent = 0; } } for( const LAYER_PAIR_INFO& pair : m_pairs ) { if( pair.IsEnabled() ) { enabledPairs.push_back( pair ); if( m_currentPair.HasSameLayers( pair.GetLayerPair() ) ) { aCurrent = enabledPairs.size() - 1; } } } return enabledPairs; } void LAYER_PAIR_SETTINGS::SetLayerPairs( std::span aPairs ) { // Replace all pairs with the given list m_pairs.clear(); for( const LAYER_PAIR_INFO& pair : aPairs ) { // Skip dupes and other addLayerPairInternal( pair ); } { wxCommandEvent* evt = new wxCommandEvent( PCB_LAYER_PAIR_PRESETS_CHANGED, wxID_ANY ); QueueEvent( evt ); } } void LAYER_PAIR_SETTINGS::SetCurrentLayerPair( const LAYER_PAIR& aPair ) { m_currentPair = aPair; if( !IsAnEnabledPreset( aPair, *this ) ) { m_lastManualPair = aPair; } wxCommandEvent* evt = new wxCommandEvent( PCB_CURRENT_LAYER_PAIR_CHANGED, wxID_ANY ); QueueEvent( evt ); }