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::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::rotateCcw, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::mirrorH, 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::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::textOutlines, CHECK( !cond.TextFillDisplay() ) );
@ -1294,4 +1282,4 @@ void FOOTPRINT_EDIT_FRAME::OnSaveFootprintAsPng( wxCommandEvent& event )
// to refresh the screen before creating the PNG or JPEG image from screen
wxYield();
SaveCanvasImageToFile( this, dlg.GetPath() );
}
}

View File

@ -684,22 +684,10 @@ void PCB_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::doDelete, 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::ungroup, ENABLE( haveAtLeastOneGroupCond ) );
mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( cond.HasItems() ) );
mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( SELECTION_CONDITIONS::HasType( PCB_GROUP_T ) ) );
mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( PCB_SELECTION_CONDITIONS::HasUnlockedItems ) );
mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( PCB_SELECTION_CONDITIONS::HasLockedItems ) );
mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) );
mgr->SetConditions( PCB_ACTIONS::viaDisplayMode, CHECK( !cond.ViaFillDisplay() ) );

View File

@ -58,6 +58,7 @@
#include <tools/drawing_tool.h>
#include <tools/pcb_actions.h>
#include <tools/pcb_picker_tool.h>
#include <tools/pcb_selection_conditions.h>
#include <tools/pcb_selection_tool.h>
#include <tools/edit_tool.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:
LOCK_CONTEXT_MENU() :
ACTION_MENU( true )
LOCK_CONTEXT_MENU( TOOL_INTERACTIVE* aTool ) :
CONDITIONAL_MENU( aTool )
{
SetIcon( BITMAPS::locked );
SetTitle( _( "Locking" ) );
Add( PCB_ACTIONS::lock );
Add( PCB_ACTIONS::unlock );
Add( PCB_ACTIONS::toggleLock );
AddItem( PCB_ACTIONS::lock, PCB_SELECTION_CONDITIONS::HasUnlockedItems );
AddItem( PCB_ACTIONS::unlock, PCB_SELECTION_CONDITIONS::HasLockedItems );
AddItem( PCB_ACTIONS::toggleLock, SELECTION_CONDITIONS::ShowAlways );
}
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>();
zoneMenu->SetTool( this );
std::shared_ptr<LOCK_CONTEXT_MENU> lockMenu = std::make_shared<LOCK_CONTEXT_MENU>();
lockMenu->SetTool( this );
std::shared_ptr<LOCK_CONTEXT_MENU> lockMenu = std::make_shared<LOCK_CONTEXT_MENU>( this );
// 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 )
{
if( aSelection.Empty() )
@ -107,5 +135,3 @@ bool PCB_SELECTION_CONDITIONS::sameLayerFunc( const SELECTION& aSelection )
return true;
}

View File

@ -56,6 +56,16 @@ public:
*/
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:
///< Helper function used by SameNet()
static bool sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected );