From 2da7199a3726baf35b59af4be57ba60e819f0d8e Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Sat, 3 Mar 2018 23:43:16 -0500 Subject: [PATCH] GerbView: Fix active layer synchronization --- gerbview/events_called_functions.cpp | 10 +--------- gerbview/files.cpp | 5 ++++- gerbview/gbr_layout.cpp | 2 +- gerbview/gerbview_draw_panel_gal.cpp | 2 +- gerbview/gerbview_frame.cpp | 5 ----- gerbview/gerbview_layer_widget.cpp | 30 ++++++++++++++++++---------- gerbview/hotkeys.cpp | 6 ++---- 7 files changed, 28 insertions(+), 32 deletions(-) diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp index 3d1d0ae79e..900dfc9594 100644 --- a/gerbview/events_called_functions.cpp +++ b/gerbview/events_called_functions.cpp @@ -351,15 +351,7 @@ void GERBVIEW_FRAME::OnSelectActiveDCode( wxCommandEvent& event ) void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event ) { - int layer = GetActiveLayer(); - - SetActiveLayer( event.GetSelection() ); - - if( layer != GetActiveLayer() ) - { - if( m_LayersManager->OnLayerSelected() ) - m_canvas->Refresh(); - } + SetActiveLayer( event.GetSelection(), true ); } diff --git a/gerbview/files.cpp b/gerbview/files.cpp index 2ed1945db4..66a284d3c4 100644 --- a/gerbview/files.cpp +++ b/gerbview/files.cpp @@ -231,6 +231,7 @@ bool GERBVIEW_FRAME::loadListOfGerberFiles( const wxString& aPath, // Read gerber files: each file is loaded on a new GerbView layer bool success = true; int layer = GetActiveLayer(); + int first_layer = layer; int visibility = GetVisibleLayers(); // Manage errors when loading files @@ -314,10 +315,12 @@ bool GERBVIEW_FRAME::loadListOfGerberFiles( const wxString& aPath, // Synchronize layers tools with actual active layer: ReFillLayerWidget(); - SetActiveLayer( GetActiveLayer() ); + SetActiveLayer( first_layer, true ); m_LayersManager->UpdateLayerIcons(); syncLayerBox( true ); + GetGalCanvas()->Refresh(); + return success; } diff --git a/gerbview/gbr_layout.cpp b/gerbview/gbr_layout.cpp index 6a6d25dac3..1bb9f21f56 100644 --- a/gerbview/gbr_layout.cpp +++ b/gerbview/gbr_layout.cpp @@ -208,7 +208,7 @@ void GBR_LAYOUT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, if( aDisplayOptions->m_IsPrinting ) gerber->m_IsVisible = IsLayerPrintable( layer ); else - gerber->m_IsVisible = gerbFrame->IsLayerVisible( GERBER_DRAW_LAYER( layer ) ); + gerber->m_IsVisible = gerbFrame->IsLayerVisible( layer ); if( !gerber->m_IsVisible ) continue; diff --git a/gerbview/gerbview_draw_panel_gal.cpp b/gerbview/gerbview_draw_panel_gal.cpp index bc25a5879e..033d2dd4a7 100644 --- a/gerbview/gerbview_draw_panel_gal.cpp +++ b/gerbview/gerbview_draw_panel_gal.cpp @@ -147,7 +147,7 @@ void GERBVIEW_DRAW_PANEL_GAL::SetTopLayer( int aLayer ) for( int i = 0; i < GERBER_DRAWLAYERS_COUNT; ++i ) { m_view->SetLayerOrder( GERBER_DCODE_LAYER( GERBER_DRAW_LAYER( i ) ), 2 * i ); - m_view->SetLayerOrder( i, ( 2 * i ) + 1 ); + m_view->SetLayerOrder( GERBER_DRAW_LAYER( i ), ( 2 * i ) + 1 ); } m_view->SetTopLayer( aLayer ); diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 26babda318..c52abfe8ba 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -814,12 +814,7 @@ void GERBVIEW_FRAME::SetVisibleLayers( long aLayerMask ) bool GERBVIEW_FRAME::IsLayerVisible( int aLayer ) const { if( ! m_DisplayOptions.m_IsPrinting ) - { - if( IsGalCanvasActive() ) - aLayer = GERBER_DRAW_LAYER( aLayer ); - return m_LayersManager->IsLayerVisible( aLayer ); - } else return GetGerberLayout()->IsLayerPrintable( aLayer ); } diff --git a/gerbview/gerbview_layer_widget.cpp b/gerbview/gerbview_layer_widget.cpp index 1e2b8a9e2c..8f04c5412a 100644 --- a/gerbview/gerbview_layer_widget.cpp +++ b/gerbview/gerbview_layer_widget.cpp @@ -195,7 +195,7 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event ) bool loc_visible = visible; if( force_active_layer_visible && - (layer == GERBER_DRAW_LAYER( myframe->GetActiveLayer() ) ) ) + (layer == myframe->GetActiveLayer() ) ) { loc_visible = true; } @@ -243,6 +243,7 @@ void GERBER_LAYER_WIDGET::ReFill() wxString msg = GetImagesList()->GetDisplayName( layer ); bool visible = true; + if( auto canvas = myframe->GetGalCanvas() ) { visible = canvas->GetView()->IsLayerVisible( GERBER_DRAW_LAYER( layer ) ); @@ -252,7 +253,7 @@ void GERBER_LAYER_WIDGET::ReFill() visible = myframe->IsLayerVisible( layer ); } - AppendLayerRow( LAYER_WIDGET::ROW( msg, GERBER_DRAW_LAYER( layer ), + AppendLayerRow( LAYER_WIDGET::ROW( msg, layer, myframe->GetLayerColor( GERBER_DRAW_LAYER( layer ) ), wxEmptyString, visible, true ) ); } @@ -267,32 +268,36 @@ void GERBER_LAYER_WIDGET::OnLayerRightClick( wxMenu& aMenu ) AddRightClickMenuItems( &aMenu ); } + void GERBER_LAYER_WIDGET::OnLayerColorChange( int aLayer, COLOR4D aColor ) { - myframe->SetLayerColor( aLayer, aColor ); + // NOTE: Active layer in GerbView is stored as 0-indexed, but layer color is + // stored according to the GERBER_DRAW_LAYER() offset. + + myframe->SetLayerColor( GERBER_DRAW_LAYER( aLayer ), aColor ); myframe->m_SelLayerBox->ResyncBitmapOnly(); if( myframe->IsGalCanvasActive() ) { KIGFX::VIEW* view = myframe->GetGalCanvas()->GetView(); view->GetPainter()->GetSettings()->ImportLegacyColors( myframe->m_colorsSettings ); - view->UpdateLayerColor( aLayer ); + view->UpdateLayerColor( GERBER_DRAW_LAYER( aLayer ) ); } myframe->GetCanvas()->Refresh(); } + bool GERBER_LAYER_WIDGET::OnLayerSelect( int aLayer ) { // the layer change from the GERBER_LAYER_WIDGET can be denied by returning // false from this function. - int layer = myframe->GetActiveLayer( ); - // TODO(JE) ActiveLayer is stored as an index from 0 rather than as a layer - // id matching GERBER_DRAW_LAYER( idx ), is this what we want long-term? - myframe->SetActiveLayer( GERBER_DRAW_LAYER_INDEX( aLayer ), false ); + int layer = myframe->GetActiveLayer(); + + myframe->SetActiveLayer( aLayer, false ); myframe->syncLayerBox(); - if( layer != myframe->GetActiveLayer( ) ) + if( layer != myframe->GetActiveLayer() ) { if( ! OnLayerSelected() ) myframe->GetCanvas()->Refresh(); @@ -301,14 +306,15 @@ bool GERBER_LAYER_WIDGET::OnLayerSelect( int aLayer ) return true; } + void GERBER_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal ) { long visibleLayers = myframe->GetVisibleLayers(); if( isVisible ) - visibleLayers |= 1 << ( aLayer - GERBVIEW_LAYER_ID_START ); + visibleLayers |= 1 << aLayer ; else - visibleLayers &= ~( 1 << ( aLayer - GERBVIEW_LAYER_ID_START ) ); + visibleLayers &= ~( 1 << aLayer ); myframe->SetVisibleLayers( visibleLayers ); @@ -316,6 +322,7 @@ void GERBER_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFin myframe->GetCanvas()->Refresh(); } + void GERBER_LAYER_WIDGET::OnRenderColorChange( int aId, COLOR4D aColor ) { myframe->SetVisibleElementColor( (GERBVIEW_LAYER_ID) aId, aColor ); @@ -338,6 +345,7 @@ void GERBER_LAYER_WIDGET::OnRenderColorChange( int aId, COLOR4D aColor ) myframe->GetCanvas()->Refresh(); } + void GERBER_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled ) { myframe->SetElementVisibility( (GERBVIEW_LAYER_ID) aId, isEnabled ); diff --git a/gerbview/hotkeys.cpp b/gerbview/hotkeys.cpp index 73dad9e447..278b5ecdd1 100644 --- a/gerbview/hotkeys.cpp +++ b/gerbview/hotkeys.cpp @@ -233,8 +233,7 @@ bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit case HK_SWITCH_LAYER_TO_PREVIOUS: if( GetActiveLayer() > 0 ) { - SetActiveLayer( GetActiveLayer() - 1 ); - m_LayersManager->OnLayerSelected(); + SetActiveLayer( GetActiveLayer() - 1, true ); m_canvas->Refresh(); } break; @@ -242,8 +241,7 @@ bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit case HK_SWITCH_LAYER_TO_NEXT: if( GetActiveLayer() < GERBER_DRAWLAYERS_COUNT - 1 ) { - SetActiveLayer( GetActiveLayer() + 1 ); - m_LayersManager->OnLayerSelected(); + SetActiveLayer( GetActiveLayer() + 1, true ); m_canvas->Refresh(); } break;