/* Set up the basic primitives for Layer control */ #include "fctsys.h" #include "gr_basic.h" #include "common.h" #include "pcbnew.h" #include "protos.h" /* Variables locales */ /* Fonctions locales: */ enum layer_sel_id { ID_LAYER_OK = 1800, ID_LAYER_CANCEL, ID_LAYER_SELECT_TOP, ID_LAYER_SELECT_BOTTOM, ID_LAYER_SELECT }; /***********************************************/ /* classe pour la frame de selection de layers */ /***********************************************/ class WinEDA_SelLayerFrame: public wxDialog { private: WinEDA_BasePcbFrame *m_Parent; wxRadioBox * m_LayerList; int m_LayerId[NB_LAYERS]; public: // Constructor and destructor WinEDA_SelLayerFrame(WinEDA_BasePcbFrame *parent, int default_layer, int min_layer, int max_layer); ~WinEDA_SelLayerFrame(void) {}; private: void Sel_Layer(wxCommandEvent& event); void Cancel(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; /* Table des evenements pour WinEDA_SelLayerFrame */ BEGIN_EVENT_TABLE(WinEDA_SelLayerFrame, wxDialog) EVT_BUTTON(ID_LAYER_OK, WinEDA_SelLayerFrame::Sel_Layer) EVT_BUTTON(ID_LAYER_CANCEL, WinEDA_SelLayerFrame::Cancel) EVT_RADIOBOX(ID_LAYER_SELECT, WinEDA_SelLayerFrame::Sel_Layer) END_EVENT_TABLE() /***********************************************************************************/ int WinEDA_BasePcbFrame::SelectLayer(int default_layer, int min_layer, int max_layer) /***********************************************************************************/ /* Install the dialog box for layer selection default_layer = Preselection min_layer = val min de layer selectionnable (-1 si pas de val mini) max_layer = val max de layer selectionnable (-1 si pas de val maxi) */ { int layer; WinEDA_SelLayerFrame * frame = new WinEDA_SelLayerFrame(this, default_layer,min_layer, max_layer); layer = frame->ShowModal(); frame->Destroy(); return layer; } /***********************************************************************/ WinEDA_SelLayerFrame::WinEDA_SelLayerFrame(WinEDA_BasePcbFrame *parent, int default_layer, int min_layer, int max_layer): wxDialog(parent, -1, _("Select Layer:"),wxPoint(-1,-1), wxSize(470, 250), DIALOG_STYLE ) /***********************************************************************/ { wxButton * Button; int ii, yy, xx; wxPoint pos; wxString LayerList[NB_LAYERS]; int LayerCount, LayerSelect = -1; m_Parent = parent; SetFont(*g_DialogFont); /* Construction de la liste des couches autorisées */ LayerCount = 0; int Masque_Layer = g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount-1]; Masque_Layer += ALL_NO_CU_LAYERS; for ( ii = 0; ii < NB_LAYERS ; ii ++ ) { m_LayerId[ii] = 0; if ( (g_TabOneLayerMask[ii] & Masque_Layer) ) { if ( min_layer > ii ) continue; if ( (max_layer >= 0) && (max_layer < ii) ) break; LayerList[LayerCount] = ReturnPcbLayerName(ii); if ( ii == default_layer ) LayerSelect = LayerCount; m_LayerId[LayerCount] = ii; LayerCount++; } } pos.x = 5; pos.y = 5; m_LayerList = new wxRadioBox(this, ID_LAYER_SELECT, _("Layer"), pos, wxSize(-1,-1), LayerCount, LayerList, (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS); if ( LayerSelect >= 0 ) m_LayerList->SetSelection(LayerSelect); m_LayerList->GetSize(&xx, &yy); pos.x += xx + 12; Button = new wxButton(this,ID_LAYER_OK, _("OK"), pos); Button->SetForegroundColour(*wxBLUE); pos.y += Button->GetSize().y + 5; Button = new wxButton(this,ID_LAYER_CANCEL, _("Cancel"), pos); Button->SetForegroundColour(*wxRED); /* Redimensionnement de la boite de dialogue: */ pos.x += Button->GetSize().x + 10; SetSize(-1, -1, pos.x , yy + 35); } /***************************************************************/ void WinEDA_SelLayerFrame::Sel_Layer(wxCommandEvent& event) /***************************************************************/ { int ii = m_LayerId[m_LayerList->GetSelection()]; EndModal(ii); } /***************************************************************/ void WinEDA_SelLayerFrame::Cancel(wxCommandEvent& event) /***************************************************************/ { EndModal(-1); } /*********************************************************/ /* classe pour la frame de selection de paires de layers */ /*********************************************************/ class WinEDA_SelLayerPairFrame: public wxDialog { private: WinEDA_BasePcbFrame *m_Parent; wxRadioBox * m_LayerListTOP; wxRadioBox * m_LayerListBOTTOM; int m_LayerId[NB_COPPER_LAYERS]; public: // Constructor and destructor WinEDA_SelLayerPairFrame(WinEDA_BasePcbFrame *parent); ~WinEDA_SelLayerPairFrame(void) {}; private: void Sel_Layer(wxCommandEvent& event); void Cancel(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; /* Table des evenements pour WinEDA_SelLayerPairFrame */ BEGIN_EVENT_TABLE(WinEDA_SelLayerPairFrame, wxDialog) EVT_BUTTON(ID_LAYER_OK, WinEDA_SelLayerPairFrame::Sel_Layer) EVT_BUTTON(ID_LAYER_CANCEL, WinEDA_SelLayerPairFrame::Cancel) EVT_RADIOBOX(ID_LAYER_SELECT, WinEDA_SelLayerPairFrame::Sel_Layer) END_EVENT_TABLE() /***********************************************/ void WinEDA_BasePcbFrame::SelectLayerPair(void) /***********************************************/ /* Affiche une double liste de layers cuivre pour selection d'une paire de layers pour autorutage, vias... */ { WinEDA_SelLayerPairFrame * frame = new WinEDA_SelLayerPairFrame(this); frame->ShowModal(); frame->Destroy(); DrawPanel->MouseToCursorSchema(); SetToolbars(); } /*******************************************************************************/ WinEDA_SelLayerPairFrame::WinEDA_SelLayerPairFrame(WinEDA_BasePcbFrame *parent): wxDialog(parent, -1, _("Select Layer Pair:"),wxPoint(-1,-1), wxSize(470, 250), DIALOG_STYLE ) /*******************************************************************************/ { wxButton * Button; int ii, LayerCount; int yy, xx; wxPoint pos; wxString LayerList[NB_COPPER_LAYERS]; int LayerTopSelect = 0, LayerBottomSelect = 0 ; m_Parent = parent; SetFont(*g_DialogFont); PCB_SCREEN * screen = (PCB_SCREEN *) m_Parent->m_CurrentScreen; /* Construction de la liste des couches autorisées */ int Masque_Layer = g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount-1]; Masque_Layer += ALL_NO_CU_LAYERS; for ( ii = 0, LayerCount = 0; ii < NB_COPPER_LAYERS ; ii ++ ) { m_LayerId[ii] = 0; if ( (g_TabOneLayerMask[ii] & Masque_Layer) ) { LayerList[LayerCount] = ReturnPcbLayerName(ii); if ( ii == screen->m_Route_Layer_TOP ) LayerTopSelect = LayerCount; if ( ii == screen->m_Route_Layer_BOTTOM ) LayerBottomSelect = LayerCount; m_LayerId[LayerCount] = ii; LayerCount++; } } pos.x = 5; pos.y = 5; m_LayerListTOP = new wxRadioBox(this, ID_LAYER_SELECT_TOP, _("Top Layer"), pos, wxSize(-1,-1), LayerCount, LayerList, (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS); m_LayerListTOP->SetSelection(LayerTopSelect); m_LayerListTOP->GetSize(&xx, &yy); pos.x += xx + 12; m_LayerListBOTTOM = new wxRadioBox(this, ID_LAYER_SELECT_BOTTOM, _("Bottom Layer"), pos, wxSize(-1,-1), LayerCount, LayerList, (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS); m_LayerListBOTTOM->SetSelection(LayerBottomSelect); m_LayerListBOTTOM->GetSize(&xx, &yy); pos.x += xx + 12; Button = new wxButton(this,ID_LAYER_OK, _("OK"), pos); Button->SetForegroundColour(*wxBLUE); pos.y += Button->GetSize().y + 5; Button = new wxButton(this,ID_LAYER_CANCEL, _("Cancel"), pos); Button->SetForegroundColour(*wxRED); /* Redimensionnement de la boite de dialogue: */ pos.x += Button->GetSize().x + 10; SetSize(-1, -1, pos.x , yy + 35); } /***************************************************************/ void WinEDA_SelLayerPairFrame::Sel_Layer(wxCommandEvent& event) /***************************************************************/ { PCB_SCREEN * screen = (PCB_SCREEN *) m_Parent->m_CurrentScreen; screen->m_Route_Layer_TOP = m_LayerId[m_LayerListTOP->GetSelection()]; screen->m_Route_Layer_BOTTOM = m_LayerId[m_LayerListBOTTOM->GetSelection()]; EndModal(0); } /***************************************************************/ void WinEDA_SelLayerPairFrame::Cancel(wxCommandEvent& event) /***************************************************************/ { EndModal(-1); }