kicad/eeschema/eelayer.cpp

485 lines
13 KiB
C++

/* Set up color Layers */
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "id.h"
#include "protos.h"
/* Variables locales */
/* Fonctions locales: */
/* Macro utile : */
#define ADR( numlayer ) & (g_LayerDescr.LayerColor[numlayer])
#define BUTT_SIZE_X 30
#define BUTT_SIZE_Y 20
enum col_sel_id {
ID_COLOR_SETUP = 1800
};
/**********************************/
/* Liste des menus de Menu_Layers */
/**********************************/
struct ColorButton
{
wxString m_Name;
int* m_Color;
int m_Id;
wxBitmapButton* m_Button;
int m_State;
};
static ColorButton Msg_General =
{
_( "General" ), /* Title */
NULL
};
static ColorButton Msg_Sheets =
{
_( "Sheets" ), /* Title */
NULL
};
static ColorButton Layer_Wire_Item =
{
_( "Wire" ), /* Title */
ADR( LAYER_WIRE ) /* adr du parametre optionnel */
};
static ColorButton Layer_Bus_Item =
{
_( "Bus" ), /* Title */
ADR( LAYER_BUS ) /* adr du parametre optionnel */
};
static ColorButton Layer_Jonction_Item =
{
_( "Junction" ), /* Title */
ADR( LAYER_JUNCTION ) /* adr du parametre optionnel */
};
static ColorButton Layer_LocalLabel_Item =
{
_( "Label" ), /* Title */
ADR( LAYER_LOCLABEL ) /* adr du parametre optionnel */
};
static ColorButton Layer_GlobLabel_Item =
{
_( "GlobLabel" ), /* Title */
ADR( LAYER_GLOBLABEL ) /* adr du parametre optionnel */
};
static ColorButton Layer_PinNum_Item =
{
_( "PinNum" ), /* Title */
ADR( LAYER_PINNUM ) /* adr du parametre optionnel */
};
static ColorButton Layer_PinNam_Item =
{
_( "PinNam" ), /* Title */
ADR( LAYER_PINNAM ) /* adr du parametre optionnel */
};
static ColorButton Layer_Reference_Item =
{
_( "Reference" ), /* Title */
ADR( LAYER_REFERENCEPART ) /* adr du parametre optionnel */
};
static ColorButton Layer_Value_Item =
{
_( "Value" ), /* Title */
ADR( LAYER_VALUEPART ) /* adr du parametre optionnel */
};
static ColorButton Layer_Fields_Item =
{
_( "Fields" ), /* Title */
ADR( LAYER_FIELDS ) /* adr du parametre optionnel */
};
static ColorButton Layer_BodyDevice_Item =
{
_( "Body" ), /* Title */
ADR( LAYER_DEVICE ) /* adr du parametre optionnel */
};
static ColorButton Layer_BodyBackgroundDevice_Item =
{
_( "Body Bg" ), /* Title */
ADR( LAYER_DEVICE_BACKGROUND ) /* adr du parametre optionnel */
};
static ColorButton MsgDevice_Item =
{
_( "Device" ), /* Title */
NULL
};
static ColorButton Layer_Notes_Item =
{
_( "Notes" ), /* Title */
ADR( LAYER_NOTES ) /* adr du parametre optionnel */
};
static ColorButton Layer_NetNam_Item =
{
_( "Netname" ), /* Title */
ADR( LAYER_NETNAM ) /* adr du parametre optionnel */
};
static ColorButton Layer_Pin_Item =
{
_( "Pin" ), /* Title */
ADR( LAYER_PIN ) /* adr du parametre optionnel */
};
static ColorButton Layer_Sheet_Item =
{
_( "Sheet" ), /* Title */
ADR( LAYER_SHEET ) /* adr du parametre optionnel */
};
static ColorButton Layer_SheetName_Item =
{
_( "SheetName" ), /* Title */
ADR( LAYER_SHEETNAME ) /* adr du parametre optionnel */
};
static ColorButton Layer_SheetFileName_Item =
{
_( "Sheetfile" ), /* Title */
ADR( LAYER_SHEETFILENAME ) /* adr du parametre optionnel */
};
static ColorButton Layer_SheetLabel_Item =
{
_( "SheetLabel" ), /* Title */
ADR( LAYER_SHEETLABEL ) /* adr du parametre optionnel */
};
static ColorButton Layer_NoConnect_Item =
{
_( "NoConn" ), /* Title */
ADR( LAYER_NOCONNECT ) /* adr du parametre optionnel */
};
static ColorButton Msg_ErcMarck =
{
_( "Erc Mark" ), /* Title */
NULL
};
static ColorButton Layer_Erc_Warning_Item =
{
_( "Erc Warning" ), /* Title */
ADR( LAYER_ERC_WARN ) /* adr du parametre optionnel */
};
static ColorButton Layer_Erc_Error_Item =
{
_( "Erc Error" ), /* Title */
ADR( LAYER_ERC_ERR ) /* adr du parametre optionnel */
};
#define NB_BUTT 26
static ColorButton* laytool_list[NB_BUTT + 1] = {
&Msg_General,
&Layer_Wire_Item,
&Layer_Bus_Item,
&Layer_Jonction_Item,
&Layer_LocalLabel_Item,
&Layer_GlobLabel_Item,
&Layer_NetNam_Item,
&Layer_Notes_Item,
&Layer_NoConnect_Item,
&MsgDevice_Item,
&Layer_BodyDevice_Item,
&Layer_BodyBackgroundDevice_Item,
&Layer_Pin_Item,
&Layer_PinNum_Item,
&Layer_PinNam_Item,
&Layer_Reference_Item,
&Layer_Value_Item,
&Layer_Fields_Item,
&Msg_Sheets,
&Layer_Sheet_Item,
&Layer_SheetFileName_Item,
&Layer_SheetName_Item,
&Layer_SheetLabel_Item,
&Msg_ErcMarck,
&Layer_Erc_Warning_Item,
&Layer_Erc_Error_Item,
NULL
};
/*************************************************************/
/* classe derivee pour la frame de Configuration des couleurs*/
/*************************************************************/
class WinEDA_SetColorsFrame : public wxDialog
{
private:
WinEDA_DrawFrame* m_Parent;
wxRadioBox* m_SelBgColor;
public:
// Constructor and destructor
WinEDA_SetColorsFrame( WinEDA_DrawFrame * parent, const wxPoint &framepos );
~WinEDA_SetColorsFrame() { };
private:
void SetColor( wxCommandEvent& event );
void BgColorChoice( wxCommandEvent& event );
DECLARE_EVENT_TABLE()
};
/* Table des evenements pour WinEDA_SetColorsFrame */
BEGIN_EVENT_TABLE( WinEDA_SetColorsFrame, wxDialog )
EVT_RADIOBOX( ID_SEL_BG_COLOR, WinEDA_SetColorsFrame::BgColorChoice )
EVT_COMMAND_RANGE( ID_COLOR_SETUP, ID_COLOR_SETUP + 26,
wxEVT_COMMAND_BUTTON_CLICKED,
WinEDA_SetColorsFrame::SetColor )
END_EVENT_TABLE()
/**************************************************************/
void DisplayColorSetupFrame( WinEDA_DrawFrame* parent,
const wxPoint& framepos )
/**************************************************************/
{
WinEDA_SetColorsFrame* frame =
new WinEDA_SetColorsFrame( parent, framepos );
frame->ShowModal();
frame->Destroy();
}
/**********************************************************************/
WinEDA_SetColorsFrame::WinEDA_SetColorsFrame( WinEDA_DrawFrame* parent,
const wxPoint& framepos ) :
wxDialog( parent, -1, _( "EESchema Preferences" ), framepos,
wxSize( 500, 270 ), DIALOG_STYLE )
/**********************************************************************/
{
#define START_Y 15
wxBitmapButton* Button;
int ii, yy, butt_ID, buttcolor;
wxPoint pos;
int w = BUTT_SIZE_X, h = BUTT_SIZE_Y;
wxStaticText* text;
int right, bottom, line_height;
wxPoint bg_color_pos;
m_Parent = parent;
SetFont( *g_DialogFont );
pos.x = 10; pos.y = START_Y;
right = pos.x; bottom = 0;
line_height = h;
for( ii = 0; laytool_list[ii] != NULL; ii++ )
{
if( laytool_list[ii]->m_Color == NULL )
{
if( pos.y != START_Y )
{
pos.x = right + 10;
pos.y = START_Y;
bg_color_pos = pos;
}
wxString msg = wxGetTranslation( laytool_list[ii]->m_Name );
text = new wxStaticText( this, -1,
msg,
wxPoint ( pos.x, pos.y ),
wxSize( -1, -1 ), 0 );
line_height = MAX( line_height, text->GetRect().GetHeight() );
pos.y += line_height;
continue;
}
butt_ID = ID_COLOR_SETUP + ii;
laytool_list[ii]->m_Id = butt_ID;
wxMemoryDC iconDC;
wxBitmap ButtBitmap( w, h );
iconDC.SelectObject( ButtBitmap );
buttcolor = *laytool_list[ii]->m_Color;
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, w, h );
Button = new wxBitmapButton( this, butt_ID,
ButtBitmap,
wxPoint ( pos.x, pos.y - (h - line_height) / 2 ),
wxSize (w, h) );
laytool_list[ii]->m_Button = Button;
wxString msg = wxGetTranslation( laytool_list[ii]->m_Name );
text = new wxStaticText( this, -1,
msg,
wxPoint (pos.x + 5 + w, pos.y ),
wxSize( -1, -1 ), 0 );
wxPoint lowpos;
lowpos.x = text->GetRect().GetRight();
lowpos.y = text->GetRect().GetBottom();
right = MAX( right, lowpos.x );
bottom = MAX( bottom, lowpos.y );
bg_color_pos.y = lowpos.y;
yy = line_height + 5;
pos.y += yy;
}
bg_color_pos.x += 5; bg_color_pos.y += 25;
static const wxString bg_choice[2] = { _( "White Background" ), _( "Black Background" ) };
m_SelBgColor = new wxRadioBox( this, ID_SEL_BG_COLOR,
_( "Background Colour" ), bg_color_pos,
wxDefaultSize, 2, bg_choice, 1, wxRA_SPECIFY_COLS );
m_SelBgColor->SetSelection( (g_DrawBgColor == BLACK) ? 1 : 0 );
bottom = MAX( bottom, m_SelBgColor->GetRect().GetBottom() );
right = MAX( right, m_SelBgColor->GetRect().GetRight() );
SetClientSize( wxSize( right + 10, bottom + 10 ) );
}
/***************************************************************/
void WinEDA_SetColorsFrame::SetColor( wxCommandEvent& event )
/***************************************************************/
{
int ii;
int id = event.GetId();
int color;
int w = BUTT_SIZE_X, h = BUTT_SIZE_Y;
color = DisplayColorFrame( this,
*laytool_list[id - ID_COLOR_SETUP]->m_Color );
if( color < 0 )
return;
for( ii = 0; laytool_list[ii] != NULL; ii++ )
{
if( laytool_list[ii]->m_Id != id )
continue;
if( *laytool_list[ii]->m_Color == color )
break;
*laytool_list[ii]->m_Color = color;
wxMemoryDC iconDC;
wxBitmapButton* Button = laytool_list[ii]->m_Button;
wxBitmap ButtBitmap = Button->GetBitmapLabel();
iconDC.SelectObject( ButtBitmap );
int buttcolor = *laytool_list[ii]->m_Color;
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, w, h );
Button->SetBitmapLabel( ButtBitmap );
if( m_Parent->GetScreen() )
m_Parent->GetScreen()->SetRefreshReq();
}
Refresh( FALSE );
}
/***************************************************************/
void WinEDA_SetColorsFrame::BgColorChoice( wxCommandEvent& event )
/***************************************************************/
{
int color;
if( m_SelBgColor->GetSelection() == 0 )
color = WHITE;
else
color = BLACK;
if( color != g_DrawBgColor )
{
g_DrawBgColor = color;
m_Parent->SetDrawBgColor( g_DrawBgColor );
m_Parent->ReDrawPanel();
}
}
/*************************/
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 */
}
/*******************************/
int ReturnLayerColor( int Layer )
/*******************************/
{
if( g_LayerDescr.Flags==0 )
return g_LayerDescr.LayerColor[Layer];
else
return g_LayerDescr.CommonColor;
}