Browse Source

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
pull/16/head
Ian McInerney 5 years ago
parent
commit
672756a018
  1. 55
      pcbnew/router/length_tuner_tool.cpp
  2. 3
      pcbnew/router/length_tuner_tool.h
  3. 118
      pcbnew/router/router_tool.cpp

55
pcbnew/router/length_tuner_tool.cpp

@ -102,39 +102,31 @@ LENGTH_TUNER_TOOL::LENGTH_TUNER_TOOL() :
}
class TUNER_TOOL_MENU : public ACTION_MENU
LENGTH_TUNER_TOOL::~LENGTH_TUNER_TOOL()
{
public:
TUNER_TOOL_MENU() :
ACTION_MENU( true )
{
SetTitle( _( "Length Tuner" ) );
SetIcon( router_len_tuner_xpm );
DisplayTitle( true );
}
Add( ACTIONS::cancelInteractive );
AppendSeparator();
bool LENGTH_TUNER_TOOL::Init()
{
auto& menu = m_menu.GetMenu();
Add( ACT_SpacingIncrease );
Add( ACT_SpacingDecrease );
Add( ACT_AmplIncrease );
Add( ACT_AmplDecrease );
Add( ACT_Settings );
}
menu.SetTitle( _( "Length Tuner" ) );
menu.SetIcon( router_len_tuner_xpm );
menu.DisplayTitle( true );
private:
ACTION_MENU* create() const override
{
return new TUNER_TOOL_MENU();
}
};
menu.AddItem( ACTIONS::cancelInteractive, SELECTION_CONDITIONS::ShowAlways );
menu.AddSeparator();
LENGTH_TUNER_TOOL::~LENGTH_TUNER_TOOL()
{
}
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 )
{
@ -194,7 +186,9 @@ void LENGTH_TUNER_TOOL::performTuning()
frame()->GetCanvas()->SetCurrentCursor( wxCURSOR_ARROW );
if( evt->IsCancelInteractive() || evt->IsActivate() )
{
break;
}
else if( evt->IsMotion() )
{
end = evt->Position();
@ -206,6 +200,10 @@ void LENGTH_TUNER_TOOL::performTuning()
if( m_router->FixRoute( evt->Position(), NULL ) )
break;
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
}
else if( evt->IsAction( &ACT_EndTuning ) )
{
if( m_router->FixRoute( end, NULL ) )
@ -273,9 +271,6 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
controls()->ShowCursor( true );
frame()->UndoRedoBlock( true );
std::unique_ptr<TUNER_TOOL_MENU> ctxMenu( new TUNER_TOOL_MENU );
SetContextMenu( ctxMenu.get() );
// Main loop: keep receiving events
while( TOOL_EVENT* evt = Wait() )
{
@ -299,6 +294,10 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
TOOL_EVENT dummy;
meanderSettingsDialog( dummy );
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
}
}
frame()->UndoRedoBlock( false );

3
pcbnew/router/length_tuner_tool.h

@ -34,6 +34,9 @@ public:
LENGTH_TUNER_TOOL();
~LENGTH_TUNER_TOOL();
/// @copydoc TOOL_BASE::Init()
bool Init() override;
void Reset( RESET_REASON aReason ) override;
int MainLoop( const TOOL_EVENT& aEvent );

118
pcbnew/router/router_tool.cpp

@ -37,8 +37,7 @@ using namespace std::placeholders;
#include <bitmaps.h>
#include <tool/action_menu.h>
#include <tool/tool_manager.h>
#include <tool/grid_menu.h>
#include <tool/zoom_menu.h>
#include <tool/tool_menu.h>
#include <tools/pcb_actions.h>
#include <tools/selection_tool.h>
#include <tools/grid_helper.h>
@ -384,75 +383,67 @@ private:
};
class ROUTER_TOOL_MENU : public ACTION_MENU
ROUTER_TOOL::~ROUTER_TOOL()
{
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();
bool ROUTER_TOOL::Init()
{
PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();
Add( PCB_ACTIONS::routeSingleTrack );
Add( PCB_ACTIONS::routeDiffPair );
Add( ACT_EndTrack );
Add( ACT_UndoLastSegment );
Add( PCB_ACTIONS::breakTrack );
wxASSERT( frame );
Add( PCB_ACTIONS::drag45Degree );
Add( PCB_ACTIONS::dragFreeAngle );
auto& menu = m_menu.GetMenu();
menu.SetTitle( _( "Interactive Router" ) );
// 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 );
auto trackViaMenu = std::make_shared<TRACK_WIDTH_MENU>( *frame );
trackViaMenu->SetTool( this );
m_menu.AddSubMenu( trackViaMenu );
AppendSeparator();
Add( &m_trackViaMenu );
auto diffPairMenu = std::make_shared<DIFF_PAIR_MENU>( *frame );
diffPairMenu->SetTool( this );
m_menu.AddSubMenu( diffPairMenu );
if( m_mode == PNS::PNS_MODE_ROUTE_DIFF_PAIR )
Add( &m_diffPairMenu );
menu.AddItem( ACTIONS::cancelInteractive, SELECTION_CONDITIONS::ShowAlways );
Add( PCB_ACTIONS::routerSettingsDialog );
menu.AddSeparator();
AppendSeparator();
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 );
Add( &m_zoomMenu );
Add( &m_gridMenu );
}
menu.AddItem( PCB_ACTIONS::drag45Degree, SELECTION_CONDITIONS::ShowAlways );
menu.AddItem( PCB_ACTIONS::dragFreeAngle, SELECTION_CONDITIONS::ShowAlways );
private:
ACTION_MENU* create() const override
{
return new ROUTER_TOOL_MENU( m_frame, m_mode );
}
// 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;
};
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;
};
menu.AddMenu( trackViaMenu.get(), SELECTION_CONDITIONS::NotEmpty );
menu.AddMenu( diffPairMenu.get(), diffPairCond );
menu.AddItem( PCB_ACTIONS::routerSettingsDialog, SELECTION_CONDITIONS::ShowAlways );
ROUTER_TOOL::~ROUTER_TOOL()
{
}
menu.AddSeparator( 1 );
frame->AddStandardSubMenus( m_menu );
bool ROUTER_TOOL::Init()
{
return true;
}
@ -476,7 +467,7 @@ void ROUTER_TOOL::handleCommonEvents( const TOOL_EVENT& aEvent )
auto logger = m_router->Logger();
if( ! logger )
return;
FILE *f = fopen("/tmp/pns.log", "wb");
wxLogTrace( "PNS", "saving drag/route log...\n" );
@ -1007,6 +998,10 @@ void ROUTER_TOOL::performRouting()
break;
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
}
else
{
evt->SetPassEvent();
@ -1094,9 +1089,6 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
m_cancelled = false;
m_startSnapPoint = ctls->GetCursorPosition();
std::unique_ptr<ROUTER_TOOL_MENU> ctxMenu( new ROUTER_TOOL_MENU( *frame, mode ) );
SetContextMenu( ctxMenu.get() );
// Prime the pump
if( aEvent.HasPosition() )
m_toolMgr->PrimeTool( m_startSnapPoint );
@ -1187,6 +1179,10 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
// pass the event.
evt->SetPassEvent();
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
}
if( m_cancelled )
{
@ -1195,8 +1191,6 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
}
}
SetContextMenu( nullptr );
// Store routing settings till the next invocation
m_savedSizes = m_router->Sizes();
@ -1245,6 +1239,10 @@ void ROUTER_TOOL::performDragging( int aMode )
if( m_router->FixRoute( m_endSnapPoint, m_endItem ) )
break;
}
else if( evt->IsClick( BUT_RIGHT ) )
{
m_menu.ShowContextMenu( selection() );
}
else if( evt->IsCancelInteractive() || evt->IsActivate() || evt->IsUndoRedo() )
{
if( evt->IsCancelInteractive() && !m_startItem )

Loading…
Cancel
Save