diff --git a/pcbnew/layer_panel_base.cpp b/pcbnew/layer_panel_base.cpp
index 11ec9dbb7d..6e6f6d989f 100644
--- a/pcbnew/layer_panel_base.cpp
+++ b/pcbnew/layer_panel_base.cpp
@@ -36,16 +36,27 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
m_LayerPanel->Layout();
bSizer3->Fit( m_LayerPanel );
m_notebook->AddPage( m_LayerPanel, _("Layers"), true );
- m_Page1Panel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_Page1Panel->SetToolTip( _("Part depiction and visibility") );
+ m_RenderingPanel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_RenderingPanel->SetToolTip( _("Part depiction and visibility") );
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL );
- m_Page1Panel->SetSizer( bSizer4 );
- m_Page1Panel->Layout();
- bSizer4->Fit( m_Page1Panel );
- m_notebook->AddPage( m_Page1Panel, _("Rendering"), false );
+ m_RenderScrolledWindow = new wxScrolledWindow( m_RenderingPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL );
+ m_RenderScrolledWindow->SetScrollRate( 5, 5 );
+ m_RenderFlexGridSizer = new wxFlexGridSizer( 0, 2, 1, 3 );
+ m_RenderFlexGridSizer->SetFlexibleDirection( wxHORIZONTAL );
+ m_RenderFlexGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_RenderScrolledWindow->SetSizer( m_RenderFlexGridSizer );
+ m_RenderScrolledWindow->Layout();
+ m_RenderFlexGridSizer->Fit( m_RenderScrolledWindow );
+ bSizer4->Add( m_RenderScrolledWindow, 1, wxALL|wxEXPAND, 5 );
+
+ m_RenderingPanel->SetSizer( bSizer4 );
+ m_RenderingPanel->Layout();
+ bSizer4->Fit( m_RenderingPanel );
+ m_notebook->AddPage( m_RenderingPanel, _("Rendering"), false );
boxSizer->Add( m_notebook, 1, wxEXPAND | wxALL, 5 );
@@ -53,7 +64,6 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
this->Layout();
// Connect Events
- m_LayerScrolledWindow->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDblClickLayers ), NULL, this );
m_LayerScrolledWindow->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this );
m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this );
}
@@ -61,7 +71,6 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
LAYER_PANEL_BASE::~LAYER_PANEL_BASE()
{
// Disconnect Events
- m_LayerScrolledWindow->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDblClickLayers ), NULL, this );
m_LayerScrolledWindow->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this );
m_LayerScrolledWindow->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this );
}
diff --git a/pcbnew/layer_panel_base.h b/pcbnew/layer_panel_base.h
index cca81cc926..259aecb9d7 100644
--- a/pcbnew/layer_panel_base.h
+++ b/pcbnew/layer_panel_base.h
@@ -38,10 +38,11 @@ class LAYER_PANEL_BASE : public wxPanel
wxPanel* m_LayerPanel;
wxScrolledWindow* m_LayerScrolledWindow;
wxFlexGridSizer* m_LayersFlexGridSizer;
- wxPanel* m_Page1Panel;
+ wxPanel* m_RenderingPanel;
+ wxScrolledWindow* m_RenderScrolledWindow;
+ wxFlexGridSizer* m_RenderFlexGridSizer;
// Virtual event handlers, overide them in your derived class
- virtual void OnLeftDblClickLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnLeftDownLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnRightDownLayers( wxMouseEvent& event ){ event.Skip(); }
diff --git a/pcbnew/layer_widget.cpp b/pcbnew/layer_widget.cpp
index d13b283914..f2acf2f5f4 100644
--- a/pcbnew/layer_widget.cpp
+++ b/pcbnew/layer_widget.cpp
@@ -43,13 +43,19 @@
#include "layer_panel_base.h"
#include "colors.h"
+#include "pcbstruct.h" // IsValidCopperLayerIndex()
+
/* no external data knowledge needed or wanted
#include "pcbnew.h"
#include "wxPcbStruct.h"
*/
-#define LAYER_COLUMN_COUNT 4
+#define LYR_COLUMN_COUNT 4 ///< Layer tab column count
+#define RND_COLUMN_COUNT 2 ///< Rendering tab column count
+
+#define ID_SHOW_ALL_COPPERS wxID_HIGHEST
+#define ID_SHOW_NO_COPPERS (wxID_HIGHEST+1)
/* XPM */
@@ -96,27 +102,27 @@ static const char * rightarrow_xpm[] = {
/**
- * Function layerId
+ * Function encodeId
* is here to allow saving a layer index within a control as its wxControl id,
* but to do so in a way that all child wxControl ids within a wxWindow are unique,
* since this is required by Windows.
- * @see getLayerId()
+ * @see getDecodedId()
*/
-static int layerId( int aColumn, int aLayer )
+static int encodeId( int aColumn, int aId )
{
- int id = aLayer * LAYER_COLUMN_COUNT + aColumn;
+ int id = aId * LYR_COLUMN_COUNT + aColumn;
return id;
}
/**
- * Function getLayerId
- * decodes \a aControlId to return a layer.
+ * Function getDecodedId
+ * decodes \a aControlId to original un-encoded value.
*/
-static int getLayerId( int aControlId )
+static int getDecodedId( int aControlId )
{
- int layer = aControlId / LAYER_COLUMN_COUNT; // rounding is OK.
- return layer;
+ int id = aControlId / LYR_COLUMN_COUNT; // rounding is OK.
+ return id;
}
@@ -133,25 +139,6 @@ static wxString makeColorTxt( int aColor )
}
-/**
- * Struct LAYER_SPEC
- * provides all the data needed to add a layer row to a LAYER_WIDGET
- */
-struct LAYER_SPEC
-{
- wxString layerName;
- int layer;
- int color;
-
- LAYER_SPEC( const wxString& aLayerName, int aLayer, int aColor = 0 )
- {
- layerName = aLayerName;
- layer = aLayer;
- color = aColor;
- }
-};
-
-
/**
* Class LAYER_WIDGET
* is abstract and is derived from a wxFormBuilder maintained class called
@@ -162,22 +149,46 @@ struct LAYER_SPEC
* within the UI provided here. This widget knows nothing of the client code, meaning
* it has no knowledge of a BOARD or anything. To use it you must derive from
* this class and implement the abstract functions:
- *
- * void OnColorChange( int aLayer, int aColor );
- *
- * bool OnLayerSelect( int aLayer );
- *
- * void OnLayerVisible( int aLayer, bool isVisible );
+ *
void OnLayerColorChange( int aLayer, int aColor );
+ *
bool OnLayerSelect( int aLayer );
+ *
void OnLayerVisible( int aLayer, bool isVisible );
+ *
void OnRenderColorChange( int id, int aColor );
+ *
void OnRenderEnable( int id, bool isEnabled );
*/
class LAYER_WIDGET : public LAYER_PANEL_BASE
{
+public:
+
+ /**
+ * Struct ROW
+ * provides all the data needed to add a row to a LAYER_WIDGET. This is
+ * part of the public API for a LAYER_WIDGET.
+ */
+ struct ROW
+ {
+ wxString rowName;
+ int id; // either a layer or
+ int color; // -1 if none.
+ bool state; // initial wxCheckBox state
+
+ ROW( const wxString& aRowName, int aId, int aColor = 0, bool aState = true )
+ {
+ rowName = aRowName;
+ id = aId;
+ color = aColor;
+ state = aState;
+ }
+ };
+
+
+protected:
+
#define MAX_LAYER_ROWS 64
#define BUTT_SIZE_X 32
#define BUTT_SIZE_Y 22
#define BUTT_VOID 6
-protected:
wxBitmap* m_BlankBitmap;
wxBitmap* m_RightArrowBitmap;
wxSize m_BitmapSize;
@@ -185,8 +196,8 @@ protected:
static wxBitmap makeBitmap( int aColor )
{
- // the bitmap will be 8 pixels smaller than the button, leaving a
- // border of 4 pixels on each side.
+ // the bitmap will be BUTT_VOID*2 pixels smaller than the button, leaving a
+ // border of BUTT_VOID pixels on each side.
wxBitmap bitmap( BUTT_SIZE_X - 2 * BUTT_VOID, BUTT_SIZE_Y - 2 * BUTT_VOID );
wxBrush brush;
wxMemoryDC iconDC;
@@ -207,13 +218,13 @@ protected:
* Function makeColorButton
* creates a wxBitmapButton and assigns it a solid color and a control ID
*/
- wxBitmapButton* makeColorButton( int aColor, int aID )
+ wxBitmapButton* makeColorButton( wxWindow* aParent, int aColor, int aID )
{
// dynamically make a wxBitMap and brush it with the appropriate color,
// then create a wxBitmapButton from it.
wxBitmap bitmap = makeBitmap( aColor );
- wxBitmapButton* ret = new wxBitmapButton( m_LayerScrolledWindow, aID, bitmap,
+ wxBitmapButton* ret = new wxBitmapButton( aParent, aID, bitmap,
wxDefaultPosition, wxSize(BUTT_SIZE_X, BUTT_SIZE_Y), wxBORDER_RAISED );
// save the color value in the name, no where else to put it.
@@ -221,7 +232,6 @@ protected:
return ret;
}
-
void OnLeftDownLayers( wxMouseEvent& event )
{
int row;
@@ -254,8 +264,8 @@ protected:
else
{
// all nested controls on a given row will have their ID encoded with
- // makeLayerId(), and the corresponding decoding is getLayerId()
- int layer = getLayerId( eventSource ->GetId() );
+ // encodeId(), and the corresponding decoding is getDecodedId()
+ int layer = getDecodedId( eventSource ->GetId() );
row = findLayerRow( layer );
}
@@ -283,10 +293,10 @@ protected:
wxBitmap bm = makeBitmap( newColor );
eventSource->SetBitmapLabel( bm );
- int layer = getLayerId( eventSource->GetId() );
+ int layer = getDecodedId( eventSource->GetId() );
// tell the client code.
- OnColorChange( layer, newColor );
+ OnLayerColorChange( layer, newColor );
}
}
@@ -297,8 +307,48 @@ protected:
*/
void OnRightDownLayers( wxMouseEvent& event )
{
- // popup menu
- printf( "OnRightDownLayers\n" );
+ wxMenu menu;
+
+ // menu text is capitalized:
+ // http://library.gnome.org/devel/hig-book/2.20/design-text-labels.html.en#layout-capitalization
+ menu.Append( new wxMenuItem( &menu, ID_SHOW_ALL_COPPERS,
+ _("Show All Copper Layers") ) );
+
+ menu.Append( new wxMenuItem( &menu, ID_SHOW_NO_COPPERS,
+ _( "Show No Copper Layers" ) ) );
+
+ PopupMenu( &menu );
+ }
+
+ void OnPopupSelection( wxCommandEvent& event )
+ {
+ int rowCount;
+ int menuId = event.GetId();
+ bool visible;
+
+ switch( menuId )
+ {
+ case ID_SHOW_ALL_COPPERS:
+ visible = true;
+ goto L_change_coppers;
+
+ case ID_SHOW_NO_COPPERS:
+ visible = false;
+ L_change_coppers:
+ rowCount = GetLayerRowCount();
+ for( int row=0; rowGetId() );
+
+ if( IsValidCopperLayerIndex( layer ) )
+ {
+ cb->SetValue( visible );
+ OnLayerVisible( layer, visible );
+ }
+ }
+ break;
+ }
}
@@ -310,23 +360,55 @@ protected:
void OnLayerCheckBox( wxCommandEvent& event )
{
wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
-
- int layer = getLayerId( eventSource->GetId() );
-
+ int layer = getDecodedId( eventSource->GetId() );
OnLayerVisible( layer, eventSource->IsChecked() );
}
+ void OnMiddleDownRenderColor( wxMouseEvent& event )
+ {
+ wxBitmapButton* eventSource = (wxBitmapButton*) event.GetEventObject();
+
+ wxString colorTxt = eventSource->GetName();
+
+ int oldColor = strtoul( CONV_TO_UTF8(colorTxt), NULL, 0 );
+ int newColor = DisplayColorFrame( this, oldColor );
+
+ if( newColor >= 0 )
+ {
+ eventSource->SetName( makeColorTxt( newColor ) );
+
+ wxBitmap bm = makeBitmap( newColor );
+ eventSource->SetBitmapLabel( bm );
+
+ int id = getDecodedId( eventSource->GetId() );
+
+ // tell the client code.
+ OnRenderColorChange( id, newColor );
+ }
+ }
+
+ void OnRenderCheckBox( wxCommandEvent& event )
+ {
+ wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
+ int id = getDecodedId( eventSource->GetId() );
+ OnRenderEnable( id, eventSource->IsChecked() );
+ }
+
+
/**
* Function getLayerComp
- * returns the component within the m_LayersFlexGridSizer at aSizerNdx.
+ * returns the component within the m_LayersFlexGridSizer at aSizerNdx or
+ * NULL if \a aSizerNdx is out of range.
*
* @param aSizerNdx is the 0 based index into all the wxWindows which have
* been added to the m_LayersFlexGridSizer.
*/
wxWindow* getLayerComp( int aSizerNdx )
{
- return m_LayersFlexGridSizer->GetChildren()[aSizerNdx]->GetWindow();
+ if( (unsigned) aSizerNdx < m_LayersFlexGridSizer->GetChildren().GetCount() )
+ return m_LayersFlexGridSizer->GetChildren()[aSizerNdx]->GetWindow();
+ return NULL;
}
/**
@@ -336,15 +418,14 @@ protected:
int findLayerRow( int aLayer )
{
int count = GetLayerRowCount();
- for( int row=0; rowGetId() ))
+ if( aLayer == getDecodedId( bm->GetId() ))
return row;
}
-
return -1;
}
@@ -352,46 +433,94 @@ protected:
* Function insertLayerRow
* appends or inserts a new row in the layer portion of the widget.
*/
- void insertLayerRow( int aRow, const LAYER_SPEC& aSpec )
+ void insertLayerRow( int aRow, const ROW& aSpec )
{
+ int col;
+
wxASSERT( aRow >= 0 && aRow < MAX_LAYER_ROWS );
- size_t index = aRow * LAYER_COLUMN_COUNT;
+ size_t index = aRow * LYR_COLUMN_COUNT;
wxSizerFlags flags;
flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
// column 0
- wxStaticBitmap* sbm = new wxStaticBitmap( m_LayerScrolledWindow, layerId( 0, aSpec.layer ),
+ col = 0;
+ wxStaticBitmap* sbm = new wxStaticBitmap( m_LayerScrolledWindow, encodeId( col, aSpec.id ),
*m_BlankBitmap, wxDefaultPosition, m_BitmapSize );
sbm->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
sbm->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
- m_LayersFlexGridSizer->Insert( index+0,
+ m_LayersFlexGridSizer->Insert( index+col,
new wxSizerItem( sbm, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL ) ) );
// column 1
- wxBitmapButton* bmb = makeColorButton( aSpec.color, layerId( 1, aSpec.layer ) );
+ col = 1;
+ wxBitmapButton* bmb = makeColorButton( m_LayerScrolledWindow, aSpec.color, encodeId( col, aSpec.id ) );
bmb->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
bmb->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownLayerColor ), NULL, this );
bmb->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
- bmb->SetToolTip( _("Right click to change layer color, left click to select layer" ) );
- m_LayersFlexGridSizer->Insert( index+1,
- new wxSizerItem( bmb, flags ) );
+ bmb->SetToolTip( _("Left click to select, middle click for color change, right click for menu" ) );
+ m_LayersFlexGridSizer->Insert( index+col, new wxSizerItem( bmb, flags ) );
// column 2
- wxStaticText* st = new wxStaticText( m_LayerScrolledWindow, layerId( 2, aSpec.layer ), aSpec.layerName );
+ col = 2;
+ wxStaticText* st = new wxStaticText( m_LayerScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
st->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
st->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
st->SetToolTip( _( "Click here to select this layer" ) );
- m_LayersFlexGridSizer->Insert( index+2,
+ m_LayersFlexGridSizer->Insert( index+col,
new wxSizerItem( st, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL )) );
// column 3
- wxCheckBox* cb = new wxCheckBox( m_LayerScrolledWindow, layerId( 3, aSpec.layer ), wxEmptyString );
+ col = 3;
+ wxCheckBox* cb = new wxCheckBox( m_LayerScrolledWindow, encodeId( col, aSpec.id ), wxEmptyString );
+ cb->SetValue( aSpec.state );
cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnLayerCheckBox ), NULL, this );
cb->SetToolTip( _( "Enable this for visibility" ) );
- m_LayersFlexGridSizer->Insert( index+3, new wxSizerItem( cb, flags ) );
+ m_LayersFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
+ }
+
+ void insertRenderRow( int aRow, const ROW& aSpec )
+ {
+ int col;
+
+ wxASSERT( aRow >= 0 && aRow < MAX_LAYER_ROWS );
+
+ size_t index = aRow * RND_COLUMN_COUNT;
+
+ wxSizerFlags flags;
+
+ flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
+
+ // column 0
+ col = 0;
+ wxBitmapButton* bmb = makeColorButton( m_RenderScrolledWindow, aSpec.color, encodeId( col, aSpec.id ) );
+ bmb->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownRenderColor ), NULL, this );
+ bmb->SetToolTip( _("Middle click for color change" ) );
+ m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( bmb, flags ) );
+
+#if 1
+ // column 1
+ col = 1;
+ wxCheckBox* cb = new wxCheckBox( m_RenderScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
+ cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnRenderCheckBox ), NULL, this );
+// cb->SetToolTip( _( "Enable this for visibility" ) );
+ m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
+#else
+ // column 1
+ col = 1;
+ wxStaticText* st = new wxStaticText( m_RenderScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
+ m_RenderFlexGridSizer->Insert( index+col,
+ new wxSizerItem( st, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL )) );
+
+ // column 2
+ col = 2;
+ wxCheckBox* cb = new wxCheckBox( m_RenderScrolledWindow, encodeId( col, aSpec.id ), wxEmptyString );
+ cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnRenderCheckBox ), NULL, this );
+// cb->SetToolTip( _( "Enable this for visibility" ) );
+ m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
+#endif
}
@@ -401,24 +530,22 @@ public:
LAYER_WIDGET( wxWindow* parent ) :
LAYER_PANEL_BASE( parent )
{
- m_CurrentRow = 0;
+ m_CurrentRow = -1;
m_RightArrowBitmap = new wxBitmap( rightarrow_xpm );
- m_BlankBitmap = new wxBitmap( clear_xpm ); // translucent
+ m_BlankBitmap = new wxBitmap( clear_xpm ); // translucent
m_BitmapSize = wxSize(m_BlankBitmap->GetWidth(), m_BlankBitmap->GetHeight());
- m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
+ // handle the popup menu over the layer window
+ m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN,
+ wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
-
- AppendLayerRow( LAYER_SPEC( wxT("layer 1"), 0, RED ) );
- AppendLayerRow( LAYER_SPEC( wxT("layer 2"), 1, GREEN ) );
- AppendLayerRow( LAYER_SPEC( wxT("brown_layer"), 2, BROWN ) );
- AppendLayerRow( LAYER_SPEC( wxT("layer_4_you"), 3, BLUE ) );
-
- SelectLayerRow( 1 );
-
- SetMinSize( GetPreferredSize() );
+ // since Popupmenu() call this->ProcessEvent() we must call this->Connect()
+ // and not m_LayerScrolledWindow->Connect()
+ Connect( ID_SHOW_ALL_COPPERS, ID_SHOW_NO_COPPERS,
+ wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler( LAYER_WIDGET::OnPopupSelection ), NULL, this );
}
@@ -429,30 +556,38 @@ public:
*/
wxSize GetPreferredSize()
{
- m_LayersFlexGridSizer->Layout();
+ FitInside();
+ // size of m_LayerScrolledWindow --------------
wxArrayInt widths = m_LayersFlexGridSizer->GetColWidths();
int totWidth = 0;
- for( int i=0; iGetHGap();
- printf("widths[%d]:%d\n", i, widths[i] );
+ // printf("widths[%d]:%d\n", i, widths[i] );
}
wxArrayInt heights = m_LayersFlexGridSizer->GetRowHeights();
- int totHeight = 0;
+ int totHeight = 2 * heights[0]; // use 2 row heights to approximate tab height
int rowCount = GetLayerRowCount();
for( int i=0; iGetVGap();
- printf("heights[%d]:%d\n", i, heights[i] );
+ // printf("heights[%d]:%d\n", i, heights[i] );
}
- wxSize layerPanelSize( totWidth, totHeight );
+ // on linux: trial and error min until horizontal scroll bar goes away.
+ // I think this is to account for the top most window's frame:
+ totWidth += 10;
- // this aint done yet, just a place holder for more work.
+ wxSize layerWindowSize( totWidth, totHeight );
- return layerPanelSize;
+ return layerWindowSize;
+ }
+
+ void SetPreferredSize()
+ {
+ SetMinSize( GetPreferredSize() );
}
@@ -463,17 +598,28 @@ public:
int GetLayerRowCount() const
{
int controlCount = m_LayersFlexGridSizer->GetChildren().GetCount();
- return controlCount / LAYER_COLUMN_COUNT;
+ return controlCount / LYR_COLUMN_COUNT;
+ }
+
+ /**
+ * Function GetRenderRowCount
+ * returns the number of rows in the render tab.
+ */
+ int GetRenderRowCount() const
+ {
+ int controlCount = m_RenderFlexGridSizer->GetChildren().GetCount();
+ return controlCount / RND_COLUMN_COUNT;
}
/**
* Function AppendLayerRow
- * appends a new row in the layer portion of the widget.
+ * appends a new row in the layer portion of the widget. The user must
+ * ensure that ROW::id is unique for all existing rows on Windows.
*/
- void AppendLayerRow( const LAYER_SPEC& aSpec )
+ void AppendLayerRow( const ROW& aRow )
{
int nextRow = GetLayerRowCount();
- insertLayerRow( nextRow, aSpec );
+ insertLayerRow( nextRow, aRow );
}
/**
@@ -485,28 +631,48 @@ public:
m_LayerScrolledWindow->DestroyChildren();
}
+ /**
+ * Function AppendRenderRow
+ * appends a new row in the render portion of the widget. The user must
+ * ensure that ROW::id is unique for all existing rows on Windows.
+ */
+ void AppendRenderRow( const ROW& aRow )
+ {
+ int nextRow = GetRenderRowCount();
+ insertRenderRow( nextRow, aRow );
+ }
+
+ /**
+ * Function ClearRenderRows
+ * empties out the render rows.
+ */
+ void ClearRenderRows()
+ {
+ m_RenderScrolledWindow->DestroyChildren();
+ }
/**
* Function SelectLayerRow
* changes the row selection in the layer list to the given row.
*/
- bool SelectLayerRow( int aRow )
+ void SelectLayerRow( int aRow )
{
// enable the layer tab at index 0
m_notebook->ChangeSelection( 0 );
- if( (unsigned) aRow < (unsigned) GetLayerRowCount() )
- {
- int newNdx = LAYER_COLUMN_COUNT * aRow;
- int oldNdx = LAYER_COLUMN_COUNT * m_CurrentRow;
+ int oldNdx = LYR_COLUMN_COUNT * m_CurrentRow;
+ int newNdx = LYR_COLUMN_COUNT * aRow;
- wxStaticBitmap* oldbm = (wxStaticBitmap*) getLayerComp( oldNdx );
- wxStaticBitmap* newbm = (wxStaticBitmap*) getLayerComp( newNdx );
+ m_CurrentRow = aRow;
+ wxStaticBitmap* oldbm = (wxStaticBitmap*) getLayerComp( oldNdx );
+ if( oldbm )
oldbm->SetBitmap( *m_BlankBitmap );
- newbm->SetBitmap( *m_RightArrowBitmap );
- m_CurrentRow = aRow;
+ wxStaticBitmap* newbm = (wxStaticBitmap*) getLayerComp( newNdx );
+ if( newbm )
+ {
+ newbm->SetBitmap( *m_RightArrowBitmap );
// Change the focus to the wxBitmapButton in column 1 for this row.
// We really do not need or want the focus, but because we get focus
@@ -519,31 +685,58 @@ public:
// It seems that as of 2.8.2, setting the focus
// does this and generally I don't expect the scrolling to be needed at all because
// the minimum window size may end up being established by the number of layers.
-
- return true;
}
- return false;
}
+
/**
* Function SelectLayer
* changes the row selection in the layer list to \a aLayer provided.
*/
- bool SelectLayer( int aLayer )
+ void SelectLayer( int aLayer )
{
int row = findLayerRow( aLayer );
- return SelectLayerRow( row );
+ SelectLayerRow( row );
}
+ /**
+ * Function GetSelectedLayer
+ * returns the selected layer or -1 if none.
+ */
+ int GetSelectedLayer()
+ {
+ // column 0 in the layer scroll window has a wxStaticBitmap, get its ID.
+ wxStaticBitmap* bm = (wxStaticBitmap*) getLayerComp( m_CurrentRow * LYR_COLUMN_COUNT );
+ if( bm )
+ return getDecodedId( bm->GetId() );
+
+ return -1;
+ }
+
+ /**
+ * Function SetLayerVisible
+ * sets \a aLayer visible or not. This does not invoke OnLayerVisible().
+ */
+ void SetLayerVisible( int aLayer, bool isVisible )
+ {
+ int row = findLayerRow( aLayer );
+ if( row >= 0 )
+ {
+ wxCheckBox* cb = (wxCheckBox*) getLayerComp( row * LYR_COLUMN_COUNT + 3 );
+ wxASSERT( cb );
+ cb->SetValue( isVisible ); // does not fire an event
+ }
+ }
+
//------------------------------------------------
/**
- * Function OnColorChange
+ * Function OnLayerColorChange
* is called to notify client code about a layer color change. Derived
* classes will handle this accordingly.
*/
- virtual void OnColorChange( int aLayer, int aColor ) = 0;
+ virtual void OnLayerColorChange( int aLayer, int aColor ) = 0;
/**
* Function OnLayerSelect
@@ -559,8 +752,26 @@ public:
*/
virtual void OnLayerVisible( int aLayer, bool isVisible ) = 0;
- //-----------------------------------------------
+ /**
+ * Function OnRenderColorChange
+ * is called to notify client code whenever the user changes a rendering
+ * color.
+ * @param aId is the same id that was established in a Rendering row
+ * via the AddRenderRow() function.
+ */
+ virtual void OnRenderColorChange( int aId, int aColor ) = 0;
+ /**
+ * Function OnRenderEnable
+ * is called to notify client code whenever the user changes an rendering
+ * enable in one of the rendering checkboxes.
+ * @param aId is the same id that was established in a Rendering row
+ * via the AddRenderRow() function.
+ * @param isEnabled is the state of the checkbox, true if checked.
+ */
+ virtual void OnRenderEnable( int aId, bool isEnabled ) = 0;
+
+ //-----------------------------------------------
};
@@ -590,16 +801,17 @@ class MYFRAME : public wxFrame
{
}
- void OnColorChange( int aLayer, int aColor )
+ void OnLayerColorChange( int aLayer, int aColor )
{
- printf( "OnColorChange( aLayer:%d, aColor:%d )\n", aLayer, aColor );
+ printf( "OnLayerColorChange( aLayer:%d, aColor:%d )\n", aLayer, aColor );
- // a test trigger only
+ /* a test trigger only
if( aLayer == 2 )
{
ClearLayerRows();
printf(" GetLayerRowCount(): %d\n", GetLayerRowCount() );
}
+ */
}
bool OnLayerSelect( int aLayer )
@@ -612,6 +824,16 @@ class MYFRAME : public wxFrame
{
printf( "OnLayerVisible( aLayer:%d, isVisible:%d )\n", aLayer, isVisible );
}
+
+ void OnRenderColorChange( int aId, int aColor )
+ {
+ printf( "OnRenderColorChange( aId:%d, aColor:%d )\n", aId, aColor );
+ }
+
+ void OnRenderEnable( int aId, bool isEnabled )
+ {
+ printf( "OnRenderEnable( aId:%d, isEnabled:%d )\n", aId, isEnabled );
+ }
};
@@ -623,28 +845,39 @@ public:
// notify wxAUI which frame to use
m_mgr.SetManagedWindow( this );
- MYLAYERS* layerWidget = new MYLAYERS( this, this );
+ MYLAYERS* lw = new MYLAYERS( this, this );
+
+ lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer 1"), 0, RED, false ) );
+ lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer 2"), 1, GREEN ) );
+ lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("brown_layer"), 2, BROWN ) );
+ lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer_4_you"), 3, BLUE, false ) );
+
+ lw->AppendRenderRow( LAYER_WIDGET::ROW( wxT("With Ears"), 0, GREEN ) );
+ lw->AppendRenderRow( LAYER_WIDGET::ROW( wxT("With Legs"), 1, YELLOW ) );
+
+ lw->SetPreferredSize();
+
+ lw->SelectLayerRow( 1 );
+
+ wxAuiPaneInfo li;
+ li.MinSize( lw->GetPreferredSize() );
+ li.BestSize( lw->GetPreferredSize() );
+ li.Left();
+// li.MaximizeButton( true );
+// li.MinimizeButton( true );
+ li.CloseButton( false );
+ li.Caption( wxT( "Layers" ) );
+ m_mgr.AddPane( lw, li );
+
wxTextCtrl* text2 = new wxTextCtrl( this, -1, _( "Pane 2 - sample text" ),
wxDefaultPosition, wxSize( 200, 150 ),
wxNO_BORDER | wxTE_MULTILINE );
+ m_mgr.AddPane( text2, wxBOTTOM, wxT( "Pane Number Two" ) );
wxTextCtrl* text3 = new wxTextCtrl( this, -1, _( "Main content window" ),
wxDefaultPosition, wxSize( 200, 150 ),
wxNO_BORDER | wxTE_MULTILINE );
-
- // add the panes to the manager
- wxAuiPaneInfo li;
- li.MinSize( layerWidget->GetPreferredSize() ); // ignored on linux
- li.BestSize( layerWidget->GetPreferredSize() );
- li.Left();
- li.MaximizeButton( true );
- li.MinimizeButton( true );
- li.CloseButton( false );
- li.Caption( wxT( "Layers" ) );
- m_mgr.AddPane( layerWidget, li );
-
- m_mgr.AddPane( text2, wxBOTTOM, wxT( "Pane Number Two" ) );
m_mgr.AddPane( text3, wxCENTER );
// tell the manager to "commit" all the changes just made
diff --git a/pcbnew/panel_layer_select.fbp b/pcbnew/panel_layer_select.fbp
index 241ce6c2b3..175fd82132 100644
--- a/pcbnew/panel_layer_select.fbp
+++ b/pcbnew/panel_layer_select.fbp
@@ -198,7 +198,7 @@
- OnLeftDblClickLayers
+
OnLeftDownLayers
@@ -246,7 +246,7 @@
wxID_ANY
- m_Page1Panel
+ m_RenderingPanel
protected
@@ -283,6 +283,69 @@
bSizer4
wxVERTICAL
none
+