diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h index 8586d39da5..d393766693 100644 --- a/include/layers_id_colors_and_visibility.h +++ b/include/layers_id_colors_and_visibility.h @@ -126,22 +126,6 @@ enum LAYER_ID #define MAX_CU_LAYERS (B_Cu - F_Cu + 1) -/* These were moved to legacy_plugin.cpp, please don't ever use them - outside there. Now with the advent of class LSEQ, we don't iterate over - LAYER_ID any more, so therefore FIRST_COPPER_LAYER and LAST_COPPER_LAYER are - dead concepts. They in fact failed to do what they were intended to do because - they implied a particular sequence which in and of itself was subject to change - and actually did when we flipped the pretty and *.kicad_pcb copper layer stack. - LSEQ is the way to go, use it. It gives a level of manipulation between - LAYER_ID and iteration. -#define FIRST_COPPER_LAYER brain dead -#define LAST_COPPER_LAYER brain dead -#define FIRST_LAYER brain dead -#define NB_LAYERS use LAYER_ID_COUNT instead -#define NB_COPPER_LAYERS was always a max, not a number, use MAX_CU_LAYERS now. -*/ - - /// A sequence of layers, a sequence provides a certain order. typedef std::vector BASE_SEQ; diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h index 476e315303..31202de1c9 100644 --- a/include/wxBasePcbFrame.h +++ b/include/wxBasePcbFrame.h @@ -343,7 +343,6 @@ public: void DeleteTextModule( TEXTE_MODULE* Text ); void PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC ); void StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC ); - TEXTE_MODULE* CreateTextModule( MODULE* Module, wxDC* DC ); /** * Function ResetTextSize diff --git a/pcbnew/class_pcb_layer_widget.cpp b/pcbnew/class_pcb_layer_widget.cpp index 439b1204a0..9c778903f2 100644 --- a/pcbnew/class_pcb_layer_widget.cpp +++ b/pcbnew/class_pcb_layer_widget.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004-2010 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr + * Copyright (C) 2004-2015 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr * Copyright (C) 2010-2012 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 2010 KiCad Developers, see change_log.txt for contributors. * @@ -79,15 +79,22 @@ const LAYER_WIDGET::ROW PCB_LAYER_WIDGET::s_render_rows[] = { RR( _( "References" ), MOD_REFERENCES_VISIBLE, UNSPECIFIED_COLOR, _( "Show footprint's references") ), }; +static int s_allowed_in_FpEditor[] = +{ + MOD_TEXT_INVISIBLE, PAD_FR_VISIBLE, PAD_BK_VISIBLE, + GRID_VISIBLE, MOD_VALUES_VISIBLE, MOD_REFERENCES_VISIBLE +}; -PCB_LAYER_WIDGET::PCB_LAYER_WIDGET( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwner, int aPointSize ) : - LAYER_WIDGET( aParent, aFocusOwner, aPointSize ), - myframe( aParent ) +PCB_LAYER_WIDGET::PCB_LAYER_WIDGET( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwner, + int aPointSize, bool aFpEditorMode ) : + LAYER_WIDGET( aParent, aFocusOwner, aPointSize ), + myframe( aParent ) { m_alwaysShowActiveCopperLayer = false; + m_fp_editor_mode = aFpEditorMode; ReFillRender(); - // Update default tabs labels for GerbView + // Update default tabs labels SetLayersManagerTabsText(); //------------------------------------------------------ @@ -106,6 +113,33 @@ PCB_LAYER_WIDGET::PCB_LAYER_WIDGET( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwn } +/* return true if item aId has meaning in footprint editor mode, + * i.e. is in s_allowed_in_FpEditor and therefore is shown in render panel + */ +bool PCB_LAYER_WIDGET::isAllowedInFpMode( int aId ) +{ + for( unsigned ii = 0; ii < DIM( s_allowed_in_FpEditor ); ii++ ) + if( s_allowed_in_FpEditor[ii] == aId ) + return true; + + return false; +} + +/* return true if item aId has meaning in footprint editor mode, + * i.e. is in s_allowed_in_FpEditor and therefore is shown in render panel + * Note: User layers, which are not paired, are not shown in layers manager. + * However a not listed layer can be reachable in the graphic item proprerties + * dialog. + */ +bool PCB_LAYER_WIDGET::isLayerAllowedInFpMode( LAYER_ID aLayer ) +{ + static LSET allowed = LSET::AllTechMask(); + // Currently not in use because putting a graphic item on a copper layer + // is not currently supported by DRC. + // allowed.set( F_Cu ).set( B_Cu ); + return allowed.test( aLayer ); +} + void PCB_LAYER_WIDGET::installRightLayerClickHandler() { int rowCount = GetLayerRowCount(); @@ -223,6 +257,9 @@ void PCB_LAYER_WIDGET::ReFillRender() { LAYER_WIDGET::ROW renderRow = s_render_rows[row]; + if( !isAllowedInFpMode( renderRow.id ) ) + continue; + renderRow.tooltip = wxGetTranslation( s_render_rows[row].tooltip ); renderRow.rowName = wxGetTranslation( s_render_rows[row].rowName ); @@ -247,6 +284,9 @@ void PCB_LAYER_WIDGET::SyncRenderStates() { int rowId = s_render_rows[row].id; + if( !isAllowedInFpMode( rowId ) ) + continue; + // this does not fire a UI event SetRenderState( rowId, board->IsElementVisible( rowId ) ); } @@ -305,6 +345,13 @@ void PCB_LAYER_WIDGET::ReFill() AppendLayerRow( LAYER_WIDGET::ROW( brd->GetLayerName( layer ), layer, brd->GetLayerColor( layer ), dsc, true ) ); + + if( m_fp_editor_mode && !isLayerAllowedInFpMode( layer ) ) + { + getLayerComp( GetLayerRowCount()-1, COLUMN_COLOR_LYRNAME )->Enable( false ); + getLayerComp( GetLayerRowCount()-1, + COLUMN_COLORBM )->SetToolTip( wxEmptyString ); + } } @@ -345,6 +392,13 @@ void PCB_LAYER_WIDGET::ReFill() AppendLayerRow( LAYER_WIDGET::ROW( brd->GetLayerName( layer ), layer, brd->GetLayerColor( layer ), wxGetTranslation( non_cu_seq[i].tooltip ), true ) ); + + if( m_fp_editor_mode && !isLayerAllowedInFpMode( layer ) ) + { + getLayerComp( GetLayerRowCount()-1, COLUMN_COLOR_LYRNAME )->Enable( false ); + getLayerComp( GetLayerRowCount()-1, + COLUMN_COLORBM )->SetToolTip( wxEmptyString ); + } } installRightLayerClickHandler(); @@ -371,7 +425,12 @@ bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer ) { // the layer change from the PCB_LAYER_WIDGET can be denied by returning // false from this function. - myframe->SetActiveLayer( ToLAYER_ID( aLayer ) ); + LAYER_ID layer = ToLAYER_ID( aLayer ); + + if( m_fp_editor_mode && !isLayerAllowedInFpMode( layer ) ) + return false; + + myframe->SetActiveLayer( layer ); if( m_alwaysShowActiveCopperLayer ) OnLayerSelected(); @@ -382,7 +441,7 @@ bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer ) } -bool PCB_LAYER_WIDGET::OnLayerSelected() +bool PCB_LAYER_WIDGET::OnLayerSelected() { if( !m_alwaysShowActiveCopperLayer ) return false; diff --git a/pcbnew/class_pcb_layer_widget.h b/pcbnew/class_pcb_layer_widget.h index 211e603aa4..a3a1aa7a3b 100644 --- a/pcbnew/class_pcb_layer_widget.h +++ b/pcbnew/class_pcb_layer_widget.h @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004-2010 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr + * Copyright (C) 2004-2015 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 2010 KiCad Developers, see change_log.txt for contributors. * @@ -50,8 +50,12 @@ public: * @param aPointSize is the font point size to use within the widget. This * effectively sets the overal size of the widget via the row height and bitmap * button sizes. + * @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( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwner, int aPointSize = 10 ); + PCB_LAYER_WIDGET( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwner, + int aPointSize = 10, bool aFpEditorMode = false ); void ReFill(); @@ -109,6 +113,7 @@ 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; @@ -118,6 +123,21 @@ protected: #define ID_SHOW_NO_COPPERS_BUT_ACTIVE (wxID_HIGHEST+2) #define ID_ALWAYS_SHOW_NO_COPPERS_BUT_ACTIVE (wxID_HIGHEST+3) + /** + * 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 + * @param aLayer is the layer id to test + * @return true if LAYER_ID aLayer has meaning in footprint editor mode. + * and therefore is shown in render panel + */ + bool isLayerAllowedInFpMode( LAYER_ID aLayer ); + /** * Function OnRightDownLayers * puts up a popup menu for the layer panel. diff --git a/pcbnew/edgemod.cpp b/pcbnew/edgemod.cpp index 3c1e901f5f..5dc01b5581 100644 --- a/pcbnew/edgemod.cpp +++ b/pcbnew/edgemod.cpp @@ -207,10 +207,11 @@ void FOOTPRINT_EDIT_FRAME::Edit_Edge_Layer( EDGE_MODULE* aEdge ) if( IsCopperLayer( new_layer ) ) { - /* an edge is put on a copper layer, and it is very dangerous. a - *confirmation is requested */ + // an edge is put on a copper layer, and it is very dangerous. + // A confirmation is requested if( !IsOK( this, - _( "The graphic item will be on a copper layer. This is very dangerous. Are you sure?" ) ) ) + _( "The graphic item will be on a copper layer.\n" + "This is very dangerous. Are you sure?" ) ) ) return; } @@ -346,13 +347,7 @@ EDGE_MODULE* FOOTPRINT_EDIT_FRAME::Begin_Edge_Module( EDGE_MODULE* aEdge, aEdge->SetAngle( ArcValue ); aEdge->SetWidth( GetDesignSettings().m_ModuleSegmentWidth ); - aEdge->SetLayer( module->GetLayer() ); - - // The default layer for an edge is the corresponding silk layer - if( module->IsFlipped() ) - aEdge->SetLayer( B_SilkS ); - else - aEdge->SetLayer( F_SilkS ); + aEdge->SetLayer( GetActiveLayer() ); // Initialize the starting point of the new segment or arc aEdge->SetStart( GetCrossHairPosition() ); diff --git a/pcbnew/edtxtmod.cpp b/pcbnew/edtxtmod.cpp index 3596ae5d18..2bd5d51013 100644 --- a/pcbnew/edtxtmod.cpp +++ b/pcbnew/edtxtmod.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr + * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -62,36 +63,43 @@ static double TextInitialOrientation; // module text initial orientation for * Note there always are 2 mandatory texts: reference and value. * New texts have the member TEXTE_MODULE.GetType() set to TEXT_is_DIVERS */ -TEXTE_MODULE* PCB_BASE_FRAME::CreateTextModule( MODULE* Module, wxDC* DC ) +TEXTE_MODULE* FOOTPRINT_EDIT_FRAME::CreateTextModule( MODULE* aModule, wxDC* aDC ) { - TEXTE_MODULE* Text = new TEXTE_MODULE( Module ); + TEXTE_MODULE* text = new TEXTE_MODULE( aModule ); - // Add the new text object to the beginning of the draw item list. - if( Module ) - Module->GraphicalItems().PushFront( Text ); - - Text->SetFlags( IS_NEW ); - - Text->SetText( wxT( "text" ) ); + text->SetFlags( IS_NEW ); GetDesignSettings().m_ModuleTextWidth = Clamp_Text_PenSize( GetDesignSettings().m_ModuleTextWidth, - std::min( GetDesignSettings().m_ModuleTextSize.x, GetDesignSettings().m_ModuleTextSize.y ), true ); - Text->SetSize( GetDesignSettings().m_ModuleTextSize ); - Text->SetThickness( GetDesignSettings().m_ModuleTextWidth ); - Text->SetTextPosition( GetCrossHairPosition() ); - Text->SetLocalCoord(); + std::min( GetDesignSettings().m_ModuleTextSize.x, GetDesignSettings().m_ModuleTextSize.y ), true ); + text->SetSize( GetDesignSettings().m_ModuleTextSize ); + text->SetThickness( GetDesignSettings().m_ModuleTextWidth ); + text->SetPosition( GetCrossHairPosition() ); + + if( LSET::AllTechMask().test( GetActiveLayer() ) ) // i.e. a possible layer for a text + text->SetLayer( GetActiveLayer() ); + + InstallTextModOptionsFrame( text, NULL ); - InstallTextModOptionsFrame( Text, NULL ); m_canvas->MoveCursorToCrossHair(); - Text->ClearFlags(); + if( text->GetText().IsEmpty() ) + { + delete text; + return NULL; + } - if( DC ) - Text->Draw( m_canvas, DC, GR_OR ); + // Add the new text object to the beginning of the footprint draw list. + if( aModule ) + aModule->GraphicalItems().PushFront( text ); - SetMsgPanel( Text ); + text->ClearFlags(); - return Text; + if( aDC ) + text->Draw( m_canvas, aDC, GR_OR ); + + SetMsgPanel( text ); + + return text; } diff --git a/pcbnew/layer_widget.h b/pcbnew/layer_widget.h index a5dd8490b6..e35be8e275 100644 --- a/pcbnew/layer_widget.h +++ b/pcbnew/layer_widget.h @@ -401,7 +401,7 @@ public: * is called to notify client code about a layer visibility change. * * @param aLayer is the board layer to select - * @param isVisible is the new vosible state + * @param isVisible is the new visible state * @param isFinal is true when this is the last of potentially several * such calls, and can be used to decide when to update the screen only * one time instead of several times in the midst of a multiple layer change. diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 6455891282..04294b08b8 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -909,6 +910,9 @@ void FOOTPRINT_EDIT_FRAME::SetActiveLayer( LAYER_ID aLayer ) GetGalCanvas()->SetHighContrastLayer( aLayer ); + m_Layers->SelectLayer( GetActiveLayer() ); + m_Layers->OnLayerSelected(); + if( IsGalCanvasActive() ) GetGalCanvas()->Refresh(); } diff --git a/pcbnew/module_editor_frame.h b/pcbnew/module_editor_frame.h index caf9518168..f7dd546d65 100644 --- a/pcbnew/module_editor_frame.h +++ b/pcbnew/module_editor_frame.h @@ -416,6 +416,43 @@ public: */ bool DeleteModuleFromCurrentLibrary(); + /** + * Function IsElementVisible + * tests whether a given element category is visible. Keep this as an + * inline function. + * @param aElement is from the enum by the same name + * @return bool - true if the element is visible. + * @see enum PCB_VISIBLE + */ + bool IsElementVisible( int aElement ) const; + + /** + * Function SetElementVisibility + * changes the visibility of an element category + * @param aElement is from the enum by the same name + * @param aNewState = The new visibility state of the element category + * @see enum PCB_VISIBLE + */ + void SetElementVisibility( int aElement, bool aNewState ); + + /** + * Function IsGridVisible() , virtual + * @return true if the grid must be shown + */ + virtual bool IsGridVisible() const; + + /** + * Function SetGridVisibility() , virtual + * It may be overloaded by derived classes + * if you want to store/retrieve the grid visibility in configuration. + * @param aVisible = true if the grid must be shown + */ + virtual void SetGridVisibility( bool aVisible ); + + /** + * Function GetGridColor() , virtual + * @return the color of the grid + */ virtual EDA_COLOR_T GetGridColor() const; ///> @copydoc PCB_BASE_FRAME::SetActiveLayer() @@ -447,6 +484,14 @@ protected: void restoreLastFootprint(); void retainLastFootprint(); + + /** + * Creates a new text for the footprint + * @param aModule is the owner of the text + * @param aDC is the current DC (can be NULL ) + * @return a pointer to the new text, or NULL if aborted + */ + TEXTE_MODULE* CreateTextModule( MODULE* aModule, wxDC* aDC ); }; #endif // MODULE_EDITOR_FRAME_H_ diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 319c2211a7..9664c4ffda 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr + * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 2012 Wayne Stambaugh * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. @@ -198,10 +198,13 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : restoreLastFootprint(); // Ensure all layers and items are visible: + // In footprint editor, some layers have no meaning or + // cannot be used, but we show all of them, at least to be able + // to edit a bad layer GetBoard()->SetVisibleAlls(); wxFont font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); - m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas(), font.GetPointSize() ); + m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas(), font.GetPointSize(), true ); SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU() ) ); @@ -257,7 +260,7 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : // Add the layer manager ( most right side of pcbframe ) m_auimgr.AddPane( m_Layers, lyrs.Name( wxT( "m_LayersManagerToolBar" ) ).Right().Layer( 2 ) ); // Layers manager is visible and served only in GAL canvas mode. - m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).Show( parentFrame->IsGalCanvasActive() ); + m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).Show( true ); // parentFrame->IsGalCanvasActive() ); // The left vertical toolbar (fast acces to display options) m_auimgr.AddPane( m_optionsToolBar, @@ -295,15 +298,17 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_toolManager->ResetTools( TOOL_BASE::RUN ); m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" ); + UseGalCanvas( true ); + } + if( m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).IsShown() ) + { m_Layers->ReFill(); m_Layers->ReFillRender(); GetScreen()->m_Active_Layer = F_SilkS; m_Layers->SelectLayer( F_SilkS ); m_Layers->OnLayerSelected(); - - UseGalCanvas( true ); } m_auimgr.Update(); @@ -714,3 +719,30 @@ void FOOTPRINT_EDIT_FRAME::updateView() m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD ); m_toolManager->RunAction( COMMON_ACTIONS::zoomFitScreen, true ); } + + +bool FOOTPRINT_EDIT_FRAME::IsGridVisible() const +{ + return IsElementVisible( GRID_VISIBLE ); +} + + +void FOOTPRINT_EDIT_FRAME::SetGridVisibility(bool aVisible) +{ + SetElementVisibility( GRID_VISIBLE, aVisible ); +} + + +bool FOOTPRINT_EDIT_FRAME::IsElementVisible( int aElement ) const +{ + return GetBoard()->IsElementVisible( aElement ); +} + + +void FOOTPRINT_EDIT_FRAME::SetElementVisibility( int aElement, bool aNewState ) +{ + GetGalCanvas()->GetView()->SetLayerVisible( ITEM_GAL_LAYER( aElement ), aNewState ); + GetBoard()->SetElementVisibility( aElement, aNewState ); + m_Layers->SetRenderState( aElement, aNewState ); +} +