Special selection mode when in high-contrast with courtyard layer active.
Fixes https://gitlab.com/kicad/code/kicad/issues/13521
This commit is contained in:
parent
95fb3825bd
commit
362d85ef50
|
@ -254,7 +254,7 @@ public:
|
||||||
* @param aLayer The layer to test for.
|
* @param aLayer The layer to test for.
|
||||||
* @return true if on given layer, else false.
|
* @return true if on given layer, else false.
|
||||||
*/
|
*/
|
||||||
virtual bool IsOnLayer( PCB_LAYER_ID aLayer ) const
|
virtual bool IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards = false ) const
|
||||||
{
|
{
|
||||||
return m_layer == aLayer;
|
return m_layer == aLayer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ public:
|
||||||
PCB_GROUP* DeepDuplicate() const;
|
PCB_GROUP* DeepDuplicate() const;
|
||||||
|
|
||||||
///< @copydoc BOARD_ITEM::IsOnLayer
|
///< @copydoc BOARD_ITEM::IsOnLayer
|
||||||
bool IsOnLayer( PCB_LAYER_ID aLayer ) const override;
|
bool IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards = false ) const override;
|
||||||
|
|
||||||
///< @copydoc EDA_ITEM::HitTest
|
///< @copydoc EDA_ITEM::HitTest
|
||||||
bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
|
bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
|
||||||
|
|
|
@ -150,7 +150,7 @@ void PCB_BASE_EDIT_FRAME::ShowGraphicItemPropertiesDialog( BOARD_ITEM* aItem )
|
||||||
|
|
||||||
if( dlg.ShowQuasiModal() == wxID_OK )
|
if( dlg.ShowQuasiModal() == wxID_OK )
|
||||||
{
|
{
|
||||||
if( aItem->IsOnLayer( GetActiveLayer() ) )
|
if( aItem->IsOnLayer( GetActiveLayer(), true ) )
|
||||||
{
|
{
|
||||||
DRAWING_TOOL* drawingTool = m_toolManager->GetTool<DRAWING_TOOL>();
|
DRAWING_TOOL* drawingTool = m_toolManager->GetTool<DRAWING_TOOL>();
|
||||||
drawingTool->SetStroke( aItem->GetStroke(), GetActiveLayer() );
|
drawingTool->SetStroke( aItem->GetStroke(), GetActiveLayer() );
|
||||||
|
|
|
@ -1085,8 +1085,13 @@ void FOOTPRINT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_I
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT::IsOnLayer( PCB_LAYER_ID aLayer ) const
|
bool FOOTPRINT::IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards ) const
|
||||||
{
|
{
|
||||||
|
static const LSET courtyardLayers( 2, B_CrtYd, F_CrtYd );
|
||||||
|
|
||||||
|
if( aIncludeCourtyards && courtyardLayers[aLayer] )
|
||||||
|
return !GetCourtyard( aLayer ).IsEmpty();
|
||||||
|
|
||||||
// If we have any pads, fall back on normal checking
|
// If we have any pads, fall back on normal checking
|
||||||
if( !m_pads.empty() )
|
if( !m_pads.empty() )
|
||||||
return m_layer == aLayer;
|
return m_layer == aLayer;
|
||||||
|
|
|
@ -328,7 +328,7 @@ public:
|
||||||
* given layer, even if that layer is not one of the valid footprint layers F_Cu and B_Cu.
|
* given layer, even if that layer is not one of the valid footprint layers F_Cu and B_Cu.
|
||||||
* This allows selection of "graphic" footprints that contain only silkscreen, for example.
|
* This allows selection of "graphic" footprints that contain only silkscreen, for example.
|
||||||
*/
|
*/
|
||||||
bool IsOnLayer( PCB_LAYER_ID aLayer ) const override;
|
bool IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards = false ) const override;
|
||||||
|
|
||||||
// m_footprintStatus bits:
|
// m_footprintStatus bits:
|
||||||
#define FP_is_LOCKED 0x01 ///< footprint LOCKED: no autoplace allowed
|
#define FP_is_LOCKED 0x01 ///< footprint LOCKED: no autoplace allowed
|
||||||
|
|
|
@ -628,7 +628,7 @@ public:
|
||||||
|
|
||||||
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
|
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
|
||||||
|
|
||||||
bool IsOnLayer( PCB_LAYER_ID aLayer ) const override
|
bool IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards = false ) const override
|
||||||
{
|
{
|
||||||
return m_layerMask[aLayer];
|
return m_layerMask[aLayer];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1298,7 +1298,7 @@ void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer )
|
||||||
// as they won't be found in the view layer's itemset for re-painting.
|
// as they won't be found in the view layer's itemset for re-painting.
|
||||||
if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )
|
if( GetDisplayOptions().m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN )
|
||||||
{
|
{
|
||||||
if( item->IsOnLayer( oldLayer ) || item->IsOnLayer( aLayer ) )
|
if( item->IsOnLayer( oldLayer, true ) || item->IsOnLayer( aLayer, true ) )
|
||||||
return KIGFX::ALL;
|
return KIGFX::ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ static void existsOnLayerFunc( LIBEVAL::CONTEXT* aCtx, void *self )
|
||||||
{
|
{
|
||||||
anyMatch = true;
|
anyMatch = true;
|
||||||
|
|
||||||
if( item->IsOnLayer( ToLAYER_ID( entry.GetValue())))
|
if( item->IsOnLayer( ToLAYER_ID( entry.GetValue() ), true ) )
|
||||||
return 1.0;
|
return 1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -329,12 +329,12 @@ LSET PCB_GROUP::GetLayerSet() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PCB_GROUP::IsOnLayer( PCB_LAYER_ID aLayer ) const
|
bool PCB_GROUP::IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards ) const
|
||||||
{
|
{
|
||||||
// A group is on a layer if any item is on the layer
|
// A group is on a layer if any item is on the layer
|
||||||
for( BOARD_ITEM* item : m_items )
|
for( BOARD_ITEM* item : m_items )
|
||||||
{
|
{
|
||||||
if( item->IsOnLayer( aLayer ) )
|
if( item->IsOnLayer( aLayer, aIncludeCourtyards ) )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -482,7 +482,7 @@ int PCB_VIA::GetSolderMaskExpansion() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PCB_VIA::IsOnLayer( PCB_LAYER_ID aLayer ) const
|
bool PCB_VIA::IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards ) const
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
// Nice and simple, but raises its ugly head in performance profiles....
|
// Nice and simple, but raises its ugly head in performance profiles....
|
||||||
|
|
|
@ -404,7 +404,7 @@ public:
|
||||||
bool IsTented() const override;
|
bool IsTented() const override;
|
||||||
int GetSolderMaskExpansion() const;
|
int GetSolderMaskExpansion() const;
|
||||||
|
|
||||||
bool IsOnLayer( PCB_LAYER_ID aLayer ) const override;
|
bool IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards = false ) const override;
|
||||||
|
|
||||||
virtual LSET GetLayerSet() const override;
|
virtual LSET GetLayerSet() const override;
|
||||||
virtual void SetLayerSet( LSET aLayers ) override;
|
virtual void SetLayerSet( LSET aLayers ) override;
|
||||||
|
|
|
@ -2388,7 +2388,7 @@ bool PCB_SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibili
|
||||||
for( int layer : activeLayers )
|
for( int layer : activeLayers )
|
||||||
{
|
{
|
||||||
// NOTE: Only checking the regular layers (not GAL meta-layers)
|
// NOTE: Only checking the regular layers (not GAL meta-layers)
|
||||||
if( layer < PCB_LAYER_ID_COUNT && aItem->IsOnLayer( ToLAYER_ID( layer ) ) )
|
if( layer < PCB_LAYER_ID_COUNT && aItem->IsOnLayer( ToLAYER_ID( layer ), true ) )
|
||||||
{
|
{
|
||||||
onActiveLayer = true;
|
onActiveLayer = true;
|
||||||
break;
|
break;
|
||||||
|
@ -2897,19 +2897,21 @@ int PCB_SELECTION_TOOL::hitTestDistance( const wxPoint& aWhere, BOARD_ITEM* aIte
|
||||||
void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector,
|
void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector,
|
||||||
const VECTOR2I& aWhere ) const
|
const VECTOR2I& aWhere ) const
|
||||||
{
|
{
|
||||||
std::set<BOARD_ITEM*> preferred;
|
static const LSET silkLayers( 2, B_SilkS, F_SilkS );
|
||||||
std::set<BOARD_ITEM*> rejected;
|
static const LSET courtyardLayers( 2, B_CrtYd, F_CrtYd );
|
||||||
wxPoint where( aWhere.x, aWhere.y );
|
|
||||||
|
|
||||||
PCB_LAYER_ID activeLayer = m_frame->GetActiveLayer();
|
std::set<BOARD_ITEM*> preferred;
|
||||||
LSET silkLayers( 2, B_SilkS, F_SilkS );
|
std::set<BOARD_ITEM*> rejected;
|
||||||
|
wxPoint where( aWhere.x, aWhere.y );
|
||||||
|
const RENDER_SETTINGS* settings = getView()->GetPainter()->GetSettings();
|
||||||
|
PCB_LAYER_ID activeLayer = m_frame->GetActiveLayer();
|
||||||
|
|
||||||
if( silkLayers[activeLayer] )
|
if( silkLayers[activeLayer] )
|
||||||
{
|
{
|
||||||
for( int i = 0; i < aCollector.GetCount(); ++i )
|
for( int i = 0; i < aCollector.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
BOARD_ITEM* item = aCollector[i];
|
BOARD_ITEM* item = aCollector[i];
|
||||||
KICAD_T type = item->Type();
|
KICAD_T type = item->Type();
|
||||||
|
|
||||||
if( ( type == PCB_TEXT_T || type == PCB_TEXTBOX_T || type == PCB_SHAPE_T )
|
if( ( type == PCB_TEXT_T || type == PCB_TEXTBOX_T || type == PCB_SHAPE_T )
|
||||||
&& silkLayers[item->GetLayer()] )
|
&& silkLayers[item->GetLayer()] )
|
||||||
|
@ -2917,18 +2919,29 @@ void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector
|
||||||
preferred.insert( item );
|
preferred.insert( item );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if( preferred.size() > 0 )
|
else if( courtyardLayers[activeLayer] && settings->GetHighContrast() )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < aCollector.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
aCollector.Empty();
|
BOARD_ITEM* item = aCollector[i];
|
||||||
|
KICAD_T type = item->Type();
|
||||||
|
|
||||||
for( BOARD_ITEM* item : preferred )
|
if( type == PCB_FOOTPRINT_T )
|
||||||
aCollector.Append( item );
|
preferred.insert( item );
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( preferred.size() > 0 )
|
||||||
|
{
|
||||||
|
aCollector.Empty();
|
||||||
|
|
||||||
|
for( BOARD_ITEM* item : preferred )
|
||||||
|
aCollector.Append( item );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Prefer exact hits to sloppy ones
|
// Prefer exact hits to sloppy ones
|
||||||
constexpr int MAX_SLOP = 5;
|
constexpr int MAX_SLOP = 5;
|
||||||
|
|
||||||
|
|
|
@ -320,7 +320,7 @@ double ZONE::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ZONE::IsOnLayer( PCB_LAYER_ID aLayer ) const
|
bool ZONE::IsOnLayer( PCB_LAYER_ID aLayer, bool aIncludeCourtyards ) const
|
||||||
{
|
{
|
||||||
return m_layerSet.test( aLayer );
|
return m_layerSet.test( aLayer );
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -164,7 +164,7 @@ public:
|
||||||
// Return the first layer in GUI sequence.
|
// Return the first layer in GUI sequence.
|
||||||
PCB_LAYER_ID GetFirstLayer() const;
|
PCB_LAYER_ID GetFirstLayer() const;
|
||||||
|
|
||||||
virtual bool IsOnLayer( PCB_LAYER_ID ) const override;
|
virtual bool IsOnLayer( PCB_LAYER_ID, bool aIncludeCourtyards = false ) const override;
|
||||||
|
|
||||||
virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
|
virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue