Unflip when going to viewport which isn't flipped.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/13773
This commit is contained in:
Jeff Young 2024-02-29 10:56:04 +00:00
parent 8ffd4f636a
commit c23550dc0b
2 changed files with 30 additions and 30 deletions

View File

@ -139,35 +139,35 @@ struct IP2581_BOM
*/ */
struct LAYER_PRESET struct LAYER_PRESET
{ {
LAYER_PRESET( const wxString& aName = wxEmptyString ) : LAYER_PRESET( const wxString& aName = wxS( "" ) ) :
name( aName ), name( aName ),
layers( LSET::AllLayersMask() ),
renderLayers( GAL_SET::DefaultVisible() ),
flipBoard( false ),
activeLayer( UNSELECTED_LAYER ) activeLayer( UNSELECTED_LAYER )
{ {
layers = LSET::AllLayersMask();
renderLayers = GAL_SET::DefaultVisible();
readOnly = false; readOnly = false;
flipBoard = false;
} }
LAYER_PRESET( const wxString& aName, const LSET& aVisibleLayers ) : LAYER_PRESET( const wxString& aName, const LSET& aVisibleLayers, bool aFlipBoard ) :
name( aName ), name( aName ),
layers( aVisibleLayers ), layers( aVisibleLayers ),
renderLayers( GAL_SET::DefaultVisible() ),
flipBoard( aFlipBoard ),
activeLayer( UNSELECTED_LAYER ) activeLayer( UNSELECTED_LAYER )
{ {
renderLayers = GAL_SET::DefaultVisible();
readOnly = false; readOnly = false;
flipBoard = false;
} }
LAYER_PRESET( const wxString& aName, const LSET& aVisibleLayers, const GAL_SET& aVisibleObjects, LAYER_PRESET( const wxString& aName, const LSET& aVisibleLayers, const GAL_SET& aVisibleObjects,
PCB_LAYER_ID aActiveLayer ) : PCB_LAYER_ID aActiveLayer, bool aFlipBoard ) :
name( aName ), name( aName ),
layers( aVisibleLayers ), layers( aVisibleLayers ),
renderLayers( aVisibleObjects ), renderLayers( aVisibleObjects ),
flipBoard( aFlipBoard ),
activeLayer( aActiveLayer ) activeLayer( aActiveLayer )
{ {
readOnly = false; readOnly = false;
flipBoard = false;
} }
bool LayersMatch( const LAYER_PRESET& aOther ) bool LayersMatch( const LAYER_PRESET& aOther )

View File

@ -368,27 +368,28 @@ static std::set<int> s_allowedInFpEditor =
// These are the built-in layer presets that cannot be deleted // These are the built-in layer presets that cannot be deleted
LAYER_PRESET APPEARANCE_CONTROLS::presetNoLayers( _HKI( "No Layers" ), LSET() ); LAYER_PRESET APPEARANCE_CONTROLS::presetNoLayers( _HKI( "No Layers" ), LSET(), false );
LAYER_PRESET APPEARANCE_CONTROLS::presetAllLayers( _HKI( "All Layers" ), LSET::AllLayersMask() ); LAYER_PRESET APPEARANCE_CONTROLS::presetAllLayers( _HKI( "All Layers" ),
LSET::AllLayersMask(), false );
LAYER_PRESET APPEARANCE_CONTROLS::presetAllCopper( _HKI( "All Copper Layers" ), LAYER_PRESET APPEARANCE_CONTROLS::presetAllCopper( _HKI( "All Copper Layers" ),
LSET::AllCuMask().set( Edge_Cuts ) ); LSET::AllCuMask().set( Edge_Cuts ), false );
LAYER_PRESET APPEARANCE_CONTROLS::presetInnerCopper( _HKI( "Inner Copper Layers" ), LAYER_PRESET APPEARANCE_CONTROLS::presetInnerCopper( _HKI( "Inner Copper Layers" ),
LSET::InternalCuMask().set( Edge_Cuts ) ); LSET::InternalCuMask().set( Edge_Cuts ), false );
LAYER_PRESET APPEARANCE_CONTROLS::presetFront( _HKI( "Front Layers" ), LAYER_PRESET APPEARANCE_CONTROLS::presetFront( _HKI( "Front Layers" ),
LSET::FrontMask().set( Edge_Cuts ) ); LSET::FrontMask().set( Edge_Cuts ), false );
LAYER_PRESET APPEARANCE_CONTROLS::presetFrontAssembly( _HKI( "Front Assembly View" ), LAYER_PRESET APPEARANCE_CONTROLS::presetFrontAssembly( _HKI( "Front Assembly View" ),
LSET::FrontAssembly().set( Edge_Cuts ), GAL_SET::DefaultVisible(), F_SilkS ); LSET::FrontAssembly().set( Edge_Cuts ), GAL_SET::DefaultVisible(), F_SilkS, false );
LAYER_PRESET APPEARANCE_CONTROLS::presetBack( _HKI( "Back Layers" ), LAYER_PRESET APPEARANCE_CONTROLS::presetBack( _HKI( "Back Layers" ),
LSET::BackMask().set( Edge_Cuts ) ); LSET::BackMask().set( Edge_Cuts ), true );
LAYER_PRESET APPEARANCE_CONTROLS::presetBackAssembly( _HKI( "Back Assembly View" ), LAYER_PRESET APPEARANCE_CONTROLS::presetBackAssembly( _HKI( "Back Assembly View" ),
LSET::BackAssembly().set( Edge_Cuts ), GAL_SET::DefaultVisible(), B_SilkS ); LSET::BackAssembly().set( Edge_Cuts ), GAL_SET::DefaultVisible(), B_SilkS, true );
// this one is only used to store the object visibility settings of the last used // this one is only used to store the object visibility settings of the last used
// built-in layer preset // built-in layer preset
@ -524,6 +525,7 @@ APPEARANCE_CONTROLS::APPEARANCE_CONTROLS( PCB_BASE_FRAME* aParent, wxWindow* aFo
[&]( wxCommandEvent& aEvent ) [&]( wxCommandEvent& aEvent )
{ {
m_frame->GetToolManager()->RunAction( PCB_ACTIONS::flipBoard ); m_frame->GetToolManager()->RunAction( PCB_ACTIONS::flipBoard );
syncLayerPresetSelection();
} ); } );
m_toggleGridRenderer = new GRID_BITMAP_TOGGLE_RENDERER( m_toggleGridRenderer = new GRID_BITMAP_TOGGLE_RENDERER(
@ -2564,12 +2566,14 @@ void APPEARANCE_CONTROLS::syncLayerPresetSelection()
{ {
LSET visibleLayers = getVisibleLayers(); LSET visibleLayers = getVisibleLayers();
GAL_SET visibleObjects = getVisibleObjects(); GAL_SET visibleObjects = getVisibleObjects();
bool flipBoard = m_cbFlipBoard->GetValue();
auto it = std::find_if( m_layerPresets.begin(), m_layerPresets.end(), auto it = std::find_if( m_layerPresets.begin(), m_layerPresets.end(),
[&]( const std::pair<const wxString, LAYER_PRESET>& aPair ) [&]( const std::pair<const wxString, LAYER_PRESET>& aPair )
{ {
return ( aPair.second.layers == visibleLayers return ( aPair.second.layers == visibleLayers
&& aPair.second.renderLayers == visibleObjects ); && aPair.second.renderLayers == visibleObjects
&& aPair.second.flipBoard == flipBoard );
} ); } );
if( it != m_layerPresets.end() ) if( it != m_layerPresets.end() )
@ -2667,7 +2671,7 @@ void APPEARANCE_CONTROLS::onLayerPresetChanged( wxCommandEvent& aEvent )
if( !exists ) if( !exists )
{ {
m_layerPresets[name] = LAYER_PRESET( name, getVisibleLayers(), getVisibleObjects(), m_layerPresets[name] = LAYER_PRESET( name, getVisibleLayers(), getVisibleObjects(),
UNSELECTED_LAYER ); UNSELECTED_LAYER, m_cbFlipBoard->GetValue() );
} }
LAYER_PRESET* preset = &m_layerPresets[name]; LAYER_PRESET* preset = &m_layerPresets[name];
@ -2675,7 +2679,6 @@ void APPEARANCE_CONTROLS::onLayerPresetChanged( wxCommandEvent& aEvent )
if( !exists ) if( !exists )
{ {
index = m_cbLayerPresets->Insert( name, index - 1, static_cast<void*>( preset ) ); index = m_cbLayerPresets->Insert( name, index - 1, static_cast<void*>( preset ) );
preset->flipBoard = m_cbFlipBoard->GetValue();
} }
else if( preset->readOnly ) else if( preset->readOnly )
{ {
@ -2757,7 +2760,7 @@ void APPEARANCE_CONTROLS::onLayerPresetChanged( wxCommandEvent& aEvent )
} }
LAYER_PRESET* preset = static_cast<LAYER_PRESET*>( m_cbLayerPresets->GetClientData( index ) ); LAYER_PRESET* preset = static_cast<LAYER_PRESET*>( m_cbLayerPresets->GetClientData( index ) );
m_currentPreset = preset; m_currentPreset = preset;
m_lastSelectedUserPreset = ( !preset || preset->readOnly ) ? nullptr : preset; m_lastSelectedUserPreset = ( !preset || preset->readOnly ) ? nullptr : preset;
@ -2786,7 +2789,8 @@ void APPEARANCE_CONTROLS::onLayerPresetChanged( wxCommandEvent& aEvent )
void APPEARANCE_CONTROLS::doApplyLayerPreset( const LAYER_PRESET& aPreset ) void APPEARANCE_CONTROLS::doApplyLayerPreset( const LAYER_PRESET& aPreset )
{ {
BOARD* board = m_frame->GetBoard(); BOARD* board = m_frame->GetBoard();
KIGFX::PCB_VIEW* view = m_frame->GetCanvas()->GetView();
setVisibleLayers( aPreset.layers ); setVisibleLayers( aPreset.layers );
setVisibleObjects( aPreset.renderLayers ); setVisibleObjects( aPreset.renderLayers );
@ -2808,15 +2812,16 @@ void APPEARANCE_CONTROLS::doApplyLayerPreset( const LAYER_PRESET& aPreset )
if( !m_isFpEditor ) if( !m_isFpEditor )
m_frame->GetCanvas()->SyncLayersVisibility( board ); m_frame->GetCanvas()->SyncLayersVisibility( board );
if( aPreset.flipBoard ) if( aPreset.flipBoard != view->IsMirroredX() )
{ {
m_frame->GetCanvas()->GetView()->SetMirror( true, false ); view->SetMirror( !view->IsMirroredX(), view->IsMirroredY() );
m_frame->GetCanvas()->GetView()->RecacheAllItems(); view->RecacheAllItems();
} }
m_frame->GetCanvas()->Refresh(); m_frame->GetCanvas()->Refresh();
syncColorsAndVisibility(); syncColorsAndVisibility();
UpdateDisplayOptions();
} }
@ -2960,11 +2965,6 @@ void APPEARANCE_CONTROLS::onViewportChanged( wxCommandEvent& aEvent )
void APPEARANCE_CONTROLS::doApplyViewport( const VIEWPORT& aViewport ) void APPEARANCE_CONTROLS::doApplyViewport( const VIEWPORT& aViewport )
{ {
m_frame->GetCanvas()->GetView()->SetViewport( aViewport.rect ); m_frame->GetCanvas()->GetView()->SetViewport( aViewport.rect );
if( m_cbFlipBoard->GetValue() )
{
m_frame->GetCanvas()->GetView()->SetMirror( true, false );
m_frame->GetCanvas()->GetView()->RecacheAllItems();
}
m_frame->GetCanvas()->Refresh(); m_frame->GetCanvas()->Refresh();
} }