Properties panel: post-rebase fixes and hide by default

Remove layer widget re-added by Orson's rebase
This commit is contained in:
Jon Evans 2020-10-18 21:57:18 -04:00
parent 990ea5595e
commit 3c6e8aea0f
9 changed files with 47 additions and 905 deletions

View File

@ -191,6 +191,8 @@ static const wxChar AllowManualCanvasScale[] = wxT( "AllowManualCanvasScale" );
static const wxChar UpdateUIEventInterval[] = wxT( "UpdateUIEventInterval" ); static const wxChar UpdateUIEventInterval[] = wxT( "UpdateUIEventInterval" );
static const wxChar ShowPropertiesPanel[] = wxT( "ShowPropertiesPanel" );
static const wxChar V3DRT_BevelHeight_um[] = wxT( "V3DRT_BevelHeight_um" ); static const wxChar V3DRT_BevelHeight_um[] = wxT( "V3DRT_BevelHeight_um" );
static const wxChar V3DRT_BevelExtentFactor[] = wxT( "V3DRT_BevelExtentFactor" ); static const wxChar V3DRT_BevelExtentFactor[] = wxT( "V3DRT_BevelExtentFactor" );
@ -315,8 +317,8 @@ ADVANCED_CFG::ADVANCED_CFG()
m_AllowManualCanvasScale = false; m_AllowManualCanvasScale = false;
m_CompactSave = false; m_CompactSave = false;
m_UpdateUIEventInterval = 0; m_UpdateUIEventInterval = 0;
m_ShowRepairSchematic = false; m_ShowRepairSchematic = false;
m_ShowPropertiesPanel = false;
m_3DRT_BevelHeight_um = 30; m_3DRT_BevelHeight_um = 30;
m_3DRT_BevelExtentFactor = 1.0 / 16.0; m_3DRT_BevelExtentFactor = 1.0 / 16.0;
@ -467,6 +469,9 @@ void ADVANCED_CFG::loadSettings( wxConfigBase& aCfg )
wxString traceMasks = ""; wxString traceMasks = "";
configParams.push_back( new PARAM_CFG_WXSTRING( true, AC_KEYS::TraceMasks, &traceMasks, "" ) ); configParams.push_back( new PARAM_CFG_WXSTRING( true, AC_KEYS::TraceMasks, &traceMasks, "" ) );
configParams.push_back( new PARAM_CFG_BOOL( true, AC_KEYS::ShowPropertiesPanel,
&m_ShowPropertiesPanel, false ) );
// Load the config from file // Load the config from file
wxConfigLoadSetups( &aCfg, configParams ); wxConfigLoadSetups( &aCfg, configParams );

View File

@ -22,13 +22,14 @@
#include <tool/selection.h> #include <tool/selection.h>
#include <eda_base_frame.h> #include <eda_base_frame.h>
#include <eda_item.h> #include <eda_item.h>
#include <import_export.h>
#include <algorithm> #include <algorithm>
#include <set> #include <set>
using namespace std; using namespace std;
extern wxPGGlobalVarsClass* wxPGGlobalVars; extern APIIMPORT wxPGGlobalVarsClass* wxPGGlobalVars;
PROPERTIES_PANEL::PROPERTIES_PANEL( wxWindow* aParent, EDA_BASE_FRAME* aFrame ) PROPERTIES_PANEL::PROPERTIES_PANEL( wxWindow* aParent, EDA_BASE_FRAME* aFrame )
: wxPanel( aParent ), m_frame( aFrame ) : wxPanel( aParent ), m_frame( aFrame )
@ -42,7 +43,7 @@ PROPERTIES_PANEL::PROPERTIES_PANEL( wxWindow* aParent, EDA_BASE_FRAME* aFrame )
m_grid = new wxPropertyGrid( this, wxID_ANY, wxDefaultPosition, wxSize( 300, 400 ), m_grid = new wxPropertyGrid( this, wxID_ANY, wxDefaultPosition, wxSize( 300, 400 ),
wxPG_AUTO_SORT | wxPG_SPLITTER_AUTO_CENTER | wxPG_DEFAULT_STYLE ); wxPG_AUTO_SORT | wxPG_SPLITTER_AUTO_CENTER | wxPG_DEFAULT_STYLE );
m_grid->SetUnspecifiedValueAppearance( wxPGCell( "<...>" ) ); m_grid->SetUnspecifiedValueAppearance( wxPGCell( wxT( "<...>" ) ) );
mainSizer->Add( m_grid, 1, wxALL | wxEXPAND, 5 ); mainSizer->Add( m_grid, 1, wxALL | wxEXPAND, 5 );
SetSizer( mainSizer ); SetSizer( mainSizer );

View File

