PCB Editor: make locking menu items conditional

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/5202
This commit is contained in:
Mike Williams 2022-12-20 10:16:25 -05:00
parent 44ab6876d9
commit 5d94d2634e
5 changed files with 52 additions and 40 deletions

View File

@ -1114,24 +1114,12 @@ void FOOTPRINT_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) ); mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) );
mgr->SetConditions( ACTIONS::selectAll, ENABLE( cond.HasItems() ) ); mgr->SetConditions( ACTIONS::selectAll, ENABLE( cond.HasItems() ) );
auto haveAtLeastOneGroupCond =
[]( const SELECTION& aSel )
{
for( EDA_ITEM* item : aSel )
{
if( item->Type() == PCB_GROUP_T )
return true;
}
return false;
};
mgr->SetConditions( PCB_ACTIONS::rotateCw, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::rotateCw, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::rotateCcw, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::rotateCcw, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::mirrorH, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::mirrorH, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::mirrorV, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::mirrorV, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::MoreThan( 1 ) ) ); mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::MoreThan( 1 ) ) );
mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( haveAtLeastOneGroupCond ) ); mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( SELECTION_CONDITIONS::HasType( PCB_GROUP_T ) ) );
mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) );
mgr->SetConditions( PCB_ACTIONS::textOutlines, CHECK( !cond.TextFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::textOutlines, CHECK( !cond.TextFillDisplay() ) );

View File

@ -684,22 +684,10 @@ void PCB_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::doDelete, ENABLE( cond.HasItems() ) ); mgr->SetConditions( ACTIONS::doDelete, ENABLE( cond.HasItems() ) );
mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) ); mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) );
auto haveAtLeastOneGroupCond =
[]( const SELECTION& aSel )
{
for( EDA_ITEM* item : aSel )
{
if( item->Type() == PCB_GROUP_T )
return true;
}
return false;
};
mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::MoreThan( 1 ) ) ); mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::MoreThan( 1 ) ) );
mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( haveAtLeastOneGroupCond ) ); mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( SELECTION_CONDITIONS::HasType( PCB_GROUP_T ) ) );
mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( PCB_SELECTION_CONDITIONS::HasUnlockedItems ) );
mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( cond.HasItems() ) ); mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( PCB_SELECTION_CONDITIONS::HasLockedItems ) );
mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) );
mgr->SetConditions( PCB_ACTIONS::viaDisplayMode, CHECK( !cond.ViaFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::viaDisplayMode, CHECK( !cond.ViaFillDisplay() ) );

View File

@ -58,6 +58,7 @@
#include <tools/drawing_tool.h> #include <tools/drawing_tool.h>
#include <tools/pcb_actions.h> #include <tools/pcb_actions.h>
#include <tools/pcb_picker_tool.h> #include <tools/pcb_picker_tool.h>
#include <tools/pcb_selection_conditions.h>
#include <tools/pcb_selection_tool.h> #include <tools/pcb_selection_tool.h>
#include <tools/edit_tool.h> #include <tools/edit_tool.h>
#include <tools/tool_event_utils.h> #include <tools/tool_event_utils.h>
@ -106,23 +107,23 @@ protected:
}; };
class LOCK_CONTEXT_MENU : public ACTION_MENU class LOCK_CONTEXT_MENU : public CONDITIONAL_MENU
{ {
public: public:
LOCK_CONTEXT_MENU() : LOCK_CONTEXT_MENU( TOOL_INTERACTIVE* aTool ) :
ACTION_MENU( true ) CONDITIONAL_MENU( aTool )
{ {
SetIcon( BITMAPS::locked ); SetIcon( BITMAPS::locked );
SetTitle( _( "Locking" ) ); SetTitle( _( "Locking" ) );
Add( PCB_ACTIONS::lock ); AddItem( PCB_ACTIONS::lock, PCB_SELECTION_CONDITIONS::HasUnlockedItems );
Add( PCB_ACTIONS::unlock ); AddItem( PCB_ACTIONS::unlock, PCB_SELECTION_CONDITIONS::HasLockedItems );
Add( PCB_ACTIONS::toggleLock ); AddItem( PCB_ACTIONS::toggleLock, SELECTION_CONDITIONS::ShowAlways );
} }
ACTION_MENU* create() const override ACTION_MENU* create() const override
{ {
return new LOCK_CONTEXT_MENU(); return new LOCK_CONTEXT_MENU( this->m_tool );
} }
}; };
@ -193,8 +194,7 @@ bool BOARD_EDITOR_CONTROL::Init()
std::shared_ptr<ZONE_CONTEXT_MENU> zoneMenu = std::make_shared<ZONE_CONTEXT_MENU>(); std::shared_ptr<ZONE_CONTEXT_MENU> zoneMenu = std::make_shared<ZONE_CONTEXT_MENU>();
zoneMenu->SetTool( this ); zoneMenu->SetTool( this );
std::shared_ptr<LOCK_CONTEXT_MENU> lockMenu = std::make_shared<LOCK_CONTEXT_MENU>(); std::shared_ptr<LOCK_CONTEXT_MENU> lockMenu = std::make_shared<LOCK_CONTEXT_MENU>( this );
lockMenu->SetTool( this );
// Add the PCB control menus to relevant other tools // Add the PCB control menus to relevant other tools

View File

@ -43,6 +43,34 @@ SELECTION_CONDITION PCB_SELECTION_CONDITIONS::SameLayer()
} }
bool PCB_SELECTION_CONDITIONS::HasLockedItems( const SELECTION& aSelection )
{
for( EDA_ITEM* item : aSelection.Items() )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( boardItem && boardItem->IsLocked() )
return true;
}
return false;
}
bool PCB_SELECTION_CONDITIONS::HasUnlockedItems( const SELECTION& aSelection )
{
for( EDA_ITEM* item : aSelection.Items() )
{
BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( item );
if( boardItem && !boardItem->IsLocked() )
return true;
}
return false;
}
bool PCB_SELECTION_CONDITIONS::sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected ) bool PCB_SELECTION_CONDITIONS::sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected )
{ {
if( aSelection.Empty() ) if( aSelection.Empty() )
@ -107,5 +135,3 @@ bool PCB_SELECTION_CONDITIONS::sameLayerFunc( const SELECTION& aSelection )
return true; return true;
} }

View File

@ -56,6 +56,16 @@ public:
*/ */
static SELECTION_CONDITION SameLayer(); static SELECTION_CONDITION SameLayer();
/**
* Test if any selected items are locked.
*/
static bool HasLockedItems( const SELECTION& aSelection );
/**
* Test if any selected items are unlocked.
*/
static bool HasUnlockedItems( const SELECTION& aSelection );
private: private:
///< Helper function used by SameNet() ///< Helper function used by SameNet()
static bool sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected ); static bool sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected );