diff --git a/pcbnew/ratsnest_viewitem.cpp b/pcbnew/ratsnest_viewitem.cpp index 27d22b9790..39a09695a6 100644 --- a/pcbnew/ratsnest_viewitem.cpp +++ b/pcbnew/ratsnest_viewitem.cpp @@ -113,7 +113,18 @@ void RATSNEST_VIEWITEM::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const continue; bool enable = !sourceNode->GetNoLine() && !targetNode->GetNoLine(); - bool show = sourceNode->Parent()->GetLocalRatsnestVisible() || targetNode->Parent()->GetLocalRatsnestVisible(); + bool show; + + // If the ratsnest layer is currently enabled, the local ratsnest + // should be easy to turn off, so either element can disable it + // If the layer is off, the local ratsnest should be easy to turn on + // so either element can enable it. + if( sourceNode->Parent()->GetBoard()->IsElementVisible( LAYER_RATSNEST ) ) + show = sourceNode->Parent()->GetLocalRatsnestVisible() && + targetNode->Parent()->GetLocalRatsnestVisible(); + else + show = sourceNode->Parent()->GetLocalRatsnestVisible() || + targetNode->Parent()->GetLocalRatsnestVisible(); if ( enable && show ) { diff --git a/pcbnew/tool_pcb_editor.cpp b/pcbnew/tool_pcb_editor.cpp index be222bbeca..cf0180c6d4 100644 --- a/pcbnew/tool_pcb_editor.cpp +++ b/pcbnew/tool_pcb_editor.cpp @@ -768,7 +768,7 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) case ID_TB_OPTIONS_SHOW_RATSNEST: SetElementVisibility( LAYER_RATSNEST, state ); - OnModify(); + PCB_BASE_FRAME::OnModify(); Compile_Ratsnest( NULL, true ); if( IsGalCanvasActive() ) diff --git a/pcbnew/tools/pcb_editor_control.cpp b/pcbnew/tools/pcb_editor_control.cpp index 0ecb699bf2..89604ae306 100644 --- a/pcbnew/tools/pcb_editor_control.cpp +++ b/pcbnew/tools/pcb_editor_control.cpp @@ -1089,25 +1089,22 @@ static bool showLocalRatsnest( TOOL_MANAGER* aToolMgr, BOARD* aBoard, const VECT for( auto mod : modules ) { for( auto pad : mod->Pads() ) - { - pad->SetLocalRatsnestVisible( false ); - } + pad->SetLocalRatsnestVisible( aBoard->IsElementVisible( LAYER_RATSNEST ) ); } - - return true; } - - for( auto item : selection ) + else { - if( item->Type() == PCB_MODULE_T ) + for( auto item : selection ) { - for( auto pad : static_cast (item)->Pads() ) + if( auto mod = dyn_cast(item) ) { - pad->SetLocalRatsnestVisible( !pad->GetLocalRatsnestVisible() ); + for( auto pad : mod->Pads() ) + pad->SetLocalRatsnestVisible( !pad->GetLocalRatsnestVisible() ); } } } + aToolMgr->GetView()->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); return true; }