@ -220,6 +220,11 @@ public:
bool m_AllowManualCanvasScale; bool m_AllowManualCanvasScale;
/**
* Show the properties panel in PcbNew
*/
bool m_ShowPropertiesPanel;
/** /**
* 3D-Viewer, Raytracing * 3D-Viewer, Raytracing
* Bevel height of layer items. Controls the start of curvature normal on the edge. * Bevel height of layer items. Controls the start of curvature normal on the edge.

View File

@ -106,7 +106,7 @@ public:
PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance(); PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance();
TYPE_ID thisType = TYPE_HASH( *this ); TYPE_ID thisType = TYPE_HASH( *this );
PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty ); PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty );
boost::optional<T> ret = T(); boost::optional<T> ret;
if( prop ) if( prop )
{ {

View File

@ -53,8 +53,7 @@ PCB_BASE_EDIT_FRAME::PCB_BASE_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_undoRedoBlocked( false ), m_undoRedoBlocked( false ),
m_selectionFilterPanel( nullptr ), m_selectionFilterPanel( nullptr ),
m_appearancePanel( nullptr ), m_appearancePanel( nullptr ),
m_propertiesPanel( nullptr ), m_propertiesPanel( nullptr )
m_tabbedPanel( nullptr )
{ {
Bind( wxEVT_IDLE, Bind( wxEVT_IDLE,
[this]( wxIdleEvent& aEvent ) [this]( wxIdleEvent& aEvent )

View File

@ -248,6 +248,7 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
ReCreateVToolbar(); ReCreateVToolbar();
ReCreateOptToolbar(); ReCreateOptToolbar();
m_propertiesPanel = new PCB_PROPERTIES_PANEL( this, this );
m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this ); m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this );
m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() ); m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas() );
@ -289,10 +290,10 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
.Caption( _( "Selection Filter" ) ).PaneBorder( false ) .Caption( _( "Selection Filter" ) ).PaneBorder( false )
.MinSize( 180, -1 ).BestSize( 180, -1 ) ); .MinSize( 180, -1 ).BestSize( 180, -1 ) );
m_auimgr.AddPane( m_tabbedPanel, // TODO check m_auimgr.AddPane( m_propertiesPanel, EDA_PANE().Name( "PropertiesManager" )
EDA_PANE().Palette().Name( "TabbedPanel" ).Right().Layer( 3 ) .Left().Layer( 2 )
.PaneBorder( false ).MinSize( 300, -1 ) .Caption( _( "Properties" ) ).PaneBorder( false )
.TopDockable( false ).BottomDockable( false ) ); .MinSize( 240, -1 ).BestSize( 300, -1 ) );
// Center // Center
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ) m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
@ -301,6 +302,9 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_auimgr.GetPane( "LayersManager" ).Show( m_show_layer_manager_tools ); m_auimgr.GetPane( "LayersManager" ).Show( m_show_layer_manager_tools );
m_auimgr.GetPane( "SelectionFilter" ).Show( m_show_layer_manager_tools ); m_auimgr.GetPane( "SelectionFilter" ).Show( m_show_layer_manager_tools );
bool showProperties = ADVANCED_CFG::GetCfg().m_ShowPropertiesPanel && m_show_properties;
m_auimgr.GetPane( "PropertiesManager" ).Show( showProperties );
// The selection filter doesn't need to grow in the vertical direction when docked // The selection filter doesn't need to grow in the vertical direction when docked
m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0; m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
@ -451,6 +455,7 @@ PCB_EDIT_FRAME::~PCB_EDIT_FRAME()
delete m_selectionFilterPanel; delete m_selectionFilterPanel;
delete m_appearancePanel; delete m_appearancePanel;
delete m_exportNetlistAction; delete m_exportNetlistAction;
delete m_propertiesPanel;
} }
@ -699,6 +704,12 @@ void PCB_EDIT_FRAME::setupUIConditions()
return LayerManagerShown(); return LayerManagerShown();
}; };
auto propertiesCond =
[this] ( const SELECTION& )
{
return PropertiesShown();
};
auto highContrastCond = auto highContrastCond =
[this] ( const SELECTION& ) [this] ( const SELECTION& )
{ {
@ -740,6 +751,7 @@ void PCB_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond ) mgr->SetConditions( PCB_ACTIONS::toggleNetHighlight, CHECK( netHighlightCond )
.Enable( enableNetHighlightCond ) ); .Enable( enableNetHighlightCond ) );
mgr->SetConditions( PCB_ACTIONS::boardSetup, ENABLE( enableBoardSetupCondition ) ); mgr->SetConditions( PCB_ACTIONS::boardSetup, ENABLE( enableBoardSetupCondition ) );
mgr->SetConditions( PCB_ACTIONS::showProperties, CHECK( propertiesCond ) );
auto isHighlightMode = auto isHighlightMode =
[this]( const SELECTION& ) [this]( const SELECTION& )
@ -1330,10 +1342,9 @@ void PCB_EDIT_FRAME::ShowChangedLanguage()
// call my base class // call my base class
PCB_BASE_EDIT_FRAME::ShowChangedLanguage(); PCB_BASE_EDIT_FRAME::ShowChangedLanguage();
wxAuiPaneInfo& ap_pane_info = m_auimgr.GetPane( m_appearancePanel ); m_auimgr.GetPane( m_appearancePanel ).Caption( _( "Appearance" ) );
ap_pane_info.Caption( _( "Appearance" ) ); m_auimgr.GetPane( m_selectionFilterPanel ).Caption( _( "Selection Filter" ) );
wxAuiPaneInfo& sf_pane_info = m_auimgr.GetPane( m_selectionFilterPanel ); m_auimgr.GetPane( m_propertiesPanel ).Caption( _( "Properties" ) );
sf_pane_info.Caption( _( "Selection Filter" ) );
m_auimgr.Update(); m_auimgr.Update();
m_appearancePanel->OnLanguageChanged(); m_appearancePanel->OnLanguageChanged();
@ -1961,6 +1972,12 @@ bool PCB_EDIT_FRAME::LayerManagerShown()
} }
bool PCB_EDIT_FRAME::PropertiesShown()
{
return m_auimgr.GetPane( "PropertiesManager" ).IsShown();
}
void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent ) void PCB_EDIT_FRAME::onSize( wxSizeEvent& aEvent )
{ {
if( IsShown() ) if( IsShown() )

View File

@ -1,708 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2017 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr
* Copyright (C) 2010-2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2010-2017 KiCad Developers, see change_log.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 Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <class_board.h>
#include <fctsys.h>
#include <gal/graphics_abstraction_layer.h>
#include <layer_widget.h>
#include <macros.h>
#include <menus_helpers.h>
#include <pcb_display_options.h>
#include <pcb_edit_frame.h>
#include <pcb_layer_widget.h>
#include <pcb_painter.h>
#include <pcbnew_id.h>
#include <pcbnew_settings.h>
#include <pgm_base.h>
#include <settings/color_settings.h>
#include <tool/tool_manager.h>
#include <view/view.h>
#include <widgets/indicator_icon.h>
/// This is a read only template that is copied and modified before adding to LAYER_WIDGET
const LAYER_WIDGET::ROW PCB_LAYER_WIDGET::s_render_rows[] = {
#define RR LAYER_WIDGET::ROW // Render Row abbreviation to reduce source width
#define NOCOLOR COLOR4D::UNSPECIFIED // specify rows that do not have a color selector icon
// text id color tooltip
RR( _( "Footprints Front" ), LAYER_MOD_FR, NOCOLOR, _( "Show footprints that are on board's front") ),
RR( _( "Footprints Back" ), LAYER_MOD_BK, NOCOLOR, _( "Show footprints that are on board's back") ),
RR( _( "Values" ), LAYER_MOD_VALUES, NOCOLOR, _( "Show footprint values") ),
RR( _( "Reference Designators" ),LAYER_MOD_REFERENCES, NOCOLOR, _( "Show footprint reference designators") ),
RR( _( "Footprint Text Front" ), LAYER_MOD_TEXT_FR, NOCOLOR, _( "Show footprint text on board's front" ) ),
RR( _( "Footprint Text Back" ), LAYER_MOD_TEXT_BK, NOCOLOR, _( "Show footprint text on board's back" ) ),
RR( _( "Hidden Text" ), LAYER_MOD_TEXT_INVISIBLE, WHITE, _( "Show footprint text marked as invisible" ) ),
RR( _( "Pads Front" ), LAYER_PAD_FR, WHITE, _( "Show footprint pads on board's front" ) ),
RR( _( "Pads Back" ), LAYER_PAD_BK, WHITE, _( "Show footprint pads on board's back" ) ),
RR( _( "Through Hole Pads" ), LAYER_PADS_TH, YELLOW, _( "Show through hole pads in specific color") ),
RR(),
RR( _( "Tracks" ), LAYER_TRACKS, NOCOLOR, _( "Show tracks" ) ),
RR( _( "Through Via" ), LAYER_VIA_THROUGH, WHITE, _( "Show through vias" ) ),
RR( _( "Bl/Buried Via" ), LAYER_VIA_BBLIND, WHITE, _( "Show blind or buried vias" ) ),
RR( _( "Micro Via" ), LAYER_VIA_MICROVIA, WHITE, _( "Show micro vias") ),
RR( _( "Non Plated Holes" ), LAYER_NON_PLATEDHOLES, WHITE, _( "Show non plated holes in specific color") ),
RR(),
RR( _( "Ratsnest" ), LAYER_RATSNEST, WHITE, _( "Show unconnected nets as a ratsnest") ),
RR( _( "No-Connects" ), LAYER_NO_CONNECTS, BLUE, _( "Show a marker on pads which have no net connected" ) ),
RR( _( "DRC Warnings" ), LAYER_DRC_WARNING, YELLOW, _( "DRC violations with a Warning severity" ) ),
RR( _( "DRC Errors" ), LAYER_DRC_ERROR, PURERED, _( "DRC violations with an Error severity" ) ),
RR( _( "Anchors" ), LAYER_ANCHOR, WHITE, _( "Show footprint and text origins as a cross" ) ),
RR( _( "Worksheet" ), LAYER_WORKSHEET, DARKRED, _( "Show worksheet") ),
RR( _( "Cursor" ), LAYER_CURSOR, WHITE, _( "PCB Cursor" ), true, false ),
RR( _( "Aux Items" ), LAYER_AUX_ITEMS, WHITE, _( "Auxiliary items (rulers, assistants, axes, etc.)" ), true, false ),
RR( _( "Grid" ), LAYER_GRID, WHITE, _( "Show the (x,y) grid dots" ) ),
RR( _( "Background" ), LAYER_PCB_BACKGROUND, BLACK, _( "PCB Background" ), true, false )
};
static int s_allowed_in_FpEditor[] =
{
LAYER_MOD_TEXT_INVISIBLE,
LAYER_NON_PLATEDHOLES,
LAYER_PADS_TH,
LAYER_PAD_FR,
LAYER_PAD_BK,
LAYER_MOD_VALUES,
LAYER_MOD_REFERENCES,
LAYER_CURSOR,
LAYER_AUX_ITEMS,
LAYER_GRID,
LAYER_PCB_BACKGROUND
};
PCB_LAYER_WIDGET::PCB_LAYER_WIDGET( wxWindow* aParent, PCB_BASE_FRAME* aFrame, wxWindow* aFocusOwner,
bool aFpEditorMode ) :
LAYER_WIDGET( aParent, aFocusOwner ),
myframe( aFrame )
{
m_alwaysShowActiveCopperLayer = false;
m_fp_editor_mode = aFpEditorMode;
// Update default tabs labels
SetLayersManagerTabsText();
//-----<Popup menu>-------------------------------------------------
// handle the popup menu over the layer window.
m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN,
wxMouseEventHandler( PCB_LAYER_WIDGET::onRightDownLayers ), NULL, this );
// since Popupmenu() calls this->ProcessEvent() we must call this->Connect()
// and not m_LayerScrolledWindow->Connect()
Connect( ID_SHOW_ALL_COPPER_LAYERS, ID_LAST_VALUE - 1,
wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( PCB_LAYER_WIDGET::onPopupSelection ), NULL, this );
}
COLOR4D PCB_LAYER_WIDGET::getBackgroundLayerColor()
{
return myframe->GetColorSettings()->GetColor( LAYER_PCB_BACKGROUND );
}
bool PCB_LAYER_WIDGET::isAllowedInFpMode( int aId )
{
for( unsigned ii = 0; ii < arrayDim( s_allowed_in_FpEditor ); ii++ )
if( s_allowed_in_FpEditor[ii] == aId )
return true;
return false;
}
bool PCB_LAYER_WIDGET::isLayerAllowedInFpMode( PCB_LAYER_ID aLayer )
{
static LSET allowed = LSET::AllTechMask();
allowed.set( F_Cu ).set( B_Cu );
return allowed.test( aLayer );
}
void PCB_LAYER_WIDGET::AddRightClickMenuItems( wxMenu& menu )
{
AddMenuItem( &menu, ID_SHOW_ALL_COPPER_LAYERS,
_( "Show All Copper Layers" ),
KiBitmap( select_layer_pair_xpm ) );
AddMenuItem( &menu, ID_HIDE_ALL_COPPER_LAYERS,
_( "Hide All Copper Layers" ),
KiBitmap( show_no_copper_layers_xpm ) );
menu.AppendSeparator();
AddMenuItem( &menu, ID_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE,
_( "Hide All Copper Layers But Active" ),
KiBitmap( select_w_layer_xpm ) );
AddMenuItem( &menu, ID_ALWAYS_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE,
_( "Always Hide All Copper Layers But Active" ),
KiBitmap( select_w_layer_xpm ) );
menu.AppendSeparator();
AddMenuItem( &menu, ID_SHOW_ALL_NON_COPPER,
_( "Show All Non Copper Layers" ),
KiBitmap( select_w_layer_xpm ) );
AddMenuItem( &menu, ID_HIDE_ALL_NON_COPPER,
_( "Hide All Non Copper Layers" ),
KiBitmap( show_no_copper_layers_xpm ) );
menu.AppendSeparator();
AddMenuItem( &menu, ID_SHOW_ALL_LAYERS, _( "Show All Layers" ),
KiBitmap( show_all_layers_xpm ) );
AddMenuItem( &menu, ID_SHOW_NO_LAYERS, _( "Hide All Layers" ),
KiBitmap( show_no_layers_xpm ) );
menu.AppendSeparator();
AddMenuItem( &menu, ID_SHOW_ONLY_FRONT_ASSEMBLY, _( "Show Only Front Assembly Layers" ),
KiBitmap( shape_3d_xpm ) );
AddMenuItem( &menu, ID_SHOW_ONLY_FRONT, _( "Show Only Front Layers" ),
KiBitmap( show_all_front_layers_xpm ) );
// Only show the internal layer option if internal layers are enabled
if( myframe->GetBoard()->GetCopperLayerCount() > 2 )
{
AddMenuItem( &menu, ID_SHOW_ONLY_INNER, _( "Show Only Inner Layers" ),
KiBitmap( show_all_copper_layers_xpm ) );
}
AddMenuItem( &menu, ID_SHOW_ONLY_BACK, _( "Show Only Back Layers" ),
KiBitmap( show_all_back_layers_xpm ) );
AddMenuItem( &menu, ID_SHOW_ONLY_BACK_ASSEMBLY, _( "Show Only Back Assembly Layers" ),
KiBitmap( shape_3d_back_xpm ) );
}
void PCB_LAYER_WIDGET::onRightDownLayers( wxMouseEvent& event )
{
wxMenu menu;
AddRightClickMenuItems( menu );
PopupMenu( &menu );
passOnFocus();
}
void PCB_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
{
// Force the active layer to be visible
bool forceActiveLayer = false;
// Reset the always show property
m_alwaysShowActiveCopperLayer = false;
// Make a distinction between the layers we want to enable and those we
// want to disable explictly. That way we can either or the current layerset
// or operate on all layers.
LSET layersToShow;
LSET layersToHide;
switch( event.GetId() )
{
case ID_SHOW_NO_LAYERS:
layersToHide = LSET::AllLayersMask();
break;
case ID_SHOW_ALL_LAYERS:
layersToShow = LSET::AllLayersMask();
break;
case ID_SHOW_ALL_COPPER_LAYERS:
layersToShow = LSET::AllCuMask();
break;
case ID_ALWAYS_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE:
m_alwaysShowActiveCopperLayer = true;
KI_FALLTHROUGH;
case ID_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE:
forceActiveLayer = true;
KI_FALLTHROUGH;
case ID_HIDE_ALL_COPPER_LAYERS:
layersToHide = LSET::AllCuMask();
break;
case ID_HIDE_ALL_NON_COPPER:
layersToHide = LSET::AllNonCuMask();
break;
case ID_SHOW_ALL_NON_COPPER:
layersToShow = LSET::AllNonCuMask();
break;
case ID_SHOW_ONLY_FRONT_ASSEMBLY:
// Include the edgecuts layer as well as the front assembly layers and hide the other layers
layersToShow = LSET::FrontAssembly().set( Edge_Cuts );
layersToHide = ~layersToShow;
myframe->SetActiveLayer( F_SilkS );
break;
case ID_SHOW_ONLY_FRONT:
// Include the edgecuts layer as well as the front layers and hide the other layers
layersToShow = LSET::FrontMask().set( Edge_Cuts );
layersToHide = ~layersToShow;
break;
case ID_SHOW_ONLY_INNER:
// Include the edgecuts layer as well as the internal layers and hide the other layers
layersToShow = LSET::InternalCuMask().set( Edge_Cuts );
layersToHide = ~layersToShow;
break;
case ID_SHOW_ONLY_BACK:
// Include the edgecuts layer as well as the back layers and hide the other layers
layersToShow = LSET::BackMask().set( Edge_Cuts );
layersToHide = ~layersToShow;
break;
case ID_SHOW_ONLY_BACK_ASSEMBLY:
// Include the edgecuts layer as well as the back assembly layers and hide the other layers
layersToShow = LSET::BackAssembly().set( Edge_Cuts );
layersToHide = ~layersToShow;
myframe->SetActiveLayer( B_SilkS );
break;
}
int rowCount = GetLayerRowCount();
for( int row = 0; row < rowCount; ++row )
{
wxCheckBox* cb = static_cast<wxCheckBox*>( getLayerComp( row, COLUMN_COLOR_LYR_CB ) );
PCB_LAYER_ID layer = ToLAYER_ID( getDecodedId( cb->GetId() ) );
bool visible = cb->GetValue();
if( layersToShow.Contains( layer ) )
visible = true;
if( layersToHide.Contains( layer ) )
visible = false;
// Force the active layer in the editor to be visible
if( forceActiveLayer && ( layer == myframe->GetActiveLayer() ) )
visible = true;
cb->SetValue( visible );
OnLayerVisible( layer, visible, false );
}
// Refresh the drawing canvas
myframe->GetCanvas()->Refresh();
}
void PCB_LAYER_WIDGET::SetLayersManagerTabsText()
{
m_notebook->SetPageText( 0, _( "Layers" ) );
m_notebook->SetPageText( 1, _( "Items" ) );
}
void PCB_LAYER_WIDGET::ReFillRender()
{
BOARD* board = myframe->GetBoard();
ClearRenderRows();
// Add "Items" tab rows to LAYER_WIDGET, after setting color and checkbox state.
// Because s_render_rows is created static, we must explicitly call
// wxGetTranslation for texts which are internationalized (tool tips
// and item names)
for( unsigned row=0; row<arrayDim(s_render_rows); ++row )
{
LAYER_WIDGET::ROW renderRow = s_render_rows[row];
if( m_fp_editor_mode && !isAllowedInFpMode( renderRow.id ) )
continue;
if( !renderRow.spacer )
{
renderRow.tooltip = wxGetTranslation( s_render_rows[row].tooltip );
renderRow.rowName = wxGetTranslation( s_render_rows[row].rowName );
if( renderRow.color != COLOR4D::UNSPECIFIED ) // does this row show a color?
{
// this window frame must have an established BOARD, i.e. after SetBoard()
renderRow.color = myframe->GetColorSettings()->GetColor(
static_cast<GAL_LAYER_ID>( renderRow.id ) );
renderRow.defaultColor = myframe->GetColorSettings()->GetDefaultColor(
static_cast<GAL_LAYER_ID>( renderRow.id ) );
}
if( renderRow.id == LAYER_RATSNEST )
renderRow.state = myframe->GetDisplayOptions().m_ShowGlobalRatsnest;
else if( renderRow.id == LAYER_GRID )
renderRow.state = myframe->IsGridVisible();
else
renderRow.state = board->IsElementVisible(
static_cast<GAL_LAYER_ID>( renderRow.id ) );
}
AppendRenderRow( renderRow );
}
UpdateLayouts();
}
void PCB_LAYER_WIDGET::SyncLayerVisibilities()
{
BOARD* board = myframe->GetBoard();
int count = GetLayerRowCount();
for( int row=0; row<count; ++row )
{
// this utilizes more implementation knowledge than ideal, eventually
// add member ROW getRow() or similar to base LAYER_WIDGET.
wxWindow* w = getLayerComp( row, COLUMN_ICON_ACTIVE );
PCB_LAYER_ID layerId = ToLAYER_ID( getDecodedId( w->GetId() ) );
// this does not fire a UI event
setLayerCheckbox( layerId, board->IsLayerVisible( layerId ) );
}
}
#define ALPHA_EPSILON 0.04
void PCB_LAYER_WIDGET::SyncLayerAlphaIndicators()
{
int count = GetLayerRowCount();
TOOL_MANAGER* mgr = myframe->GetToolManager();
KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( mgr->GetView()->GetPainter() );
KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
for( int row = 0; row < count; ++row )
{
// this utilizes more implementation knowledge than ideal, eventually
// add member ROW getRow() or similar to base LAYER_WIDGET.
wxWindow* w = getLayerComp( row, COLUMN_ICON_ACTIVE );
PCB_LAYER_ID layerId = ToLAYER_ID( getDecodedId( w->GetId() ) );
KIGFX::COLOR4D screenColor = settings->GetLayerColor( layerId );
COLOR_SWATCH* swatch = static_cast<COLOR_SWATCH*>( getLayerComp( row, COLUMN_COLORBM ) );
KIGFX::COLOR4D layerColor = swatch->GetSwatchColor();
INDICATOR_ICON* indicator = static_cast<INDICATOR_ICON*>( getLayerComp( row, COLUMN_ALPHA_INDICATOR ) );
if( std::abs( screenColor.a - layerColor.a ) > ALPHA_EPSILON )
{
if( screenColor.a < layerColor.a )
indicator->SetIndicatorState( ROW_ICON_PROVIDER::STATE::DOWN );
else
indicator->SetIndicatorState( ROW_ICON_PROVIDER::STATE::UP );
}
else
indicator->SetIndicatorState( ROW_ICON_PROVIDER::STATE::OFF );
}
}
void PCB_LAYER_WIDGET::SyncLayerColors()
{
COLOR_SETTINGS* cs = myframe->GetColorSettings();
COLOR4D bg = cs->GetColor( LAYER_PCB_BACKGROUND );
int count = GetLayerRowCount();
int row;
int col = 1; // bitmap button is column 1 in layers tab
for( row = 0; row < count; ++row )
{
COLOR_SWATCH* swatch = dynamic_cast<COLOR_SWATCH*>( getLayerComp( row, col ) );
if( swatch )
{
swatch->SetSwatchBackground( bg );
swatch->SetSwatchColor( cs->GetColor( getDecodedId( swatch->GetId() ) ), false );
}
}
count = GetRenderRowCount();
col = 0; // bitmap button is column 0 in render tab
for( row = 0; row < count; ++row )
{
COLOR_SWATCH* swatch = dynamic_cast<COLOR_SWATCH*>( getRenderComp( row, col ) );
if( swatch )
{
swatch->SetSwatchBackground( bg );
swatch->SetSwatchColor( cs->GetColor( getDecodedId( swatch->GetId() ) ), false );
}
}
}
void PCB_LAYER_WIDGET::ReFill()
{
BOARD* brd = myframe->GetBoard();
LSET enabled = brd->GetEnabledLayers();
ClearLayerRows();
wxString dsc;
// show all coppers first, with front on top, back on bottom, then technical layers
for( LSEQ cu_stack = enabled.CuStack(); cu_stack; ++cu_stack )
{
PCB_LAYER_ID layer = *cu_stack;
switch( layer )
{
case F_Cu:
dsc = _( "Front copper layer" );
break;
case B_Cu:
dsc = _( "Back copper layer" );
break;
default:
dsc = _( "Inner copper layer" );
break;
}
AppendLayerRow( LAYER_WIDGET::ROW( brd->GetLayerName( layer ), layer,
myframe->GetColorSettings()->GetColor( layer ), dsc, true, true,
myframe->GetColorSettings()->GetDefaultColor( layer ) ) );
if( m_fp_editor_mode && LSET::ForbiddenFootprintLayers().test( layer ) )
{
getLayerComp( GetLayerRowCount()-1, COLUMN_COLOR_LYRNAME )->Enable( false );
getLayerComp( GetLayerRowCount()-1, COLUMN_COLORBM )->SetToolTip( wxEmptyString );
}
}
UpdateLayouts();
// technical layers are shown in this order:
// Because they are static, wxGetTranslation must be explicitly
// called for tooltips.
static const struct {
PCB_LAYER_ID layerId;
wxString tooltip;
} non_cu_seq[] = {
{ F_Adhes, _( "Adhesive on board's front" ) },
{ B_Adhes, _( "Adhesive on board's back" ) },
{ F_Paste, _( "Solder paste on board's front" ) },
{ B_Paste, _( "Solder paste on board's back" ) },
{ F_SilkS, _( "Silkscreen on board's front" ) },
{ B_SilkS, _( "Silkscreen on board's back" ) },
{ F_Mask, _( "Solder mask on board's front" ) },
{ B_Mask, _( "Solder mask on board's back" ) },
{ Dwgs_User, _( "Explanatory drawings" ) },
{ Cmts_User, _( "Explanatory comments" ) },
{ Eco1_User, _( "User defined meaning" ) },
{ Eco2_User, _( "User defined meaning" ) },
{ Edge_Cuts, _( "Board's perimeter definition" ) },
{ Margin, _( "Board's edge setback outline" ) },
{ F_CrtYd, _( "Footprint courtyards on board's front" ) },
{ B_CrtYd, _( "Footprint courtyards on board's back" ) },
{ F_Fab, _( "Footprint assembly on board's front" ) },
{ B_Fab, _( "Footprint assembly on board's back" ) }
};
for( unsigned i=0; i<arrayDim( non_cu_seq ); ++i )
{
PCB_LAYER_ID layer = non_cu_seq[i].layerId;
if( !enabled[layer] )
continue;
AppendLayerRow( LAYER_WIDGET::ROW( brd->GetLayerName( layer ), layer,
myframe->GetColorSettings()->GetColor( layer ),
wxGetTranslation( non_cu_seq[i].tooltip ), true, true,
myframe->GetColorSettings()->GetDefaultColor( layer ) ) );
if( m_fp_editor_mode && LSET::ForbiddenFootprintLayers().test( layer ) )
{
getLayerComp( GetLayerRowCount()-1, COLUMN_COLOR_LYRNAME )->Enable( false );
getLayerComp( GetLayerRowCount()-1, COLUMN_COLORBM )->SetToolTip( wxEmptyString );
}
}
}
//-----<LAYER_WIDGET callbacks>-------------------------------------------
void PCB_LAYER_WIDGET::OnLayerColorChange( int aLayer, COLOR4D aColor )
{
COLOR_SETTINGS* cs = myframe->GetColorSettings();
cs->SetColor( aLayer, aColor );
myframe->GetCanvas()->UpdateColors();
KIGFX::VIEW* view = myframe->GetCanvas()->GetView();
view->UpdateLayerColor( aLayer );
view->UpdateLayerColor( GetNetnameLayer( aLayer ) );
myframe->ReCreateHToolbar();
myframe->GetCanvas()->Refresh();
if( aLayer == LAYER_PCB_BACKGROUND )
myframe->SetDrawBgColor( aColor );
}
bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer )
{
// the layer change from the PCB_LAYER_WIDGET can be denied by returning
// false from this function.
PCB_LAYER_ID layer = ToLAYER_ID( aLayer );
if( m_fp_editor_mode && LSET::ForbiddenFootprintLayers().test( layer ) )
return false;
myframe->SetActiveLayer( layer );
bool hcm = ( myframe->GetDisplayOptions().m_ContrastModeDisplay !=
HIGH_CONTRAST_MODE::NORMAL );
if( m_alwaysShowActiveCopperLayer )
OnLayerSelected();
else if( hcm )
myframe->GetCanvas()->Refresh();
return true;
}
bool PCB_LAYER_WIDGET::OnLayerSelected()
{
if( !m_alwaysShowActiveCopperLayer )
return false;
// postprocess after an active layer selection
// ensure active layer visible
wxCommandEvent event;
event.SetId( ID_ALWAYS_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE );
onPopupSelection( event );
return true;
}
void PCB_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal )
{
// In other frames than board editor, the board is a dummy board.
// so changing board settings makes sense (and works) only for the board editor frame
if( myframe->IsType( FRAME_PCB_EDITOR ) )
{
BOARD* brd = myframe->GetBoard();
LSET visibleLayers = brd->GetVisibleLayers();
if( visibleLayers.test( aLayer ) != isVisible )
{
visibleLayers.set( aLayer, isVisible );
brd->SetVisibleLayers( visibleLayers );
if( myframe->GetCanvas() )
myframe->GetCanvas()->GetView()->SetLayerVisible( aLayer, isVisible );
}
}
else
if( myframe->GetCanvas() )
myframe->GetCanvas()->GetView()->SetLayerVisible( aLayer, isVisible );
if( isFinal )
myframe->GetCanvas()->Refresh();
}
void PCB_LAYER_WIDGET::OnLayerRightClick( wxMenu& aMenu )
{
AddRightClickMenuItems( aMenu );
}
void PCB_LAYER_WIDGET::OnRenderColorChange( int aId, COLOR4D aColor )
{
wxASSERT( aId > GAL_LAYER_ID_START && aId < GAL_LAYER_ID_END );
myframe->GetColorSettings()->SetColor( aId, aColor );
myframe->GetCanvas()->UpdateColors();
KIGFX::VIEW* view = myframe->GetCanvas()->GetView();
view->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); // useful to update rastnest
view->UpdateLayerColor( aId );
// plated-through-holes don't have their own color; they use the background color
if( aId == LAYER_PCB_BACKGROUND )
view->UpdateLayerColor( LAYER_PADS_PLATEDHOLES );
myframe->ReCreateHToolbar();
myframe->GetCanvas()->ForceRefresh();
myframe->GetCanvas()->Refresh();
}
void PCB_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled )
{
BOARD* brd = myframe->GetBoard();
wxASSERT( aId > GAL_LAYER_ID_START && aId < GAL_LAYER_ID_END );
// Grid is not set through the board visibility
if( aId == LAYER_GRID )
myframe->SetGridVisibility( isEnabled );
else
brd->SetElementVisibility( static_cast<GAL_LAYER_ID>( aId ), isEnabled );
if( aId == LAYER_RATSNEST )
{
// don't touch the layers. ratsnest is enabled on per-item basis.
myframe->GetCanvas()->GetView()->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
myframe->GetCanvas()->GetView()->SetLayerVisible( aId, true );
if( myframe->IsType( FRAME_PCB_EDITOR ) )
{
PCB_DISPLAY_OPTIONS opt = myframe->GetDisplayOptions();
opt.m_ShowGlobalRatsnest = isEnabled;
myframe->GetCanvas()->GetView()->UpdateDisplayOptions( opt );
}
}
else if( aId != LAYER_GRID )
myframe->GetCanvas()->GetView()->SetLayerVisible( aId, isEnabled );
myframe->GetCanvas()->Refresh();
myframe->GetCanvas()->Refresh();
}
//-----</LAYER_WIDGET callbacks>------------------------------------------

View File

@ -1,182 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2010-2018 KiCad Developers, see cAUTHORS.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 Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/************************************************************/
/* pcb_layer_widget.h : header for the layers manager */
/************************************************************/
#ifndef PCB_LAYER_WIDGET_H
#define PCB_LAYER_WIDGET_H
#include <layer_widget.h>
/**
* PCB_LAYER_WIDGET
* is here to implement the abstract functions of LAYER_WIDGET so they
* may be tied into the PCB_EDIT_FRAME's data and so we can add a popup
* menu which is specific to PCBNEW's needs.
*/
class PCB_LAYER_WIDGET : public LAYER_WIDGET
{
public:
/**
* Constructor
* @param aParent is the parent window
* @param aFocusOwner is the window that should be sent the focus after
* @param aFpEditorMode false for the board editor (default), true for fp editor
* when true, some options or layers which cannot be used in editor mode are not
* displayed
*/
PCB_LAYER_WIDGET( wxWindow* aParent, PCB_BASE_FRAME* aFrame, wxWindow* aFocusOwner, bool aFpEditorMode = false );
void ReFill();
/**
* Function ReFillRender
* rebuilds Render for instance after the config is read
*/
void ReFillRender();
/**
* Function SyncLayerVisibilities
* updates each "Layer" checkbox in this layer widget according
* to each layer's current visibility determined by IsLayerVisible(), and is
* helpful immediately after loading a BOARD which may have state information in it.
*/
void SyncLayerVisibilities();
/**
* Function SyncLayerAlphaIndicators
* updates each "Layer"s alpha indicator to show if the board is currently being
* rendered with more transparency or less.
*/
void SyncLayerAlphaIndicators();
/**
* Updates the color for each layer and item from the active color theme
*/
void SyncLayerColors();
/**
* Function SetLayersManagerTabsText
* Update the layer manager tabs labels
* Useful when changing Language or to set labels to a non default value
*/
void SetLayersManagerTabsText();
//-----<implement LAYER_WIDGET abstract callback functions>-----------
void OnLayerColorChange( int aLayer, COLOR4D aColor ) override;
bool OnLayerSelect( int aLayer ) override;
void OnLayerVisible( int aLayer, bool isVisible, bool isFinal ) override;
void OnLayerRightClick( wxMenu& aMenu ) override;
void OnRenderColorChange( int aId, COLOR4D aColor ) override;
void OnRenderEnable( int aId, bool isEnabled ) override;
//-----</implement LAYER_WIDGET abstract callback functions>----------
/**
* Function OnLayerSelected
* ensure the active layer is visible, and other layers not visible
* when m_alwaysShowActiveLayer is true
* Otherwise do nothing.
* @return true m_alwaysShowActiveLayer is true and the canvas is refreshed,
* and false if do nothing
*/
bool OnLayerSelected(); // postprocess after an active layer selection
// ensure active layer visible if
// m_alwaysShowActiveCopperLayer is true;
/**
* Function addRightClickMenuItems
* add menu items to a menu that should be shown when right-clicking
* the PCB layer widget.
*/
void AddRightClickMenuItems( wxMenu& menu );
protected:
static const LAYER_WIDGET::ROW s_render_rows[];
bool m_alwaysShowActiveCopperLayer; // If true: Only shows the current active layer
// even if it is changed
bool m_fp_editor_mode;
PCB_BASE_FRAME* myframe;
// popup menu ids.
enum POPUP_ID
{
ID_SHOW_ALL_COPPER_LAYERS = LAYER_WIDGET::ID_LAST_VALUE,
ID_HIDE_ALL_COPPER_LAYERS,
ID_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE,
ID_ALWAYS_HIDE_ALL_COPPER_LAYERS_BUT_ACTIVE,
ID_SHOW_NO_LAYERS,
ID_SHOW_ALL_LAYERS,
ID_SHOW_ONLY_FRONT,
ID_SHOW_ONLY_INNER,
ID_SHOW_ONLY_BACK,
ID_SHOW_ONLY_FRONT_ASSEMBLY,
ID_SHOW_ONLY_BACK_ASSEMBLY,
ID_HIDE_ALL_NON_COPPER,
ID_SHOW_ALL_NON_COPPER,
ID_LAST_VALUE
};
virtual COLOR4D getBackgroundLayerColor() override;
/**
* Function isAllowedInFpMode
* @return true if item aId has meaning in footprint editor mode.
* and therefore is shown in render panel
*/
bool isAllowedInFpMode( int aId );
/**
* Function isLayerAllowedInFpMode
*
* User layers, which are not paired, are not shown in layers manager. However a not
* listed layer can be reachable in the graphic item properties dialog.
*
* @param aLayer is the layer id to test
* @return true if PCB_LAYER_ID aLayer has meaning in footprint editor mode.
* and therefore is shown in render panel
*/
bool isLayerAllowedInFpMode( PCB_LAYER_ID aLayer );
/**
* Function OnRightDownLayers
* puts up a popup menu for the layer panel.
*/
void onRightDownLayers( wxMouseEvent& event );
void onPopupSelection( wxCommandEvent& event );
/// this is for the popup menu, the right click handler has to be installed
/// on every child control within the layer panel.
void installRightLayerClickHandler();
};
#endif // PCB_LAYER_WIDGET_H

