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 + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + + m_RenderScrolledWindow + protected + + 5 + 5 + + + + + + wxVSCROLL + + + + + + + + + + + + + + + + + + + + + + + + + 2 + wxHORIZONTAL + + + 3 + + m_RenderFlexGridSizer + wxFLEX_GROWMODE_SPECIFIED + protected + 0 + 1 + + +