Commit 7d8df042 authored by jean-pierre charras's avatar jean-pierre charras

Modedit: now shows a specific layers manager, which allows user to select the...

Modedit: now shows a specific layers manager, which allows user to select the technical layer which is used when adding a new graphic text or outline to the current footprint.
Please, note the layer manager was already available in GAL mode, but is was the same as tne board editor, which is not good.
Now:
- In default mode or GAL mode, the look is the same.
- Only suitable technical layers (i.e. paired layers) are selectable from the layers manager (for special purposes, some other layers can be used, via the graphic items properties dialog)
parent 1bcfd956
......@@ -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<LAYER_ID> BASE_SEQ;
......
......@@ -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
......
/*
* 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 <dick@softplc.com>
* 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();
//-----<Popup menu>-------------------------------------------------
......@@ -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;
......
/*
* 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 <dick@softplc.com>
* 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.
......
......@@ -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() );
......
/*
* 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 <pcbnew.h>
#include <wxPcbStruct.h>
#include <module_editor_frame.h>
#include <class_board.h>
#include <class_module.h>
......@@ -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->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->SetPosition( GetCrossHairPosition() );
Text->SetText( wxT( "text" ) );
if( LSET::AllTechMask().test( GetActiveLayer() ) ) // i.e. a possible layer for a text
text->SetLayer( GetActiveLayer() );
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();
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();
if( aDC )
text->Draw( m_canvas, aDC, GR_OR );
SetMsgPanel( text );
return Text;
return text;
}
......
......@@ -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.
......
......@@ -39,6 +39,7 @@
#include <kicad_device_context.h>
#include <macros.h>
#include <invoke_pcb_dialog.h>
#include <class_pcb_layer_widget.h>
#include <class_board.h>
#include <class_module.h>
......@@ -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();
}
......
......@@ -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_
/*
* 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 <dick@softplc.com>
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
* 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 );
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment