From ce983ec34acf29c8899192a575b4021d1d338376 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 30 Aug 2013 21:28:31 +0200 Subject: [PATCH 1/4] Pcbnew: Redesign layer selection and layer pair selection (give them a look near the Layer selector in toolbarr) --- common/class_layer_box_selector.cpp | 82 ++-- include/class_layer_box_selector.h | 60 ++- pagelayout_editor/files.cpp | 9 +- pcbnew/CMakeLists.txt | 1 + pcbnew/edit.cpp | 8 + pcbnew/sel_layer.cpp | 686 +++++++++++++++++----------- 6 files changed, 502 insertions(+), 344 deletions(-) diff --git a/common/class_layer_box_selector.cpp b/common/class_layer_box_selector.cpp index 66b40377cf..2dadd15585 100644 --- a/common/class_layer_box_selector.cpp +++ b/common/class_layer_box_selector.cpp @@ -11,6 +11,46 @@ #include + +LAYER_SELECTOR::LAYER_SELECTOR() +{ + m_layerorder = true; + m_layerhotkeys = true; + m_hotkeys = NULL; +} + + +bool LAYER_SELECTOR::SetLayersOrdered( bool value ) +{ + m_layerorder = value; + return m_layerorder; +} + + +bool LAYER_SELECTOR::SetLayersHotkeys( bool value ) +{ + m_layerhotkeys = value; + return m_layerhotkeys; +} + + +void LAYER_SELECTOR::SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayer ) +{ + wxMemoryDC bmpDC; + wxBrush brush; + + // Prepare Bitmap + bmpDC.SelectObject( aLayerbmp ); + brush.SetColour( MakeColour( GetLayerColor( aLayer ) ) ); + brush.SetStyle( wxSOLID ); + + bmpDC.SetBrush( brush ); + bmpDC.DrawRectangle( 0, 0, aLayerbmp.GetWidth(), aLayerbmp.GetHeight() ); + bmpDC.SetBrush( *wxTRANSPARENT_BRUSH ); + bmpDC.SetPen( *wxBLACK_PEN ); + bmpDC.DrawRectangle( 0, 0, aLayerbmp.GetWidth(), aLayerbmp.GetHeight() ); +} + /* class to display a layer list. * */ @@ -18,12 +58,9 @@ LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxAuiToolBar* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, int n, const wxString choices[] ) : + LAYER_SELECTOR(), wxBitmapComboBox( parent, id, wxEmptyString, pos, size, n, choices, wxCB_READONLY ) { - m_layerorder = true; - m_layerhotkeys = true; - m_hotkeys = NULL; - if( choices != NULL ) ResyncBitmapOnly(); } @@ -32,31 +69,14 @@ LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxAuiToolBar* parent, wxWindowID id, LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxAuiToolBar* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, const wxArrayString& choices ) : + LAYER_SELECTOR(), wxBitmapComboBox( parent, id, wxEmptyString, pos, size, choices, wxCB_READONLY ) { - m_layerorder = true; - m_layerhotkeys = true; - m_hotkeys = NULL; - if( !choices.IsEmpty() ) ResyncBitmapOnly(); } -bool LAYER_BOX_SELECTOR::SetLayersOrdered( bool value ) -{ - m_layerorder = value; - return m_layerorder; -} - - -bool LAYER_BOX_SELECTOR::SetLayersHotkeys( bool value ) -{ - m_layerhotkeys = value; - return m_layerhotkeys; -} - - // Get Current Item # int LAYER_BOX_SELECTOR::GetChoice() { @@ -104,21 +124,3 @@ void LAYER_BOX_SELECTOR::ResyncBitmapOnly() SetBitmapLayer( layerbmp, i ); } } - - -void LAYER_BOX_SELECTOR::SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayer ) -{ - wxMemoryDC bmpDC; - wxBrush brush; - - // Prepare Bitmap - bmpDC.SelectObject( aLayerbmp ); - brush.SetColour( MakeColour( GetLayerColor( aLayer ) ) ); - brush.SetStyle( wxSOLID ); - - bmpDC.SetBrush( brush ); - bmpDC.DrawRectangle( 0, 0, aLayerbmp.GetWidth(), aLayerbmp.GetHeight() ); - bmpDC.SetBrush( *wxTRANSPARENT_BRUSH ); - bmpDC.SetPen( *wxBLACK_PEN ); - bmpDC.DrawRectangle( 0, 0, aLayerbmp.GetWidth(), aLayerbmp.GetHeight() ); -} diff --git a/include/class_layer_box_selector.h b/include/class_layer_box_selector.h index e313b6242a..a45c60eccf 100644 --- a/include/class_layer_box_selector.h +++ b/include/class_layer_box_selector.h @@ -9,11 +9,11 @@ class wxAuiToolBar; -/* class to display a layer list. - * +/* Basic class to build a layer list. + * this is an basic abstract class to build a layer list selector. + * To display this list, you should therefore derive this class */ - -class LAYER_BOX_SELECTOR : public wxBitmapComboBox +class LAYER_SELECTOR { protected: bool m_layerhotkeys; @@ -23,6 +23,37 @@ public: // Hotkey Info struct EDA_HOTKEY_CONFIG* m_hotkeys; +public: + LAYER_SELECTOR(); + + // Returns a color index from the layer id + // Virtual function because GerbView uses its own functions in a derived class + virtual EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const = 0; + + // Returns the name of the layer id + // Virtual pure function because GerbView uses its own functions in a derived class + virtual wxString GetLayerName( LAYER_NUM aLayer ) const = 0; + + // Returns true if the layer id is enabled (i.e. is it should be displayed) + // Virtual function pure because GerbView uses its own functions in a derived class + virtual bool IsLayerEnabled( LAYER_NUM aLayer ) const = 0; + + bool SetLayersOrdered(bool value); + bool SetLayersHotkeys(bool value); + +protected: + // Fills the layer bitmap aLayerbmp with the layer color + void SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayer ); +}; + +/* class to display a layer list in a wxBitmapComboBox. + */ +class LAYER_BOX_SELECTOR : public LAYER_SELECTOR, public wxBitmapComboBox +{ +public: + // Hotkey Info + struct EDA_HOTKEY_CONFIG* m_hotkeys; + public: LAYER_BOX_SELECTOR( wxAuiToolBar* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, @@ -33,19 +64,7 @@ public: const wxPoint& pos, const wxSize& size, const wxArrayString& choices ); - // Returns a color index from the layer id - // Virtual function because GerbView uses its own functions in a derived class - virtual EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const = 0; - - // Returns the name of the layer id - // Virtual pure function because GerbView uses its own functions in a derived class - virtual wxString GetLayerName( LAYER_NUM aLayer ) const = 0; - - // Returns true if the layer id is enabled (i.e. is it should be displayed) - // Virtual function pure because GerbView uses its own functions in a derived class - virtual bool IsLayerEnabled( LAYER_NUM aLayer ) const = 0; - - // Get Current Item # + // Get Current Item # int GetChoice(); // Get Current Layer @@ -60,13 +79,6 @@ public: // Reload the Layers bitmaps colors void ResyncBitmapOnly(); - - bool SetLayersOrdered(bool value); - bool SetLayersHotkeys(bool value); - -protected: - // Fills the layer bitmap aLayerbmp with the layer color - void SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayer ); }; #define DECLARE_LAYERS_HOTKEY(list) int list[NB_LAYERS] = \ diff --git a/pagelayout_editor/files.cpp b/pagelayout_editor/files.cpp index 45749ae016..cc6ef4de7d 100644 --- a/pagelayout_editor/files.cpp +++ b/pagelayout_editor/files.cpp @@ -186,9 +186,14 @@ void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event ) filename = openFileDialog.GetPath(); // Ensure the file has the right extension: + // because a name like name.subname.subsubname is legal, + // add the right extension without replacing the wxFileName + // extension wxFileName fn(filename); - fn.SetExt( PageLayoutDescrFileExtension ); - filename = fn.GetFullPath(); + + if( fn.GetExt() != PageLayoutDescrFileExtension ) + filename << wxT(".") << PageLayoutDescrFileExtension; + if( !SavePageLayoutDescrFile( filename ) ) { wxString msg; diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 393740ae7b..59fcb0209c 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -76,6 +76,7 @@ set( PCBNEW_DIALOGS dialogs/dialog_global_deletion_base.cpp dialogs/dialog_keepout_area_properties.cpp dialogs/dialog_keepout_area_properties_base.cpp + dialogs/dialog_layer_selection_base.cpp dialogs/dialog_layers_setup.cpp dialogs/dialog_layers_setup_base.cpp dialogs/dialog_netlist.cpp diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index a154b8677f..ae445f1d8b 100755 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -925,7 +925,15 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) itmp = SelectLayer( getActiveLayer(), UNDEFINED_LAYER, UNDEFINED_LAYER ); if( itmp >= 0 ) + { + // if user changed colors and we are in high contrast mode, then redraw + // because the PAD_SMD pads may change color. + if( DisplayOpt.ContrastModeDisplay && getActiveLayer() != itmp ) + { + m_canvas->Refresh(); + } setActiveLayer( itmp ); + } m_canvas->MoveCursorToCrossHair(); break; diff --git a/pcbnew/sel_layer.cpp b/pcbnew/sel_layer.cpp index 5e265a26dc..0634c7fb28 100644 --- a/pcbnew/sel_layer.cpp +++ b/pcbnew/sel_layer.cpp @@ -1,7 +1,31 @@ /** * @file sel_layer.cpp - * @brief Set up the basic primitives for Layer control. + * @brief dialogs for one layer selection and a layer pair selection. */ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + #include #include @@ -9,340 +33,446 @@ #include #include #include - +#include #include +#include -enum layer_sel_id { - ID_LAYER_SELECT_TOP = 1800, - ID_LAYER_SELECT_BOTTOM, - ID_LAYER_SELECT -}; - - -class SELECT_LAYER_DIALOG : public wxDialog +/* classes to display a layer list using a wxGrid. + */ +class PCB_LAYER_SELECTOR: public LAYER_SELECTOR { -private: - PCB_BASE_FRAME* m_Parent; - wxRadioBox* m_LayerList; - LAYER_NUM m_LayerId[int(NB_PCB_LAYERS) + 1]; // One extra element for "(Deselect)" radiobutton + BOARD * m_brd; public: - // Constructor and destructor - SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent, LAYER_NUM default_layer, - LAYER_NUM min_layer, LAYER_NUM max_layer, bool null_layer ); - ~SELECT_LAYER_DIALOG() { }; + PCB_LAYER_SELECTOR( BOARD* aBrd ):LAYER_SELECTOR() + { + m_brd = aBrd; + } -private: - void OnLayerSelected( wxCommandEvent& event ); - void OnCancelClick( wxCommandEvent& event ); +protected: + // Returns true if the layer id is enabled (i.e. is it should be displayed) + bool IsLayerEnabled( LAYER_NUM aLayer ) const + { + return m_brd->IsLayerEnabled( aLayer ); + } + + // Returns a color index from the layer id + // Virtual function + EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const + { + return m_brd->GetLayerColor( aLayer ); + } + + // Returns the name of the layer id + // Virtual function + wxString GetLayerName( LAYER_NUM aLayer ) const + { + return m_brd->GetLayerName( aLayer ); + } - DECLARE_EVENT_TABLE() }; +/* + * This class display a pcb layers list in adialog, + * to select one layer from this list + */ +class PCB_ONE_LAYER_SELECTOR : public PCB_LAYER_SELECTOR, + public DIALOG_LAYER_SELECTION_BASE +{ + LAYER_NUM m_layerSelected; + LAYER_NUM m_minLayer; + LAYER_NUM m_maxLayer; -BEGIN_EVENT_TABLE( SELECT_LAYER_DIALOG, wxDialog ) - EVT_BUTTON( wxID_OK, SELECT_LAYER_DIALOG::OnLayerSelected ) - EVT_BUTTON( wxID_CANCEL, SELECT_LAYER_DIALOG::OnCancelClick ) - EVT_RADIOBOX( ID_LAYER_SELECT, SELECT_LAYER_DIALOG::OnLayerSelected ) -END_EVENT_TABLE() +public: + PCB_ONE_LAYER_SELECTOR( wxWindow* aParent, BOARD * aBrd, + LAYER_NUM aDefaultLayer, + LAYER_NUM aMinLayer = -1, LAYER_NUM aMaxLayer = -1, + bool aClearTool = false ) + :PCB_LAYER_SELECTOR( aBrd ), DIALOG_LAYER_SELECTION_BASE( aParent ) + { + m_layerSelected = (int) aDefaultLayer; + // When not needed, remove the "Clear" button + m_buttonClear->Show( aClearTool ); + m_minLayer = aMinLayer; + m_maxLayer = aMaxLayer; + BuildList(); + Layout(); + GetSizer()->SetSizeHints(this); + SetFocus(); + } + LAYER_NUM GetLayerSelection() { return m_layerSelected; } + +private: + // Event handlers + void OnLeftGridClick( wxGridEvent& event ); + void OnRightGridClick( wxGridEvent& event ); + void OnClearSelection( wxCommandEvent& event ) + { + m_layerSelected = NB_PCB_LAYERS; + EndModal( NB_PCB_LAYERS ); + } + + void BuildList(); +}; + +// Build the layers list +// Column position by function: +#define SELECT_COLNUM 0 +#define COLOR_COLNUM 1 +#define LAYERNAME_COLNUM 2 +#define LAYERID_COLNUM 3 +static DECLARE_LAYERS_ORDER_LIST( layertranscode ); + +void PCB_ONE_LAYER_SELECTOR::BuildList() +{ + m_leftGridLayers->SetColFormatNumber( LAYERID_COLNUM ); + m_rightGridLayers->SetColFormatNumber( LAYERID_COLNUM ); + m_leftGridLayers->HideCol( LAYERID_COLNUM ); + m_rightGridLayers->HideCol( LAYERID_COLNUM ); + m_leftGridLayers->SetColSize( COLOR_COLNUM, 20 ); + m_rightGridLayers->SetColSize( COLOR_COLNUM, 20 ); + + // Select a not show cell, to avoid a wrong cell selection for user + m_leftGridLayers->GoToCell( 0, LAYERID_COLNUM ); + m_rightGridLayers->GoToCell( 0, LAYERID_COLNUM ); + + int left_row = 0; + int right_row = 0; + wxString layernum; + wxString layername; + for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i ) + { + LAYER_NUM layerid = i; + + if( m_layerorder ) + layerid = layertranscode[i]; + + if( ! IsLayerEnabled( layerid ) ) + continue; + + if( m_minLayer >= 0 && layerid < m_minLayer ) + continue; + + if( m_maxLayer >= 0 && layerid > m_maxLayer ) + continue; + + wxColour color = MakeColour( GetLayerColor( layerid ) ); + layername = GetLayerName( layerid ); + layernum.Printf( wxT("%d"), layerid ); + + if( layerid <= LAST_COPPER_LAYER ) + { + if( left_row ) + m_leftGridLayers->AppendRows( 1 ); + + m_leftGridLayers->SetCellBackgroundColour ( left_row, COLOR_COLNUM, + color ); + m_leftGridLayers->SetCellValue( left_row, LAYERNAME_COLNUM, + layername ); + m_leftGridLayers->SetCellValue( left_row, LAYERID_COLNUM, + layernum ); + + if( m_layerSelected == layerid ) + { + m_leftGridLayers->SetCellValue( left_row, SELECT_COLNUM, + wxT("X") ); + m_leftGridLayers->SetCellBackgroundColour ( left_row, SELECT_COLNUM, + color ); + } + + left_row++; + } + else + { + if( right_row ) + m_rightGridLayers->AppendRows( 1 ); + + m_rightGridLayers->SetCellBackgroundColour ( right_row, COLOR_COLNUM, + color ); + m_rightGridLayers->SetCellValue( right_row, LAYERNAME_COLNUM, + layername ); + m_rightGridLayers->SetCellValue( right_row, LAYERID_COLNUM, + layernum ); + + if( m_layerSelected == layerid ) + { + m_rightGridLayers->SetCellValue( right_row, SELECT_COLNUM, + wxT("X") ); + m_rightGridLayers->SetCellBackgroundColour ( right_row, SELECT_COLNUM, + color ); + } + + right_row++; + } + } + + // Show only populated lists: + if( left_row <= 0 ) + m_leftGridLayers->Show( false ); + + if( right_row <= 0 ) + m_rightGridLayers->Show( false ); + + m_leftGridLayers->AutoSizeColumn(LAYERNAME_COLNUM); + m_rightGridLayers->AutoSizeColumn(LAYERNAME_COLNUM); + m_leftGridLayers->AutoSizeColumn(SELECT_COLNUM); + m_rightGridLayers->AutoSizeColumn(SELECT_COLNUM); +} + +void PCB_ONE_LAYER_SELECTOR::OnLeftGridClick( wxGridEvent& event ) +{ + wxString text = m_leftGridLayers->GetCellValue(event.GetRow(), LAYERID_COLNUM); + long layer; + text.ToLong( &layer ); + m_layerSelected = layer; + EndModal( 1 ); +} + +void PCB_ONE_LAYER_SELECTOR::OnRightGridClick( wxGridEvent& event ) +{ + wxString text = m_rightGridLayers->GetCellValue(event.GetRow(), LAYERID_COLNUM); + long layer; + text.ToLong( &layer ); + m_layerSelected = layer; + EndModal( 2 ); +} /** Install the dialog box for layer selection - * @param default_layer = Preselection (NB_PCB_LAYERS for "(Deselect)" layer) - * @param min_layer = min layer value (-1 if no min value) - * @param max_layer = max layer value (-1 if no max value) - * @param null_layer = display a "(Deselect)" radiobutton (when set to true) + * @param aDefaultLayer = Preselection (NB_PCB_LAYERS for "(Deselect)" layer) + * @param aMinlayer = min layer id value (-1 if no min value) + * @param aMaxLayer = max layer id value (-1 if no max value) + * @param aDeselectTool = display a "Clear" button when true * @return new layer value (NB_PCB_LAYERS when "(Deselect)" radiobutton selected), * or -1 if canceled * - * Providing the option to also display a "(Deselect)" radiobutton makes the - * "Swap Layers" command (and GerbView's "Export to Pcbnew" command) more "user - * friendly", by permitting any layer to be "deselected" immediately after its + * Providing the option to also display a "Clear" button makes the + * "Swap Layers" command more "user friendly", + * by permitting any layer to be "deselected" immediately after its * corresponding radiobutton has been clicked on. (It would otherwise be * necessary to first cancel the "Select Layer:" dialog box (invoked after a * different radiobutton is clicked on) prior to then clicking on the - * "Deselect" - * button provided within the "Swap Layers:" or "Layer selection:" dialog box). + * "Clear" button provided within the "Swap Layers:" + * or "Layer selection:" dialog box). */ -LAYER_NUM PCB_BASE_FRAME::SelectLayer( LAYER_NUM default_layer, - LAYER_NUM min_layer, - LAYER_NUM max_layer, - bool null_layer ) +LAYER_NUM PCB_BASE_FRAME::SelectLayer( LAYER_NUM aDefaultLayer, + LAYER_NUM aMinlayer, + LAYER_NUM aMaxLayer, + bool aDeselectTool ) { - SELECT_LAYER_DIALOG* frame = new SELECT_LAYER_DIALOG( this, - default_layer, - min_layer, - max_layer, - null_layer ); - - LAYER_NUM layer = frame->ShowModal(); - frame->Destroy(); + PCB_ONE_LAYER_SELECTOR dlg( this, GetBoard(), + aDefaultLayer, aMinlayer, aMaxLayer, + aDeselectTool ); + dlg.ShowModal(); + LAYER_NUM layer = dlg.GetLayerSelection(); return layer; } /* - * The "OK" and "Cancel" buttons are positioned (in a horizontal line) - * beneath the "Layer" radiobox, unless that contains only one column of - * radiobuttons, in which case they are positioned (in a vertical line) - * to the right of that radiobox. + * This class display a double pcb copper layers list in a dialog, + * to select a layer pair from this list */ -SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent, - LAYER_NUM default_layer, LAYER_NUM min_layer, - LAYER_NUM max_layer, bool null_layer ) : - wxDialog( parent, -1, _( "Select Layer:" ), wxPoint( -1, -1 ), - wxSize( 470, 250 ), - DIALOG_STYLE ) -{ - BOARD* board = parent->GetBoard(); - wxButton* Button; - LAYER_NUM ii; - wxString LayerList[NB_PCB_LAYERS + 1]; // One extra element for "(Deselect)" - // radiobutton - int LayerCount, LayerSelect = -1; - - m_Parent = parent; - - // Build the layer list - LayerCount = 0; - LAYER_MSK Masque_Layer = g_TabAllCopperLayerMask[board->GetCopperLayerCount() - 1]; - Masque_Layer |= ALL_NO_CU_LAYERS; - - for( ii = FIRST_LAYER; ii < NB_PCB_LAYERS; ++ii ) - { - m_LayerId[ii] = FIRST_LAYER; - - if( GetLayerMask( ii ) & Masque_Layer ) - { - if( min_layer > ii ) - continue; - - if( ( max_layer >= 0 ) && ( max_layer < ii ) ) - break; - - LayerList[LayerCount] = board->GetLayerName( ii ); - - if( ii == default_layer ) - LayerSelect = LayerCount; - - m_LayerId[LayerCount] = ii; - LayerCount++; - } - } - - // When appropriate, also provide a "(Deselect)" radiobutton - if( null_layer ) - { - LayerList[LayerCount] = _( "(Deselect)" ); - - if( NB_PCB_LAYERS == default_layer ) - LayerSelect = LayerCount; - - m_LayerId[LayerCount] = NB_PCB_LAYERS; - LayerCount++; - } - - m_LayerList = new wxRadioBox( this, ID_LAYER_SELECT, _( "Layer" ), - wxPoint( -1, -1 ), wxSize( -1, -1 ), - LayerCount, LayerList, - (LayerCount < 8) ? LayerCount : 8, - wxRA_SPECIFY_ROWS ); - - if( LayerSelect >= 0 ) - m_LayerList->SetSelection( LayerSelect ); - - wxBoxSizer* FrameBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - SetSizer( FrameBoxSizer ); - FrameBoxSizer->Add( m_LayerList, 0, wxALIGN_TOP | wxALL, 5 ); - wxBoxSizer* ButtonBoxSizer = new wxBoxSizer( wxVERTICAL ); - FrameBoxSizer->Add( ButtonBoxSizer, 0, wxALIGN_BOTTOM | wxALL, 0 ); - - Button = new wxButton( this, wxID_OK, _( "OK" ) ); - Button->SetDefault(); - ButtonBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); - - Button = new wxButton( this, wxID_CANCEL, _( "Cancel" ) ); - ButtonBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); - - SetFocus(); - - GetSizer()->SetSizeHints( this ); - - Center(); -} - - -void SELECT_LAYER_DIALOG::OnLayerSelected( wxCommandEvent& event ) -{ - int ii = m_LayerId[m_LayerList->GetSelection()]; - - EndModal( ii ); -} - - -void SELECT_LAYER_DIALOG::OnCancelClick( wxCommandEvent& event ) -{ - EndModal( -1 ); -} - - -/*********************************************/ -/* Dialog for the selecting pairs of layers. */ -/*********************************************/ - -class SELECT_LAYERS_PAIR_DIALOG : public wxDialog +class SELECT_COPPER_LAYERS_PAIR_DIALOG: public PCB_LAYER_SELECTOR, + public DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE { private: - PCB_BASE_FRAME* m_Parent; - wxRadioBox* m_LayerListTOP; - wxRadioBox* m_LayerListBOTTOM; - LAYER_NUM m_LayerId[NB_COPPER_LAYERS]; + BOARD* m_brd; + LAYER_NUM m_frontLayer; + LAYER_NUM m_backLayer; + int m_leftRowSelected; + int m_rightRowSelected; -public: SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent ); - ~SELECT_LAYERS_PAIR_DIALOG() { }; +public: + SELECT_COPPER_LAYERS_PAIR_DIALOG( wxWindow* aParent, BOARD * aPcb, + LAYER_NUM aFrontLayer, LAYER_NUM aBackLayer ); + + void GetLayerPair( LAYER_NUM& aFrontLayer, LAYER_NUM& aBackLayer ) + { + aFrontLayer = m_frontLayer; + aBackLayer = m_backLayer; + } private: - void OnOkClick( wxCommandEvent& event ); - void OnCancelClick( wxCommandEvent& event ); + void OnLeftGridClick( wxGridEvent& event ); + void OnRightGridClick( wxGridEvent& event ); + + void OnOkClick( wxCommandEvent& event ) + { + EndModal( wxID_OK ); + } + + void OnCancelClick( wxCommandEvent& event ) + { + EndModal( wxID_CANCEL ); + } + + void BuildList(); - DECLARE_EVENT_TABLE() }; - -BEGIN_EVENT_TABLE( SELECT_LAYERS_PAIR_DIALOG, wxDialog ) - EVT_BUTTON( wxID_OK, SELECT_LAYERS_PAIR_DIALOG::OnOkClick ) - EVT_BUTTON( wxID_CANCEL, SELECT_LAYERS_PAIR_DIALOG::OnCancelClick ) -END_EVENT_TABLE() - - -/* Display a list of two copper layers for selection of a pair of layers +/* Display a list of two copper layers to choose a pair of layers * for auto-routing, vias ... */ void PCB_BASE_FRAME::SelectLayerPair() { - // Check whether more than one copper layer has been enabled for the - // current PCB file, as Layer Pairs can only meaningfully be defined - // within PCB files which contain at least two copper layers. - if( GetBoard()->GetCopperLayerCount() < 2 ) + PCB_SCREEN* screen = GetScreen(); + SELECT_COPPER_LAYERS_PAIR_DIALOG dlg( this, GetBoard(), + screen->m_Route_Layer_TOP, + screen->m_Route_Layer_BOTTOM ); + + if( dlg.ShowModal() == wxID_OK ) { - wxString InfoMsg; - InfoMsg = _( "Less than two copper layers are being used." ); - InfoMsg << wxT( "\n" ) << _( "Hence layer pairs cannot be specified." ); - DisplayInfoMessage( this, InfoMsg ); - return; + dlg.GetLayerPair( screen->m_Route_Layer_TOP, screen->m_Route_Layer_BOTTOM ); + + // select the same layer for both layers is allowed (normal in some boards) + // but could be a mistake. So display an info message + if( screen->m_Route_Layer_TOP == screen->m_Route_Layer_BOTTOM ) + DisplayInfoMessage( this, + _( "Warning: The Top Layer and Bottom Layer are same." ) ); } - SELECT_LAYERS_PAIR_DIALOG* frame = new SELECT_LAYERS_PAIR_DIALOG( this ); - - int result = frame->ShowModal(); - frame->Destroy(); m_canvas->MoveCursorToCrossHair(); - - // if user changed colors and we are in high contrast mode, then redraw - // because the PAD_SMD pads may change color. - if( result >= 0 && DisplayOpt.ContrastModeDisplay ) - { - m_canvas->Refresh(); - } } - -SELECT_LAYERS_PAIR_DIALOG::SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent ) : - wxDialog( parent, -1, _( "Select Layer Pair:" ), wxPoint( -1, -1 ), - wxSize( 470, 250 ), DIALOG_STYLE ) +SELECT_COPPER_LAYERS_PAIR_DIALOG:: + SELECT_COPPER_LAYERS_PAIR_DIALOG( wxWindow* aParent, BOARD * aPcb, + LAYER_NUM aFrontLayer, LAYER_NUM aBackLayer) : + PCB_LAYER_SELECTOR( aPcb ), + DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE( aParent ) { - BOARD* board = parent->GetBoard(); - wxButton* Button; - wxString LayerList[NB_COPPER_LAYERS]; - LAYER_NUM LayerTopSelect = FIRST_LAYER, LayerBottomSelect = FIRST_LAYER; - - m_Parent = parent; - - PCB_SCREEN* screen = (PCB_SCREEN*) m_Parent->GetScreen(); - LAYER_MSK Masque_Layer = g_TabAllCopperLayerMask[board->GetCopperLayerCount() - 1]; - Masque_Layer |= ALL_NO_CU_LAYERS; - - LAYER_NUM LayerCount = FIRST_LAYER; - for( LAYER_NUM ii = FIRST_COPPER_LAYER; ii < NB_COPPER_LAYERS; ++ii ) - { - m_LayerId[ii] = FIRST_LAYER; - - if( (GetLayerMask( ii ) & Masque_Layer) ) - { - LayerList[LayerCount] = board->GetLayerName( ii ); - - if( ii == screen->m_Route_Layer_TOP ) - LayerTopSelect = LayerCount; - - if( ii == screen->m_Route_Layer_BOTTOM ) - LayerBottomSelect = LayerCount; - - m_LayerId[LayerCount] = ii; - ++LayerCount; - } - } - - m_LayerListTOP = new wxRadioBox( this, ID_LAYER_SELECT_TOP, - _( "Top Layer" ), - wxPoint( -1, -1 ), wxSize( -1, -1 ), - LayerCount, LayerList, - (LayerCount < 8) ? LayerCount : 8, - wxRA_SPECIFY_ROWS ); - m_LayerListTOP->SetSelection( LayerTopSelect ); - - m_LayerListBOTTOM = new wxRadioBox( this, ID_LAYER_SELECT_BOTTOM, - _( "Bottom Layer" ), - wxPoint( -1, -1 ), wxSize( -1, -1 ), - LayerCount, LayerList, - (LayerCount < 8) ? LayerCount : 8, - wxRA_SPECIFY_ROWS ); - m_LayerListBOTTOM->SetSelection( LayerBottomSelect ); - - wxBoxSizer* FrameBoxSizer = new wxBoxSizer( wxVERTICAL ); - SetSizer( FrameBoxSizer ); - - wxBoxSizer* RadioBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - FrameBoxSizer->Add( RadioBoxSizer, 0, wxALIGN_LEFT | wxALL, 0 ); - - wxBoxSizer* ButtonBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - FrameBoxSizer->Add( ButtonBoxSizer, 0, wxALIGN_RIGHT | wxALL, 0 ); - - RadioBoxSizer->Add( m_LayerListTOP, 0, wxALIGN_TOP | wxALL, 5 ); - RadioBoxSizer->Add( m_LayerListBOTTOM, 0, wxALIGN_TOP | wxALL, 5 ); - - Button = new wxButton( this, wxID_OK, _( "OK" ) ); - Button->SetDefault(); - ButtonBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); - - Button = new wxButton( this, wxID_CANCEL, _( "Cancel" ) ); - ButtonBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); + m_frontLayer = aFrontLayer; + m_backLayer = aBackLayer; + m_leftRowSelected = 0; + m_rightRowSelected = 0; + BuildList(); SetFocus(); - GetSizer()->SetSizeHints( this ); Center(); } - -void SELECT_LAYERS_PAIR_DIALOG::OnOkClick( wxCommandEvent& event ) +void SELECT_COPPER_LAYERS_PAIR_DIALOG::BuildList() { - // select the same layer for top and bottom is allowed (normal in some - // boards) - // but could be a mistake. So display an info message - if( m_LayerId[m_LayerListTOP->GetSelection()] == m_LayerId[m_LayerListBOTTOM->GetSelection()] ) - DisplayInfoMessage( this, - _( "Warning: The Top Layer and Bottom Layer are same." ) ); + m_leftGridLayers->SetColFormatNumber( LAYERID_COLNUM ); + m_rightGridLayers->SetColFormatNumber( LAYERID_COLNUM ); + m_leftGridLayers->HideCol( LAYERID_COLNUM ); + m_rightGridLayers->HideCol( LAYERID_COLNUM ); + m_leftGridLayers->SetColSize( COLOR_COLNUM, 20 ); + m_rightGridLayers->SetColSize( COLOR_COLNUM, 20 ); - PCB_SCREEN* screen = (PCB_SCREEN*) m_Parent->GetScreen(); + // Select a not show cell, to avoid a wrong cell selection for user + m_leftGridLayers->GoToCell( 0, LAYERID_COLNUM ); + m_rightGridLayers->GoToCell( 0, LAYERID_COLNUM ); - screen->m_Route_Layer_TOP = m_LayerId[m_LayerListTOP->GetSelection()]; - screen->m_Route_Layer_BOTTOM = m_LayerId[m_LayerListBOTTOM->GetSelection()]; + int row = 0; + wxString layernum; + wxString layername; + for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i ) + { + LAYER_NUM layerid = i; - EndModal( 0 ); + if( m_layerorder ) + layerid = layertranscode[i]; + + if( ! IsLayerEnabled( layerid ) ) + continue; + + if( layerid > LAST_COPPER_LAYER ) + continue; + + wxColour color = MakeColour( GetLayerColor( layerid ) ); + layername = GetLayerName( layerid ); + layernum.Printf( wxT("%d"), layerid ); + + if( row ) + m_leftGridLayers->AppendRows( 1 ); + m_leftGridLayers->SetCellBackgroundColour ( row, COLOR_COLNUM, + color ); + m_leftGridLayers->SetCellValue( row, LAYERNAME_COLNUM, + layername ); + m_leftGridLayers->SetCellValue( row, LAYERID_COLNUM, + layernum ); + + if( m_frontLayer == layerid ) + { + m_leftGridLayers->SetCellValue( row, SELECT_COLNUM, + wxT("X") ); + m_leftGridLayers->SetCellBackgroundColour( row, SELECT_COLNUM, + color ); + m_leftRowSelected = row; + } + + if( row ) + m_rightGridLayers->AppendRows( 1 ); + m_rightGridLayers->SetCellBackgroundColour ( row, COLOR_COLNUM, + color ); + m_rightGridLayers->SetCellValue( row, LAYERNAME_COLNUM, + layername ); + m_rightGridLayers->SetCellValue( row, LAYERID_COLNUM, + layernum ); + + if( m_backLayer == layerid ) + { + m_rightGridLayers->SetCellValue( row, SELECT_COLNUM, + wxT("X") ); + m_rightGridLayers->SetCellBackgroundColour ( row, SELECT_COLNUM, + color ); + m_rightRowSelected = row; + } + + row++; + } + + m_leftGridLayers->AutoSizeColumn(LAYERNAME_COLNUM); + m_rightGridLayers->AutoSizeColumn(LAYERNAME_COLNUM); + m_leftGridLayers->AutoSizeColumn(SELECT_COLNUM); + m_rightGridLayers->AutoSizeColumn(SELECT_COLNUM); } - -void SELECT_LAYERS_PAIR_DIALOG::OnCancelClick( wxCommandEvent& event ) +void SELECT_COPPER_LAYERS_PAIR_DIALOG::OnLeftGridClick( wxGridEvent& event ) { - EndModal( -1 ); + int row = event.GetRow(); + wxString text = m_leftGridLayers->GetCellValue( row, LAYERID_COLNUM ); + long layer; + text.ToLong( &layer ); + + if( m_frontLayer == layer ) + return; + + m_leftGridLayers->SetCellValue( m_leftRowSelected, SELECT_COLNUM, + wxEmptyString ); + m_leftGridLayers->SetCellBackgroundColour ( m_leftRowSelected, SELECT_COLNUM, + m_leftGridLayers->GetDefaultCellBackgroundColour() ); + + m_frontLayer = layer; + m_leftRowSelected = row; + m_leftGridLayers->SetCellValue( row, SELECT_COLNUM, + wxT("X") ); + m_leftGridLayers->SetCellBackgroundColour( row, SELECT_COLNUM, + MakeColour( GetLayerColor( layer ) ) ); + +} + +void SELECT_COPPER_LAYERS_PAIR_DIALOG::OnRightGridClick( wxGridEvent& event ) +{ + int row = event.GetRow(); + wxString text = m_rightGridLayers->GetCellValue( row, LAYERID_COLNUM ); + long layer; + text.ToLong( &layer ); + + if( m_backLayer == layer ) + return; + + m_rightGridLayers->SetCellValue( m_rightRowSelected, SELECT_COLNUM, + wxEmptyString ); + m_rightGridLayers->SetCellBackgroundColour ( m_rightRowSelected, SELECT_COLNUM, + m_rightGridLayers->GetDefaultCellBackgroundColour() ); + + m_backLayer = layer; + m_rightRowSelected = row; + m_rightGridLayers->SetCellValue( row, SELECT_COLNUM, + wxT("X") ); + m_rightGridLayers->SetCellBackgroundColour ( row, SELECT_COLNUM, + MakeColour( GetLayerColor( layer ) ) ); } From e4710f54f8c8f686c903cb0bb6d4c746a45c2dcd Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 30 Aug 2013 21:37:56 +0200 Subject: [PATCH 2/4] add missing files --- .../dialogs/dialog_layer_selection_base.cpp | 225 ++++++++++++++++++ pcbnew/dialogs/dialog_layer_selection_base.h | 87 +++++++ 2 files changed, 312 insertions(+) create mode 100644 pcbnew/dialogs/dialog_layer_selection_base.cpp create mode 100644 pcbnew/dialogs/dialog_layer_selection_base.h diff --git a/pcbnew/dialogs/dialog_layer_selection_base.cpp b/pcbnew/dialogs/dialog_layer_selection_base.cpp new file mode 100644 index 0000000000..ccb42218d5 --- /dev/null +++ b/pcbnew/dialogs/dialog_layer_selection_base.cpp @@ -0,0 +1,225 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_layer_selection_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_LAYER_SELECTION_BASE::DIALOG_LAYER_SELECTION_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerUpper; + bSizerUpper = new wxBoxSizer( wxHORIZONTAL ); + + m_leftGridLayers = new wxGrid( this, ID_LEFT_LIST, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_leftGridLayers->CreateGrid( 1, 4 ); + m_leftGridLayers->EnableEditing( false ); + m_leftGridLayers->EnableGridLines( true ); + m_leftGridLayers->EnableDragGridSize( false ); + m_leftGridLayers->SetMargins( 0, 3 ); + + // Columns + m_leftGridLayers->EnableDragColMove( false ); + m_leftGridLayers->EnableDragColSize( false ); + m_leftGridLayers->SetColLabelSize( 0 ); + m_leftGridLayers->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_leftGridLayers->EnableDragRowSize( false ); + m_leftGridLayers->SetRowLabelSize( 0 ); + m_leftGridLayers->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + m_leftGridLayers->SetLabelBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + // Cell Defaults + m_leftGridLayers->SetDefaultCellBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) ); + m_leftGridLayers->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizerUpper->Add( m_leftGridLayers, 0, wxALL|wxEXPAND, 5 ); + + m_rightGridLayers = new wxGrid( this, ID_RIGHT_LIST, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_rightGridLayers->CreateGrid( 1, 4 ); + m_rightGridLayers->EnableEditing( false ); + m_rightGridLayers->EnableGridLines( true ); + m_rightGridLayers->EnableDragGridSize( false ); + m_rightGridLayers->SetMargins( 0, 3 ); + + // Columns + m_rightGridLayers->EnableDragColMove( false ); + m_rightGridLayers->EnableDragColSize( false ); + m_rightGridLayers->SetColLabelSize( 0 ); + m_rightGridLayers->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_rightGridLayers->EnableDragRowSize( false ); + m_rightGridLayers->SetRowLabelSize( 0 ); + m_rightGridLayers->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_rightGridLayers->SetDefaultCellBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) ); + m_rightGridLayers->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizerUpper->Add( m_rightGridLayers, 0, wxALL|wxEXPAND, 5 ); + + + bSizerMain->Add( bSizerUpper, 1, wxEXPAND, 5 ); + + m_buttonClear = new wxButton( this, wxID_ANY, _("Clear Selection"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerMain->Add( m_buttonClear, 0, wxALL|wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizerMain ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_leftGridLayers->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LAYER_SELECTION_BASE::OnLeftGridClick ), NULL, this ); + m_rightGridLayers->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LAYER_SELECTION_BASE::OnRightGridClick ), NULL, this ); + m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LAYER_SELECTION_BASE::OnClearSelection ), NULL, this ); +} + +DIALOG_LAYER_SELECTION_BASE::~DIALOG_LAYER_SELECTION_BASE() +{ + // Disconnect Events + m_leftGridLayers->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LAYER_SELECTION_BASE::OnLeftGridClick ), NULL, this ); + m_rightGridLayers->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LAYER_SELECTION_BASE::OnRightGridClick ), NULL, this ); + m_buttonClear->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LAYER_SELECTION_BASE::OnClearSelection ), NULL, this ); + +} + +DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerUpper; + bSizerUpper = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerLeft; + bSizerLeft = new wxBoxSizer( wxVERTICAL ); + + m_staticTextTopLayer = new wxStaticText( this, wxID_ANY, _("Top/Front Layer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTopLayer->Wrap( -1 ); + bSizerLeft->Add( m_staticTextTopLayer, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_leftGridLayers = new wxGrid( this, ID_LEFT_LIST, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_leftGridLayers->CreateGrid( 1, 4 ); + m_leftGridLayers->EnableEditing( false ); + m_leftGridLayers->EnableGridLines( true ); + m_leftGridLayers->EnableDragGridSize( false ); + m_leftGridLayers->SetMargins( 0, 3 ); + + // Columns + m_leftGridLayers->EnableDragColMove( false ); + m_leftGridLayers->EnableDragColSize( false ); + m_leftGridLayers->SetColLabelSize( 0 ); + m_leftGridLayers->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_leftGridLayers->EnableDragRowSize( false ); + m_leftGridLayers->SetRowLabelSize( 0 ); + m_leftGridLayers->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + m_leftGridLayers->SetLabelBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + // Cell Defaults + m_leftGridLayers->SetDefaultCellBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) ); + m_leftGridLayers->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizerLeft->Add( m_leftGridLayers, 1, wxALL|wxEXPAND, 5 ); + + + bSizerUpper->Add( bSizerLeft, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerRight; + bSizerRight = new wxBoxSizer( wxVERTICAL ); + + m_staticTextBottomLayer = new wxStaticText( this, wxID_ANY, _("Bottom/Back Layer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBottomLayer->Wrap( -1 ); + bSizerRight->Add( m_staticTextBottomLayer, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_rightGridLayers = new wxGrid( this, ID_RIGHT_LIST, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_rightGridLayers->CreateGrid( 1, 4 ); + m_rightGridLayers->EnableEditing( false ); + m_rightGridLayers->EnableGridLines( true ); + m_rightGridLayers->EnableDragGridSize( false ); + m_rightGridLayers->SetMargins( 0, 3 ); + + // Columns + m_rightGridLayers->EnableDragColMove( false ); + m_rightGridLayers->EnableDragColSize( false ); + m_rightGridLayers->SetColLabelSize( 0 ); + m_rightGridLayers->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_rightGridLayers->EnableDragRowSize( false ); + m_rightGridLayers->SetRowLabelSize( 0 ); + m_rightGridLayers->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_rightGridLayers->SetDefaultCellBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) ); + m_rightGridLayers->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizerRight->Add( m_rightGridLayers, 1, wxALL|wxEXPAND, 5 ); + + + bSizerUpper->Add( bSizerRight, 1, wxEXPAND, 5 ); + + + bSizerMain->Add( bSizerUpper, 1, wxEXPAND, 5 ); + + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); + + m_sdbSizer = new wxStdDialogButtonSizer(); + m_sdbSizerOK = new wxButton( this, wxID_OK ); + m_sdbSizer->AddButton( m_sdbSizerOK ); + m_sdbSizerCancel = new wxButton( this, wxID_CANCEL ); + m_sdbSizer->AddButton( m_sdbSizerCancel ); + m_sdbSizer->Realize(); + + bSizerMain->Add( m_sdbSizer, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizerMain ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_leftGridLayers->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnLeftGridClick ), NULL, this ); + m_rightGridLayers->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnRightGridClick ), NULL, this ); + m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnOKClick ), NULL, this ); +} + +DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::~DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE() +{ + // Disconnect Events + m_leftGridLayers->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnLeftGridClick ), NULL, this ); + m_rightGridLayers->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnRightGridClick ), NULL, this ); + m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE::OnOKClick ), NULL, this ); + +} diff --git a/pcbnew/dialogs/dialog_layer_selection_base.h b/pcbnew/dialogs/dialog_layer_selection_base.h new file mode 100644 index 0000000000..a124524afa --- /dev/null +++ b/pcbnew/dialogs/dialog_layer_selection_base.h @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 8 2012) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_LAYER_SELECTION_BASE_H__ +#define __DIALOG_LAYER_SELECTION_BASE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +#define ID_LEFT_LIST 1000 +#define ID_RIGHT_LIST 1001 + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_LAYER_SELECTION_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_LAYER_SELECTION_BASE : public wxDialog +{ + private: + + protected: + wxGrid* m_leftGridLayers; + wxGrid* m_rightGridLayers; + wxButton* m_buttonClear; + + // Virtual event handlers, overide them in your derived class + virtual void OnLeftGridClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnRightGridClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnClearSelection( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_LAYER_SELECTION_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Layer:"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 452,183 ), long style = wxCAPTION|wxCLOSE_BOX ); + ~DIALOG_LAYER_SELECTION_BASE(); + +}; + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE : public wxDialog +{ + private: + + protected: + wxStaticText* m_staticTextTopLayer; + wxGrid* m_leftGridLayers; + wxStaticText* m_staticTextBottomLayer; + wxGrid* m_rightGridLayers; + wxStaticLine* m_staticline1; + wxStdDialogButtonSizer* m_sdbSizer; + wxButton* m_sdbSizerOK; + wxButton* m_sdbSizerCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnLeftGridClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnRightGridClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOKClick( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Cpper Layer Pair:"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 332,175 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE(); + +}; + +#endif //__DIALOG_LAYER_SELECTION_BASE_H__ From 9eeb56fe3e2c5a97721dd5c0802eedf390ca031c Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 2 Sep 2013 11:06:17 +0200 Subject: [PATCH 3/4] minor changes and refinement in class pcb layer box --- common/class_layer_box_selector.cpp | 12 +++++------ include/class_layer_box_selector.h | 2 +- pcbnew/class_pcb_layer_box_selector.cpp | 28 ++++++++++++++++++------- pcbnew/class_pcb_layer_box_selector.h | 5 +++-- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/common/class_layer_box_selector.cpp b/common/class_layer_box_selector.cpp index c5eb0b237a..a4676e91cf 100644 --- a/common/class_layer_box_selector.cpp +++ b/common/class_layer_box_selector.cpp @@ -50,15 +50,13 @@ void LAYER_SELECTOR::SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayer ) bmpDC.DrawRectangle( 0, 0, aLayerbmp.GetWidth(), aLayerbmp.GetHeight() ); } -/* class to display a layer list. - * +/* class to display a layer list in a wxBitmapComboBox. */ - LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, int n, const wxString choices[] ) : - LAYER_SELECTOR(), - wxBitmapComboBox( parent, id, wxEmptyString, pos, size, n, choices, wxCB_READONLY ) + wxBitmapComboBox( parent, id, wxEmptyString, pos, size, n, choices, wxCB_READONLY ), + LAYER_SELECTOR() { if( choices != NULL ) ResyncBitmapOnly(); @@ -68,8 +66,8 @@ LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxWindow* parent, wxWindowID id, LAYER_BOX_SELECTOR::LAYER_BOX_SELECTOR( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, const wxArrayString& choices ) : - LAYER_SELECTOR(), - wxBitmapComboBox( parent, id, wxEmptyString, pos, size, choices, wxCB_READONLY ) + wxBitmapComboBox( parent, id, wxEmptyString, pos, size, choices, wxCB_READONLY ), + LAYER_SELECTOR() { if( !choices.IsEmpty() ) ResyncBitmapOnly(); diff --git a/include/class_layer_box_selector.h b/include/class_layer_box_selector.h index 4f6cf5d04e..27d19b8a18 100644 --- a/include/class_layer_box_selector.h +++ b/include/class_layer_box_selector.h @@ -46,7 +46,7 @@ protected: /* class to display a layer list in a wxBitmapComboBox. */ -class LAYER_BOX_SELECTOR : public LAYER_SELECTOR, public wxBitmapComboBox +class LAYER_BOX_SELECTOR :public wxBitmapComboBox, public LAYER_SELECTOR { public: // Hotkey Info diff --git a/pcbnew/class_pcb_layer_box_selector.cpp b/pcbnew/class_pcb_layer_box_selector.cpp index 807e8b0f78..30a3f56938 100644 --- a/pcbnew/class_pcb_layer_box_selector.cpp +++ b/pcbnew/class_pcb_layer_box_selector.cpp @@ -40,10 +40,7 @@ #include -/* class to display a layer list. - * - */ - +// class to display a layer list in a wxBitmapComboBox. // Reload the Layers void PCB_LAYER_BOX_SELECTOR::Resync() @@ -53,9 +50,16 @@ void PCB_LAYER_BOX_SELECTOR::Resync() static DECLARE_LAYERS_ORDER_LIST( layertranscode ); static DECLARE_LAYERS_HOTKEY( layerhk ); + // Tray to fix a minimum width fot the BitmapComboBox + int minwidth, h; + wxClientDC dc( GetParent() ); // The DC for "this" is not always initialized + wxString dummyText( wxT("XXXXXXXXXXXX") ); + dc.GetTextExtent ( dummyText, &minwidth, &h ); + + #define BM_SIZE 14 for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i ) { - wxBitmap layerbmp( 14, 14 ); + wxBitmap layerbmp( BM_SIZE, BM_SIZE ); wxString layername; LAYER_NUM layerid = i; @@ -73,10 +77,20 @@ void PCB_LAYER_BOX_SELECTOR::Resync() layername = GetLayerName( layerid ); if( m_layerhotkeys && m_hotkeys != NULL ) - layername = AddHotkeyName( layername, m_hotkeys, layerhk[layerid], IS_COMMENT ); + layername = AddHotkeyName( layername, m_hotkeys, + layerhk[layerid], IS_COMMENT ); Append( layername, layerbmp, (void*)(intptr_t) layerid ); - } + int w; + dc.GetTextExtent ( layername, &w, &h ); + + minwidth = std::max( minwidth, w ); + } + + minwidth += BM_SIZE + 12; // Take in account the bitmap size and margins +wxLogMessage( "minw %d min %d", minwidth, GetMinClientSize().x ); +// SetMinClientSize( wxSize( minwidth, -1 ) ); + Layout(); } diff --git a/pcbnew/class_pcb_layer_box_selector.h b/pcbnew/class_pcb_layer_box_selector.h index 0a63b65032..5ac87e5da4 100644 --- a/pcbnew/class_pcb_layer_box_selector.h +++ b/pcbnew/class_pcb_layer_box_selector.h @@ -19,9 +19,9 @@ public: public: // If you are thinking the constructor is a bit curious, - // just remember it is used by automaticallty generated by wxFormBuilder files, + // just remember it is used by automaticallty generated by wxFormBuilder files, // and it should mimic the wxBitmapComboBox constructor. - // Therefore, value, pos, size, n, choices and style are not yet used, + // Therefore, value, style are not yet used, // but they are here for compatibility PCB_LAYER_BOX_SELECTOR( wxWindow* parent, wxWindowID id, const wxString& value = wxEmptyString, @@ -49,6 +49,7 @@ public: // Virtual function void Resync(); +private: // Returns a color index from the layer id // Virtual function EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const; From 7bc9003fb8d5e2a87488d8b8da02ad3d3187e250 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 2 Sep 2013 17:26:52 +0200 Subject: [PATCH 4/4] pcb layer box selector: ajust size when modifying the layer names, to show the full name. --- include/wxPcbStruct.h | 10 +++++++++- pcbnew/class_pcb_layer_box_selector.cpp | 13 ++++--------- pcbnew/class_pcb_layer_widget.cpp | 2 +- pcbnew/dialogs/dialog_layers_setup.cpp | 2 +- pcbnew/files.cpp | 5 ++--- pcbnew/pcbframe.cpp | 2 +- pcbnew/pcbnew.cpp | 2 +- pcbnew/tool_pcb.cpp | 17 +++++++++++------ 8 files changed, 30 insertions(+), 23 deletions(-) diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 5fb8256601..7df4dfb73e 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -542,7 +542,15 @@ public: void ReCreateMicrowaveVToolbar(); void ReCreateOptToolbar(); void ReCreateMenuBar(); - PCB_LAYER_BOX_SELECTOR* ReCreateLayerBox( wxAuiToolBar* parent ); + + /** + * Re create the layer Box by clearing the old list, and building + * le new one, from the new layers names and cole layers + * @param aForceResizeToolbar = true to resize the parent toolbar + * false if not needed (mainly in parent toolbar creation, + * or when the layers names are not modified) + */ + void ReCreateLayerBox( bool aForceResizeToolbar = true ); /** * Function OnModify diff --git a/pcbnew/class_pcb_layer_box_selector.cpp b/pcbnew/class_pcb_layer_box_selector.cpp index 30a3f56938..4e4bc1f96d 100644 --- a/pcbnew/class_pcb_layer_box_selector.cpp +++ b/pcbnew/class_pcb_layer_box_selector.cpp @@ -51,10 +51,8 @@ void PCB_LAYER_BOX_SELECTOR::Resync() static DECLARE_LAYERS_HOTKEY( layerhk ); // Tray to fix a minimum width fot the BitmapComboBox - int minwidth, h; + int minwidth = 80, h; wxClientDC dc( GetParent() ); // The DC for "this" is not always initialized - wxString dummyText( wxT("XXXXXXXXXXXX") ); - dc.GetTextExtent ( dummyText, &minwidth, &h ); #define BM_SIZE 14 for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i ) @@ -83,14 +81,11 @@ void PCB_LAYER_BOX_SELECTOR::Resync() Append( layername, layerbmp, (void*)(intptr_t) layerid ); int w; dc.GetTextExtent ( layername, &w, &h ); - minwidth = std::max( minwidth, w ); - } + } - minwidth += BM_SIZE + 12; // Take in account the bitmap size and margins -wxLogMessage( "minw %d min %d", minwidth, GetMinClientSize().x ); -// SetMinClientSize( wxSize( minwidth, -1 ) ); - Layout(); + minwidth += BM_SIZE + 35; // Take in account the bitmap size and margins + SetMinClientSize( wxSize( minwidth, -1 ) ); } diff --git a/pcbnew/class_pcb_layer_widget.cpp b/pcbnew/class_pcb_layer_widget.cpp index a4dc99df80..e78f2043ca 100644 --- a/pcbnew/class_pcb_layer_widget.cpp +++ b/pcbnew/class_pcb_layer_widget.cpp @@ -341,7 +341,7 @@ void PCB_LAYER_WIDGET::ReFill() void PCB_LAYER_WIDGET::OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor ) { myframe->GetBoard()->SetLayerColor( aLayer, aColor ); - myframe->ReCreateLayerBox( NULL ); + myframe->ReCreateLayerBox( false ); myframe->GetCanvas()->Refresh(); } diff --git a/pcbnew/dialogs/dialog_layers_setup.cpp b/pcbnew/dialogs/dialog_layers_setup.cpp index d06f501394..aded0cf5df 100644 --- a/pcbnew/dialogs/dialog_layers_setup.cpp +++ b/pcbnew/dialogs/dialog_layers_setup.cpp @@ -560,7 +560,7 @@ void DIALOG_LAYERS_SETUP::OnOkButtonClick( wxCommandEvent& event ) } m_Parent->OnModify(); - m_Parent->ReCreateLayerBox( NULL ); + m_Parent->ReCreateLayerBox(); m_Parent->ReFillLayerWidget(); EndModal( wxID_OK ); diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index bdd507fae0..e728f64d73 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -141,7 +141,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) fn.SetExt( PcbFileExtension ); GetBoard()->SetFileName( fn.GetFullPath() ); UpdateTitle(); - ReCreateLayerBox( NULL ); + ReCreateLayerBox(); } break; @@ -396,8 +396,7 @@ bool PCB_EDIT_FRAME::LoadOnePcbFile( const wxString& aFileName, bool aAppend, // Update info shown by the horizontal toolbars GetBoard()->SetCurrentNetClass( NETCLASS::Default ); ReFillLayerWidget(); - - ReCreateLayerBox( NULL ); + ReCreateLayerBox(); // upate the layer widget to match board visibility states, both layers and render columns. syncLayerVisibilities(); diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index 0c8e065a21..e45b22075b 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -589,7 +589,7 @@ void PCB_EDIT_FRAME::ShowDesignRulesEditor( wxCommandEvent& event ) if( returncode == wxID_OK ) // New rules, or others changes. { - ReCreateLayerBox( NULL ); + ReCreateLayerBox(); updateTraceWidthSelectBox(); updateViaSizeSelectBox(); OnModify(); diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index 061f465d4a..aa8887a2f1 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -301,7 +301,7 @@ bool EDA_APP::OnInit() frame->Clear_Pcb( false ); // update the layer names in the listbox - frame->ReCreateLayerBox( NULL ); + frame->ReCreateLayerBox( false ); /* For an obscure reason the focus is lost after loading a board file * when starting (i.e. only at this point) diff --git a/pcbnew/tool_pcb.cpp b/pcbnew/tool_pcb.cpp index 4a5e3310dc..d57011f534 100644 --- a/pcbnew/tool_pcb.cpp +++ b/pcbnew/tool_pcb.cpp @@ -281,7 +281,7 @@ void PCB_EDIT_FRAME::ReCreateHToolbar() m_SelLayerBox = new PCB_LAYER_BOX_SELECTOR( m_mainToolBar, ID_TOOLBARH_PCB_SELECT_LAYER ); m_SelLayerBox->SetBoardFrame( this ); } - ReCreateLayerBox( m_mainToolBar ); + ReCreateLayerBox( false ); m_mainToolBar->AddControl( m_SelLayerBox ); PrepareLayerIndicator(); // Initialize the bitmap with current @@ -663,14 +663,19 @@ void PCB_EDIT_FRAME::updateViaSizeSelectBox() } -PCB_LAYER_BOX_SELECTOR* PCB_EDIT_FRAME::ReCreateLayerBox( wxAuiToolBar* parent ) +void PCB_EDIT_FRAME::ReCreateLayerBox( bool aForceResizeToolbar ) { - if( m_SelLayerBox == NULL ) - return NULL; + if( m_SelLayerBox == NULL || m_mainToolBar == NULL ) + return; + m_SelLayerBox->SetToolTip( _( "+/- to switch" ) ); m_SelLayerBox->m_hotkeys = g_Board_Editor_Hokeys_Descr; m_SelLayerBox->Resync(); - m_SelLayerBox->SetToolTip( _( "+/- to switch" ) ); - return m_SelLayerBox; + if( aForceResizeToolbar ) + { + // the layer box can have its size changed + // Update the aui manager, to take in account the new size + m_auimgr.Update(); + } }