Move the router tools to a TOOL_MENU context menu
The previous way of displaying a context menu was being usurped by the selection tool because it was displaying its menu before DispatchContextMenu was called, and all other tools explictly use the TOOL_MENU system. Fixes https://gitlab.com/kicad/code/kicad/issues/5762
This commit is contained in:
parent
1319885285
commit
672756a018
|
@ -102,40 +102,32 @@ LENGTH_TUNER_TOOL::LENGTH_TUNER_TOOL() :
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class TUNER_TOOL_MENU : public ACTION_MENU
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TUNER_TOOL_MENU() :
|
|
||||||
ACTION_MENU( true )
|
|
||||||
{
|
|
||||||
SetTitle( _( "Length Tuner" ) );
|
|
||||||
SetIcon( router_len_tuner_xpm );
|
|
||||||
DisplayTitle( true );
|
|
||||||
|
|
||||||
Add( ACTIONS::cancelInteractive );
|
|
||||||
|
|
||||||
AppendSeparator();
|
|
||||||
|
|
||||||
Add( ACT_SpacingIncrease );
|
|
||||||
Add( ACT_SpacingDecrease );
|
|
||||||
Add( ACT_AmplIncrease );
|
|
||||||
Add( ACT_AmplDecrease );
|
|
||||||
Add( ACT_Settings );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
ACTION_MENU* create() const override
|
|
||||||
{
|
|
||||||
return new TUNER_TOOL_MENU();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
LENGTH_TUNER_TOOL::~LENGTH_TUNER_TOOL()
|
LENGTH_TUNER_TOOL::~LENGTH_TUNER_TOOL()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool LENGTH_TUNER_TOOL::Init()
|
||||||
|
{
|
||||||
|
auto& menu = m_menu.GetMenu();
|
||||||
|
|
||||||
|
menu.SetTitle( _( "Length Tuner" ) );
|
||||||
|
menu.SetIcon( router_len_tuner_xpm );
|
||||||
|
menu.DisplayTitle( true );
|
||||||
|
|
||||||
|
menu.AddItem( ACTIONS::cancelInteractive, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
menu.AddSeparator();
|
||||||
|
|
||||||
|
menu.AddItem( ACT_SpacingIncrease, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_SpacingDecrease, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_AmplIncrease, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_AmplDecrease, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_Settings, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason )
|
void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason )
|
||||||
{
|
{
|
||||||
if( aReason == RUN )
|
if( aReason == RUN )
|
||||||
|
@ -194,7 +186,9 @@ void LENGTH_TUNER_TOOL::performTuning()
|
||||||
frame()->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
frame()->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
|
||||||
|
|
||||||
if( evt->IsCancelInteractive() || evt->IsActivate() )
|
if( evt->IsCancelInteractive() || evt->IsActivate() )
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
else if( evt->IsMotion() )
|
else if( evt->IsMotion() )
|
||||||
{
|
{
|
||||||
end = evt->Position();
|
end = evt->Position();
|
||||||
|
@ -206,6 +200,10 @@ void LENGTH_TUNER_TOOL::performTuning()
|
||||||
if( m_router->FixRoute( evt->Position(), NULL ) )
|
if( m_router->FixRoute( evt->Position(), NULL ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if( evt->IsClick( BUT_RIGHT ) )
|
||||||
|
{
|
||||||
|
m_menu.ShowContextMenu( selection() );
|
||||||
|
}
|
||||||
else if( evt->IsAction( &ACT_EndTuning ) )
|
else if( evt->IsAction( &ACT_EndTuning ) )
|
||||||
{
|
{
|
||||||
if( m_router->FixRoute( end, NULL ) )
|
if( m_router->FixRoute( end, NULL ) )
|
||||||
|
@ -273,9 +271,6 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
controls()->ShowCursor( true );
|
controls()->ShowCursor( true );
|
||||||
frame()->UndoRedoBlock( true );
|
frame()->UndoRedoBlock( true );
|
||||||
|
|
||||||
std::unique_ptr<TUNER_TOOL_MENU> ctxMenu( new TUNER_TOOL_MENU );
|
|
||||||
SetContextMenu( ctxMenu.get() );
|
|
||||||
|
|
||||||
// Main loop: keep receiving events
|
// Main loop: keep receiving events
|
||||||
while( TOOL_EVENT* evt = Wait() )
|
while( TOOL_EVENT* evt = Wait() )
|
||||||
{
|
{
|
||||||
|
@ -299,6 +294,10 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
TOOL_EVENT dummy;
|
TOOL_EVENT dummy;
|
||||||
meanderSettingsDialog( dummy );
|
meanderSettingsDialog( dummy );
|
||||||
}
|
}
|
||||||
|
else if( evt->IsClick( BUT_RIGHT ) )
|
||||||
|
{
|
||||||
|
m_menu.ShowContextMenu( selection() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
frame()->UndoRedoBlock( false );
|
frame()->UndoRedoBlock( false );
|
||||||
|
|
|
@ -34,6 +34,9 @@ public:
|
||||||
LENGTH_TUNER_TOOL();
|
LENGTH_TUNER_TOOL();
|
||||||
~LENGTH_TUNER_TOOL();
|
~LENGTH_TUNER_TOOL();
|
||||||
|
|
||||||
|
/// @copydoc TOOL_BASE::Init()
|
||||||
|
bool Init() override;
|
||||||
|
|
||||||
void Reset( RESET_REASON aReason ) override;
|
void Reset( RESET_REASON aReason ) override;
|
||||||
|
|
||||||
int MainLoop( const TOOL_EVENT& aEvent );
|
int MainLoop( const TOOL_EVENT& aEvent );
|
||||||
|
|
|
@ -37,8 +37,7 @@ using namespace std::placeholders;
|
||||||
#include <bitmaps.h>
|
#include <bitmaps.h>
|
||||||
#include <tool/action_menu.h>
|
#include <tool/action_menu.h>
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
#include <tool/grid_menu.h>
|
#include <tool/tool_menu.h>
|
||||||
#include <tool/zoom_menu.h>
|
|
||||||
#include <tools/pcb_actions.h>
|
#include <tools/pcb_actions.h>
|
||||||
#include <tools/selection_tool.h>
|
#include <tools/selection_tool.h>
|
||||||
#include <tools/grid_helper.h>
|
#include <tools/grid_helper.h>
|
||||||
|
@ -384,68 +383,6 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class ROUTER_TOOL_MENU : public ACTION_MENU
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ROUTER_TOOL_MENU( PCB_EDIT_FRAME& aFrame, PNS::ROUTER_MODE aMode ) :
|
|
||||||
ACTION_MENU( true ),
|
|
||||||
m_frame( aFrame ), m_mode( aMode ), m_trackViaMenu( aFrame ), m_diffPairMenu( aFrame ),
|
|
||||||
m_zoomMenu( &aFrame ), m_gridMenu( &aFrame )
|
|
||||||
{
|
|
||||||
SetTitle( _( "Interactive Router" ) );
|
|
||||||
|
|
||||||
Add( ACTIONS::cancelInteractive );
|
|
||||||
|
|
||||||
AppendSeparator();
|
|
||||||
|
|
||||||
Add( PCB_ACTIONS::routeSingleTrack );
|
|
||||||
Add( PCB_ACTIONS::routeDiffPair );
|
|
||||||
Add( ACT_EndTrack );
|
|
||||||
Add( ACT_UndoLastSegment );
|
|
||||||
Add( PCB_ACTIONS::breakTrack );
|
|
||||||
|
|
||||||
Add( PCB_ACTIONS::drag45Degree );
|
|
||||||
Add( PCB_ACTIONS::dragFreeAngle );
|
|
||||||
|
|
||||||
// Add( ACT_AutoEndRoute ); // fixme: not implemented yet. Sorry.
|
|
||||||
Add( ACT_PlaceThroughVia );
|
|
||||||
Add( ACT_PlaceBlindVia );
|
|
||||||
Add( ACT_PlaceMicroVia );
|
|
||||||
Add( ACT_SelLayerAndPlaceThroughVia );
|
|
||||||
Add( ACT_SelLayerAndPlaceBlindVia );
|
|
||||||
Add( ACT_SwitchPosture );
|
|
||||||
Add( ACT_SwitchRounding );
|
|
||||||
|
|
||||||
AppendSeparator();
|
|
||||||
|
|
||||||
Add( &m_trackViaMenu );
|
|
||||||
|
|
||||||
if( m_mode == PNS::PNS_MODE_ROUTE_DIFF_PAIR )
|
|
||||||
Add( &m_diffPairMenu );
|
|
||||||
|
|
||||||
Add( PCB_ACTIONS::routerSettingsDialog );
|
|
||||||
|
|
||||||
AppendSeparator();
|
|
||||||
|
|
||||||
Add( &m_zoomMenu );
|
|
||||||
Add( &m_gridMenu );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
ACTION_MENU* create() const override
|
|
||||||
{
|
|
||||||
return new ROUTER_TOOL_MENU( m_frame, m_mode );
|
|
||||||
}
|
|
||||||
|
|
||||||
PCB_EDIT_FRAME& m_frame;
|
|
||||||
PNS::ROUTER_MODE m_mode;
|
|
||||||
TRACK_WIDTH_MENU m_trackViaMenu;
|
|
||||||
DIFF_PAIR_MENU m_diffPairMenu;
|
|
||||||
ZOOM_MENU m_zoomMenu;
|
|
||||||
GRID_MENU m_gridMenu;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
ROUTER_TOOL::~ROUTER_TOOL()
|
ROUTER_TOOL::~ROUTER_TOOL()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -453,6 +390,60 @@ ROUTER_TOOL::~ROUTER_TOOL()
|
||||||
|
|
||||||
bool ROUTER_TOOL::Init()
|
bool ROUTER_TOOL::Init()
|
||||||
{
|
{
|
||||||
|
PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();
|
||||||
|
|
||||||
|
wxASSERT( frame );
|
||||||
|
|
||||||
|
auto& menu = m_menu.GetMenu();
|
||||||
|
menu.SetTitle( _( "Interactive Router" ) );
|
||||||
|
|
||||||
|
auto trackViaMenu = std::make_shared<TRACK_WIDTH_MENU>( *frame );
|
||||||
|
trackViaMenu->SetTool( this );
|
||||||
|
m_menu.AddSubMenu( trackViaMenu );
|
||||||
|
|
||||||
|
auto diffPairMenu = std::make_shared<DIFF_PAIR_MENU>( *frame );
|
||||||
|
diffPairMenu->SetTool( this );
|
||||||
|
m_menu.AddSubMenu( diffPairMenu );
|
||||||
|
|
||||||
|
menu.AddItem( ACTIONS::cancelInteractive, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
menu.AddSeparator();
|
||||||
|
|
||||||
|
menu.AddItem( PCB_ACTIONS::routeSingleTrack, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( PCB_ACTIONS::routeDiffPair, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_EndTrack, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_UndoLastSegment, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( PCB_ACTIONS::breakTrack, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
menu.AddItem( PCB_ACTIONS::drag45Degree, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( PCB_ACTIONS::dragFreeAngle, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
// Add( ACT_AutoEndRoute ); // fixme: not implemented yet. Sorry.
|
||||||
|
menu.AddItem( ACT_PlaceThroughVia, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_PlaceBlindVia, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_PlaceMicroVia, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_SelLayerAndPlaceThroughVia, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_SelLayerAndPlaceBlindVia, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_SwitchPosture, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
menu.AddItem( ACT_SwitchRounding, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
menu.AddSeparator();
|
||||||
|
|
||||||
|
auto diffPairCond =
|
||||||
|
[this]( const SELECTION& )
|
||||||
|
{
|
||||||
|
return m_router->Mode() == PNS::PNS_MODE_ROUTE_DIFF_PAIR;
|
||||||
|
};
|
||||||
|
|
||||||
|
menu.AddMenu( trackViaMenu.get(), SELECTION_CONDITIONS::NotEmpty );
|
||||||
|
menu.AddMenu( diffPairMenu.get(), diffPairCond );
|
||||||
|
|
||||||
|
menu.AddItem( PCB_ACTIONS::routerSettingsDialog, SELECTION_CONDITIONS::ShowAlways );
|
||||||
|
|
||||||
|
menu.AddSeparator( 1 );
|
||||||
|
|
||||||
|
frame->AddStandardSubMenus( m_menu );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +467,7 @@ void ROUTER_TOOL::handleCommonEvents( const TOOL_EVENT& aEvent )
|
||||||
auto logger = m_router->Logger();
|
auto logger = m_router->Logger();
|
||||||
if( ! logger )
|
if( ! logger )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FILE *f = fopen("/tmp/pns.log", "wb");
|
FILE *f = fopen("/tmp/pns.log", "wb");
|
||||||
wxLogTrace( "PNS", "saving drag/route log...\n" );
|
wxLogTrace( "PNS", "saving drag/route log...\n" );
|
||||||
|
|
||||||
|
@ -1007,6 +998,10 @@ void ROUTER_TOOL::performRouting()
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if( evt->IsClick( BUT_RIGHT ) )
|
||||||
|
{
|
||||||
|
m_menu.ShowContextMenu( selection() );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
evt->SetPassEvent();
|
evt->SetPassEvent();
|
||||||
|
@ -1094,9 +1089,6 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
m_cancelled = false;
|
m_cancelled = false;
|
||||||
m_startSnapPoint = ctls->GetCursorPosition();
|
m_startSnapPoint = ctls->GetCursorPosition();
|
||||||
|
|
||||||
std::unique_ptr<ROUTER_TOOL_MENU> ctxMenu( new ROUTER_TOOL_MENU( *frame, mode ) );
|
|
||||||
SetContextMenu( ctxMenu.get() );
|
|
||||||
|
|
||||||
// Prime the pump
|
// Prime the pump
|
||||||
if( aEvent.HasPosition() )
|
if( aEvent.HasPosition() )
|
||||||
m_toolMgr->PrimeTool( m_startSnapPoint );
|
m_toolMgr->PrimeTool( m_startSnapPoint );
|
||||||
|
@ -1187,6 +1179,10 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
// pass the event.
|
// pass the event.
|
||||||
evt->SetPassEvent();
|
evt->SetPassEvent();
|
||||||
}
|
}
|
||||||
|
else if( evt->IsClick( BUT_RIGHT ) )
|
||||||
|
{
|
||||||
|
m_menu.ShowContextMenu( selection() );
|
||||||
|
}
|
||||||
|
|
||||||
if( m_cancelled )
|
if( m_cancelled )
|
||||||
{
|
{
|
||||||
|
@ -1195,8 +1191,6 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetContextMenu( nullptr );
|
|
||||||
|
|
||||||
// Store routing settings till the next invocation
|
// Store routing settings till the next invocation
|
||||||
m_savedSizes = m_router->Sizes();
|
m_savedSizes = m_router->Sizes();
|
||||||
|
|
||||||
|
@ -1245,6 +1239,10 @@ void ROUTER_TOOL::performDragging( int aMode )
|
||||||
if( m_router->FixRoute( m_endSnapPoint, m_endItem ) )
|
if( m_router->FixRoute( m_endSnapPoint, m_endItem ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if( evt->IsClick( BUT_RIGHT ) )
|
||||||
|
{
|
||||||
|
m_menu.ShowContextMenu( selection() );
|
||||||
|
}
|
||||||
else if( evt->IsCancelInteractive() || evt->IsActivate() || evt->IsUndoRedo() )
|
else if( evt->IsCancelInteractive() || evt->IsActivate() || evt->IsUndoRedo() )
|
||||||
{
|
{
|
||||||
if( evt->IsCancelInteractive() && !m_startItem )
|
if( evt->IsCancelInteractive() && !m_startItem )
|
||||||
|
|
Loading…
Reference in New Issue