From d91e744f0f76f6e0d2584e83f5b3e2dc9974394a Mon Sep 17 00:00:00 2001 From: jean-pierre charras <jp.charras@wanadoo.fr> Date: Wed, 7 Feb 2024 10:49:24 +0100 Subject: [PATCH] Gerbview: fix incorrect layer visibility settings after removing the current layer --- gerbview/gerbview_frame.cpp | 38 ++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 47c0807911..9b5923eb66 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -550,14 +550,21 @@ void GERBVIEW_FRAME::SortLayersByX2Attributes() void GERBVIEW_FRAME::RemapLayers( const std::unordered_map<int, int>& remapping ) { - std::unordered_map<int, bool> oldVisibility; - LSET newVisibility; + // Save the visibility of each existing gerber layer, in order to be able + // to restore this visibility after layer reorder. + for( int currlayer = GERBER_DRAWLAYERS_COUNT-1; currlayer >= 0; --currlayer ) + { + GERBER_FILE_IMAGE* gerber = GetImagesList()->GetGbrImage( currlayer ); - for( const std::pair<const int, int>& entry : remapping ) - oldVisibility[ entry.second ] = IsLayerVisible( entry.second ); + if( gerber ) + { + if( IsLayerVisible( currlayer ) ) + gerber->SetFlags( CANDIDATE ); + else + gerber->ClearFlags( CANDIDATE ); + } - for( const std::pair<const int, int>& entry : remapping ) - newVisibility.set( entry.first, oldVisibility[ entry.second ] ); + } std::unordered_map<int, int> view_remapping; @@ -569,7 +576,24 @@ void GERBVIEW_FRAME::RemapLayers( const std::unordered_map<int, int>& remapping GetCanvas()->GetView()->ReorderLayerData( view_remapping ); + // Restore visibility options + LSET newVisibility; + + for( int currlayer = GERBER_DRAWLAYERS_COUNT-1; currlayer >= 0; --currlayer ) + { + GERBER_FILE_IMAGE* gerber = GetImagesList()->GetGbrImage( currlayer ); + + if( gerber ) + { + if( gerber->HasFlag( CANDIDATE ) ) + newVisibility.set( currlayer ); + + gerber->ClearFlags( CANDIDATE ); + } + } + SetVisibleLayers( newVisibility ); + ReFillLayerWidget(); syncLayerBox( true ); GetCanvas()->Refresh();