416 lines
14 KiB
C++
416 lines
14 KiB
C++
/***************/
|
|
/* eelayer.cpp */
|
|
/***************/
|
|
|
|
/* Set up color Layers for EESchema
|
|
*/
|
|
|
|
#if defined(__GNUG__) && !defined(__APPLE__)
|
|
#pragma implementation "eelayer.h"
|
|
#endif
|
|
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
#include "common.h"
|
|
#include "id.h"
|
|
#include "class_drawpanel.h"
|
|
|
|
#include "program.h"
|
|
#include "libcmp.h"
|
|
#include "general.h"
|
|
#include "protos.h"
|
|
|
|
#include "eelayer.h" // Header file associated with this file
|
|
|
|
// Local variables:
|
|
int CurrentColor[NB_BUTT]; // Holds color for each layer while dialog box open
|
|
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS( WinEDA_SetColorsFrame, wxDialog )
|
|
|
|
// Table of events for WinEDA_SetColorsFrame
|
|
BEGIN_EVENT_TABLE( WinEDA_SetColorsFrame, wxDialog )
|
|
EVT_COMMAND_RANGE( ID_COLOR_SETUP, ID_COLOR_SETUP + NB_BUTT - 1,
|
|
wxEVT_COMMAND_BUTTON_CLICKED,
|
|
WinEDA_SetColorsFrame::SetColor )
|
|
EVT_BUTTON( wxID_OK, WinEDA_SetColorsFrame::OnOkClick )
|
|
EVT_BUTTON( wxID_CANCEL, WinEDA_SetColorsFrame::OnCancelClick )
|
|
EVT_BUTTON( wxID_APPLY, WinEDA_SetColorsFrame::OnApplyClick )
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
/**************************************************************/
|
|
void DisplayColorSetupFrame( WinEDA_DrawFrame* parent,
|
|
const wxPoint& framepos )
|
|
/**************************************************************/
|
|
{
|
|
WinEDA_SetColorsFrame* frame =
|
|
new WinEDA_SetColorsFrame( parent, framepos );
|
|
|
|
frame->ShowModal();
|
|
frame->Destroy();
|
|
}
|
|
|
|
|
|
// Default Constructor (whose provision is mandated by the inclusion
|
|
// of DECLARE_DYNAMIC_CLASS( WinEDA_SetColorsFrame ) within eelayer.h)
|
|
WinEDA_SetColorsFrame::WinEDA_SetColorsFrame()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
|
|
// Standard Constructor
|
|
WinEDA_SetColorsFrame::WinEDA_SetColorsFrame( WinEDA_DrawFrame* parent,
|
|
const wxPoint& framepos )
|
|
{
|
|
m_Parent = parent;
|
|
Init();
|
|
Create( parent,
|
|
SYMBOL_WINEDA_SETCOLORSFRAME_IDNAME,
|
|
SYMBOL_WINEDA_SETCOLORSFRAME_TITLE,
|
|
framepos,
|
|
wxDefaultSize,
|
|
SYMBOL_WINEDA_SETCOLORSFRAME_STYLE );
|
|
}
|
|
|
|
|
|
// Destructor
|
|
WinEDA_SetColorsFrame::~WinEDA_SetColorsFrame() { }
|
|
|
|
|
|
/**********************************************************/
|
|
bool WinEDA_SetColorsFrame::Create( wxWindow* parent, wxWindowID id,
|
|
const wxString& caption, const wxPoint& pos,
|
|
const wxSize& size, long style )
|
|
/**********************************************************/
|
|
{
|
|
SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
|
|
wxDialog::Create( parent, id, caption, pos, size, style );
|
|
|
|
CreateControls();
|
|
if (GetSizer())
|
|
{
|
|
GetSizer()->SetSizeHints(this);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
void WinEDA_SetColorsFrame::Init()
|
|
/**********************************************************/
|
|
{
|
|
OuterBoxSizer = NULL;
|
|
MainBoxSizer = NULL;
|
|
ColumnBoxSizer = NULL;
|
|
RowBoxSizer = NULL;
|
|
Label = NULL;
|
|
BitmapButton = NULL;
|
|
m_ShowGrid = NULL;
|
|
m_SelBgColor = NULL;
|
|
Line = NULL;
|
|
StdDialogButtonSizer = NULL;
|
|
Button = NULL;
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
void WinEDA_SetColorsFrame::CreateControls()
|
|
/**********************************************************/
|
|
{
|
|
int lyr, grp, butt_ID, buttcolor;
|
|
|
|
SetFont( *g_DialogFont );
|
|
|
|
OuterBoxSizer = new wxBoxSizer(wxVERTICAL);
|
|
SetSizer(OuterBoxSizer);
|
|
|
|
MainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
OuterBoxSizer->Add(MainBoxSizer, 1, wxGROW|wxLEFT|wxRIGHT, 5);
|
|
|
|
// Add various items to the dialog box, as determined by the
|
|
// details of each element contained within laytool_list[]
|
|
for( lyr = 0, grp = 0; lyr < NB_BUTT; lyr++ )
|
|
{
|
|
// Look for the initial button of each group of controls.
|
|
if( lyr == 0 || lyr == laytool_index[grp]->m_Index + 1 )
|
|
{
|
|
if( lyr != 0 )
|
|
grp++;
|
|
|
|
// Add another column sizer, unless the current value of
|
|
// grp is BUTTON_GROUPS - 1. (The very last group of controls
|
|
// differs from the previous groups in that its associated
|
|
// controls are located in the same column as the controls
|
|
// associated with the preceeding group.)
|
|
if( grp < BUTTON_GROUPS - 1 )
|
|
{
|
|
ColumnBoxSizer = new wxBoxSizer(wxVERTICAL);
|
|
MainBoxSizer->Add(ColumnBoxSizer, 1, wxALIGN_TOP|wxLEFT|wxTOP, 5);
|
|
}
|
|
else
|
|
{
|
|
// Add a spacer to better separate the text string (which is
|
|
// about to be added) from the items located above it.
|
|
ColumnBoxSizer->AddSpacer(5);
|
|
}
|
|
|
|
RowBoxSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
ColumnBoxSizer->Add(RowBoxSizer, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
|
|
|
|
// Add a text string to identify the following set of controls
|
|
Label = new wxStaticText( this, -1, laytool_index[grp]->m_Name,
|
|
wxDefaultPosition, wxDefaultSize, 0 );
|
|
// Make this text string bold (so that it stands out better)
|
|
Label->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxNORMAL_FONT->GetFamily(),
|
|
wxNORMAL, wxBOLD, false, wxNORMAL_FONT->GetFaceName() ) );
|
|
|
|
RowBoxSizer->Add(Label, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
|
}
|
|
|
|
RowBoxSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
ColumnBoxSizer->Add(RowBoxSizer, 0, wxGROW|wxALL, 0);
|
|
|
|
butt_ID = ID_COLOR_SETUP + lyr;
|
|
laytool_list[lyr]->m_Id = butt_ID;
|
|
wxMemoryDC iconDC;
|
|
wxBitmap ButtBitmap( BUTT_SIZE_X, BUTT_SIZE_Y );
|
|
|
|
iconDC.SelectObject( ButtBitmap );
|
|
buttcolor = *laytool_list[lyr]->m_Color;
|
|
CurrentColor[lyr] = buttcolor;
|
|
wxBrush Brush;
|
|
iconDC.SelectObject( ButtBitmap );
|
|
iconDC.SetPen( *wxBLACK_PEN );
|
|
Brush.SetColour(
|
|
ColorRefs[buttcolor].m_Red,
|
|
ColorRefs[buttcolor].m_Green,
|
|
ColorRefs[buttcolor].m_Blue
|
|
);
|
|
Brush.SetStyle( wxSOLID );
|
|
|
|
iconDC.SetBrush( Brush );
|
|
iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y );
|
|
|
|
BitmapButton = new wxBitmapButton( this, butt_ID, ButtBitmap, wxDefaultPosition, wxSize(BUTT_SIZE_X, BUTT_SIZE_Y) );
|
|
RowBoxSizer->Add(BitmapButton, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5);
|
|
|
|
laytool_list[lyr]->m_Button = BitmapButton;
|
|
|
|
// Add a text string, unless the current value of lyr is NB_BUTT - 1
|
|
if( lyr < NB_BUTT - 1 )
|
|
{
|
|
Label = new wxStaticText( this, wxID_STATIC, wxGetTranslation( laytool_list[lyr]->m_Name ),
|
|
wxDefaultPosition, wxDefaultSize, 0 );
|
|
RowBoxSizer->Add(Label, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5);
|
|
}
|
|
else
|
|
{
|
|
// Special case; provide a checkbox instead (rather than a text string).
|
|
m_ShowGrid = new wxCheckBox( this, ID_CHECKBOX_SHOW_GRID, _("Grid"), wxDefaultPosition, wxDefaultSize, 0 );
|
|
m_ShowGrid->SetValue( m_Parent->m_Draw_Grid );
|
|
RowBoxSizer->Add(m_ShowGrid, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5);
|
|
}
|
|
}
|
|
|
|
// Add a spacer to improve appearance.
|
|
ColumnBoxSizer->AddSpacer(5);
|
|
|
|
wxArrayString m_SelBgColorStrings;
|
|
m_SelBgColorStrings.Add(_("White"));
|
|
m_SelBgColorStrings.Add(_("Black"));
|
|
m_SelBgColor = new wxRadioBox( this, ID_RADIOBOX_BACKGROUND_COLOR, _("Background Color:"),
|
|
wxDefaultPosition, wxDefaultSize, m_SelBgColorStrings, 1, wxRA_SPECIFY_COLS );
|
|
m_SelBgColor->SetSelection( ( g_DrawBgColor == BLACK ) ? 1 : 0 );
|
|
ColumnBoxSizer->Add(m_SelBgColor, 1, wxGROW|wxRIGHT|wxTOP|wxBOTTOM, 5);
|
|
|
|
// Provide a line to separate all of the controls added so far from the
|
|
// "OK", "Cancel", and "Apply" buttons (which will be added after that line).
|
|
Line = new wxStaticLine( this, -1, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
|
OuterBoxSizer->Add(Line, 0, wxGROW|wxALL, 5);
|
|
|
|
// Provide a StdDialogButtonSizer to accommodate the OK, Cancel, and Apply
|
|
// buttons; using that type of sizer results in those buttons being
|
|
// automatically located in positions appropriate for each (OS) version of KiCad.
|
|
StdDialogButtonSizer = new wxStdDialogButtonSizer;
|
|
OuterBoxSizer->Add(StdDialogButtonSizer, 0, wxGROW|wxALL, 10);
|
|
|
|
Button = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
|
|
Button->SetForegroundColour( *wxRED );
|
|
StdDialogButtonSizer->AddButton(Button);
|
|
|
|
Button = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
|
|
Button->SetForegroundColour( *wxBLUE );
|
|
StdDialogButtonSizer->AddButton(Button);
|
|
Button->SetFocus();
|
|
|
|
Button = new wxButton( this, wxID_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize, 0 );
|
|
StdDialogButtonSizer->AddButton(Button);
|
|
|
|
StdDialogButtonSizer->Realize();
|
|
|
|
// (Dialog now needs to be resized, but the associated command is found elsewhere.)
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
bool WinEDA_SetColorsFrame::ShowToolTips()
|
|
/**********************************************************/
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
wxBitmap WinEDA_SetColorsFrame::GetBitmapResource( const wxString& name )
|
|
/**********************************************************/
|
|
{
|
|
wxUnusedVar(name);
|
|
return wxNullBitmap;
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
wxIcon WinEDA_SetColorsFrame::GetIconResource( const wxString& name )
|
|
/**********************************************************/
|
|
{
|
|
wxUnusedVar(name);
|
|
return wxNullIcon;
|
|
}
|
|
|
|
|
|
/**********************************************************/
|
|
void WinEDA_SetColorsFrame::SetColor( wxCommandEvent& event )
|
|
/**********************************************************/
|
|
{
|
|
int id = event.GetId();
|
|
int color;
|
|
|
|
wxBitmapButton* Button;
|
|
|
|
color = DisplayColorFrame( this,
|
|
CurrentColor[id - ID_COLOR_SETUP] );
|
|
|
|
if( color < 0 )
|
|
return;
|
|
|
|
if( CurrentColor[id - ID_COLOR_SETUP] == color )
|
|
return;
|
|
|
|
CurrentColor[id - ID_COLOR_SETUP] = color;
|
|
wxMemoryDC iconDC;
|
|
|
|
Button = laytool_list[id - ID_COLOR_SETUP]->m_Button;
|
|
|
|
wxBitmap ButtBitmap = Button->GetBitmapLabel();
|
|
iconDC.SelectObject( ButtBitmap );
|
|
wxBrush Brush;
|
|
iconDC.SetPen( *wxBLACK_PEN );
|
|
Brush.SetColour(
|
|
ColorRefs[color].m_Red,
|
|
ColorRefs[color].m_Green,
|
|
ColorRefs[color].m_Blue
|
|
);
|
|
Brush.SetStyle( wxSOLID );
|
|
|
|
iconDC.SetBrush( Brush );
|
|
iconDC.DrawRectangle( 0, 0, BUTT_SIZE_X, BUTT_SIZE_Y );
|
|
Button->SetBitmapLabel( ButtBitmap );
|
|
Button->Refresh();
|
|
|
|
Refresh( FALSE );
|
|
}
|
|
|
|
|
|
/******************************************************************/
|
|
void WinEDA_SetColorsFrame::UpdateLayerSettings()
|
|
/******************************************************************/
|
|
{
|
|
// Update colors for each layer
|
|
for( int lyr = 0; lyr < NB_BUTT; lyr++ )
|
|
{
|
|
// (As a bitmap button has been provided for *every* layer,
|
|
// it is not necessary to check whether it actually has been
|
|
// provided for each of those layers.)
|
|
*laytool_list[lyr]->m_Color = CurrentColor[lyr];
|
|
}
|
|
|
|
// Update whether grid is actually displayed or otherwise
|
|
// The previous command compiles OK, but to prevent a warning
|
|
// from being generated when the Linux version is being compiled,
|
|
// the next two commands are provided instead.
|
|
m_Parent->m_Draw_Grid = m_ShowGrid->GetValue();
|
|
|
|
// Update color of background
|
|
if( m_SelBgColor->GetSelection() == 0 )
|
|
g_DrawBgColor = WHITE;
|
|
else
|
|
g_DrawBgColor = BLACK;
|
|
m_Parent->SetDrawBgColor( g_DrawBgColor );
|
|
}
|
|
|
|
|
|
/**********************************************************************/
|
|
void WinEDA_SetColorsFrame::OnOkClick( wxCommandEvent& WXUNUSED (event) )
|
|
/**********************************************************************/
|
|
{
|
|
UpdateLayerSettings();
|
|
m_Parent->DrawPanel->Refresh();
|
|
EndModal( 1 );
|
|
}
|
|
|
|
|
|
/*******************************************************************/
|
|
void WinEDA_SetColorsFrame::OnCancelClick( wxCommandEvent& WXUNUSED (event) )
|
|
/*******************************************************************/
|
|
{
|
|
EndModal( -1 );
|
|
}
|
|
|
|
|
|
/*******************************************************************/
|
|
void WinEDA_SetColorsFrame::OnApplyClick( wxCommandEvent& WXUNUSED (event) )
|
|
/*******************************************************************/
|
|
{
|
|
UpdateLayerSettings();
|
|
m_Parent->DrawPanel->Refresh();
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************/
|
|
void SeedLayers()
|
|
/*************************/
|
|
{
|
|
LayerStruct* LayerPointer = &g_LayerDescr;
|
|
int pt;
|
|
|
|
LayerPointer->CommonColor = WHITE;
|
|
LayerPointer->Flags = 0;
|
|
pt = 0;
|
|
LayerPointer->CurrentWidth = 1;
|
|
|
|
/* seed Up the Layer colours, set all user layers off */
|
|
for( pt = 0; pt < MAX_LAYERS; pt++ )
|
|
{
|
|
LayerPointer->LayerStatus[pt] = 0;
|
|
LayerPointer->LayerColor[pt] = DARKGRAY;
|
|
}
|
|
|
|
LayerPointer->NumberOfLayers = pt - 1;
|
|
/* Couleurs specifiques: Mise a jour par la lecture de la config */
|
|
}
|
|
|
|
|
|
/***************************************/
|
|
EDA_Colors ReturnLayerColor( int Layer )
|
|
/****************************************/
|
|
{
|
|
if( g_LayerDescr.Flags == 0 )
|
|
return (EDA_Colors) g_LayerDescr.LayerColor[Layer];
|
|
else
|
|
return (EDA_Colors) g_LayerDescr.CommonColor;
|
|
}
|