pcbnew: More about work on color selection and items visibility

This commit is contained in:
charras 2010-01-30 14:46:26 +00:00
parent 560970da29
commit cf7ad0f503
10 changed files with 140 additions and 56 deletions

View File

@ -4,6 +4,12 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with
email address.
2010-Jan-30 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++ pcbnew:
More about work on color selection and items visibility
work in progress
2010-Jan-29 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++ All:

View File

@ -4,6 +4,7 @@
/****************************************************/
#include "fctsys.h"
#include "colors.h"
#include "macros.h"
#include "class_colors_design_settings.h"
@ -64,10 +65,10 @@ static const int default_items_color[LAYERSCOLORSBUFFERSIZE] =
COLORS_DESIGN_SETTINGS:: COLORS_DESIGN_SETTINGS()
{
for( unsigned ii = 0; ii < LAYERSCOLORSBUFFERSIZE; ii++ )
for( unsigned ii = 0; ii < DIM(m_LayersColors); ii++ )
m_LayersColors[ii] = default_layer_color[ii];
for( unsigned ii = 0; ii < ITEMSCOLORSBUFFERSIZE; ii++ )
for( unsigned ii = 0; ii < DIM(m_ItemsColors); ii++ )
m_ItemsColors[ii] = default_items_color[ii];
}
@ -79,7 +80,7 @@ COLORS_DESIGN_SETTINGS:: COLORS_DESIGN_SETTINGS()
*/
int COLORS_DESIGN_SETTINGS::GetLayerColor( int aLayer )
{
if( (unsigned) aLayer < LAYERSCOLORSBUFFERSIZE )
if( (unsigned) aLayer < DIM(m_LayersColors) )
{
return m_LayersColors[aLayer];
}
@ -94,7 +95,7 @@ int COLORS_DESIGN_SETTINGS::GetLayerColor( int aLayer )
*/
void COLORS_DESIGN_SETTINGS:: SetLayerColor( int aLayer, int aColor )
{
if( (unsigned) aLayer < LAYERSCOLORSBUFFERSIZE )
if( (unsigned) aLayer < DIM(m_LayersColors) )
{
m_LayersColors[aLayer] = aColor;
}
@ -108,7 +109,7 @@ void COLORS_DESIGN_SETTINGS:: SetLayerColor( int aLayer, int aColor )
*/
int COLORS_DESIGN_SETTINGS:: GetItemColor( int aItemIdx )
{
if( (unsigned) aItemIdx < ITEMSCOLORSBUFFERSIZE )
if( (unsigned) aItemIdx < DIM(m_ItemsColors) )
{
return m_ItemsColors[aItemIdx];
}
@ -123,7 +124,7 @@ int COLORS_DESIGN_SETTINGS:: GetItemColor( int aItemIdx )
*/
void COLORS_DESIGN_SETTINGS:: SetItemColor( int aItemIdx, int aColor )
{
if( (unsigned) aItemIdx < ITEMSCOLORSBUFFERSIZE )
if( (unsigned) aItemIdx < DIM(m_ItemsColors) )
{
m_ItemsColors[aItemIdx] = aColor;
}

View File

@ -96,8 +96,11 @@ protected:
* <p>
* This function cannot be inline without including layer_widget.h in
* here and we do not want to do that.
* @param aRenderOnly: true to update render only, false (default) for full update
* if aRenderOnly = true, the page displayed by the layer manager is not changed
* if aRenderOnly = false, the page displayed after update is the layers list
*/
void syncLayerWidget();
void syncLayerWidget(bool aRenderOnly = false);
/**
* Function syncLayerBox

View File

@ -390,7 +390,27 @@ void BOARD::SetVisibleLayers( int aLayerMask )
void BOARD::SetVisibleElements( int aMask )
{
m_BoardSettings->SetVisibleElements( aMask );
/* Call SetElementVisibility for each item,
* to ensure specific calculations that can be needed by some items
*/
for( int ii = 0; ii < PCB_VISIBLE(END_PCB_VISIBLE_LIST); ii++ )
{
int item_mask = 1 << ii;
SetElementVisibility( ii, aMask & item_mask );
}
}
// these are not tidy, since there are PCB_VISIBLEs that are not stored in the bitmap.
void BOARD::SetVisibleAlls( )
{
SetVisibleLayers( FULL_LAYERS );
/* Call SetElementVisibility for each item,
* to ensure specific calculations that can be needed by some items
*/
for( int ii = 0; ii < PCB_VISIBLE(END_PCB_VISIBLE_LIST); ii++ )
{
SetElementVisibility( ii, true );
}
}
@ -420,11 +440,29 @@ void BOARD::SetElementVisibility( int aPCB_VISIBLE, bool isEnabled )
{
switch( aPCB_VISIBLE )
{
/*
case GRID_VISIBLE:
myframe->m_Draw_Grid = isEnabled;
m_PcbFrame->m_Draw_Grid = isEnabled;
m_BoardSettings->SetElementVisibility( aPCB_VISIBLE, isEnabled );
break;
*/
case RATSNEST_VISIBLE:
m_BoardSettings->SetElementVisibility( aPCB_VISIBLE, isEnabled );
// we must clear or set the CH_VISIBLE flags to hide/show ratsnet
// because we have a tool to show hide ratsnest relative to a pad or a module
// so the hide/show option is a per item selection
if( IsElementVisible(RATSNEST_VISIBLE) )
{
for( unsigned ii = 0; ii < GetRatsnestsCount(); ii++ )
m_FullRatsnest[ii].m_Status |= CH_VISIBLE;
}
else
{
for( unsigned ii = 0; ii < GetRatsnestsCount(); ii++ )
m_FullRatsnest[ii].m_Status &= ~CH_VISIBLE;
}
break;
default:
m_BoardSettings->SetElementVisibility( aPCB_VISIBLE, isEnabled );
@ -478,20 +516,6 @@ void BOARD::SetVisibleElementColor( int aPCB_VISIBLE, int aColor )
g_ColorsSettings.SetItemColor( aPCB_VISIBLE, aColor );
break;
case RATSNEST_VISIBLE:
// we must clear or set the CH_VISIBLE flags to hide/show ratsnet
// because we have atool to show hide ratsnest relative to a pad or a module
// so the hide/show option is a per item selection
if( IsElementVisible(RATSNEST_VISIBLE) )
{
for( unsigned ii = 0; ii < GetRatsnestsCount(); ii++ )
m_FullRatsnest[ii].m_Status |= CH_VISIBLE;
}
else
{
for( unsigned ii = 0; ii < GetRatsnestsCount(); ii++ )
m_FullRatsnest[ii].m_Status &= ~CH_VISIBLE;
}
g_ColorsSettings.SetItemColor( aPCB_VISIBLE, aColor );
break;

View File

@ -304,6 +304,13 @@ public:
*/
void SetVisibleElements( int aMask );
/**
* Function SetVisibleAlls
* changes the bit-mask of visible element categories and layers
* @see enum PCB_VISIBLE
*/
void SetVisibleAlls( );
/**
* Function IsElementVisible
* tests whether a given element category is visible. Keep this as an

View File

@ -150,26 +150,29 @@ void WinEDA_ModuleEditFrame::InstallOptionsFrame( const wxPoint& pos )
void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
{
int id = event.GetId();
bool state = m_OptionsToolBar->GetToolState( id );
switch( id )
{
case ID_TB_OPTIONS_DRC_OFF:
Drc_On = m_OptionsToolBar->GetToolState( id ) ? FALSE : true;
Drc_On = state ? FALSE : true;
break;
case ID_TB_OPTIONS_SHOW_GRID:
m_Draw_Grid = m_OptionsToolBar->GetToolState( id );
GetBoard()->SetElementVisibility(GRID_VISIBLE, state);
syncLayerWidget( true );
DrawPanel->Refresh();
break;
case ID_TB_OPTIONS_SHOW_RATSNEST:
GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, m_OptionsToolBar->GetToolState( id ));
GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, state);
syncLayerWidget( true );
DrawPanel->Refresh( );
break;
case ID_TB_OPTIONS_SHOW_MODULE_RATSNEST:
g_Show_Module_Ratsnest = m_OptionsToolBar->GetToolState( id );
g_Show_Module_Ratsnest = state; // TODO: use the visibility list
syncLayerWidget( true );
break;
case ID_TB_OPTIONS_SELECT_UNIT_MM:
@ -186,16 +189,16 @@ void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
case ID_TB_OPTIONS_SHOW_POLAR_COORD:
Affiche_Message( wxEmptyString );
DisplayOpt.DisplayPolarCood = m_OptionsToolBar->GetToolState( id );
DisplayOpt.DisplayPolarCood = state;
UpdateStatusBar();
break;
case ID_TB_OPTIONS_SELECT_CURSOR:
m_CursorShape = m_OptionsToolBar->GetToolState( id );
m_CursorShape = state;
break;
case ID_TB_OPTIONS_AUTO_DEL_TRACK:
g_AutoDeleteOldTrack = m_OptionsToolBar->GetToolState( id );
g_AutoDeleteOldTrack = state;
break;
case ID_TB_OPTIONS_SHOW_ZONES:
@ -214,7 +217,7 @@ void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
break;
case ID_TB_OPTIONS_SHOW_PADS_SKETCH:
if( m_OptionsToolBar->GetToolState( id ) )
if( state )
{
m_DisplayPadFill = DisplayOpt.DisplayPadFill = false;
}
@ -226,7 +229,7 @@ void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
break;
case ID_TB_OPTIONS_SHOW_VIAS_SKETCH:
if( m_OptionsToolBar->GetToolState( id ) )
if( state )
{
m_DisplayViaFill = DisplayOpt.DisplayViaFill = false;
}
@ -238,19 +241,17 @@ void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
break;
case ID_TB_OPTIONS_SHOW_TRACKS_SKETCH:
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill =
!m_OptionsToolBar->GetToolState( id );
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill = !state;
DrawPanel->Refresh();
break;
case ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE:
DisplayOpt.ContrastModeDisplay =
m_OptionsToolBar->GetToolState( id );
DisplayOpt.ContrastModeDisplay = state;
DrawPanel->Refresh();
break;
case ID_TB_OPTIONS_SHOW_EXTRA_VERTICAL_TOOLBAR1:
m_show_microwave_tools = m_OptionsToolBar->GetToolState( id );
m_show_microwave_tools = state;
#if !defined(KICAD_AUIMANAGER)
// show auxiliary Vertical toolbar (Microwave tool)
m_AuxVToolBar->Show(m_show_microwave_tools);
@ -267,7 +268,7 @@ void WinEDA_PcbFrame::OnSelectOptionToolbar( wxCommandEvent& event )
case ID_TB_OPTIONS_SHOW_MANAGE_LAYERS_VERTICAL_TOOLBAR:
#if defined(KICAD_AUIMANAGER)
// show auxiliary Vertical layers and visibility manager toolbar
m_show_layer_manager_tools = m_OptionsToolBar->GetToolState( id );
m_show_layer_manager_tools = state;
m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).Show( m_show_layer_manager_tools );
m_auimgr.Update();
if( m_show_layer_manager_tools )

View File

@ -259,6 +259,7 @@ this file again."));
ReCreateLayerBox( NULL );
AuxiliaryToolBar_Update_UI();
syncLayerWidget( );
// Display the loaded board:
Zoom_Automatique( false );

View File

@ -85,6 +85,9 @@ public:
PCB_LAYER_WIDGET( WinEDA_PcbFrame* aParent, wxWindow* aFocusOwner, int aPointSize = 10 );
void ReFill();
// Update Show/hide checkbox state in render page
// must be called when a Show/hide option is changed outside the layer manager
void RenderSynchronize( );
//-----<implement LAYER_WIDGET abstract callback functions>-----------
void OnLayerColorChange( int aLayer, int aColor );
@ -315,6 +318,33 @@ void PCB_LAYER_WIDGET::ReFill()
// m_Layers->Thaw();
}
// Update the checkboxes state of each row of the render.
void PCB_LAYER_WIDGET::RenderSynchronize( )
{
BOARD* brd = myframe->GetBoard();
wxSizerItemList& sizerslist = m_RenderFlexGridSizer->GetChildren();
for( unsigned ii=0; ii< PCB_VISIBLE(END_PCB_VISIBLE_LIST); ++ii )
{
unsigned idx = ii * m_RenderFlexGridSizer->GetCols();
// idx points the first size of a m_RenderFlexGridSizer row
// the checkbox to update is managed by the second sizer
idx = idx + 1;
if( idx >= sizerslist.size() )
break; // Should not occur
// Get the sizer that manages the check box to update
wxSizerItem * sizer = sizerslist[idx];
// Get the checkbox and update its state.
wxCheckBox* cb = (wxCheckBox*)sizer->GetWindow();
if( cb )
{
// Calculate the visible item id
int id = getDecodedId(cb->GetId());
cb->SetValue(brd->IsElementVisible(id));
}
}
}
//-----<LAYER_WIDGET callbacks>-------------------------------------------
@ -330,6 +360,9 @@ bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer )
// false from this function.
myframe->setActiveLayer( aLayer, false );
myframe->syncLayerBox();
if(DisplayOpt.ContrastModeDisplay)
myframe->DrawPanel->Refresh();
return true;
}
@ -362,13 +395,10 @@ void PCB_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled )
/* @todo:
1) move:
move:
RATSNEST_VISIBLE,
GRID_VISIBLE, ? maybe not this one
into m_VisibleElements and get rid of globals.
2) Add IsElementVisible() & SetVisibleElement() to class BOARD
*/
switch( aId )
@ -378,7 +408,7 @@ void PCB_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled )
case GRID_VISIBLE:
// @todo, make read/write accessors for grid control so the write accessor can fire updates to
// grid state listeners. I think the grid state should be kept in the BOARD.
myframe->m_Draw_Grid = isEnabled;
brd->SetElementVisibility( aId, isEnabled ); // set visibilty flag also in list, and myframe->m_Draw_Grid
break;
default:
@ -643,6 +673,7 @@ WinEDA_PcbFrame::WinEDA_PcbFrame( wxWindow* father,
if( DrawPanel )
DrawPanel->m_Block_Enable = true;
ReCreateMenuBar();
ReCreateHToolbar();
ReCreateAuxiliaryToolbar();
@ -718,8 +749,8 @@ WinEDA_PcbFrame::WinEDA_PcbFrame( wxWindow* father,
m_AuxVToolBar->Show(m_show_microwave_tools);
#endif
SetToolbars();
ReFillLayerWidget(); // this is near end because contents establish size
syncLayerWidget();
}
@ -845,6 +876,10 @@ void WinEDA_PcbFrame::LoadSettings()
config->Read( PCB_MAGNETIC_TRACKS_OPT, &g_MagneticTrackOption );
config->Read( SHOW_MICROWAVE_TOOLS, &m_show_microwave_tools );
config->Read( SHOW_LAYER_MANAGER_TOOLS, &m_show_layer_manager_tools );
// Copy grid visibility (set by LoadSetting() in visibility items list:
GetBoard()->SetElementVisibility(GRID_VISIBLE, m_Draw_Grid);
}
@ -870,8 +905,10 @@ void WinEDA_PcbFrame::SaveSettings()
}
void WinEDA_PcbFrame::syncLayerWidget()
void WinEDA_PcbFrame::syncLayerWidget( bool aRenderOnly)
{
if( ! aRenderOnly )
m_Layers->SelectLayer( getActiveLayer() );
m_Layers->RenderSynchronize( );
}

View File

@ -191,9 +191,14 @@ bool WinEDA_PcbFrame::Read_Config( const wxString& projectFileName )
/* Reset the items visibility flag when loading a new config
* Because it could creates SERIOUS mistakes for the user,
* if some items are not visible after loading a board...
* if board items are not visible after loading a board...
* Grid and ratsnest can be left to their previous state
*/
GetBoard()->m_BoardSettings->SetVisibleAlls( );
bool showGrid = GetBoard()->IsElementVisible(GRID_VISIBLE);
bool showRats = GetBoard()->IsElementVisible(RATSNEST_VISIBLE);
GetBoard()->SetVisibleAlls( );
GetBoard()->SetElementVisibility(GRID_VISIBLE, showGrid);
GetBoard()->SetElementVisibility(RATSNEST_VISIBLE, showRats);
DisplayOpt.DisplayPadNoConn = true;
return TRUE;

View File

@ -203,10 +203,9 @@ void WinEDA_PcbFrame::SetToolbars()
_( "Display rectangular coordinates" ) :
_( "Display polar coordinates" ) );
m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_GRID,
m_Draw_Grid );
m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_GRID, GetBoard()->IsElementVisible(GRID_VISIBLE) );
m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_GRID,
m_Draw_Grid ?
GetBoard()->IsElementVisible(GRID_VISIBLE) ?
_( "Hide grid" ) :
_( "Show grid" ) );