View File

@ -378,7 +378,9 @@ void PCB_EDIT_FRAME::ReCreateOptToolbar()
// Tools to show/hide toolbars: // Tools to show/hide toolbars:
m_optionsToolBar->AddScaledSeparator( this ); m_optionsToolBar->AddScaledSeparator( this );
m_optionsToolBar->Add( PCB_ACTIONS::showLayersManager, ACTION_TOOLBAR::TOGGLE ); m_optionsToolBar->Add( PCB_ACTIONS::showLayersManager, ACTION_TOOLBAR::TOGGLE );
m_optionsToolBar->Add( PCB_ACTIONS::showProperties, ACTION_TOOLBAR::TOGGLE );
if( ADVANCED_CFG::GetCfg().m_ShowPropertiesPanel )
m_optionsToolBar->Add( PCB_ACTIONS::showProperties, ACTION_TOOLBAR::TOGGLE );
PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool<PCB_SELECTION_TOOL>(); PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool<PCB_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( false, selTool ); std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( false, selTool );
@ -766,6 +768,7 @@ void PCB_EDIT_FRAME::ToggleLayersManager()
// show auxiliary Vertical layers and visibility manager toolbar // show auxiliary Vertical layers and visibility manager toolbar
m_show_layer_manager_tools = !m_show_layer_manager_tools; m_show_layer_manager_tools = !m_show_layer_manager_tools;
layersManager.Show( m_show_layer_manager_tools ); layersManager.Show( m_show_layer_manager_tools );
selectionFilter.Show( m_show_layer_manager_tools ); selectionFilter.Show( m_show_layer_manager_tools );
@ -784,6 +787,8 @@ void PCB_EDIT_FRAME::ToggleLayersManager()
void PCB_EDIT_FRAME::ToggleProperties() void PCB_EDIT_FRAME::ToggleProperties()
{ {
m_show_properties = !m_show_properties; m_show_properties = !m_show_properties;
m_auimgr.GetPane( "PropertiesManager" ).Show( m_show_properties );
m_auimgr.Update(); m_auimgr.Update();
} }