KiCad PCB EDA Suite
layer_widget.h
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) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
5  * Copyright (C) 2010 KiCad Developers, see change_log.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 #ifndef LAYERWIDGET_H_
26 #define LAYERWIDGET_H_
27 
28 #include <wx/intl.h>
29 #include <wx/wx.h>
30 #include <wx/statbmp.h>
31 #include <wx/string.h>
32 #include <wx/aui/auibook.h>
33 #include <wx/notebook.h>
34 #include <wx/sizer.h>
35 #include <wx/gdicmn.h>
36 #include <wx/scrolwin.h>
37 #include <wx/font.h>
38 #include <wx/colour.h>
39 #include <wx/settings.h>
40 #include <wx/panel.h>
41 #include <wx/bitmap.h>
42 #include <wx/image.h>
43 #include <wx/icon.h>
45 #include <gal/color4d.h>
46 
47 #define LYR_COLUMN_COUNT 4
48 #define RND_COLUMN_COUNT 2
49 
50 #define COLUMN_ICON_ACTIVE 0
51 #define COLUMN_COLORBM 1
52 #define COLUMN_COLOR_LYR_CB 2
53 #define COLUMN_COLOR_LYRNAME 3
54 
55 using KIGFX::COLOR4D;
56 
76 class LAYER_WIDGET : public wxPanel
77 {
78 public:
84  struct ROW
85  {
86  wxString rowName;
87  int id;
89  bool state;
90  wxString tooltip;
91  bool changeable;
92 
93  ROW( const wxString& aRowName, int aId, COLOR4D aColor = COLOR4D::UNSPECIFIED,
94  const wxString& aTooltip = wxEmptyString, bool aState = true, bool aChangeable = true )
95  {
96  rowName = aRowName;
97  id = aId;
98  color = aColor;
99  state = aState;
100  tooltip = aTooltip;
101  changeable = aChangeable;
102  }
103  };
104 
105  static const wxEventType EVT_LAYER_COLOR_CHANGE;
106 
107 protected:
108 
109  wxAuiNotebook* m_notebook;
110  wxPanel* m_LayerPanel;
111  wxScrolledWindow* m_LayerScrolledWindow;
112  wxFlexGridSizer* m_LayersFlexGridSizer;
114  wxScrolledWindow* m_RenderScrolledWindow;
115  wxFlexGridSizer* m_RenderFlexGridSizer;
116 
117  wxWindow* m_FocusOwner;
120 
129  virtual bool useAlternateBitmap(int aRow) { return false; }
130 
135  virtual bool AreArbitraryColorsAllowed() { return false; }
136 
144  static int encodeId( int aColumn, int aId );
145 
152  static LAYER_NUM getDecodedId( int aControlId );
153 
154  void OnLeftDownLayers( wxMouseEvent& event );
155 
160  void OnLayerSwatchChanged( wxCommandEvent& aEvent );
161 
167  void OnLayerCheckBox( wxCommandEvent& event );
168 
173  void OnRenderSwatchChanged( wxCommandEvent& aEvent );
174 
175  void OnRenderCheckBox( wxCommandEvent& event );
176 
177  void OnTabChange( wxNotebookEvent& event );
178 
179 
189  wxWindow* getLayerComp( int aRow, int aColumn ) const;
190  wxWindow* getRenderComp( int aRow, int aColumn ) const;
191 
196  int findLayerRow( LAYER_NUM aLayer ) const;
197  int findRenderRow( int aId ) const;
198 
203  void insertLayerRow( int aRow, const ROW& aSpec );
204 
205  void insertRenderRow( int aRow, const ROW& aSpec );
206 
211  void passOnFocus();
212 
213 public:
214 
227  LAYER_WIDGET( wxWindow* aParent, wxWindow* aFocusOwner, int aPointSize = -1,
228  wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
229  const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
230 
231  virtual ~LAYER_WIDGET();
232 
239  wxSize GetBestSize() const;
240 
245  int GetLayerRowCount() const;
246 
251  int GetRenderRowCount() const;
252 
258  void AppendLayerRow( const ROW& aRow );
259 
265  void AppendLayerRows( const ROW* aRowsArray, int aRowCount )
266  {
267  for( int row=0; row<aRowCount; ++row )
268  AppendLayerRow( aRowsArray[row] );
269  }
270 
275  void ClearLayerRows();
276 
282  void AppendRenderRow( const ROW& aRow );
283 
289  void AppendRenderRows( const ROW* aRowsArray, int aRowCount )
290  {
291  for( int row=0; row<aRowCount; ++row )
292  AppendRenderRow( aRowsArray[row] );
293  }
294 
299  void ClearRenderRows();
300 
305  void SelectLayerRow( int aRow );
306 
311  void SelectLayer( LAYER_NUM aLayer );
312 
318 
323  void SetLayerVisible( LAYER_NUM aLayer, bool isVisible );
324 
329  bool IsLayerVisible( LAYER_NUM aLayer );
330 
335  void SetLayerColor( LAYER_NUM aLayer, COLOR4D aColor );
336 
341  COLOR4D GetLayerColor( LAYER_NUM aLayer ) const;
342 
352  void SetRenderState( int aId, bool isSet );
353 
359  bool GetRenderState( int aId );
360 
361  void UpdateLayouts();
362 
369  void UpdateLayerIcons();
370 
371 /* did not help:
372  void Freeze()
373  {
374  LAYER_PANEL_BASE::Freeze();
375  m_LayerScrolledWindow->Freeze();
376  m_RenderScrolledWindow->Freeze();
377  }
378 
379  void Thaw()
380  {
381  m_RenderScrolledWindow->Thaw();
382  m_LayerScrolledWindow->Thaw();
383  LAYER_PANEL_BASE::Thaw();
384  }
385 */
386 
387  //-----<abstract functions>-------------------------------------------
388 
396  virtual void OnLayerColorChange( int aLayer, COLOR4D aColor ) = 0;
397 
405  virtual bool OnLayerSelect( int aLayer ) = 0;
406 
417  virtual void OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal = true ) = 0;
418 
427  virtual void OnRenderColorChange( int aId, COLOR4D aColor ) = 0;
428 
437  virtual void OnRenderEnable( int aId, bool isEnabled ) = 0;
438 
439  //-----</abstract functions>------------------------------------------
440 };
441 
442 #endif // LAYERWIDGET_H_
void OnLeftDownLayers(wxMouseEvent &event)
wxAuiNotebook * m_notebook
Definition: layer_widget.h:109
int m_CurrentRow
selected row of layer list
Definition: layer_widget.h:118
void insertRenderRow(int aRow, const ROW &aSpec)
Struct ROW provides all the data needed to add a row to a LAYER_WIDGET.
Definition: layer_widget.h:84
int findRenderRow(int aId) const
virtual void OnRenderColorChange(int aId, COLOR4D aColor)=0
Function OnRenderColorChange is called to notify client code whenever the user changes a rendering co...
bool GetRenderState(int aId)
Function GetRenderState returns the state of the checkbox associated with aId.
void UpdateLayouts()
virtual void OnLayerVisible(LAYER_NUM aLayer, bool isVisible, bool isFinal=true)=0
Function OnLayerVisible is called to notify client code about a layer visibility change.
ROW(const wxString &aRowName, int aId, COLOR4D aColor=COLOR4D::UNSPECIFIED, const wxString &aTooltip=wxEmptyString, bool aState=true, bool aChangeable=true)
Definition: layer_widget.h:93
void OnTabChange(wxNotebookEvent &event)
bool changeable
if true, the state can be changed
Definition: layer_widget.h:91
static const wxEventType EVT_LAYER_COLOR_CHANGE
Definition: layer_widget.h:105
COLOR4D GetLayerColor(LAYER_NUM aLayer) const
Function GetLayerColor returns the color of the layer ROW associated with aLayer id.
wxScrolledWindow * m_RenderScrolledWindow
Definition: layer_widget.h:114
wxFlexGridSizer * m_LayersFlexGridSizer
Definition: layer_widget.h:112
virtual bool useAlternateBitmap(int aRow)
Virtual Function useAlternateBitmap.
Definition: layer_widget.h:129
int findLayerRow(LAYER_NUM aLayer) const
Function findLayerRow returns the row index that aLayer resides in, or -1 if not found.
wxSize GetBestSize() const
Function GetBestSize returns the preferred minimum size, taking into consideration the dynamic conten...
void AppendLayerRows(const ROW *aRowsArray, int aRowCount)
Function AppendLayerRows appends new rows in the layer portion of the widget.
Definition: layer_widget.h:265
void ClearRenderRows()
Function ClearRenderRows empties out the render rows.
wxFlexGridSizer * m_RenderFlexGridSizer
Definition: layer_widget.h:115
bool state
initial wxCheckBox state
Definition: layer_widget.h:89
void ClearLayerRows()
Function ClearLayerRows empties out the layer rows.
wxString tooltip
if not empty, use this tooltip on row
Definition: layer_widget.h:90
virtual void OnLayerColorChange(int aLayer, COLOR4D aColor)=0
Function OnLayerColorChange is called to notify client code about a layer color change.
void OnRenderCheckBox(wxCommandEvent &event)
void OnLayerCheckBox(wxCommandEvent &event)
Function OnLayerCheckBox handles the "is layer visible" checkbox and propogates the event to the clie...
void AppendRenderRow(const ROW &aRow)
Function AppendRenderRow appends a new row in the render portion of the widget.
static int encodeId(int aColumn, int aId)
Function encodeId is here to allow saving a layer index within a control as its wxControl id...
COLOR4D color
COLOR4D::UNSPECIFIED if none.
Definition: layer_widget.h:88
int GetRenderRowCount() const
Function GetRenderRowCount returns the number of rows in the render tab.
void SetLayerColor(LAYER_NUM aLayer, COLOR4D aColor)
Function SetLayerColor changes the color of aLayer.
virtual bool AreArbitraryColorsAllowed()
Subclasses can override this to provide logic for allowing arbitrary color selection via wxColourPick...
Definition: layer_widget.h:135
wxPanel * m_RenderingPanel
Definition: layer_widget.h:113
void AppendLayerRow(const ROW &aRow)
Function AppendLayerRow appends a new row in the layer portion of the widget.
void UpdateLayerIcons()
Function UpdateLayerIcons Update all layer manager icons (layers only) Useful when loading a file or ...
wxScrolledWindow * m_LayerScrolledWindow
Definition: layer_widget.h:111
virtual void OnRenderEnable(int aId, bool isEnabled)=0
Function OnRenderEnable is called to notify client code whenever the user changes an rendering enable...
wxWindow * getLayerComp(int aRow, int aColumn) const
Function getLayerComp returns the component within the m_LayersFlexGridSizer at aRow and aCol or NULL...
int GetLayerRowCount() const
Function GetLayerRowCount returns the number of rows in the layer tab.
void SelectLayerRow(int aRow)
Function SelectLayerRow changes the row selection in the layer list to the given row.
void AppendRenderRows(const ROW *aRowsArray, int aRowCount)
Function AppendRenderRows appends new rows in the render portion of the widget.
Definition: layer_widget.h:289
void OnRenderSwatchChanged(wxCommandEvent &aEvent)
Function OnRenderSwatchChanged Called when user has changed the swatch color of a render entry...
static LAYER_NUM getDecodedId(int aControlId)
Function getDecodedId decodes aControlId to original un-encoded value.
virtual ~LAYER_WIDGET()
wxWindow * m_FocusOwner
Definition: layer_widget.h:117
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
void passOnFocus()
Function passOnFocus gives away the keyboard focus up to the main parent window.
LAYER_NUM GetSelectedLayer()
Function GetSelectedLayer returns the selected layer or -1 if none.
bool IsLayerVisible(LAYER_NUM aLayer)
Function IsLayerVisible returns the visible state of the layer ROW associated with aLayer id...
Class LAYER_WIDGET is abstract and is used to manage a list of layers, with the notion of a "current"...
Definition: layer_widget.h:76
Board layer functions and definitions.
wxString rowName
the prompt or layername
Definition: layer_widget.h:86
void insertLayerRow(int aRow, const ROW &aSpec)
Function insertLayerRow appends or inserts a new row in the layer portion of the widget.
void SetLayerVisible(LAYER_NUM aLayer, bool isVisible)
Function SetLayerVisible sets aLayer visible or not.
void OnLayerSwatchChanged(wxCommandEvent &aEvent)
Function OnSwatchChanged() is called when a user changes a swatch color.
virtual bool OnLayerSelect(int aLayer)=0
Function OnLayerSelect is called to notify client code whenever the user selects a different layer...
void SetRenderState(int aId, bool isSet)
Function SetRenderState sets the state of the checkbox associated with aId within the Render tab grou...
void SelectLayer(LAYER_NUM aLayer)
Function SelectLayer changes the row selection in the layer list to aLayer provided.
int id
either a layer or "visible element" id
Definition: layer_widget.h:87
wxPanel * m_LayerPanel
Definition: layer_widget.h:110
LAYER_WIDGET(wxWindow *aParent, wxWindow *aFocusOwner, int aPointSize=-1, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL)
Constructor.
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
wxWindow * getRenderComp(int aRow, int aColumn) const