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 
92  ROW( const wxString& aRowName, int aId, COLOR4D aColor = COLOR4D::UNSPECIFIED,
93  const wxString& aTooltip = wxEmptyString, bool aState = true )
94  {
95  rowName = aRowName;
96  id = aId;
97  color = aColor;
98  state = aState;
99  tooltip = aTooltip;
100  }
101  };
102 
103  static const wxEventType EVT_LAYER_COLOR_CHANGE;
104 
105 protected:
106 
107  wxAuiNotebook* m_notebook;
108  wxPanel* m_LayerPanel;
109  wxScrolledWindow* m_LayerScrolledWindow;
110  wxFlexGridSizer* m_LayersFlexGridSizer;
112  wxScrolledWindow* m_RenderScrolledWindow;
113  wxFlexGridSizer* m_RenderFlexGridSizer;
114 
115  wxWindow* m_FocusOwner;
118 
127  virtual bool useAlternateBitmap(int aRow) { return false; }
128 
133  virtual bool AreArbitraryColorsAllowed() { return false; }
134 
142  static int encodeId( int aColumn, int aId );
143 
150  static LAYER_NUM getDecodedId( int aControlId );
151 
152  void OnLeftDownLayers( wxMouseEvent& event );
153 
158  void OnLayerSwatchChanged( wxCommandEvent& aEvent );
159 
165  void OnLayerCheckBox( wxCommandEvent& event );
166 
171  void OnRenderSwatchChanged( wxCommandEvent& aEvent );
172 
173  void OnRenderCheckBox( wxCommandEvent& event );
174 
175  void OnTabChange( wxNotebookEvent& event );
176 
177 
187  wxWindow* getLayerComp( int aRow, int aColumn ) const;
188  wxWindow* getRenderComp( int aRow, int aColumn ) const;
189 
194  int findLayerRow( LAYER_NUM aLayer ) const;
195  int findRenderRow( int aId ) const;
196 
201  void insertLayerRow( int aRow, const ROW& aSpec );
202 
203  void insertRenderRow( int aRow, const ROW& aSpec );
204 
209  void passOnFocus();
210 
211 public:
212 
225  LAYER_WIDGET( wxWindow* aParent, wxWindow* aFocusOwner, int aPointSize = -1,
226  wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
227  const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
228 
229  virtual ~LAYER_WIDGET();
230 
237  wxSize GetBestSize() const;
238 
243  int GetLayerRowCount() const;
244 
249  int GetRenderRowCount() const;
250 
256  void AppendLayerRow( const ROW& aRow );
257 
263  void AppendLayerRows( const ROW* aRowsArray, int aRowCount )
264  {
265  for( int row=0; row<aRowCount; ++row )
266  AppendLayerRow( aRowsArray[row] );
267  }
268 
273  void ClearLayerRows();
274 
280  void AppendRenderRow( const ROW& aRow );
281 
287  void AppendRenderRows( const ROW* aRowsArray, int aRowCount )
288  {
289  for( int row=0; row<aRowCount; ++row )
290  AppendRenderRow( aRowsArray[row] );
291  }
292 
297  void ClearRenderRows();
298 
303  void SelectLayerRow( int aRow );
304 
309  void SelectLayer( LAYER_NUM aLayer );
310 
316 
321  void SetLayerVisible( LAYER_NUM aLayer, bool isVisible );
322 
327  bool IsLayerVisible( LAYER_NUM aLayer );
328 
333  void SetLayerColor( LAYER_NUM aLayer, COLOR4D aColor );
334 
339  COLOR4D GetLayerColor( LAYER_NUM aLayer ) const;
340 
350  void SetRenderState( int aId, bool isSet );
351 
357  bool GetRenderState( int aId );
358 
359  void UpdateLayouts();
360 
367  void UpdateLayerIcons();
368 
369 /* did not help:
370  void Freeze()
371  {
372  LAYER_PANEL_BASE::Freeze();
373  m_LayerScrolledWindow->Freeze();
374  m_RenderScrolledWindow->Freeze();
375  }
376 
377  void Thaw()
378  {
379  m_RenderScrolledWindow->Thaw();
380  m_LayerScrolledWindow->Thaw();
381  LAYER_PANEL_BASE::Thaw();
382  }
383 */
384 
385  //-----<abstract functions>-------------------------------------------
386 
394  virtual void OnLayerColorChange( int aLayer, COLOR4D aColor ) = 0;
395 
403  virtual bool OnLayerSelect( int aLayer ) = 0;
404 
415  virtual void OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal = true ) = 0;
416 
425  virtual void OnRenderColorChange( int aId, COLOR4D aColor ) = 0;
426 
435  virtual void OnRenderEnable( int aId, bool isEnabled ) = 0;
436 
437  //-----</abstract functions>------------------------------------------
438 };
439 
440 #endif // LAYERWIDGET_H_
void OnLeftDownLayers(wxMouseEvent &event)
wxAuiNotebook * m_notebook
Definition: layer_widget.h:107
int m_CurrentRow
selected row of layer list
Definition: layer_widget.h:116
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.
void OnTabChange(wxNotebookEvent &event)
static const wxEventType EVT_LAYER_COLOR_CHANGE
Definition: layer_widget.h:103
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:112
wxFlexGridSizer * m_LayersFlexGridSizer
Definition: layer_widget.h:110
virtual bool useAlternateBitmap(int aRow)
Virtual Function useAlternateBitmap.
Definition: layer_widget.h:127
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:263
void ClearRenderRows()
Function ClearRenderRows empties out the render rows.
wxFlexGridSizer * m_RenderFlexGridSizer
Definition: layer_widget.h:113
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
ROW(const wxString &aRowName, int aId, COLOR4D aColor=COLOR4D::UNSPECIFIED, const wxString &aTooltip=wxEmptyString, bool aState=true)
Definition: layer_widget.h:92
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:133
wxPanel * m_RenderingPanel
Definition: layer_widget.h:111
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:109
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:287
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:115
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:108
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