pcbnew: layer combo update, code cleanup
This commit is contained in:
parent
ed9213c174
commit
d65b648722
|
@ -0,0 +1,55 @@
|
||||||
|
#ifndef CLASS_LAYERCHOICEBOX_H
|
||||||
|
#define CLASS_LAYERCHOICEBOX_H 1
|
||||||
|
|
||||||
|
#include <wx/bmpcbox.h>
|
||||||
|
|
||||||
|
/* class to display a layer list.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class WinEDALayerChoiceBox : public wxBitmapComboBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WinEDALayerChoiceBox( wxWindow* parent, wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
int n = 0, const wxString choices[] = NULL );
|
||||||
|
|
||||||
|
WinEDALayerChoiceBox( wxWindow* parent, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size,
|
||||||
|
const wxArrayString& choices );
|
||||||
|
|
||||||
|
// Get Current Item #
|
||||||
|
int GetChoice();
|
||||||
|
|
||||||
|
// Get Current Layer
|
||||||
|
int GetLayerChoice();
|
||||||
|
|
||||||
|
// Set Layer #
|
||||||
|
int SetLayerSelection(int layer);
|
||||||
|
|
||||||
|
// Reload the Layers
|
||||||
|
void Resync();
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DECLARE_LAYERS_HOTKEY(list) int list[LAYER_COUNT] = \
|
||||||
|
{ \
|
||||||
|
HK_SWITCH_LAYER_TO_COPPER, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER1, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER2, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER3, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER4, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER5, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER6, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER7, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER8, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER9, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER10, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER11, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER12, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER13, \
|
||||||
|
HK_SWITCH_LAYER_TO_INNER14, \
|
||||||
|
HK_SWITCH_LAYER_TO_COMPONENT \
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //CLASS_LAYERCHOICEBOX_H
|
|
@ -9,6 +9,7 @@
|
||||||
#include "wxstruct.h"
|
#include "wxstruct.h"
|
||||||
#include "base_struct.h"
|
#include "base_struct.h"
|
||||||
#include "param_config.h"
|
#include "param_config.h"
|
||||||
|
#include "class_layerchoicebox.h"
|
||||||
|
|
||||||
#ifndef PCB_INTERNAL_UNIT
|
#ifndef PCB_INTERNAL_UNIT
|
||||||
#define PCB_INTERNAL_UNIT 10000
|
#define PCB_INTERNAL_UNIT 10000
|
||||||
|
@ -114,7 +115,7 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WinEDAChoiceBox* m_SelLayerBox; // a combo box to display and
|
WinEDALayerChoiceBox* m_SelLayerBox; // a combo box to display and
|
||||||
// select active layer
|
// select active layer
|
||||||
WinEDAChoiceBox* m_SelTrackWidthBox; // a combo box to display and
|
WinEDAChoiceBox* m_SelTrackWidthBox; // a combo box to display and
|
||||||
// select current track width
|
// select current track width
|
||||||
|
@ -308,7 +309,7 @@ public:
|
||||||
void ReCreateMicrowaveVToolbar();
|
void ReCreateMicrowaveVToolbar();
|
||||||
void ReCreateOptToolbar();
|
void ReCreateOptToolbar();
|
||||||
void ReCreateMenuBar();
|
void ReCreateMenuBar();
|
||||||
WinEDAChoiceBox* ReCreateLayerBox( WinEDA_Toolbar* parent );
|
WinEDALayerChoiceBox* ReCreateLayerBox( WinEDA_Toolbar* parent );
|
||||||
|
|
||||||
/** Virtual Function OnModify()
|
/** Virtual Function OnModify()
|
||||||
* Must be called after a board change
|
* Must be called after a board change
|
||||||
|
|
|
@ -32,6 +32,7 @@ set(PCBNEW_SRCS
|
||||||
block.cpp
|
block.cpp
|
||||||
block_module_editor.cpp
|
block_module_editor.cpp
|
||||||
build_BOM_from_board.cpp
|
build_BOM_from_board.cpp
|
||||||
|
class_layerchoicebox.cpp
|
||||||
class_pcb_layer_widget.cpp
|
class_pcb_layer_widget.cpp
|
||||||
clean.cpp
|
clean.cpp
|
||||||
# cleaningoptions_dialog.cpp
|
# cleaningoptions_dialog.cpp
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
#include "common.h"
|
||||||
|
#include "pcbnew.h"
|
||||||
|
#include "wxPcbStruct.h"
|
||||||
|
#include "class_board_design_settings.h"
|
||||||
|
#include "colors_selection.h"
|
||||||
|
|
||||||
|
#include "bitmaps.h"
|
||||||
|
#include "pcbnew_id.h"
|
||||||
|
|
||||||
|
#include "hotkeys.h"
|
||||||
|
#include "help_common_strings.h"
|
||||||
|
|
||||||
|
#include <wx/ownerdrw.h>
|
||||||
|
#include <wx/menuitem.h>
|
||||||
|
#include <wx/bmpcbox.h>
|
||||||
|
#include <wx/wx.h>
|
||||||
|
|
||||||
|
#include "class_layerchoicebox.h"
|
||||||
|
|
||||||
|
/* class to display a layer list.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
WinEDALayerChoiceBox::WinEDALayerChoiceBox( wxWindow* parent, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size,
|
||||||
|
int n, const wxString choices[] ) :
|
||||||
|
wxBitmapComboBox( parent, id, wxEmptyString, pos, size,
|
||||||
|
n, choices, wxCB_READONLY )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WinEDALayerChoiceBox::WinEDALayerChoiceBox( wxWindow* parent, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size,
|
||||||
|
const wxArrayString& choices ) :
|
||||||
|
wxBitmapComboBox( parent, id, wxEmptyString, pos, size,
|
||||||
|
choices, wxCB_READONLY )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Current Item #
|
||||||
|
int WinEDALayerChoiceBox::GetChoice()
|
||||||
|
{
|
||||||
|
return GetSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Current Layer
|
||||||
|
int WinEDALayerChoiceBox::GetLayerChoice()
|
||||||
|
{
|
||||||
|
return (long) GetClientData(GetSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Layer #
|
||||||
|
int WinEDALayerChoiceBox::SetLayerSelection(int layer)
|
||||||
|
{
|
||||||
|
int elements = GetCount();
|
||||||
|
|
||||||
|
for( int i = 0 ; i < elements; i++)
|
||||||
|
if(GetClientData(i) == (void*)layer)
|
||||||
|
if(GetSelection() != i) // Element (i) is not selected
|
||||||
|
{
|
||||||
|
SetSelection(i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return i; //If element already selected; do nothing
|
||||||
|
|
||||||
|
// Not Found
|
||||||
|
SetSelection(-1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reload the Layers
|
||||||
|
void WinEDALayerChoiceBox::Resync()
|
||||||
|
{
|
||||||
|
BOARD* board = ((WinEDA_BasePcbFrame*)GetParent())->GetBoard();
|
||||||
|
wxASSERT(board != NULL);
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
|
||||||
|
static DECLARE_LAYERS_ORDER_LIST(layertranscode);
|
||||||
|
static DECLARE_LAYERS_HOTKEY(layerhk);
|
||||||
|
|
||||||
|
for( int i=0 ; i < LAYER_COUNT ; i++)
|
||||||
|
{
|
||||||
|
wxBitmap layerbmp (20,18);
|
||||||
|
wxMemoryDC bmpDC;
|
||||||
|
wxBrush brush;
|
||||||
|
wxString layername;
|
||||||
|
|
||||||
|
int layerid = layertranscode[i];
|
||||||
|
|
||||||
|
// Prepare Bitmap
|
||||||
|
bmpDC.SelectObject(layerbmp);
|
||||||
|
brush.SetColour( MakeColour(board->GetLayerColor( layerid ) ));
|
||||||
|
brush.SetStyle( wxSOLID );
|
||||||
|
|
||||||
|
bmpDC.SetBrush(brush);
|
||||||
|
bmpDC.DrawRectangle(0,0,layerbmp.GetWidth(), layerbmp.GetHeight());
|
||||||
|
bmpDC.SetBrush(*wxTRANSPARENT_BRUSH);
|
||||||
|
bmpDC.SetPen(*wxBLACK_PEN);
|
||||||
|
bmpDC.DrawRectangle(0,0,layerbmp.GetWidth(), layerbmp.GetHeight());
|
||||||
|
|
||||||
|
layername = board->GetLayerName( layerid );
|
||||||
|
|
||||||
|
layername.Append("\t");
|
||||||
|
layername = AddHotkeyName( layername, s_Board_Editor_Hokeys_Descr, layerhk[layerid], false );
|
||||||
|
|
||||||
|
|
||||||
|
if(board->IsLayerEnabled(layerid))
|
||||||
|
Append(layername, layerbmp, (void*) layerid );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "hotkeys.h"
|
#include "hotkeys.h"
|
||||||
|
|
||||||
#include "help_common_strings.h"
|
#include "help_common_strings.h"
|
||||||
|
#include "class_layerchoicebox.h"
|
||||||
|
|
||||||
#define SEL_LAYER_HELP _( \
|
#define SEL_LAYER_HELP _( \
|
||||||
"Show active layer selections\nand select layer pair for route and place via" )
|
"Show active layer selections\nand select layer pair for route and place via" )
|
||||||
|
@ -266,8 +267,13 @@ void WinEDA_PcbFrame::ReCreateHToolbar()
|
||||||
_( "Perform design rules check" ) );
|
_( "Perform design rules check" ) );
|
||||||
|
|
||||||
m_HToolBar->AddSeparator();
|
m_HToolBar->AddSeparator();
|
||||||
|
|
||||||
|
if(m_SelLayerBox == NULL)
|
||||||
|
m_SelLayerBox = new WinEDALayerChoiceBox( this, ID_TOOLBARH_PCB_SELECT_LAYER);
|
||||||
|
|
||||||
ReCreateLayerBox( m_HToolBar );
|
ReCreateLayerBox( m_HToolBar );
|
||||||
|
m_HToolBar->AddControl( m_SelLayerBox );
|
||||||
|
|
||||||
PrepareLayerIndicator(); // Initialize the bitmap with current
|
PrepareLayerIndicator(); // Initialize the bitmap with current
|
||||||
// active layer colors for the next tool
|
// active layer colors for the next tool
|
||||||
m_HToolBar->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR, wxEmptyString,
|
m_HToolBar->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR, wxEmptyString,
|
||||||
|
@ -685,97 +691,17 @@ void WinEDA_PcbFrame::syncLayerBox()
|
||||||
{
|
{
|
||||||
wxASSERT( m_SelLayerBox );
|
wxASSERT( m_SelLayerBox );
|
||||||
|
|
||||||
// Enable the display on the correct layer
|
|
||||||
// To avoid reentrancy ( Bug wxGTK Linux version? ), the selection is
|
|
||||||
// made only if it needs changing ( corrected on wxGTK 2.6.0 )
|
|
||||||
int count = m_SelLayerBox->GetCount();
|
|
||||||
int choice = m_SelLayerBox->GetChoice();
|
|
||||||
int layer = getActiveLayer();
|
int layer = getActiveLayer();
|
||||||
|
m_SelLayerBox->SetLayerSelection(layer);
|
||||||
for( int listNdx=0; listNdx<count; ++listNdx )
|
|
||||||
{
|
|
||||||
int clientData = (int) (size_t) m_SelLayerBox->wxItemContainer::GetClientData( listNdx );
|
|
||||||
|
|
||||||
if( clientData == layer )
|
|
||||||
{
|
|
||||||
if( listNdx != choice )
|
|
||||||
m_SelLayerBox->SetSelection( listNdx );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WinEDAChoiceBox* WinEDA_PcbFrame::ReCreateLayerBox( WinEDA_Toolbar* parent )
|
WinEDALayerChoiceBox* WinEDA_PcbFrame::ReCreateLayerBox( WinEDA_Toolbar* parent )
|
||||||
{
|
{
|
||||||
if( m_SelLayerBox == NULL )
|
if( m_SelLayerBox == NULL )
|
||||||
{
|
return NULL;
|
||||||
if( parent == NULL )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
m_SelLayerBox = new WinEDAChoiceBox( parent,
|
|
||||||
ID_TOOLBARH_PCB_SELECT_LAYER,
|
|
||||||
wxPoint( -1, -1 ),
|
|
||||||
#if defined (__UNIX__)
|
|
||||||
|
|
||||||
// Width enough for the longest
|
|
||||||
// string: "Component (Page Down)"
|
|
||||||
// Maybe that string is too long?
|
|
||||||
wxSize( 230, -1 )
|
|
||||||
#else
|
|
||||||
wxSize( LISTBOX_WIDTH + 30, -1 )
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
parent->AddControl( m_SelLayerBox );
|
|
||||||
}
|
|
||||||
int layer_mask = GetBoard()->GetEnabledLayers();
|
|
||||||
unsigned length = 0;
|
|
||||||
|
|
||||||
m_SelLayerBox->Clear();
|
|
||||||
|
|
||||||
static DECLARE_LAYERS_ORDER_LIST(layerOrder_for_display);
|
|
||||||
|
|
||||||
for( int idx=0, listNdx=0; idx <= EDGE_N; idx++ )
|
|
||||||
{
|
|
||||||
int layer = layerOrder_for_display[idx];
|
|
||||||
// List to append hotkeys in layer box selection
|
|
||||||
static const int HK_SwitchLayer[EDGE_N + 1] = {
|
|
||||||
HK_SWITCH_LAYER_TO_COPPER,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER1,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER2,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER3,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER4,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER5,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER6,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER7,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER8,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER9,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER10,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER11,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER12,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER13,
|
|
||||||
HK_SWITCH_LAYER_TO_INNER14,
|
|
||||||
HK_SWITCH_LAYER_TO_COMPONENT
|
|
||||||
};
|
|
||||||
|
|
||||||
if( g_TabOneLayerMask[layer] & layer_mask )
|
|
||||||
{
|
|
||||||
wxString msg = GetBoard()->GetLayerName( layer );
|
|
||||||
msg << wxT(" ");
|
|
||||||
msg = AddHotkeyName( msg, s_Board_Editor_Hokeys_Descr,
|
|
||||||
HK_SwitchLayer[layer], false );
|
|
||||||
|
|
||||||
m_SelLayerBox->Append( msg );
|
|
||||||
|
|
||||||
//D(printf("appending layername=%s, ndx=%d, layer=%d\n", CONV_TO_UTF8(msg), listNdx, layer );)
|
|
||||||
|
|
||||||
m_SelLayerBox->wxItemContainer::SetClientData( listNdx, (void*) layer );
|
|
||||||
length = MAX( length, msg.Len() );
|
|
||||||
listNdx++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
m_SelLayerBox->Resync();
|
||||||
m_SelLayerBox->SetToolTip( _( "+/- to switch" ) );
|
m_SelLayerBox->SetToolTip( _( "+/- to switch" ) );
|
||||||
|
|
||||||
syncLayerBox();
|
syncLayerBox();
|
||||||
|
|
Loading…
Reference in New Issue