KiCad PCB EDA Suite
widget_eeschema_color_config.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2016-2018 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 /* Set up colors to draw items in Eeschema
26  */
27 
28 #include <fctsys.h>
29 #include <draw_frame.h>
30 #include <class_drawpanel.h>
31 
32 #include <general.h>
33 
35 #include <../common/widgets/color4Dpickerdlg.h>
36 
37 // Width and height of every (color-displaying / bitmap) button in dialog units
38 const wxSize BUTT_SIZE( 10, 6 );
39 const wxSize BUTT_BORDER( 4, 4 );
40 
41 /********************/
42 /* Layer menu list. */
43 /********************/
44 
46 {
47  wxString m_Name;
48  int m_Layer;
49 };
50 
52 {
53  wxString m_Name;
55 };
56 
58  { _( "Wire" ), LAYER_WIRE },
59  { _( "Bus" ), LAYER_BUS },
60  { _( "Junction" ), LAYER_JUNCTION },
61  { _( "Label" ), LAYER_LOCLABEL },
62  { _( "Global label" ), LAYER_GLOBLABEL },
63  { _( "Net name" ), LAYER_NETNAM },
64  { _( "Notes" ), LAYER_NOTES },
65  { _( "No connect symbol" ), LAYER_NOCONNECT },
66  { wxT( "" ), -1 } // Sentinel marking end of list.
67 };
68 
70  { _( "Body" ), LAYER_DEVICE },
71  { _( "Body background" ), LAYER_DEVICE_BACKGROUND },
72  { _( "Pin" ), LAYER_PIN },
73  { _( "Pin number" ), LAYER_PINNUM },
74  { _( "Pin name" ), LAYER_PINNAM },
75  { _( "Reference" ), LAYER_REFERENCEPART },
76  { _( "Value" ), LAYER_VALUEPART },
77  { _( "Fields" ), LAYER_FIELDS },
78  { wxT( "" ), -1 } // Sentinel marking end of list.
79 };
80 
82  { _( "Sheet" ), LAYER_SHEET },
83  { _( "Sheet file name" ), LAYER_SHEETFILENAME },
84  { _( "Sheet name" ), LAYER_SHEETNAME },
85  { _( "Sheet label" ), LAYER_SHEETLABEL },
86  { _( "Hierarchical label" ),LAYER_HIERLABEL },
87  { wxT( "" ), -1 } // Sentinel marking end of list.
88 };
89 
91  { _( "ERC warning" ), LAYER_ERC_WARN },
92  { _( "ERC error" ), LAYER_ERC_ERR },
93  { _( "Grid" ), LAYER_SCHEMATIC_GRID },
94  { _( "Brightened" ), LAYER_BRIGHTENED },
95  { wxT( "" ), -1 } // Sentinel marking end of list.
96 };
97 
98 
100  { _( "General" ), generalColorButtons },
101  { _( "Component" ), componentColorButtons },
102  { _( "Sheet" ), sheetColorButtons },
103  { _( "Miscellaneous" ), miscColorButtons },
104  { wxT( "" ), NULL }
105 };
106 
108 
110 
111 
113  wxPanel( aParent ), m_drawFrame( aDrawFrame )
114 {
115  m_butt_size_pix = ConvertDialogToPixels( BUTT_SIZE );
116  m_butt_border_pix = ConvertDialogToPixels( BUTT_BORDER );
117 
118  CreateControls();
119 }
120 
121 
123 {
124  wxStaticText* label;
125  int buttonId = 1800;
126 
127  m_mainBoxSizer = new wxBoxSizer( wxHORIZONTAL );
128  SetSizer( m_mainBoxSizer );
129 
130  BUTTONINDEX* groups = buttonGroups;
131  wxBoxSizer* columnBoxSizer = NULL;
132 
133  while( groups->m_Buttons != NULL )
134  {
135  COLORBUTTON* buttons = groups->m_Buttons;
136 
137  columnBoxSizer = new wxBoxSizer( wxVERTICAL );
138  m_mainBoxSizer->Add( columnBoxSizer, 1, wxALIGN_TOP | wxLEFT | wxTOP, 5 );
139  wxBoxSizer* rowBoxSizer = new wxBoxSizer( wxHORIZONTAL );
140  columnBoxSizer->Add( rowBoxSizer, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
141 
142  // Add a text string to identify the column of color select buttons.
143  label = new wxStaticText( this, wxID_ANY, groups->m_Name );
144 
145  // Make the column label font bold.
146  wxFont font( label->GetFont() );
147  font.SetWeight( wxFONTWEIGHT_BOLD );
148  label->SetFont( font );
149 
150  rowBoxSizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
151 
152  while( buttons->m_Layer >= 0 )
153  {
154  rowBoxSizer = new wxBoxSizer( wxHORIZONTAL );
155  columnBoxSizer->Add( rowBoxSizer, 0, wxGROW | wxALL, 0 );
156 
158  currentColors[ SCH_LAYER_INDEX( buttons->m_Layer ) ] = color;
159 
160  wxMemoryDC iconDC;
161  wxBitmap bitmap( m_butt_size_pix );
162 
163  iconDC.SelectObject( bitmap );
164  iconDC.SetPen( *wxBLACK_PEN );
165 
166  wxBrush brush;
167  brush.SetColour( color.ToColour() );
168  brush.SetStyle( wxBRUSHSTYLE_SOLID );
169  iconDC.SetBrush( brush );
170  iconDC.DrawRectangle( 0, 0, m_butt_size_pix.x, m_butt_size_pix.y );
171 
172  wxBitmapButton* bitmapButton = new wxBitmapButton(
173  this, buttonId, bitmap, wxDefaultPosition,
174  m_butt_size_pix + m_butt_border_pix + wxSize( 1, 1 ) );
175  bitmapButton->SetClientData( (void*) buttons );
176 
177  rowBoxSizer->Add( bitmapButton, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxBOTTOM, 5 );
178 
179  label = new wxStaticText( this, wxID_ANY, wxGetTranslation( buttons->m_Name ) );
180  rowBoxSizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxBOTTOM, 5 );
181  buttonId += 1;
182  buttons++;
183  }
184 
185  groups++;
186  }
187 
188  COLOR4D bgColor = GetDrawFrame()->GetDrawBgColor();
189  wxMemoryDC iconDC;
190  wxBitmap bitmap( m_butt_size_pix );
191 
192  iconDC.SelectObject( bitmap );
193  iconDC.SetPen( *wxBLACK_PEN );
194 
195  wxBrush brush;
196  brush.SetColour( bgColor.ToColour() );
197  brush.SetStyle( wxBRUSHSTYLE_SOLID );
198  iconDC.SetBrush( brush );
199  iconDC.DrawRectangle( 0, 0, m_butt_size_pix.x, m_butt_size_pix.y );
200 
201  buttonId++;
202  wxBitmapButton* selBgColorBtn = new wxBitmapButton(
203  this, buttonId, bitmap, wxDefaultPosition,
204  m_butt_size_pix + m_butt_border_pix + wxSize( 1, 1 ) );
205  selBgColorBtn->SetClientData( (void*) &bgColorButton );
206 
207  Connect( 1800, buttonId, wxEVT_COMMAND_BUTTON_CLICKED,
208  wxCommandEventHandler( WIDGET_EESCHEMA_COLOR_CONFIG::SetColor ) );
209 
210  wxStaticText* bgColorLabel = new wxStaticText( this, wxID_ANY, _( "Background Color" ) );
211  wxFont font( bgColorLabel->GetFont() );
212  font.SetWeight( wxFONTWEIGHT_BOLD );
213  bgColorLabel->SetFont( font );
214 
215  if( columnBoxSizer )
216  {
217  // Add a spacer to improve appearance.
218  columnBoxSizer->AddSpacer( 5 );
219  columnBoxSizer->Add( bgColorLabel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
220  columnBoxSizer->Add( selBgColorBtn, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxBOTTOM, 5 );
221  }
222 
223  currentColors[ SCH_LAYER_INDEX( LAYER_SCHEMATIC_BACKGROUND ) ] = bgColor;
224 
225  // Dialog now needs to be resized, but the associated command is found elsewhere.
226 }
227 
228 
229 void WIDGET_EESCHEMA_COLOR_CONFIG::SetColor( wxCommandEvent& event )
230 {
231  wxBitmapButton* button = (wxBitmapButton*) event.GetEventObject();
232 
233  wxCHECK_RET( button != NULL, wxT( "Color button event object is NULL." ) );
234 
235  COLORBUTTON* colorButton = (COLORBUTTON*) button->GetClientData();
236 
237  wxCHECK_RET( colorButton != NULL, wxT( "Client data not set for color button." ) );
238  COLOR4D oldColor = currentColors[ SCH_LAYER_INDEX( colorButton->m_Layer ) ];
239  COLOR4D newColor = COLOR4D::UNSPECIFIED;
240  COLOR4D_PICKER_DLG dialog( this, oldColor, false );
241 
242  if( dialog.ShowModal() == wxID_OK )
243  {
244  newColor = dialog.GetColor();
245  }
246 
247  if( newColor == COLOR4D::UNSPECIFIED || oldColor == newColor )
248  return;
249 
250  currentColors[ SCH_LAYER_INDEX( colorButton->m_Layer ) ] = newColor;
251 
252  wxMemoryDC iconDC;
253 
254  wxBitmap bitmap = button->GetBitmapLabel();
255  iconDC.SelectObject( bitmap );
256  iconDC.SetPen( *wxBLACK_PEN );
257 
258  wxBrush brush;
259  brush.SetColour( newColor.ToColour() );
260  brush.SetStyle( wxBRUSHSTYLE_SOLID );
261 
262  iconDC.SetBrush( brush );
263  iconDC.DrawRectangle( 0, 0, m_butt_size_pix.x, m_butt_size_pix.y );
264  button->SetBitmapLabel( bitmap );
265  button->Refresh();
266 
267  Refresh( false );
268 }
269 
270 
272 {
273  bool warning = false;
274 
275  // Check for color conflicts with background color to give user a chance to bail
276  // out before making changes.
277 
278  COLOR4D bgcolor = currentColors[ SCH_LAYER_INDEX( LAYER_SCHEMATIC_BACKGROUND ) ];
279 
280  for( SCH_LAYER_ID clyr = LAYER_WIRE; clyr < SCH_LAYER_ID_END; ++clyr )
281  {
282  if( bgcolor == currentColors[ SCH_LAYER_INDEX( clyr ) ] && clyr != LAYER_SCHEMATIC_BACKGROUND )
283  {
284  warning = true;
285  break;
286  }
287  }
288 
289  // Prompt the user if an item has the same color as the background
290  // because this item cannot be seen:
291  if( warning )
292  {
293  if( wxMessageBox( _( "Some items have the same color as the background\n"
294  "and they will not be seen on the screen. Are you\n"
295  "sure you want to use these colors?" ),
296  _( "Warning" ),
297  wxYES_NO | wxICON_QUESTION, this ) == wxNO )
298  return false;
299  }
300 
301  // Update color of background
302  GetDrawFrame()->SetDrawBgColor( bgcolor );
303  currentColors[ SCH_LAYER_INDEX( LAYER_SCHEMATIC_BACKGROUND ) ] = bgcolor;
304 
305 
306  for( SCH_LAYER_ID clyr = LAYER_WIRE; clyr < SCH_LAYER_ID_END; ++clyr )
307  {
308  SetLayerColor( currentColors[ SCH_LAYER_INDEX( clyr ) ], clyr );
309  }
310 
313 
314  return true;
315 }
316 
317 
319 {
320  wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
321 
322  sizer->Add( this, 1, wxALL | wxEXPAND, 0 );
323  aPanel->SetSizer( sizer );
324 }
void SetLayerColor(COLOR4D aColor, SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:174
KIGFX::COLOR4D GetColor()
virtual void Refresh(bool eraseBackground=true, const wxRect *rect=NULL) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
Definition: draw_panel.cpp:338
EDA_DRAW_PANEL * GetCanvas()
Definition: draw_frame.h:359
static COLORBUTTON generalColorButtons[]
static COLOR4D currentColors[SCH_LAYER_ID_COUNT]
int color
Definition: DXF_plotter.cpp:62
const wxSize BUTT_BORDER(4, 4)
WIDGET_EESCHEMA_COLOR_CONFIG(wxWindow *aParent, EDA_DRAW_FRAME *aDrawFrame)
virtual void SetDrawBgColor(COLOR4D aColor)
Definition: draw_frame.h:351
static BUTTONINDEX buttonGroups[]
#define SCH_LAYER_INDEX(x)
static COLORBUTTON bgColorButton
#define SCH_LAYER_ID_COUNT
virtual void SetGridColor(COLOR4D aColor)
Function SetGridColor() , virtual.
Definition: draw_frame.h:534
Class EDA_DRAW_FRAME is the base class for create windows for drawing purpose.
Definition: draw_frame.h:63
COLOR4D GetLayerColor(SCH_LAYER_ID aLayer)
Definition: eeschema.cpp:167
void InstallOnPanel(wxPanel *aPanel)
Method InstallOnPanel Install this WIDGET_EESCHEMA_COLOR_CONFIG onto an empty panel.
static COLORBUTTON sheetColorButtons[]
virtual COLOR4D GetDrawBgColor() const
Definition: draw_frame.h:346
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
SCH_LAYER_ID
Eeschema drawing layers.
static COLORBUTTON miscColorButtons[]
static COLORBUTTON componentColorButtons[]
const wxSize BUTT_SIZE(10, 6)
virtual EDA_DRAW_FRAME * GetDrawFrame()
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39