Switch UNIT_BINDER and DIALOG_SHIM to local units.

The general idea is to support user-units inheritance.  The
UNIT_BINDER allows wrapped controls to inherit units from their
parent dialog, while KEYWAY_HOLDER and DIALOG_SHIM allow child
KEYWAY_HOLDERs or DIALOG_SHIMs to inherit units from their
parent.

The GetUserUnits() method signature has to move to KEYWAY_HOLDER
rather than KEYWAY_PLAYER (where it makes more sense) as it’s the
only common ancestor of KEYWAY_PLAYER and DIALOG_SHIM.

As long as we'll be using the UNIT_BINDER more widely, it also
makes sense to move evaluation and validation into it.

This commit also provides eeschema’s DIALOG_LABEL_EDITOR and
pcbnew’s DIALOG_TRACK_VIA_PROPERTIES and DIALOG_SET_GRID as
models of how to use the new user-units inheritance, eval, and
validation.

Fixes: lp:593795
* https://bugs.launchpad.net/kicad/+bug/593795

(cherry picked from commit c8bc53e)
This commit is contained in:
Jeff Young 2018-02-03 09:09:53 +00:00
parent 4f8c546140
commit 74acb76e7f
36 changed files with 2254 additions and 2289 deletions

View File

@ -63,13 +63,27 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
m_qmodal_showing( false ), m_qmodal_showing( false ),
m_qmodal_parent_disabler( 0 ) m_qmodal_parent_disabler( 0 )
{ {
// pray that aParent is either a KIWAY_PLAYER or DIALOG_SHIM derivation.
KIWAY_HOLDER* h = dynamic_cast<KIWAY_HOLDER*>( aParent ); KIWAY_HOLDER* h = dynamic_cast<KIWAY_HOLDER*>( aParent );
while( !h && aParent->GetParent() )
// wxASSERT_MSG( h, wxT( "DIALOG_SHIM's parent is NULL or not derived from KIWAY_PLAYER nor DIALOG_SHIM" ) ); {
aParent = aParent->GetParent();
h = dynamic_cast<KIWAY_HOLDER*>( aParent );
}
if( h ) if( h )
{
// Inherit units from parent
m_units = h->GetUserUnits();
// Set up the message bus
SetKiway( this, &h->Kiway() ); SetKiway( this, &h->Kiway() );
}
else
{
wxFAIL_MSG( wxString::Format( "No KIWAY_HOLDER in parent chain. Top window is a %s.",
aParent->GetClassInfo()->GetClassName() ) );
m_units = MILLIMETRES;
}
Bind( wxEVT_CLOSE_WINDOW, &DIALOG_SHIM::OnCloseWindow, this ); Bind( wxEVT_CLOSE_WINDOW, &DIALOG_SHIM::OnCloseWindow, this );
Bind( wxEVT_BUTTON, &DIALOG_SHIM::OnButton, this ); Bind( wxEVT_BUTTON, &DIALOG_SHIM::OnButton, this );
@ -77,7 +91,7 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
#ifdef __WINDOWS__ #ifdef __WINDOWS__
// On Windows, the app top windows can be brought to the foreground // On Windows, the app top windows can be brought to the foreground
// (at least temporary) in certain circumstances, // (at least temporary) in certain circumstances,
// for instance when calling an external tool in Eeschema boom generation. // for instance when calling an external tool in Eeschema BOM generation.
// So set the parent KIWAY_PLAYER kicad frame (if exists) to top window // So set the parent KIWAY_PLAYER kicad frame (if exists) to top window
// to avoid this annoying behavior // to avoid this annoying behavior
KIWAY_PLAYER* parent_kiwayplayer = dynamic_cast<KIWAY_PLAYER*>( aParent ); KIWAY_PLAYER* parent_kiwayplayer = dynamic_cast<KIWAY_PLAYER*>( aParent );

View File

@ -37,6 +37,12 @@ PROJECT& KIWAY_HOLDER::Prj() const
} }
EDA_UNITS_T KIWAY_HOLDER::GetUserUnits() const
{
return MILLIMETRES;
}
// this is not speed critical, hide it out of line. // this is not speed critical, hide it out of line.
void KIWAY_HOLDER::SetKiway( wxWindow* aDest, KIWAY* aKiway ) void KIWAY_HOLDER::SetKiway( wxWindow* aDest, KIWAY* aKiway )
{ {

View File

@ -55,7 +55,9 @@ namespace numEval
} /* namespace numEval */ } /* namespace numEval */
NumericEvaluator :: NumericEvaluator() : pClParser(0) // JEY TODO: remove this version;
NumericEvaluator :: NumericEvaluator() :
pClParser( 0 )
{ {
struct lconv* lc = localeconv(); struct lconv* lc = localeconv();
cClDecSep = *lc->decimal_point; cClDecSep = *lc->decimal_point;
@ -65,7 +67,47 @@ NumericEvaluator :: NumericEvaluator() : pClParser(0)
bClError = false; bClError = false;
bClParseFinished = false; bClParseFinished = false;
init(); if( pClParser == nullptr )
pClParser = numEval::ParseAlloc(malloc);
switch( g_UserUnit )
{
case INCHES:
eClUnitDefault = Unit::Inch;
break;
case MILLIMETRES:
eClUnitDefault = Unit::Metric;
break;
default:
eClUnitDefault = Unit::Metric;
break;
}
}
NumericEvaluator::NumericEvaluator( EDA_UNITS_T aUnits, bool aUseMils ) :
pClParser( 0 )
{
struct lconv* lc = localeconv();
cClDecSep = *lc->decimal_point;
bClTextInputStorage = true;
pClParser = numEval::ParseAlloc(malloc);
switch( aUnits )
{
case INCHES:
if( aUseMils )
eClUnitDefault = Unit::Mil;
else
eClUnitDefault = Unit::Inch;
break;
case MILLIMETRES:
eClUnitDefault = Unit::Metric;
break;
default:
eClUnitDefault = Unit::Metric;
break;
}
} }
NumericEvaluator :: ~NumericEvaluator() NumericEvaluator :: ~NumericEvaluator()
@ -78,26 +120,6 @@ NumericEvaluator :: ~NumericEvaluator()
clear(); clear();
} }
void
NumericEvaluator :: init()
{
if (pClParser == nullptr)
pClParser = numEval::ParseAlloc(malloc);
//numEval::ParseTrace(stdout, "lib");
#if TESTMODE
eClUnitDefault = Unit::Metric;
#else
switch (g_UserUnit)
{
case INCHES : eClUnitDefault = Unit::Inch; break;
case MILLIMETRES : eClUnitDefault = Unit::Metric; break;
default: eClUnitDefault = Unit::Metric; break;
}
#endif
}
void void
NumericEvaluator :: clear(const void* pObj) NumericEvaluator :: clear(const void* pObj)
{ {
@ -106,7 +128,8 @@ NumericEvaluator :: clear(const void* pObj)
clToken.input = nullptr; clToken.input = nullptr;
bClError = true; bClError = true;
if (bClTextInputStorage && pObj) clObjMap.erase(pObj); if (bClTextInputStorage)
clObjMap.clear();
} }
void void
@ -151,7 +174,9 @@ NumericEvaluator :: process(const char* s)
newString(s); newString(s);
if (pClParser == nullptr) init(); if (pClParser == nullptr)
pClParser = numEval::ParseAlloc(malloc);
bClError = false; bClError = false;
bClParseFinished = false; bClParseFinished = false;
@ -191,8 +216,7 @@ NumericEvaluator :: newString(const char* s)
bClParseFinished = false; bClParseFinished = false;
} }
NumericEvaluator::Token NumericEvaluator::Token NumericEvaluator::getToken()
NumericEvaluator :: getToken()
{ {
Token retval; Token retval;
size_t idx; size_t idx;
@ -227,32 +251,35 @@ NumericEvaluator :: getToken()
for (int i = strlen(clToken.token); i; i--) if (isDecSep(clToken.token[i-1])) clToken.token[i-1] = cClDecSep; for (int i = strlen(clToken.token); i; i--) if (isDecSep(clToken.token[i-1])) clToken.token[i-1] = cClDecSep;
}; };
/* Lamda: Get unit for current token. Returns Unit::Invalid if token is not a unit. // Lamda: Get unit for current token.
* '"', "in", "th", "mi", "mil" or "mm" // Valid units are ", in, mm, mil and thou. Returns Unit::Invalid otherwise.
*/
auto checkUnit = [this]() -> Unit { auto checkUnit = [this]() -> Unit {
const int sizeLeft = clToken.inputLen - clToken.pos; char ch = clToken.input[clToken.pos];
Unit convertFrom = Unit::Invalid; if (ch == '"') {
char unit[2] = { 0, 0 }; clToken.pos++;
for (int i = 0; i < sizeLeft && i < int(sizeof(unit)/sizeof(unit[0])); i++) unit[i] = tolower(clToken.input[clToken.pos+i]); return Unit::Inch;
auto tokcmp = [sizeLeft, unit](const char* s, int len) -> int { }
if (len > sizeLeft) return 0; // Do not use strcasecmp() as it is not available on all platforms
if (!strncmp(unit, s, len)) return len; const char* cptr = &clToken.input[clToken.pos];
return 0; const auto sizeLeft = clToken.inputLen - clToken.pos;
}; if (sizeLeft >= 2 && ch == 'm' && tolower(cptr[1]) == 'm' && !isalnum(cptr[2])) {
int size = 0; clToken.pos += 2;
if ((size = tokcmp("\"", 1))) convertFrom = Unit::Inch; return Unit::Metric;
else if ((size = tokcmp("in", 2))) convertFrom = Unit::Inch; }
else if ((size = tokcmp("mi", 2))) convertFrom = Unit::Mil; if (sizeLeft >= 2 && ch == 'i' && tolower(cptr[1]) == 'n' && !isalnum(cptr[2])) {
else if ((size = tokcmp("th", 2))) convertFrom = Unit::Mil; clToken.pos += 2;
else if ((size = tokcmp("mm", 2))) convertFrom = Unit::Metric; return Unit::Inch;
clToken.pos += size; }
if (sizeLeft >= 3 && ch == 'm' && tolower(cptr[1]) == 'i' && tolower(cptr[2]) == 'l' && !isalnum(cptr[3])) {
if (size) { clToken.pos += 3;
while (clToken.pos < clToken.inputLen && isalnum(clToken.input[clToken.pos])) clToken.pos++; return Unit::Mil;
}
if (sizeLeft >= 4 && ch == 't' && tolower(cptr[1]) == 'h' && tolower(cptr[2]) == 'o' && tolower(cptr[2]) == 'u' && !isalnum(cptr[3])) {
clToken.pos += 4;
return Unit::Mil;
} }
return convertFrom; return Unit::Invalid;
}; };
// Start processing of first/next token: Remove whitespace // Start processing of first/next token: Remove whitespace
@ -301,6 +328,16 @@ NumericEvaluator :: getToken()
case Unit::Invalid : break; case Unit::Invalid : break;
} }
} }
else if (eClUnitDefault == Unit::Mil)
{
switch (convertFrom)
{
case Unit::Inch : retval.value.dValue = 1.0*1000.0; break;
case Unit::Mil : retval.value.dValue = 1.0; break;
case Unit::Metric : retval.value.dValue = 1000.0/25.4; break;
case Unit::Invalid : break;
}
}
} }
else if (isalpha(ch)) { // VAR else if (isalpha(ch)) { // VAR
const char* cptr = &clToken.input[clToken.pos]; const char* cptr = &clToken.input[clToken.pos];

View File

@ -23,26 +23,36 @@
*/ */
#include <wx/stattext.h> #include <wx/stattext.h>
#include <wx/sizer.h>
#include <wx/textentry.h> #include <wx/textentry.h>
#include <limits> #include <limits>
#include <base_units.h> #include <base_units.h>
#include <wx/valnum.h> #include <draw_frame.h>
#include <confirm.h>
#include "widgets/unit_binder.h" #include "widgets/unit_binder.h"
UNIT_BINDER::UNIT_BINDER( wxWindow* aParent, wxTextEntry* aTextInput, UNIT_BINDER::UNIT_BINDER( EDA_DRAW_FRAME* aParent,
wxStaticText* aUnitLabel, wxSpinButton* aSpinButton ) : wxStaticText* aLabel, wxTextEntry* aTextEntry, wxStaticText* aUnitLabel,
m_textEntry( aTextInput ), bool aUseMils, int aMin, int aMax, bool allowEval ) :
m_label( aLabel ),
m_textEntry( aTextEntry ),
m_unitLabel( aUnitLabel ), m_unitLabel( aUnitLabel ),
m_units( g_UserUnit ), m_eval( aParent->GetUserUnits(), aUseMils )
m_step( 1 ),
m_min( 0 ),
m_max( 1 )
{ {
// Use the currently selected units // Fix the units (to the current units) for the life of the binder
m_units = aParent->GetUserUnits();
m_useMils = aUseMils;
m_min = aMin;
m_max = aMax;
m_allowEval = allowEval;
m_textEntry->SetValue( wxT( "0" ) ); m_textEntry->SetValue( wxT( "0" ) );
m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units ) ); m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units, aUseMils ) );
wxWindow* textInput = dynamic_cast<wxWindow*>( m_textEntry );
textInput->Connect( wxEVT_SET_FOCUS, wxFocusEventHandler( UNIT_BINDER::onSetFocus ), NULL, this );
textInput->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( UNIT_BINDER::onKillFocus ), NULL, this );
textInput->Connect( wxEVT_TEXT_ENTER, wxCommandEventHandler( UNIT_BINDER::onTextEnter ), NULL, this );
} }
@ -51,13 +61,130 @@ UNIT_BINDER::~UNIT_BINDER()
} }
void UNIT_BINDER::onSetFocus( wxFocusEvent& aEvent )
{
if( m_allowEval )
{
auto oldStr = m_eval.textInput( this );
if( oldStr )
m_textEntry->SetValue( wxString::FromUTF8( oldStr ) );
}
aEvent.Skip();
}
void UNIT_BINDER::onKillFocus( wxFocusEvent& aEvent )
{
// The ship is going down; no need to do anything...
if( !aEvent.GetWindow() || aEvent.GetWindow()->GetId() == wxID_CANCEL )
return;
if( m_allowEval )
evaluate();
Validate( true );
aEvent.Skip();
}
void UNIT_BINDER::onTextEnter( wxCommandEvent& aEvent )
{
if( m_allowEval )
evaluate();
// Send an OK event to the parent dialog
wxCommandEvent event( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK );
wxPostEvent( dynamic_cast<wxWindow*>( m_textEntry )->GetParent(), event );
}
void UNIT_BINDER::evaluate()
{
if( m_textEntry->GetValue().IsEmpty() )
m_textEntry->SetValue( "0" );
if( m_eval.process( m_textEntry->GetValue().mb_str(), this ) )
m_textEntry->SetValue( wxString::FromUTF8( m_eval.result() ) );
}
wxString valueDescriptionFromLabel( wxStaticText* aLabel )
{
wxString desc = aLabel->GetLabel();
desc.EndsWith( wxT( ":" ), &desc );
return desc;
}
void UNIT_BINDER::delayedFocusHandler( wxIdleEvent& )
{
wxWindow* textInput = dynamic_cast<wxWindow*>( m_textEntry );
textInput->SetFocus();
textInput->Unbind( wxEVT_IDLE, &UNIT_BINDER::delayedFocusHandler, this );
}
bool UNIT_BINDER::Validate( bool setFocusOnError )
{
wxWindow* textInput = dynamic_cast<wxWindow*>( m_textEntry );
if( m_min > INT_MIN && GetValue() < m_min )
{
wxString msg = wxString::Format( _( "%s must be larger than %s." ),
valueDescriptionFromLabel( m_label ),
StringFromValue( EDA_UNITS_T::MILLIMETRES, m_min, true ) );
DisplayError( textInput->GetParent(), msg );
if( setFocusOnError )
{
m_textEntry->SelectAll();
// Don't focus directly; we might be inside a KillFocus event handler
textInput->Bind( wxEVT_IDLE, &UNIT_BINDER::delayedFocusHandler, this );
}
return false;
}
if( m_max < INT_MAX && GetValue() > m_max )
{
wxString msg = wxString::Format( _( "%s must be smaller than %s." ),
valueDescriptionFromLabel( m_label ),
StringFromValue( EDA_UNITS_T::MILLIMETRES, m_max, true ) );
DisplayError( textInput->GetParent(), msg );
if( setFocusOnError )
{
m_textEntry->SelectAll();
// Don't focus directly; we might be inside a KillFocus event handler
textInput->Bind( wxEVT_IDLE, &UNIT_BINDER::delayedFocusHandler, this );
}
return false;
}
return true;
}
void UNIT_BINDER::SetValue( int aValue ) void UNIT_BINDER::SetValue( int aValue )
{ {
wxString s = StringFromValue( m_units, aValue, false ); SetValue( StringFromValue( m_units, aValue, false, m_useMils ) );
}
m_textEntry->SetValue( s );
m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units ) ); void UNIT_BINDER::SetValue( wxString aValue )
{
m_textEntry->SetValue( aValue );
if( m_allowEval )
m_eval.clear();
m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units, m_useMils ) );
} }
@ -65,28 +192,20 @@ int UNIT_BINDER::GetValue() const
{ {
wxString s = m_textEntry->GetValue(); wxString s = m_textEntry->GetValue();
return ValueFromString( m_units, s ); return ValueFromString( m_units, s, m_useMils );
} }
bool UNIT_BINDER::Valid() const bool UNIT_BINDER::IsIndeterminate() const
{ {
double dummy; return m_textEntry->GetValue() == INDETERMINATE;
return m_textEntry->GetValue().ToDouble( &dummy );
} }
void UNIT_BINDER::Enable( bool aEnable ) void UNIT_BINDER::Enable( bool aEnable )
{ {
wxWindow* wxWin = dynamic_cast<wxWindow*>( m_textEntry ); m_label->Enable( aEnable );
wxASSERT( wxWin ); dynamic_cast<wxWindow*>( m_textEntry )->Enable( aEnable );
// Most text input entry widgets inherit from wxTextEntry and wxWindow, so it should be fine.
// Still, it is better to be safe than sorry.
if( wxWin )
wxWin->Enable( aEnable );
m_unitLabel->Enable( aEnable ); m_unitLabel->Enable( aEnable );
} }

View File

@ -40,6 +40,7 @@
#include <confirm.h> #include <confirm.h>
#include <sch_text.h> #include <sch_text.h>
#include <typeinfo> #include <typeinfo>
#include <widgets/unit_binder.h>
#include <dialog_edit_label_base.h> #include <dialog_edit_label_base.h>
@ -78,16 +79,16 @@ public:
} }
private: private:
void InitDialog( ) override;
virtual void OnEnterKey( wxCommandEvent& aEvent ) override; virtual void OnEnterKey( wxCommandEvent& aEvent ) override;
virtual void OnOkClick( wxCommandEvent& aEvent ) override;
virtual void OnCancelClick( wxCommandEvent& aEvent ) override;
void OnCharHook( wxKeyEvent& aEvent ); void OnCharHook( wxKeyEvent& aEvent );
void TextPropertiesAccept( wxCommandEvent& aEvent );
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
SCH_EDIT_FRAME* m_Parent; SCH_EDIT_FRAME* m_Parent;
SCH_TEXT* m_CurrentText; SCH_TEXT* m_CurrentText;
wxTextCtrl* m_textLabel; wxTextCtrl* m_activeTextCtrl;
UNIT_BINDER m_textSize;
}; };
@ -106,24 +107,61 @@ void SCH_EDIT_FRAME::EditSchematicText( SCH_TEXT* aTextItem )
} }
// Conservative limits 0.01 to 250mm
const int minSize = (int)( 0.01 * IU_PER_MM );
const int maxSize = (int)( 250 * IU_PER_MM );
DIALOG_LABEL_EDITOR::DIALOG_LABEL_EDITOR( SCH_EDIT_FRAME* aParent, SCH_TEXT* aTextItem ) : DIALOG_LABEL_EDITOR::DIALOG_LABEL_EDITOR( SCH_EDIT_FRAME* aParent, SCH_TEXT* aTextItem ) :
DIALOG_LABEL_EDITOR_BASE( aParent ) DIALOG_LABEL_EDITOR_BASE( aParent ),
m_textSize( aParent, m_SizeTitle, m_TextSizeCtrl, m_staticSizeUnits, false, minSize, maxSize )
{ {
m_Parent = aParent; m_Parent = aParent;
m_CurrentText = aTextItem; m_CurrentText = aTextItem;
InitDialog();
// Conservative limits 0.0 to 10.0 inches switch( m_CurrentText->Type() )
const int minSize = 0; // a value like 0.01 is better, but if > 0, creates {
// annoying issues when trying to enter a value starting by 0 or .0 case SCH_GLOBAL_LABEL_T:
const int maxSize = 10 * 1000 * IU_PER_MILS; SetTitle( _( "Global Label Properties" ) );
break;
wxFloatingPointValidator<double> textSizeValidator( NULL, wxNUM_VAL_NO_TRAILING_ZEROES ); case SCH_HIERARCHICAL_LABEL_T:
textSizeValidator.SetPrecision( 4 ); SetTitle( _( "Hierarchical Label Properties" ) );
textSizeValidator.SetRange( To_User_Unit( g_UserUnit, minSize ), break;
To_User_Unit( g_UserUnit, maxSize ) );
m_TextSize->SetValidator( textSizeValidator ); case SCH_LABEL_T:
SetTitle( _( "Label Properties" ) );
break;
case SCH_SHEET_PIN_T:
SetTitle( _( "Hierarchical Sheet Pin Properties." ) );
break;
default:
SetTitle( _( "Text Properties" ) );
break;
}
if( m_CurrentText->IsMultilineAllowed() )
{
m_activeTextCtrl = m_textLabelMultiLine;
m_textLabelSingleLine->Show( false );
m_textControlSizer->AddGrowableRow( 0 );
}
else
{
m_activeTextCtrl = m_textLabelSingleLine;
m_textLabelMultiLine->Show( false );
}
if( m_CurrentText->Type() != SCH_TEXT_T )
( (wxTextValidator*) m_activeTextCtrl->GetValidator() )->SetCharExcludes( wxT( " /" ) );
m_TextShape->Show( m_CurrentText->Type() == SCH_GLOBAL_LABEL_T ||
m_CurrentText->Type() == SCH_HIERARCHICAL_LABEL_T );
m_sdbSizer1OK->SetDefault();
Layout();
// wxTextCtrls fail to generate wxEVT_CHAR events when the wxTE_MULTILINE flag is set, // wxTextCtrls fail to generate wxEVT_CHAR events when the wxTE_MULTILINE flag is set,
// so we have to listen to wxEVT_CHAR_HOOK events instead. // so we have to listen to wxEVT_CHAR_HOOK events instead.
@ -165,93 +203,13 @@ static int mapOrientation( KICAD_T labelType, int aOrientation )
} }
void DIALOG_LABEL_EDITOR::InitDialog() bool DIALOG_LABEL_EDITOR::TransferDataToWindow()
{ {
wxString msg; if( !wxDialog::TransferDataToWindow() )
bool multiLine = false; return false;
if( m_CurrentText->IsMultilineAllowed() ) m_activeTextCtrl->SetValue( m_CurrentText->GetText() );
{ m_activeTextCtrl->SetFocus();
m_textLabel = m_textLabelMultiLine;
m_textLabelSingleLine->Show( false );
m_textControlSizer->AddGrowableRow( 0 );
multiLine = true;
}
else
{
m_textLabel = m_textLabelSingleLine;
m_textLabelMultiLine->Show( false );
wxTextValidator* validator = (wxTextValidator*) m_textLabel->GetValidator();
// Add invalid label characters to this list.
// for any label type but SCH_TEXT_T (that has the multiline allowed)
validator->SetCharExcludes( wxT( " /" ) );
}
m_textLabel->SetValue( m_CurrentText->GetText() );
m_textLabel->SetFocus();
switch( m_CurrentText->Type() )
{
case SCH_GLOBAL_LABEL_T:
SetTitle( _( "Global Label Properties" ) );
break;
case SCH_HIERARCHICAL_LABEL_T:
SetTitle( _( "Hierarchical Label Properties" ) );
break;
case SCH_LABEL_T:
SetTitle( _( "Label Properties" ) );
break;
case SCH_SHEET_PIN_T:
SetTitle( _( "Hierarchical Sheet Pin Properties." ) );
break;
default:
SetTitle( _( "Text Properties" ) );
break;
}
const int MINTEXTWIDTH = 40; // M's are big characters, a few establish a lot of width
int max_len = 0;
if ( !multiLine )
{
max_len = m_CurrentText->GetText().Length();
}
else
{
// calculate the length of the biggest line
// we cannot use the length of the entire text that has no meaning
int curr_len = MINTEXTWIDTH;
int imax = m_CurrentText->GetText().Length();
for( int count = 0; count < imax; count++ )
{
if( m_CurrentText->GetText()[count] == '\n' ||
m_CurrentText->GetText()[count] == '\r' ) // new line
{
curr_len = 0;
}
else
{
curr_len++;
if ( max_len < curr_len )
max_len = curr_len;
}
}
}
if( max_len < MINTEXTWIDTH )
max_len = MINTEXTWIDTH;
wxString textWidth;
textWidth.Append( 'M', MINTEXTWIDTH );
EnsureTextCtrlWidth( m_textLabel, &textWidth );
// Set text options: // Set text options:
int orientation = mapOrientation( m_CurrentText->Type(), m_CurrentText->GetLabelSpinStyle() ); int orientation = mapOrientation( m_CurrentText->Type(), m_CurrentText->GetLabelSpinStyle() );
@ -269,35 +227,24 @@ void DIALOG_LABEL_EDITOR::InitDialog()
m_TextStyle->SetSelection( style ); m_TextStyle->SetSelection( style );
wxString units = ReturnUnitSymbol( g_UserUnit, wxT( "(%s)" ) ); m_textSize.SetValue( m_CurrentText->GetTextWidth() );
msg.Printf( _( "H%s x W%s" ), GetChars( units ), GetChars( units ) );
m_staticSizeUnits->SetLabel( msg );
msg = StringFromValue( g_UserUnit, m_CurrentText->GetTextWidth() ); return true;
m_TextSize->SetValue( msg );
if( m_CurrentText->Type() != SCH_GLOBAL_LABEL_T
&& m_CurrentText->Type() != SCH_HIERARCHICAL_LABEL_T )
{
m_TextShape->Show( false );
}
m_sdbSizer1OK->SetDefault();
} }
/*! /*!
* wxEVT_COMMAND_ENTER event handler for m_textLabel * wxEVT_COMMAND_ENTER event handler for single-line control
*/ */
void DIALOG_LABEL_EDITOR::OnEnterKey( wxCommandEvent& aEvent ) void DIALOG_LABEL_EDITOR::OnEnterKey( wxCommandEvent& aEvent )
{ {
TextPropertiesAccept( aEvent ); wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
} }
/*! /*!
* wxEVT_CHAR_HOOK event handler for m_textLabel * wxEVT_CHAR_HOOK event handler for multi-line control
*/ */
void DIALOG_LABEL_EDITOR::OnCharHook( wxKeyEvent& aEvent ) void DIALOG_LABEL_EDITOR::OnCharHook( wxKeyEvent& aEvent )
@ -313,8 +260,7 @@ void DIALOG_LABEL_EDITOR::OnCharHook( wxKeyEvent& aEvent )
} }
else if( aEvent.GetKeyCode() == WXK_RETURN && aEvent.ShiftDown() ) else if( aEvent.GetKeyCode() == WXK_RETURN && aEvent.ShiftDown() )
{ {
wxCommandEvent cmdEvent( wxEVT_COMMAND_ENTER ); wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
TextPropertiesAccept( cmdEvent );
} }
else else
{ {
@ -323,31 +269,12 @@ void DIALOG_LABEL_EDITOR::OnCharHook( wxKeyEvent& aEvent )
} }
/*! bool DIALOG_LABEL_EDITOR::TransferDataFromWindow()
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK
*/
void DIALOG_LABEL_EDITOR::OnOkClick( wxCommandEvent& aEvent )
{ {
TextPropertiesAccept( aEvent ); if( !wxDialog::TransferDataFromWindow() )
} return false;
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL
*/
void DIALOG_LABEL_EDITOR::OnCancelClick( wxCommandEvent& aEvent )
{
m_Parent->GetCanvas()->MoveCursorToCrossHair();
EndModal( wxID_CANCEL );
}
void DIALOG_LABEL_EDITOR::TextPropertiesAccept( wxCommandEvent& aEvent )
{
wxString text; wxString text;
int value;
/* save old text in undo list if not already in edit */ /* save old text in undo list if not already in edit */
/* or the label to be edited is part of a block */ /* or the label to be edited is part of a block */
@ -357,22 +284,20 @@ void DIALOG_LABEL_EDITOR::TextPropertiesAccept( wxCommandEvent& aEvent )
m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentText->GetBoundingBox() ); m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentText->GetBoundingBox() );
text = m_textLabel->GetValue(); text = m_activeTextCtrl->GetValue();
if( !text.IsEmpty() ) if( !text.IsEmpty() )
m_CurrentText->SetText( text ); m_CurrentText->SetText( text );
else if( !m_CurrentText->IsNew() ) else if( !m_CurrentText->IsNew() )
{ {
DisplayError( this, _( "Empty Text!" ) ); DisplayError( this, _( "Empty Text!" ) );
return; return false;
} }
int orientation = m_TextOrient->GetSelection(); int orientation = m_TextOrient->GetSelection();
m_CurrentText->SetLabelSpinStyle( mapOrientation( m_CurrentText->Type(), orientation ) ); m_CurrentText->SetLabelSpinStyle( mapOrientation( m_CurrentText->Type(), orientation ) );
text = m_TextSize->GetValue(); m_CurrentText->SetTextSize( wxSize( m_textSize.GetValue(), m_textSize.GetValue() ) );
value = ValueFromString( g_UserUnit, text );
m_CurrentText->SetTextSize( wxSize( value, value ) );
if( m_TextShape ) if( m_TextShape )
/// @todo move cast to widget /// @todo move cast to widget
@ -401,5 +326,6 @@ void DIALOG_LABEL_EDITOR::TextPropertiesAccept( wxCommandEvent& aEvent )
m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentText->GetBoundingBox() ); m_Parent->GetCanvas()->RefreshDrawingRect( m_CurrentText->GetBoundingBox() );
m_Parent->GetCanvas()->MoveCursorToCrossHair(); m_Parent->GetCanvas()->MoveCursorToCrossHair();
EndModal( wxID_OK );
return true;
} }

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 5 2018) // C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -18,6 +18,7 @@ DIALOG_LABEL_EDITOR_BASE::DIALOG_LABEL_EDITOR_BASE( wxWindow* parent, wxWindowID
m_textControlSizer = new wxFlexGridSizer( 2, 2, 3, 3 ); m_textControlSizer = new wxFlexGridSizer( 2, 2, 3, 3 );
m_textControlSizer->AddGrowableCol( 1 ); m_textControlSizer->AddGrowableCol( 1 );
m_textControlSizer->AddGrowableRow( 0 );
m_textControlSizer->SetFlexibleDirection( wxBOTH ); m_textControlSizer->SetFlexibleDirection( wxBOTH );
m_textControlSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); m_textControlSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
@ -25,37 +26,39 @@ DIALOG_LABEL_EDITOR_BASE::DIALOG_LABEL_EDITOR_BASE( wxWindow* parent, wxWindowID
m_staticText1->Wrap( -1 ); m_staticText1->Wrap( -1 );
m_staticText1->SetToolTip( _("Enter the text to be used within the schematic") ); m_staticText1->SetToolTip( _("Enter the text to be used within the schematic") );
m_textControlSizer->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); m_textControlSizer->Add( m_staticText1, 0, wxALIGN_TOP|wxRIGHT|wxTOP, 3 );
wxBoxSizer* bSizeText; wxBoxSizer* bSizeText;
bSizeText = new wxBoxSizer( wxVERTICAL ); bSizeText = new wxBoxSizer( wxVERTICAL );
m_textLabelSingleLine = new wxTextCtrl( this, wxID_VALUESINGLE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER|wxTE_RICH ); m_textLabelSingleLine = new wxTextCtrl( this, wxID_VALUESINGLE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER|wxTE_RICH );
m_textLabelSingleLine->SetMinSize( wxSize( 360,-1 ) );
m_textLabelSingleLine->SetValidator( wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, &m_labelText ) ); m_textLabelSingleLine->SetValidator( wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, &m_labelText ) );
bSizeText->Add( m_textLabelSingleLine, 0, wxEXPAND|wxLEFT, 3 ); bSizeText->Add( m_textLabelSingleLine, 0, wxBOTTOM|wxEXPAND|wxLEFT, 3 );
m_textLabelMultiLine = new wxTextCtrl( this, wxID_VALUEMULTI, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); m_textLabelMultiLine = new wxTextCtrl( this, wxID_VALUEMULTI, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
m_textLabelMultiLine->SetMinSize( wxSize( -1,60 ) ); m_textLabelMultiLine->SetMinSize( wxSize( 480,72 ) );
bSizeText->Add( m_textLabelMultiLine, 1, wxEXPAND|wxLEFT, 3 ); bSizeText->Add( m_textLabelMultiLine, 1, wxBOTTOM|wxEXPAND|wxLEFT, 3 );
m_textControlSizer->Add( bSizeText, 1, wxEXPAND, 3 ); m_textControlSizer->Add( bSizeText, 1, wxEXPAND, 3 );
m_SizeTitle = new wxStaticText( this, wxID_ANY, _("&Size:"), wxDefaultPosition, wxDefaultSize, 0 ); m_SizeTitle = new wxStaticText( this, wxID_ANY, _("&Size:"), wxDefaultPosition, wxDefaultSize, 0 );
m_SizeTitle->Wrap( -1 ); m_SizeTitle->Wrap( -1 );
m_textControlSizer->Add( m_SizeTitle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); m_textControlSizer->Add( m_SizeTitle, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 3 );
wxBoxSizer* bSizeCtrlSizer; wxBoxSizer* bSizeCtrlSizer;
bSizeCtrlSizer = new wxBoxSizer( wxHORIZONTAL ); bSizeCtrlSizer = new wxBoxSizer( wxHORIZONTAL );
m_TextSize = new wxTextCtrl( this, wxID_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_TextSizeCtrl = new wxTextCtrl( this, wxID_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizeCtrlSizer->Add( m_TextSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT, 3 ); bSizeCtrlSizer->Add( m_TextSizeCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxTOP, 3 );
m_staticSizeUnits = new wxStaticText( this, wxID_ANY, _("units"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticSizeUnits = new wxStaticText( this, wxID_ANY, _("units"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticSizeUnits->Wrap( -1 ); m_staticSizeUnits->Wrap( -1 );
bSizeCtrlSizer->Add( m_staticSizeUnits, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); bSizeCtrlSizer->Add( m_staticSizeUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
m_textControlSizer->Add( bSizeCtrlSizer, 1, wxEXPAND, 3 ); m_textControlSizer->Add( bSizeCtrlSizer, 1, wxEXPAND, 3 );
@ -68,21 +71,21 @@ DIALOG_LABEL_EDITOR_BASE::DIALOG_LABEL_EDITOR_BASE( wxWindow* parent, wxWindowID
wxString m_TextOrientChoices[] = { _("Right"), _("Up"), _("Left"), _("Down") }; wxString m_TextOrientChoices[] = { _("Right"), _("Up"), _("Left"), _("Down") };
int m_TextOrientNChoices = sizeof( m_TextOrientChoices ) / sizeof( wxString ); int m_TextOrientNChoices = sizeof( m_TextOrientChoices ) / sizeof( wxString );
m_TextOrient = new wxRadioBox( this, wxID_ANY, _("O&rientation:"), wxDefaultPosition, wxDefaultSize, m_TextOrientNChoices, m_TextOrientChoices, 1, wxRA_SPECIFY_COLS ); m_TextOrient = new wxRadioBox( this, wxID_ANY, _("Orientation"), wxDefaultPosition, wxDefaultSize, m_TextOrientNChoices, m_TextOrientChoices, 1, wxRA_SPECIFY_COLS );
m_TextOrient->SetSelection( 0 ); m_TextOrient->SetSelection( 0 );
m_OptionsSizer->Add( m_TextOrient, 1, wxRIGHT|wxTOP, 3 ); m_OptionsSizer->Add( m_TextOrient, 1, wxRIGHT|wxTOP|wxEXPAND, 3 );
wxString m_TextStyleChoices[] = { _("Normal"), _("Italic"), _("Bold"), _("Bold and italic") }; wxString m_TextStyleChoices[] = { _("Normal"), _("Italic"), _("Bold"), _("Bold and italic") };
int m_TextStyleNChoices = sizeof( m_TextStyleChoices ) / sizeof( wxString ); int m_TextStyleNChoices = sizeof( m_TextStyleChoices ) / sizeof( wxString );
m_TextStyle = new wxRadioBox( this, wxID_ANY, _("St&yle:"), wxDefaultPosition, wxDefaultSize, m_TextStyleNChoices, m_TextStyleChoices, 1, wxRA_SPECIFY_COLS ); m_TextStyle = new wxRadioBox( this, wxID_ANY, _("Style"), wxDefaultPosition, wxDefaultSize, m_TextStyleNChoices, m_TextStyleChoices, 1, wxRA_SPECIFY_COLS );
m_TextStyle->SetSelection( 3 ); m_TextStyle->SetSelection( 3 );
m_OptionsSizer->Add( m_TextStyle, 1, wxLEFT|wxRIGHT|wxTOP, 3 ); m_OptionsSizer->Add( m_TextStyle, 1, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 3 );
wxString m_TextShapeChoices[] = { _("Input"), _("Output"), _("Bidirectional"), _("Tri-State"), _("Passive") }; wxString m_TextShapeChoices[] = { _("Input"), _("Output"), _("Bidirectional"), _("Tri-state"), _("Passive") };
int m_TextShapeNChoices = sizeof( m_TextShapeChoices ) / sizeof( wxString ); int m_TextShapeNChoices = sizeof( m_TextShapeChoices ) / sizeof( wxString );
m_TextShape = new wxRadioBox( this, wxID_ANY, _("S&hape:"), wxDefaultPosition, wxDefaultSize, m_TextShapeNChoices, m_TextShapeChoices, 1, wxRA_SPECIFY_COLS ); m_TextShape = new wxRadioBox( this, wxID_ANY, _("Shape"), wxDefaultPosition, wxDefaultSize, m_TextShapeNChoices, m_TextShapeChoices, 1, wxRA_SPECIFY_COLS );
m_TextShape->SetSelection( 0 ); m_TextShape->SetSelection( 3 );
m_OptionsSizer->Add( m_TextShape, 1, wxALL|wxLEFT|wxTOP, 3 ); m_OptionsSizer->Add( m_TextShape, 1, wxALL|wxLEFT|wxTOP|wxEXPAND, 3 );
bMainSizer->Add( m_OptionsSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 12 ); bMainSizer->Add( m_OptionsSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 12 );
@ -103,15 +106,11 @@ DIALOG_LABEL_EDITOR_BASE::DIALOG_LABEL_EDITOR_BASE( wxWindow* parent, wxWindowID
// Connect Events // Connect Events
m_textLabelSingleLine->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnEnterKey ), NULL, this ); m_textLabelSingleLine->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnEnterKey ), NULL, this );
m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnCancelClick ), NULL, this );
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnOkClick ), NULL, this );
} }
DIALOG_LABEL_EDITOR_BASE::~DIALOG_LABEL_EDITOR_BASE() DIALOG_LABEL_EDITOR_BASE::~DIALOG_LABEL_EDITOR_BASE()
{ {
// Disconnect Events // Disconnect Events
m_textLabelSingleLine->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnEnterKey ), NULL, this ); m_textLabelSingleLine->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnEnterKey ), NULL, this );
m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnCancelClick ), NULL, this );
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LABEL_EDITOR_BASE::OnOkClick ), NULL, this );
} }

View File

@ -14,7 +14,6 @@
<property name="file">dialog_edit_label_base</property> <property name="file">dialog_edit_label_base</property>
<property name="first_id">1000</property> <property name="first_id">1000</property>
<property name="help_provider">none</property> <property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property> <property name="internationalize">1</property>
<property name="name">dialog_edit_label_base</property> <property name="name">dialog_edit_label_base</property>
<property name="namespace"></property> <property name="namespace"></property>
@ -112,7 +111,7 @@
<property name="vgap">3</property> <property name="vgap">3</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> <property name="flag">wxALIGN_TOP|wxRIGHT|wxTOP</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticText" expanded="1"> <object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -204,7 +203,7 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxEXPAND|wxLEFT</property> <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1"> <object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -240,7 +239,7 @@
<property name="maxlength"></property> <property name="maxlength"></property>
<property name="min_size"></property> <property name="min_size"></property>
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size">360,-1</property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_textLabelSingleLine</property> <property name="name">m_textLabelSingleLine</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
@ -295,7 +294,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxEXPAND|wxLEFT</property> <property name="flag">wxBOTTOM|wxEXPAND|wxLEFT</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxTextCtrl" expanded="1"> <object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -331,7 +330,7 @@
<property name="maxlength"></property> <property name="maxlength"></property>
<property name="min_size"></property> <property name="min_size"></property>
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size">-1,60</property> <property name="minimum_size">480,72</property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_textLabelMultiLine</property> <property name="name">m_textLabelMultiLine</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
@ -388,7 +387,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticText" expanded="1"> <object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -480,7 +479,7 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxTOP</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1"> <object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -518,7 +517,7 @@
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_TextSize</property> <property name="name">m_TextSizeCtrl</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
<property name="pane_position"></property> <property name="pane_position"></property>
<property name="pane_size"></property> <property name="pane_size"></property>
@ -570,8 +569,8 @@
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">2</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStaticText" expanded="1"> <object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -667,7 +666,7 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxRIGHT|wxTOP</property> <property name="flag">wxRIGHT|wxTOP|wxEXPAND</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxRadioBox" expanded="1"> <object class="wxRadioBox" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -698,7 +697,7 @@
<property name="gripper">0</property> <property name="gripper">0</property>
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">O&amp;rientation:</property> <property name="label">Orientation</property>
<property name="majorDimension">1</property> <property name="majorDimension">1</property>
<property name="max_size"></property> <property name="max_size"></property>
<property name="maximize_button">0</property> <property name="maximize_button">0</property>
@ -757,7 +756,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxLEFT|wxRIGHT|wxTOP</property> <property name="flag">wxLEFT|wxRIGHT|wxTOP|wxEXPAND</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxRadioBox" expanded="1"> <object class="wxRadioBox" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -788,7 +787,7 @@
<property name="gripper">0</property> <property name="gripper">0</property>
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">St&amp;yle:</property> <property name="label">Style</property>
<property name="majorDimension">1</property> <property name="majorDimension">1</property>
<property name="max_size"></property> <property name="max_size"></property>
<property name="maximize_button">0</property> <property name="maximize_button">0</property>
@ -847,7 +846,7 @@
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">3</property> <property name="border">3</property>
<property name="flag">wxALL|wxLEFT|wxTOP</property> <property name="flag">wxALL|wxLEFT|wxTOP|wxEXPAND</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxRadioBox" expanded="1"> <object class="wxRadioBox" expanded="1">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -863,7 +862,7 @@
<property name="caption"></property> <property name="caption"></property>
<property name="caption_visible">1</property> <property name="caption_visible">1</property>
<property name="center_pane">0</property> <property name="center_pane">0</property>
<property name="choices">&quot;Input&quot; &quot;Output&quot; &quot;Bidirectional&quot; &quot;Tri-State&quot; &quot;Passive&quot;</property> <property name="choices">&quot;Input&quot; &quot;Output&quot; &quot;Bidirectional&quot; &quot;Tri-state&quot; &quot;Passive&quot;</property>
<property name="close_button">1</property> <property name="close_button">1</property>
<property name="context_help"></property> <property name="context_help"></property>
<property name="context_menu">1</property> <property name="context_menu">1</property>
@ -878,7 +877,7 @@
<property name="gripper">0</property> <property name="gripper">0</property>
<property name="hidden">0</property> <property name="hidden">0</property>
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">S&amp;hape:</property> <property name="label">Shape</property>
<property name="majorDimension">1</property> <property name="majorDimension">1</property>
<property name="max_size"></property> <property name="max_size"></property>
<property name="maximize_button">0</property> <property name="maximize_button">0</property>
@ -895,7 +894,7 @@
<property name="pin_button">1</property> <property name="pin_button">1</property>
<property name="pos"></property> <property name="pos"></property>
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="selection">0</property> <property name="selection">3</property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style">wxRA_SPECIFY_COLS</property> <property name="style">wxRA_SPECIFY_COLS</property>
@ -954,11 +953,11 @@
<property name="name">m_sdbSizer1</property> <property name="name">m_sdbSizer1</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<event name="OnApplyButtonClick"></event> <event name="OnApplyButtonClick"></event>
<event name="OnCancelButtonClick">OnCancelClick</event> <event name="OnCancelButtonClick"></event>
<event name="OnContextHelpButtonClick"></event> <event name="OnContextHelpButtonClick"></event>
<event name="OnHelpButtonClick"></event> <event name="OnHelpButtonClick"></event>
<event name="OnNoButtonClick"></event> <event name="OnNoButtonClick"></event>
<event name="OnOKButtonClick">OnOkClick</event> <event name="OnOKButtonClick"></event>
<event name="OnSaveButtonClick"></event> <event name="OnSaveButtonClick"></event>
<event name="OnYesButtonClick"></event> <event name="OnYesButtonClick"></event>
</object> </object>

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 5 2018) // C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -47,7 +47,7 @@ class DIALOG_LABEL_EDITOR_BASE : public DIALOG_SHIM
wxTextCtrl* m_textLabelSingleLine; wxTextCtrl* m_textLabelSingleLine;
wxTextCtrl* m_textLabelMultiLine; wxTextCtrl* m_textLabelMultiLine;
wxStaticText* m_SizeTitle; wxStaticText* m_SizeTitle;
wxTextCtrl* m_TextSize; wxTextCtrl* m_TextSizeCtrl;
wxStaticText* m_staticSizeUnits; wxStaticText* m_staticSizeUnits;
wxRadioBox* m_TextOrient; wxRadioBox* m_TextOrient;
wxRadioBox* m_TextStyle; wxRadioBox* m_TextStyle;
@ -58,8 +58,6 @@ class DIALOG_LABEL_EDITOR_BASE : public DIALOG_SHIM
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnEnterKey( wxCommandEvent& event ) { event.Skip(); } virtual void OnEnterKey( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
public: public:

View File

@ -37,6 +37,14 @@
#include <common.h> #include <common.h>
#include <convert_to_biu.h> #include <convert_to_biu.h>
/**
* Used for holding indeterminate values, such as with multiple selections
* holding different values or controls which do not wish to set a value.
*/
#define INDETERMINATE wxString( "<...>" )
/// Convert mm to mils. /// Convert mm to mils.
inline int Mm2mils( double x ) { return KiROUND( x * 1000./25.4 ); } inline int Mm2mils( double x ) { return KiROUND( x * 1000./25.4 ); }

View File

@ -108,6 +108,8 @@ public:
void OnPaint( wxPaintEvent &event ); void OnPaint( wxPaintEvent &event );
EDA_UNITS_T GetUserUnits() const override { return m_units; }
protected: protected:
/** /**
@ -146,9 +148,9 @@ protected:
*/ */
int VertPixelsFromDU( int y ); int VertPixelsFromDU( int y );
bool m_fixupsRun; EDA_UNITS_T m_units; // userUnits for display and parsing
bool m_fixupsRun; // indicates various wxWidgets fixups have run
std::string m_hash_key; // alternate for class_map when classname re-used. std::string m_hash_key; // alternate for class_map when classname re-used
// variables for quasi-modal behavior support, only used by a few derivatives. // variables for quasi-modal behavior support, only used by a few derivatives.
EVENT_LOOP* m_qmodal_loop; // points to nested event_loop, NULL means not qmodal and dismissed EVENT_LOOP* m_qmodal_loop; // points to nested event_loop, NULL means not qmodal and dismissed

View File

@ -256,9 +256,9 @@ public:
/** /**
* Function GetUserUnits * Function GetUserUnits
* returns the user unit currently in use * returns the user units currently in use
*/ */
EDA_UNITS_T GetUserUnits() const { return m_UserUnits; } EDA_UNITS_T GetUserUnits() const override { return m_UserUnits; }
void SetUserUnits( EDA_UNITS_T aUnits ) { m_UserUnits = aUnits; } void SetUserUnits( EDA_UNITS_T aUnits ) { m_UserUnits = aUnits; }
/** /**

View File

@ -69,6 +69,15 @@ public:
*/ */
PROJECT& Prj() const; PROJECT& Prj() const;
/**
* Function GetUserUnits
* Allows participation in KEYWAY_PLAYER/DIALOG_SHIM userUnits inheritance.
*
* This would fit better in KEYWAY_PLAYER, but DIALOG_SHIMs can only use mix-ins
* because their primary superclass must be wxDialog.
*/
VTBL_ENTRY EDA_UNITS_T GetUserUnits() const;
/** /**
* Function SetKiway * Function SetKiway
* *

View File

@ -74,6 +74,8 @@ Supported units are millimeters (mm), Mil (mil) and inch (")
#include <string> #include <string>
#include <map> #include <map>
#include <base_units.h>
// This namespace is used for the lemon parser // This namespace is used for the lemon parser
namespace numEval namespace numEval
{ {
@ -96,14 +98,12 @@ class NumericEvaluator {
public: public:
NumericEvaluator(); NumericEvaluator();
NumericEvaluator( EDA_UNITS_T aUnits, bool aUseMils );
~NumericEvaluator(); ~NumericEvaluator();
/* Initialization and destruction. init() is invoked be the constructor and should not be needed /* clear() should be invoked by the client if a new input string is to be processed. It
* by the user. * will reset the parser. User defined variables are retained.
* clear() should be invoked by the user if a new input string is to be processed. It will reset
* the parser and clear the original expression value for a requested object (if pObj != null).
*/ */
void init();
void clear(const void* pObj = nullptr); void clear(const void* pObj = nullptr);
/* Set the decimal separator for the input string. Defaults to '.' */ /* Set the decimal separator for the input string. Defaults to '.' */
@ -125,6 +125,9 @@ public:
/* Result of string processing. Undefined if !isValid() */ /* Result of string processing. Undefined if !isValid() */
inline const char* result() const { return clToken.token; } inline const char* result() const { return clToken.token; }
/* Numeric result of string processing, in default units. */
inline const double value() const { return resultValue; }
/* Evaluate input string. /* Evaluate input string.
* Result can be retrieved by result(). * Result can be retrieved by result().
* Returns true if input string could be evaluated, otherwise false. * Returns true if input string could be evaluated, otherwise false.
@ -184,6 +187,9 @@ private:
bool bClError; bool bClError;
bool bClParseFinished; bool bClParseFinished;
/* The result (in eClUnitDefault units) */
int resultValue;
bool bClTextInputStorage; // Enable input string storage used by process(const char*, const void*) bool bClTextInputStorage; // Enable input string storage used by process(const char*, const void*)
Unit eClUnitDefault; // Default unit for values Unit eClUnitDefault; // Default unit for values

View File

@ -26,24 +26,37 @@
#define __UNIT_BINDER_H_ #define __UNIT_BINDER_H_
#include <common.h> #include <common.h>
#include <wx/spinbutt.h> #include <base_units.h>
#include <libeval/numeric_evaluator.h>
class wxTextEntry; class wxTextEntry;
class wxSpinButton; class wxSpinButton;
class wxStaticText; class wxStaticText;
class UNIT_BINDER
class UNIT_BINDER : public wxEvtHandler
{ {
public: public:
/** /**
* Constructor. * Constructor.
* @param aParent is the parent window. * @param aParent is the parent EDA_DRAW_FRAME.
* @param aTextInput is the text input widget used to edit the given value (wxTextCtrl, wxComboBox, ...). * @param aLabel is the static text used to label the text input widget (note: the label
* @param aUnitLabel is the units label displayed next to the text field. * text, trimmed of its colon, will also be used in error messages)
* @param aSpinButton is an optional spin button (for adjusting the input value) * @param aTextEntry is the text input widget used to edit the given value (wxTextCtrl,
* wxComboBox, ...).
* @param aUnitLabel is the units label displayed after the text input widget
* @param aUseMils specifies the use of mils for imperial units (instead of inches)
* @param aMin a minimum value (in internal units) for validation
* @param aMax a maximum value (in internal units) for validation
* @param aAllowEval indicates \a aTextInput's content should be eval'ed before storing
*/ */
UNIT_BINDER( wxWindow* aParent, wxTextEntry* aTextInput, wxStaticText* aUnitLabel, wxSpinButton* aSpinButton = NULL ); UNIT_BINDER( EDA_DRAW_FRAME* aParent,
wxStaticText* aLabel, wxTextEntry* aTextEntry, wxStaticText* aUnitLabel,
bool aUseMils = false,
int aMin = INT_MIN, int aMax = INT_MAX,
bool aAllowEval = true );
virtual ~UNIT_BINDER(); virtual ~UNIT_BINDER();
@ -54,6 +67,8 @@ public:
*/ */
virtual void SetValue( int aValue ); virtual void SetValue( int aValue );
void SetValue( wxString aValue );
/** /**
* Function GetValue * Function GetValue
* Returns the current value in Internal Units. * Returns the current value in Internal Units.
@ -61,37 +76,53 @@ public:
virtual int GetValue() const; virtual int GetValue() const;
/** /**
* Function Valid * Function IsIndeterminate
* Returns true if the text control contains a real number. * Returns true if the control holds the indeterminate value (for instance, if it
* represents a multiple selection of differing values).
*/ */
bool Valid() const; bool IsIndeterminate() const;
/**
* Function Validate
* Validates the control, informing the user of any errors found.
*
* When called from an OK handler, \a setFocusOnError should be set to true. A negative
* return value indicates an error.
*/
virtual bool Validate( bool setFocusOnError = false );
/** /**
* Function Enable * Function Enable
* Enables/diasables the binded widgets * Enables/diasables the label, text input widget, and units label.
*/ */
void Enable( bool aEnable ); void Enable( bool aEnable );
protected: protected:
void onTextChanged( wxEvent& aEvent ); void onTextChanged( wxEvent& aEvent );
void onSetFocus( wxFocusEvent& aEvent );
void onKillFocus( wxFocusEvent& aEvent );
void onTextEnter( wxCommandEvent& aEvent );
void delayedFocusHandler( wxIdleEvent& aEvent );
///> Text input control. void evaluate();
wxTextEntry* m_textEntry;
///> Label showing currently used units. ///> The bound widgets
wxStaticText* m_label;
wxTextEntry* m_textEntry;
wxStaticText* m_unitLabel; wxStaticText* m_unitLabel;
///> Currently used units. ///> Currently used units.
EDA_UNITS_T m_units; EDA_UNITS_T m_units;
bool m_useMils;
///> Step size (added/subtracted difference if spin buttons are used). ///> Validation support.
int m_step; int m_min;
int m_min; int m_max;
int m_max;
///> Default value (or non-specified) ///> Evaluator
static const wxString DEFAULT_VALUE; NumericEvaluator m_eval;
bool m_allowEval;
}; };
#endif /* __UNIT_BINDER_H_ */ #endif /* __UNIT_BINDER_H_ */

View File

@ -39,7 +39,6 @@
#include <board_design_settings.h> #include <board_design_settings.h>
#include <class_draw_panel_gal.h> #include <class_draw_panel_gal.h>
#include <view/view.h> #include <view/view.h>
#include <bitmaps.h>
#include <collectors.h> #include <collectors.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/pcb_actions.h> #include <tools/pcb_actions.h>
@ -88,7 +87,10 @@ protected:
DIALOG_DRC_CONTROL::DIALOG_DRC_CONTROL( DRC* aTester, PCB_EDIT_FRAME* aEditorFrame, DIALOG_DRC_CONTROL::DIALOG_DRC_CONTROL( DRC* aTester, PCB_EDIT_FRAME* aEditorFrame,
wxWindow* aParent ) : wxWindow* aParent ) :
DIALOG_DRC_CONTROL_BASE( aParent ) DIALOG_DRC_CONTROL_BASE( aParent ),
m_trackMinWidth( aEditorFrame, m_TrackMinWidthTitle, m_SetTrackMinWidthCtrl, m_TrackMinWidthUnit, true ),
m_viaMinSize( aEditorFrame, m_ViaMinTitle, m_SetViaMinSizeCtrl, m_ViaMinUnit, true ),
m_uviaMinSize( aEditorFrame, m_MicroViaMinTitle, m_SetMicroViakMinSizeCtrl, m_MicroViaMinUnit, true )
{ {
m_config = Kiface().KifaceSettings(); m_config = Kiface().KifaceSettings();
m_tester = aTester; m_tester = aTester;
@ -168,13 +170,9 @@ void DIALOG_DRC_CONTROL::OnActivateDlg( wxActivateEvent& event )
void DIALOG_DRC_CONTROL::DisplayDRCValues() void DIALOG_DRC_CONTROL::DisplayDRCValues()
{ {
m_TrackMinWidthUnit->SetLabel( GetAbbreviatedUnitsLabel( g_UserUnit ) ); m_trackMinWidth.SetValue( m_BrdSettings.m_TrackMinWidth );
m_ViaMinUnit->SetLabel( GetAbbreviatedUnitsLabel( g_UserUnit ) ); m_viaMinSize.SetValue( m_BrdSettings.m_ViasMinSize );
m_MicroViaMinUnit->SetLabel(GetAbbreviatedUnitsLabel( g_UserUnit ) ); m_uviaMinSize.SetValue( m_BrdSettings.m_MicroViasMinSize );
PutValueInLocalUnits( *m_SetTrackMinWidthCtrl, m_BrdSettings.m_TrackMinWidth );
PutValueInLocalUnits( *m_SetViaMinSizeCtrl, m_BrdSettings.m_ViasMinSize );
PutValueInLocalUnits( *m_SetMicroViakMinSizeCtrl, m_BrdSettings.m_MicroViasMinSize );
} }
@ -205,9 +203,9 @@ void DIALOG_DRC_CONTROL::InitValues()
*/ */
void DIALOG_DRC_CONTROL::SetDrcParmeters( ) void DIALOG_DRC_CONTROL::SetDrcParmeters( )
{ {
m_BrdSettings.m_TrackMinWidth = ValueFromTextCtrl( *m_SetTrackMinWidthCtrl ); m_BrdSettings.m_TrackMinWidth = m_trackMinWidth.GetValue();
m_BrdSettings.m_ViasMinSize = ValueFromTextCtrl( *m_SetViaMinSizeCtrl ); m_BrdSettings.m_ViasMinSize = m_viaMinSize.GetValue();
m_BrdSettings.m_MicroViasMinSize = ValueFromTextCtrl( *m_SetMicroViakMinSizeCtrl ); m_BrdSettings.m_MicroViasMinSize = m_uviaMinSize.GetValue();
m_brdEditor->GetBoard()->SetDesignSettings( m_BrdSettings ); m_brdEditor->GetBoard()->SetDesignSettings( m_BrdSettings );
} }

View File

@ -38,6 +38,7 @@
#include <dialog_drc_base.h> #include <dialog_drc_base.h>
#include <dialog_drclistbox.h> #include <dialog_drclistbox.h>
#include <widgets/unit_binder.h>
// forward declarations // forward declarations
class DRCLISTBOX; class DRCLISTBOX;
@ -148,8 +149,13 @@ private:
DRC* m_tester; DRC* m_tester;
PCB_EDIT_FRAME* m_brdEditor; PCB_EDIT_FRAME* m_brdEditor;
wxConfigBase* m_config; wxConfigBase* m_config;
wxString m_markersTitleTemplate; wxString m_markersTitleTemplate;
wxString m_unconnectedTitleTemplate; wxString m_unconnectedTitleTemplate;
UNIT_BINDER m_trackMinWidth;
UNIT_BINDER m_viaMinSize;
UNIT_BINDER m_uviaMinSize;
}; };
#endif // _DIALOG_DRC_H_ #endif // _DIALOG_DRC_H_

View File

@ -26,12 +26,14 @@
#include "dialog_pns_diff_pair_dimensions.h" #include "dialog_pns_diff_pair_dimensions.h"
#include <widgets/text_ctrl_eval.h> #include <widgets/text_ctrl_eval.h>
#include <router/pns_sizes_settings.h> #include <router/pns_sizes_settings.h>
#include <draw_frame.h>
DIALOG_PNS_DIFF_PAIR_DIMENSIONS::DIALOG_PNS_DIFF_PAIR_DIMENSIONS( wxWindow* aParent, PNS::SIZES_SETTINGS& aSizes ) : DIALOG_PNS_DIFF_PAIR_DIMENSIONS::DIALOG_PNS_DIFF_PAIR_DIMENSIONS( EDA_DRAW_FRAME* aParent,
PNS::SIZES_SETTINGS& aSizes ) :
DIALOG_PNS_DIFF_PAIR_DIMENSIONS_BASE( aParent ), DIALOG_PNS_DIFF_PAIR_DIMENSIONS_BASE( aParent ),
m_traceWidth( this, m_traceWidthText, m_traceWidthUnit ), m_traceWidth( aParent, m_traceWidthLabel, m_traceWidthText, m_traceWidthUnit ),
m_traceGap( this, m_traceGapText, m_traceGapUnit ), m_traceGap( aParent, m_traceGapLabel, m_traceGapText, m_traceGapUnit ),
m_viaGap( this, m_viaGapText, m_viaGapUnit ), m_viaGap( aParent, m_viaGapLabel, m_viaGapText, m_viaGapUnit ),
m_sizes( aSizes ) m_sizes( aSizes )
{ {
Layout(); Layout();
@ -44,7 +46,7 @@ DIALOG_PNS_DIFF_PAIR_DIMENSIONS::DIALOG_PNS_DIFF_PAIR_DIMENSIONS( wxWindow* aPar
bool DIALOG_PNS_DIFF_PAIR_DIMENSIONS::TransferDataFromWindow() bool DIALOG_PNS_DIFF_PAIR_DIMENSIONS::TransferDataFromWindow()
{ {
if( !wxDialog::TransferDataToWindow() ) if( !wxDialog::TransferDataFromWindow() )
return false; return false;
// Save widgets' values to settings // Save widgets' values to settings
@ -58,7 +60,7 @@ bool DIALOG_PNS_DIFF_PAIR_DIMENSIONS::TransferDataFromWindow()
bool DIALOG_PNS_DIFF_PAIR_DIMENSIONS::TransferDataToWindow() bool DIALOG_PNS_DIFF_PAIR_DIMENSIONS::TransferDataToWindow()
{ {
if( !wxDialog::TransferDataFromWindow() ) if( !wxDialog::TransferDataToWindow() )
return false; return false;
m_traceWidth.SetValue( m_sizes.DiffPairWidth() ); m_traceWidth.SetValue( m_sizes.DiffPairWidth() );

View File

@ -39,7 +39,7 @@ class SIZES_SETTINGS;
class DIALOG_PNS_DIFF_PAIR_DIMENSIONS : public DIALOG_PNS_DIFF_PAIR_DIMENSIONS_BASE class DIALOG_PNS_DIFF_PAIR_DIMENSIONS : public DIALOG_PNS_DIFF_PAIR_DIMENSIONS_BASE
{ {
public: public:
DIALOG_PNS_DIFF_PAIR_DIMENSIONS( wxWindow* aParent, PNS::SIZES_SETTINGS& aSizes ); DIALOG_PNS_DIFF_PAIR_DIMENSIONS( EDA_DRAW_FRAME* aParent, PNS::SIZES_SETTINGS& aSizes );
bool TransferDataFromWindow() override; bool TransferDataFromWindow() override;
bool TransferDataToWindow() override; bool TransferDataToWindow() override;

View File

@ -27,15 +27,16 @@
#include <router/pns_meander_placer.h> #include <router/pns_meander_placer.h>
#include <widgets/text_ctrl_eval.h> #include <widgets/text_ctrl_eval.h>
#include <bitmaps.h> #include <bitmaps.h>
#include <draw_frame.h>
DIALOG_PNS_LENGTH_TUNING_SETTINGS::DIALOG_PNS_LENGTH_TUNING_SETTINGS( wxWindow* aParent, DIALOG_PNS_LENGTH_TUNING_SETTINGS::DIALOG_PNS_LENGTH_TUNING_SETTINGS( EDA_DRAW_FRAME* aParent,
PNS::MEANDER_SETTINGS& aSettings, PNS::ROUTER_MODE aMode ) PNS::MEANDER_SETTINGS& aSettings, PNS::ROUTER_MODE aMode )
: :
DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE( aParent ), DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE( aParent ),
m_minAmpl( this, m_minAmplText, m_minAmplUnit ), m_minAmpl( aParent, m_minAmplLabel, m_minAmplText, m_minAmplUnit ),
m_maxAmpl( this, m_maxAmplText, m_maxAmplUnit ), m_maxAmpl( aParent, m_maxAmplLabel, m_maxAmplText, m_maxAmplUnit ),
m_spacing( this, m_spacingText, m_spacingUnit ), m_spacing( aParent, m_spacingLabel, m_spacingText, m_spacingUnit ),
m_targetLength( this, m_targetLengthText, m_targetLengthUnit ), m_targetLength( aParent, m_targetLengthLabel, m_targetLengthText, m_targetLengthUnit ),
m_settings( aSettings ), m_settings( aSettings ),
m_mode( aMode ) m_mode( aMode )
{ {

View File

@ -41,7 +41,7 @@ class MEANDER_SETTINGS;
class DIALOG_PNS_LENGTH_TUNING_SETTINGS : public DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE class DIALOG_PNS_LENGTH_TUNING_SETTINGS : public DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE
{ {
public: public:
DIALOG_PNS_LENGTH_TUNING_SETTINGS( wxWindow* aParent, PNS::MEANDER_SETTINGS& aSettings, PNS::ROUTER_MODE aMode ); DIALOG_PNS_LENGTH_TUNING_SETTINGS( EDA_DRAW_FRAME* aParent, PNS::MEANDER_SETTINGS& aSettings, PNS::ROUTER_MODE aMode );
virtual void OnOkClick( wxCommandEvent& aEvent ) override; virtual void OnOkClick( wxCommandEvent& aEvent ) override;

View File

@ -95,9 +95,9 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE::DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE(
fgSizer3->SetFlexibleDirection( wxBOTH ); fgSizer3->SetFlexibleDirection( wxBOTH );
fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText9 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Min amplitude (Amin):"), wxDefaultPosition, wxDefaultSize, 0 ); m_minAmplLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Min amplitude (Amin):"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText9->Wrap( -1 ); m_minAmplLabel->Wrap( -1 );
fgSizer3->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 ); fgSizer3->Add( m_minAmplLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
m_minAmplText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_minAmplText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer3->Add( m_minAmplText, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); fgSizer3->Add( m_minAmplText, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
@ -106,9 +106,9 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE::DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE(
m_minAmplUnit->Wrap( -1 ); m_minAmplUnit->Wrap( -1 );
fgSizer3->Add( m_minAmplUnit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 ); fgSizer3->Add( m_minAmplUnit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 );
m_staticText91 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Max amplitude (Amax):"), wxDefaultPosition, wxDefaultSize, 0 ); m_maxAmplLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Max amplitude (Amax):"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText91->Wrap( -1 ); m_maxAmplLabel->Wrap( -1 );
fgSizer3->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 ); fgSizer3->Add( m_maxAmplLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
m_maxAmplText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_maxAmplText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer3->Add( m_maxAmplText, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); fgSizer3->Add( m_maxAmplText, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
@ -117,9 +117,9 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE::DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE(
m_maxAmplUnit->Wrap( -1 ); m_maxAmplUnit->Wrap( -1 );
fgSizer3->Add( m_maxAmplUnit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 ); fgSizer3->Add( m_maxAmplUnit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT, 5 );
m_staticText11 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Spacing (s):"), wxDefaultPosition, wxDefaultSize, 0 ); m_spacingLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Spacing (s):"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText11->Wrap( -1 ); m_spacingLabel->Wrap( -1 );
fgSizer3->Add( m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 ); fgSizer3->Add( m_spacingLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
m_spacingText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_spacingText = new TEXT_CTRL_EVAL( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer3->Add( m_spacingText, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); fgSizer3->Add( m_spacingText, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
@ -165,7 +165,7 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE::DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE(
m_stdButtons->AddButton( m_stdButtonsCancel ); m_stdButtons->AddButton( m_stdButtonsCancel );
m_stdButtons->Realize(); m_stdButtons->Realize();
bMainSizer->Add( m_stdButtons, 0, wxEXPAND|wxALL, 5 ); bMainSizer->Add( m_stdButtons, 0, wxEXPAND, 5 );
this->SetSizer( bMainSizer ); this->SetSizer( bMainSizer );

View File

@ -1076,7 +1076,7 @@
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_staticText9</property> <property name="name">m_minAmplLabel</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
<property name="pane_position"></property> <property name="pane_position"></property>
<property name="pane_size"></property> <property name="pane_size"></property>
@ -1333,7 +1333,7 @@
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_staticText91</property> <property name="name">m_maxAmplLabel</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
<property name="pane_position"></property> <property name="pane_position"></property>
<property name="pane_size"></property> <property name="pane_size"></property>
@ -1590,7 +1590,7 @@
<property name="minimize_button">0</property> <property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="moveable">1</property> <property name="moveable">1</property>
<property name="name">m_staticText11</property> <property name="name">m_spacingLabel</property>
<property name="pane_border">1</property> <property name="pane_border">1</property>
<property name="pane_position"></property> <property name="pane_position"></property>
<property name="pane_size"></property> <property name="pane_size"></property>
@ -2251,7 +2251,7 @@
</object> </object>
<object class="sizeritem" expanded="0"> <object class="sizeritem" expanded="0">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property> <property name="flag">wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="0"> <object class="wxStdDialogButtonSizer" expanded="0">
<property name="Apply">0</property> <property name="Apply">0</property>

View File

@ -52,13 +52,13 @@ class DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE : public DIALOG_SHIM
TEXT_CTRL_EVAL* m_targetLengthText; TEXT_CTRL_EVAL* m_targetLengthText;
wxStaticText* m_targetLengthUnit; wxStaticText* m_targetLengthUnit;
wxStaticBitmap* m_legend; wxStaticBitmap* m_legend;
wxStaticText* m_staticText9; wxStaticText* m_minAmplLabel;
TEXT_CTRL_EVAL* m_minAmplText; TEXT_CTRL_EVAL* m_minAmplText;
wxStaticText* m_minAmplUnit; wxStaticText* m_minAmplUnit;
wxStaticText* m_staticText91; wxStaticText* m_maxAmplLabel;
TEXT_CTRL_EVAL* m_maxAmplText; TEXT_CTRL_EVAL* m_maxAmplText;
wxStaticText* m_maxAmplUnit; wxStaticText* m_maxAmplUnit;
wxStaticText* m_staticText11; wxStaticText* m_spacingLabel;
TEXT_CTRL_EVAL* m_spacingText; TEXT_CTRL_EVAL* m_spacingText;
wxStaticText* m_spacingUnit; wxStaticText* m_spacingUnit;
wxStaticText* m_staticText14; wxStaticText* m_staticText14;

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -29,8 +29,8 @@
#include <dialog_set_grid_base.h> #include <dialog_set_grid_base.h>
#include <base_units.h> #include <base_units.h>
#include <convert_to_biu.h>
#include <common.h> #include <common.h>
#include <widgets/unit_binder.h>
#include <pcb_base_frame.h> #include <pcb_base_frame.h>
#include <class_drawpanel.h> #include <class_drawpanel.h>
@ -40,20 +40,15 @@
#include <tools/pcb_actions.h> #include <tools/pcb_actions.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <limits.h>
// Max values for grid size // Max values for grid size
static const double MAX_GRID_SIZE = 1000.0 * IU_PER_MM; static const int MAX_GRID_SIZE = KiROUND( 1000.0 * IU_PER_MM );
static const double MIN_GRID_SIZE = 0.001 * IU_PER_MM; static const int MIN_GRID_SIZE = KiROUND( 0.001 * IU_PER_MM );
// Min/Max value for grid offset
static const double MAX_GRID_OFFSET = INT_MAX / 2.0;
class DIALOG_SET_GRID : public DIALOG_SET_GRID_BASE class DIALOG_SET_GRID : public DIALOG_SET_GRID_BASE
{ {
PCB_BASE_FRAME* m_parent; PCB_BASE_FRAME* m_parent;
wxArrayString m_fast_grid_opts; wxArrayString m_fast_grid_opts;
EDA_UNITS_T m_units;
public: public:
/// This has no dependencies on calling wxFrame derivative, such as PCB_BASE_FRAME. /// This has no dependencies on calling wxFrame derivative, such as PCB_BASE_FRAME.
@ -64,72 +59,64 @@ public:
private: private:
void OnResetGridOrgClick( wxCommandEvent& event ) override; void OnResetGridOrgClick( wxCommandEvent& event ) override;
void OnInitDlg( wxInitDialogEvent& event ) override
{
// Call the default wxDialog handler of a wxInitDialogEvent
TransferDataToWindow();
// Now all widgets have the size fixed, call FinishDialogSettings UNIT_BINDER m_gridOriginX;
FinishDialogSettings(); UNIT_BINDER m_gridOriginY;
} UNIT_BINDER m_userGridX;
UNIT_BINDER m_userGridY;
bool getGridSize( wxPoint& aGrisSize );
bool getGridOrigin( wxPoint& aGridOrigin );
}; };
DIALOG_SET_GRID::DIALOG_SET_GRID( PCB_BASE_FRAME* aParent, const wxArrayString& aGridChoices ): DIALOG_SET_GRID::DIALOG_SET_GRID( PCB_BASE_FRAME* aParent, const wxArrayString& aGridChoices ):
DIALOG_SET_GRID_BASE( aParent ), DIALOG_SET_GRID_BASE( aParent ),
m_parent( aParent ), m_parent( aParent ),
m_fast_grid_opts( aGridChoices ) m_fast_grid_opts( aGridChoices ),
m_gridOriginX( aParent, m_staticTextGridPosX, m_GridOriginXCtrl, m_TextPosXUnits ),
m_gridOriginY( aParent, m_staticTextGridPosY, m_GridOriginYCtrl, m_TextPosYUnits ),
m_userGridX( aParent, m_staticTextSizeX, m_OptGridSizeX, m_TextSizeXUnits,
true, MIN_GRID_SIZE, MAX_GRID_SIZE ),
m_userGridY( aParent, m_staticTextSizeY, m_OptGridSizeY, m_TextSizeYUnits,
true, MIN_GRID_SIZE, MAX_GRID_SIZE )
{ {
m_comboBoxGrid1->Append( m_fast_grid_opts );
m_comboBoxGrid2->Append( m_fast_grid_opts );
m_sdbSizerOK->SetDefault(); // set OK button as default response to 'Enter' key m_sdbSizerOK->SetDefault(); // set OK button as default response to 'Enter' key
m_units = m_parent->GetUserUnits(); Layout();
m_TextPosXUnits->SetLabel( GetAbbreviatedUnitsLabel( m_units ) ); // Now all widgets have the size fixed, call FinishDialogSettings
m_TextPosYUnits->SetLabel( GetAbbreviatedUnitsLabel( m_units ) ); FinishDialogSettings();
m_TextSizeXUnits->SetLabel( GetAbbreviatedUnitsLabel( m_units, true ) );
m_TextSizeYUnits->SetLabel( GetAbbreviatedUnitsLabel( m_units, true ) );
} }
bool DIALOG_SET_GRID::TransferDataFromWindow() bool DIALOG_SET_GRID::TransferDataFromWindow()
{ {
// Validate new settings // Validate new settings
wxPoint gridOrigin; if( !m_gridOriginX.Validate( true ) )
if( !getGridOrigin( gridOrigin ) )
{
wxMessageBox( wxString::Format( _( "Invalid grid origin (must be between %.3f mm and %.3f mm)" ),
-MAX_GRID_OFFSET/IU_PER_MM,
MAX_GRID_OFFSET/IU_PER_MM ) );
return false; return false;
}
wxPoint gridSize; if( !m_gridOriginY.Validate( true ) )
return false;
if( !getGridSize( gridSize ) )
{ if( !m_userGridX.Validate( true ) )
wxMessageBox( wxString::Format( _( "Invalid grid size (must be between %.3f mm and %.3f mm)" ), return false;
MIN_GRID_SIZE/IU_PER_MM,
MAX_GRID_SIZE/IU_PER_MM ) ); if( !m_userGridY.Validate( true ) )
return false; return false;
}
// Apply the new settings // Apply the new settings
// Because grid origin is saved in board, show as modified // Because grid origin is saved in board, show as modified
m_parent->OnModify(); m_parent->OnModify();
m_parent->SetGridOrigin( gridOrigin ); m_parent->SetGridOrigin( wxPoint( m_gridOriginX.GetValue(), m_gridOriginY.GetValue() ) );
m_parent->m_UserGridSize = gridSize; m_parent->m_UserGridSize = wxPoint( m_userGridX.GetValue(), m_userGridY.GetValue() );
m_parent->m_FastGrid1 = m_comboBoxGrid1->GetSelection(); m_parent->m_FastGrid1 = m_comboBoxGrid1->GetSelection();
m_parent->m_FastGrid2 = m_comboBoxGrid2->GetSelection(); m_parent->m_FastGrid2 = m_comboBoxGrid2->GetSelection();
// User grid // User grid
BASE_SCREEN* screen = m_parent->GetScreen(); BASE_SCREEN* screen = m_parent->GetScreen();
screen->AddGrid( gridSize, EDA_UNITS_T::UNSCALED_UNITS, ID_POPUP_GRID_USER ); screen->AddGrid( m_parent->m_UserGridSize, EDA_UNITS_T::UNSCALED_UNITS, ID_POPUP_GRID_USER );
// If the user grid is the current option, recall SetGrid() // If the user grid is the current option, recall SetGrid()
// to force new values put in list as current grid value // to force new values put in list as current grid value
@ -145,7 +132,7 @@ bool DIALOG_SET_GRID::TransferDataFromWindow()
screen->GetGridCmdId() - ID_POPUP_GRID_LEVEL_1000 ); screen->GetGridCmdId() - ID_POPUP_GRID_LEVEL_1000 );
TOOL_EVENT gridOriginUpdate = ACTIONS::gridSetOrigin.MakeEvent(); TOOL_EVENT gridOriginUpdate = ACTIONS::gridSetOrigin.MakeEvent();
gridOriginUpdate.SetParameter( new VECTOR2D( gridOrigin ) ); gridOriginUpdate.SetParameter( new VECTOR2D( m_parent->GetGridOrigin() ) );
mgr->ProcessEvent( gridOriginUpdate ); mgr->ProcessEvent( gridOriginUpdate );
} }
@ -155,14 +142,11 @@ bool DIALOG_SET_GRID::TransferDataFromWindow()
bool DIALOG_SET_GRID::TransferDataToWindow() bool DIALOG_SET_GRID::TransferDataToWindow()
{ {
m_OptGridSizeX->SetValue( StringFromValue( m_units, m_parent->m_UserGridSize.x, false, true ) ); m_userGridX.SetValue( m_parent->m_UserGridSize.x );
m_OptGridSizeY->SetValue( StringFromValue( m_units, m_parent->m_UserGridSize.y, false, true ) ); m_userGridY.SetValue( m_parent->m_UserGridSize.y );
m_GridOriginXCtrl->SetValue( StringFromValue( m_units, m_parent->GetGridOrigin().x ) ); m_gridOriginX.SetValue( m_parent->GetGridOrigin().x );
m_GridOriginYCtrl->SetValue( StringFromValue( m_units, m_parent->GetGridOrigin().y ) ); m_gridOriginY.SetValue( m_parent->GetGridOrigin().y );
m_comboBoxGrid1->Append( m_fast_grid_opts );
m_comboBoxGrid2->Append( m_fast_grid_opts );
m_comboBoxGrid1->SetSelection( m_parent->m_FastGrid1 ); m_comboBoxGrid1->SetSelection( m_parent->m_FastGrid1 );
m_comboBoxGrid2->SetSelection( m_parent->m_FastGrid2 ); m_comboBoxGrid2->SetSelection( m_parent->m_FastGrid2 );
@ -171,49 +155,10 @@ bool DIALOG_SET_GRID::TransferDataToWindow()
} }
bool DIALOG_SET_GRID::getGridSize( wxPoint& aGridSize )
{
double x = DoubleValueFromString( m_units, m_OptGridSizeX->GetValue(), true );
if( x < MIN_GRID_SIZE || x > MAX_GRID_SIZE )
return false;
double y = DoubleValueFromString( m_units, m_OptGridSizeY->GetValue(), true );
if( y < MIN_GRID_SIZE || y > MAX_GRID_SIZE )
return false;
aGridSize.x = KiROUND( x );
aGridSize.y = KiROUND( y );
return true;
}
bool DIALOG_SET_GRID::getGridOrigin( wxPoint& aGridOrigin )
{
double x = DoubleValueFromString( m_units, m_GridOriginXCtrl->GetValue() );
// Some error checking here is a good thing.
if( x < -MAX_GRID_OFFSET || x > MAX_GRID_OFFSET )
return false;
double y = DoubleValueFromString( m_units, m_GridOriginYCtrl->GetValue() );
if( y < -MAX_GRID_OFFSET || y > MAX_GRID_OFFSET )
return false;
aGridOrigin.x = KiROUND( x );
aGridOrigin.y = KiROUND( y );
return true;
}
void DIALOG_SET_GRID::OnResetGridOrgClick( wxCommandEvent& event ) void DIALOG_SET_GRID::OnResetGridOrgClick( wxCommandEvent& event )
{ {
m_GridOriginXCtrl->SetValue( wxT( "0" ) ); m_gridOriginX.SetValue( 0 );
m_GridOriginYCtrl->SetValue( wxT( "0" ) ); m_gridOriginY.SetValue( 0 );
} }

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 19 2018) // C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -20,7 +20,7 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
bUpperSizer = new wxBoxSizer( wxHORIZONTAL ); bUpperSizer = new wxBoxSizer( wxHORIZONTAL );
wxStaticBoxSizer* sbLeftSizer; wxStaticBoxSizer* sbLeftSizer;
sbLeftSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Grid Origin:") ), wxVERTICAL ); sbLeftSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Grid Origin") ), wxVERTICAL );
wxFlexGridSizer* fgSizerGridOrigin; wxFlexGridSizer* fgSizerGridOrigin;
fgSizerGridOrigin = new wxFlexGridSizer( 2, 3, 0, 0 ); fgSizerGridOrigin = new wxFlexGridSizer( 2, 3, 0, 0 );
@ -30,40 +30,34 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
m_staticTextGridPosX = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("X:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextGridPosX = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("X:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextGridPosX->Wrap( -1 ); m_staticTextGridPosX->Wrap( -1 );
fgSizerGridOrigin->Add( m_staticTextGridPosX, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT|wxTOP, 5 ); fgSizerGridOrigin->Add( m_staticTextGridPosX, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_GridOriginXCtrl = new wxTextCtrl( sbLeftSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_GridOriginXCtrl = new wxTextCtrl( sbLeftSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizerGridOrigin->Add( m_GridOriginXCtrl, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); fgSizerGridOrigin->Add( m_GridOriginXCtrl, 0, wxEXPAND|wxLEFT, 5 );
m_TextPosXUnits = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); m_TextPosXUnits = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_TextPosXUnits->Wrap( -1 ); m_TextPosXUnits->Wrap( -1 );
fgSizerGridOrigin->Add( m_TextPosXUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxTOP, 5 ); fgSizerGridOrigin->Add( m_TextPosXUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT, 5 );
m_staticTextGridPosY = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextGridPosY = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("Y:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextGridPosY->Wrap( -1 ); m_staticTextGridPosY->Wrap( -1 );
fgSizerGridOrigin->Add( m_staticTextGridPosY, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxTOP, 5 ); fgSizerGridOrigin->Add( m_staticTextGridPosY, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_GridOriginYCtrl = new wxTextCtrl( sbLeftSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_GridOriginYCtrl = new wxTextCtrl( sbLeftSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizerGridOrigin->Add( m_GridOriginYCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); fgSizerGridOrigin->Add( m_GridOriginYCtrl, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
m_TextPosYUnits = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); m_TextPosYUnits = new wxStaticText( sbLeftSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_TextPosYUnits->Wrap( -1 ); m_TextPosYUnits->Wrap( -1 );
fgSizerGridOrigin->Add( m_TextPosYUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT, 5 ); fgSizerGridOrigin->Add( m_TextPosYUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT, 5 );
sbLeftSizer->Add( fgSizerGridOrigin, 1, wxALL|wxEXPAND, 5 ); sbLeftSizer->Add( fgSizerGridOrigin, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_buttonReset = new wxButton( sbLeftSizer->GetStaticBox(), wxID_ANY, _("Reset Grid Origin"), wxDefaultPosition, wxDefaultSize, 0 );
sbLeftSizer->Add( m_buttonReset, 0, wxALL|wxEXPAND, 5 );
bUpperSizer->Add( sbLeftSizer, 0, wxEXPAND|wxALL, 5 ); bUpperSizer->Add( sbLeftSizer, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 );
wxBoxSizer* bRightSizer;
bRightSizer = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbUserGridSizer; wxStaticBoxSizer* sbUserGridSizer;
sbUserGridSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("User Defined Grid:") ), wxVERTICAL ); sbUserGridSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("User Defined Grid") ), wxVERTICAL );
wxFlexGridSizer* fgSizer31; wxFlexGridSizer* fgSizer31;
fgSizer31 = new wxFlexGridSizer( 2, 3, 0, 0 ); fgSizer31 = new wxFlexGridSizer( 2, 3, 0, 0 );
@ -73,10 +67,10 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
m_staticTextSizeX = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("Size X:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextSizeX = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("Size X:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextSizeX->Wrap( -1 ); m_staticTextSizeX->Wrap( -1 );
fgSizer31->Add( m_staticTextSizeX, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT, 5 ); fgSizer31->Add( m_staticTextSizeX, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
m_OptGridSizeX = new wxTextCtrl( sbUserGridSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_OptGridSizeX = new wxTextCtrl( sbUserGridSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer31->Add( m_OptGridSizeX, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); fgSizer31->Add( m_OptGridSizeX, 0, wxEXPAND|wxBOTTOM|wxLEFT, 5 );
m_TextSizeXUnits = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); m_TextSizeXUnits = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_TextSizeXUnits->Wrap( -1 ); m_TextSizeXUnits->Wrap( -1 );
@ -84,23 +78,26 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
m_staticTextSizeY = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("Size Y:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextSizeY = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("Size Y:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextSizeY->Wrap( -1 ); m_staticTextSizeY->Wrap( -1 );
fgSizer31->Add( m_staticTextSizeY, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); fgSizer31->Add( m_staticTextSizeY, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_OptGridSizeY = new wxTextCtrl( sbUserGridSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_OptGridSizeY = new wxTextCtrl( sbUserGridSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer31->Add( m_OptGridSizeY, 0, wxEXPAND|wxLEFT|wxRIGHT, 5 ); fgSizer31->Add( m_OptGridSizeY, 0, wxEXPAND|wxLEFT, 5 );
m_TextSizeYUnits = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); m_TextSizeYUnits = new wxStaticText( sbUserGridSizer->GetStaticBox(), wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
m_TextSizeYUnits->Wrap( -1 ); m_TextSizeYUnits->Wrap( -1 );
fgSizer31->Add( m_TextSizeYUnits, 0, wxALIGN_CENTER_VERTICAL, 5 ); fgSizer31->Add( m_TextSizeYUnits, 0, wxALIGN_CENTER_VERTICAL, 5 );
sbUserGridSizer->Add( fgSizer31, 0, wxALL|wxEXPAND, 5 ); sbUserGridSizer->Add( fgSizer31, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bRightSizer->Add( sbUserGridSizer, 0, wxALL|wxEXPAND, 5 ); bUpperSizer->Add( sbUserGridSizer, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
bSizerMain->Add( bUpperSizer, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
wxStaticBoxSizer* sbFastSwitchSizer; wxStaticBoxSizer* sbFastSwitchSizer;
sbFastSwitchSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Fast Switching:") ), wxVERTICAL ); sbFastSwitchSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Fast Switching") ), wxVERTICAL );
wxFlexGridSizer* fgSizer3; wxFlexGridSizer* fgSizer3;
fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 );
@ -110,29 +107,36 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
m_staticTextGrid1 = new wxStaticText( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, _("Grid 1:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextGrid1 = new wxStaticText( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, _("Grid 1:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextGrid1->Wrap( -1 ); m_staticTextGrid1->Wrap( -1 );
fgSizer3->Add( m_staticTextGrid1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); fgSizer3->Add( m_staticTextGrid1, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_comboBoxGrid1 = new wxComboBox( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY ); m_comboBoxGrid1 = new wxComboBox( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
fgSizer3->Add( m_comboBoxGrid1, 1, wxEXPAND|wxLEFT|wxRIGHT, 5 ); m_comboBoxGrid1->SetMinSize( wxSize( 240,-1 ) );
fgSizer3->Add( m_comboBoxGrid1, 0, wxLEFT, 5 );
m_staticTextGrid2 = new wxStaticText( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, _("Grid 2:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextGrid2 = new wxStaticText( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, _("Grid 2:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextGrid2->Wrap( -1 ); m_staticTextGrid2->Wrap( -1 );
fgSizer3->Add( m_staticTextGrid2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT, 5 ); fgSizer3->Add( m_staticTextGrid2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_comboBoxGrid2 = new wxComboBox( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY ); m_comboBoxGrid2 = new wxComboBox( sbFastSwitchSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
fgSizer3->Add( m_comboBoxGrid2, 1, wxALL|wxEXPAND, 5 ); m_comboBoxGrid2->SetMinSize( wxSize( 240,-1 ) );
fgSizer3->Add( m_comboBoxGrid2, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
sbFastSwitchSizer->Add( fgSizer3, 0, wxEXPAND, 5 ); sbFastSwitchSizer->Add( fgSizer3, 0, wxEXPAND|wxLEFT, 5 );
bRightSizer->Add( sbFastSwitchSizer, 0, wxALL|wxEXPAND, 5 ); bSizerMain->Add( sbFastSwitchSizer, 0, wxEXPAND|wxALL, 5 );
wxBoxSizer* bButtonSizer;
bButtonSizer = new wxBoxSizer( wxHORIZONTAL );
m_buttonReset = new wxButton( this, wxID_ANY, _("Reset Grid Origin"), wxDefaultPosition, wxDefaultSize, 0 );
bButtonSizer->Add( m_buttonReset, 0, wxALL|wxEXPAND, 5 );
bUpperSizer->Add( bRightSizer, 1, wxEXPAND, 5 ); bButtonSizer->Add( 0, 0, 1, wxEXPAND, 5 );
bSizerMain->Add( bUpperSizer, 1, wxEXPAND, 5 );
m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK ); m_sdbSizerOK = new wxButton( this, wxID_OK );
@ -141,7 +145,10 @@ DIALOG_SET_GRID_BASE::DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id, con
m_sdbSizer->AddButton( m_sdbSizerCancel ); m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizer->Realize(); m_sdbSizer->Realize();
bSizerMain->Add( m_sdbSizer, 0, wxEXPAND, 5 ); bButtonSizer->Add( m_sdbSizer, 0, wxEXPAND, 5 );
bSizerMain->Add( bButtonSizer, 0, wxEXPAND|wxLEFT, 5 );
this->SetSizer( bSizerMain ); this->SetSizer( bSizerMain );

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 19 2018) // C++ code generated with wxFormBuilder (version Dec 30 2017)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO *NOT* EDIT THIS FILE!
@ -20,9 +20,9 @@
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/button.h>
#include <wx/statbox.h> #include <wx/statbox.h>
#include <wx/combobox.h> #include <wx/combobox.h>
#include <wx/button.h>
#include <wx/dialog.h> #include <wx/dialog.h>
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -42,7 +42,6 @@ class DIALOG_SET_GRID_BASE : public DIALOG_SHIM
wxStaticText* m_staticTextGridPosY; wxStaticText* m_staticTextGridPosY;
wxTextCtrl* m_GridOriginYCtrl; wxTextCtrl* m_GridOriginYCtrl;
wxStaticText* m_TextPosYUnits; wxStaticText* m_TextPosYUnits;
wxButton* m_buttonReset;
wxStaticText* m_staticTextSizeX; wxStaticText* m_staticTextSizeX;
wxTextCtrl* m_OptGridSizeX; wxTextCtrl* m_OptGridSizeX;
wxStaticText* m_TextSizeXUnits; wxStaticText* m_TextSizeXUnits;
@ -53,6 +52,7 @@ class DIALOG_SET_GRID_BASE : public DIALOG_SHIM
wxComboBox* m_comboBoxGrid1; wxComboBox* m_comboBoxGrid1;
wxStaticText* m_staticTextGrid2; wxStaticText* m_staticTextGrid2;
wxComboBox* m_comboBoxGrid2; wxComboBox* m_comboBoxGrid2;
wxButton* m_buttonReset;
wxStdDialogButtonSizer* m_sdbSizer; wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK; wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel; wxButton* m_sdbSizerCancel;
@ -66,7 +66,7 @@ class DIALOG_SET_GRID_BASE : public DIALOG_SHIM
public: public:
DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Grid Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); DIALOG_SET_GRID_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Grid Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
~DIALOG_SET_GRID_BASE(); ~DIALOG_SET_GRID_BASE();
}; };

View File

@ -28,40 +28,32 @@
#include <class_track.h> #include <class_track.h>
#include <pcb_edit_frame.h> #include <pcb_edit_frame.h>
#include <confirm.h> #include <confirm.h>
#include <widgets/text_ctrl_eval.h>
#include <widgets/widget_net_selector.h> #include <widgets/widget_net_selector.h>
#include <board_commit.h> #include <board_commit.h>
DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent, const SELECTION& aItems ) : #define MIN_SIZE ( int )( 0.001 * IU_PER_MM )
DIALOG_TRACK_VIA_PROPERTIES_BASE( aParent ), m_items( aItems ),
m_trackStartX( aParent, m_TrackStartXCtrl, m_TrackStartXUnit ), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent,
m_trackStartY( aParent, m_TrackStartYCtrl, m_TrackStartYUnit ), const SELECTION& aItems,
m_trackEndX( aParent, m_TrackEndXCtrl, m_TrackEndXUnit ), COMMIT& aCommit ) :
m_trackEndY( aParent, m_TrackEndYCtrl, m_TrackEndYUnit ), DIALOG_TRACK_VIA_PROPERTIES_BASE( aParent ),
m_trackWidth( aParent, m_TrackWidthCtrl, m_TrackWidthUnit ), m_items( aItems ), m_commit( aCommit ),
m_viaX( aParent, m_ViaXCtrl, m_ViaXUnit ), m_viaY( aParent, m_ViaYCtrl, m_ViaYUnit ), m_trackStartX( aParent, m_TrackStartXLabel, m_TrackStartXCtrl, m_TrackStartXUnit ),
m_viaDiameter( aParent, m_ViaDiameterCtrl, m_ViaDiameterUnit ), m_trackStartY( aParent, m_TrackStartYLabel, m_TrackStartYCtrl, m_TrackStartYUnit ),
m_viaDrill( aParent, m_ViaDrillCtrl, m_ViaDrillUnit ), m_trackEndX( aParent, m_TrackEndXLabel, m_TrackEndXCtrl, m_TrackEndXUnit ),
m_tracks( false ), m_vias( false ) m_trackEndY( aParent, m_TrackEndYLabel, m_TrackEndYCtrl, m_TrackEndYUnit ),
m_trackWidth( aParent, m_TrackWidthLabel, m_TrackWidthCtrl, m_TrackWidthUnit, false, MIN_SIZE ),
m_viaX( aParent, m_ViaXLabel, m_ViaXCtrl, m_ViaXUnit ),
m_viaY( aParent, m_ViaYLabel, m_ViaYCtrl, m_ViaYUnit ),
m_viaDiameter( aParent, m_ViaDiameterLabel, m_ViaDiameterCtrl, m_ViaDiameterUnit, false, MIN_SIZE ),
m_viaDrill( aParent, m_ViaDrillLabel, m_ViaDrillCtrl, m_ViaDrillUnit, false, MIN_SIZE ),
m_tracks( false ),
m_vias( false )
{ {
wxASSERT( !m_items.Empty() ); wxASSERT( !m_items.Empty() );
// This is a way to trick gcc into considering these variables as initialized VIATYPE_T viaType = VIA_NOT_DEFINED;
OPT<int> trackStartX( []()->OPT<int> { return NULLOPT; }() );
OPT<int> trackStartY( []()->OPT<int> { return NULLOPT; }() );
OPT<int> trackEndX( []()->OPT<int> { return NULLOPT; }() );
OPT<int> trackEndY( []()->OPT<int> { return NULLOPT; }() );
OPT<int> trackWidth( []()->OPT<int> { return NULLOPT; }() );
OPT<PCB_LAYER_ID> trackLayer( []()->OPT<PCB_LAYER_ID> { return NULLOPT; }() );
OPT<int> viaX( []()->OPT<int> { return NULLOPT; }() );
OPT<int> viaY( []()->OPT<int> { return NULLOPT; }() );
OPT<int> viaDiameter( []()->OPT<int> { return NULLOPT; }() );
OPT<int> viaDrill( []()->OPT<int> { return NULLOPT; }() );
VIATYPE_T viaType = VIA_NOT_DEFINED;
PCB_LAYER_ID viaStartLayer = UNDEFINED_LAYER;
PCB_LAYER_ID viaEndLayer = UNDEFINED_LAYER;
m_haveUniqueNet = true; m_haveUniqueNet = true;
int prevNet = -1; int prevNet = -1;
@ -87,13 +79,9 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
} }
if ( m_haveUniqueNet ) if ( m_haveUniqueNet )
{
m_NetComboBox->SetSelectedNet( prevNet ); m_NetComboBox->SetSelectedNet( prevNet );
}
else else
{
m_NetComboBox->SetMultiple( true ); m_NetComboBox->SetMultiple( true );
}
// Look for values that are common for every item that is selected // Look for values that are common for every item that is selected
@ -107,33 +95,33 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
if( !m_tracks ) // first track in the list if( !m_tracks ) // first track in the list
{ {
trackStartX = t->GetStart().x; m_trackStartX.SetValue( t->GetStart().x );
trackStartY = t->GetStart().y; m_trackStartY.SetValue( t->GetStart().y );
trackEndX = t->GetEnd().x; m_trackEndX.SetValue( t->GetEnd().x );
trackEndY = t->GetEnd().y; m_trackEndY.SetValue( t->GetEnd().y );
trackWidth = t->GetWidth(); m_trackWidth.SetValue( t->GetWidth() );
trackLayer = t->GetLayer(); m_TrackLayerCtrl->SetLayerSelection( t->GetLayer() );
m_tracks = true; m_tracks = true;
} }
else // check if values are the same for every selected track else // check if values are the same for every selected track
{ {
if( trackStartX && ( *trackStartX != t->GetStart().x ) ) if( m_trackStartX.GetValue() != t->GetStart().x )
trackStartX = NULLOPT; m_trackStartX.SetValue( INDETERMINATE );
if( trackStartY && ( *trackStartY != t->GetStart().y ) ) if( m_trackStartY.GetValue() != t->GetStart().y )
trackStartY = NULLOPT; m_trackStartY.SetValue( INDETERMINATE );
if( trackEndX && ( *trackEndX != t->GetEnd().x ) ) if( m_trackEndX.GetValue() != t->GetEnd().x )
trackEndX = NULLOPT; m_trackEndX.SetValue( INDETERMINATE );
if( trackEndY && ( *trackEndY != t->GetEnd().y ) ) if( m_trackEndY.GetValue() != t->GetEnd().y )
trackEndY = NULLOPT; m_trackEndY.SetValue( INDETERMINATE );
if( trackWidth && ( *trackWidth != t->GetWidth() ) ) if( m_trackWidth.GetValue() != t->GetWidth() )
trackWidth = NULLOPT; m_trackWidth.SetValue( INDETERMINATE );
if( trackLayer && ( *trackLayer != t->GetLayer() ) ) if( m_TrackLayerCtrl->GetLayerSelection() != t->GetLayer() )
trackLayer = NULLOPT; m_TrackLayerCtrl->SetLayerSelection( UNDEFINED_LAYER );
} }
if( t->IsLocked() ) if( t->IsLocked() )
@ -150,37 +138,37 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
if( !m_vias ) // first via in the list if( !m_vias ) // first via in the list
{ {
viaX = v->GetPosition().x; m_viaX.SetValue( v->GetPosition().x );
viaY = v->GetPosition().y; m_viaY.SetValue( v->GetPosition().y );
viaDiameter = v->GetWidth(); m_viaDiameter.SetValue( v->GetWidth() );
viaDrill = v->GetDrillValue(); m_viaDrill.SetValue( v->GetDrillValue() );
m_vias = true; m_vias = true;
viaType = v->GetViaType(); viaType = v->GetViaType();
viaStartLayer = v->TopLayer(); m_ViaStartLayer->SetLayerSelection( v->TopLayer() );
viaEndLayer = v->BottomLayer(); m_ViaEndLayer->SetLayerSelection( v->BottomLayer() );
} }
else // check if values are the same for every selected via else // check if values are the same for every selected via
{ {
if( viaX && ( *viaX != v->GetPosition().x ) ) if( m_viaX.GetValue() != v->GetPosition().x )
viaX = NULLOPT; m_viaX.SetValue( INDETERMINATE );
if( viaY && ( *viaY != v->GetPosition().y ) ) if( m_viaY.GetValue() != v->GetPosition().y )
viaY = NULLOPT; m_viaY.SetValue( INDETERMINATE );
if( viaDiameter && ( *viaDiameter != v->GetWidth() ) ) if( m_viaDiameter.GetValue() != v->GetWidth() )
viaDiameter = NULLOPT; m_viaDiameter.SetValue( INDETERMINATE );
if( viaDrill && ( *viaDrill != v->GetDrillValue() ) ) if( m_viaDrill.GetValue() != v->GetDrillValue() )
viaDrill = NULLOPT; m_viaDrill.SetValue( INDETERMINATE );
if( viaType != v->GetViaType() ) if( viaType != v->GetViaType() )
viaType = VIA_NOT_DEFINED; viaType = VIA_NOT_DEFINED;
if( viaStartLayer != v->TopLayer() ) if( m_ViaStartLayer->GetLayerSelection() != v->TopLayer() )
viaStartLayer = UNDEFINED_LAYER; m_ViaStartLayer->SetLayerSelection( UNDEFINED_LAYER );
if( viaEndLayer != v->BottomLayer() ) if( m_ViaEndLayer->GetLayerSelection() != v->BottomLayer() )
viaEndLayer = UNDEFINED_LAYER; m_ViaEndLayer->SetLayerSelection( UNDEFINED_LAYER );
} }
if( v->IsLocked() ) if( v->IsLocked() )
@ -203,24 +191,20 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
if( m_vias ) if( m_vias )
{ {
setCommonVal( viaX, m_ViaXCtrl, m_viaX ); m_DesignRuleViasUnit->SetLabel( GetAbbreviatedUnitsLabel( m_units ) );
setCommonVal( viaY, m_ViaYCtrl, m_viaY );
setCommonVal( viaDiameter, m_ViaDiameterCtrl, m_viaDiameter );
setCommonVal( viaDrill, m_ViaDrillCtrl, m_viaDrill );
m_DesignRuleViasUnit->SetLabel( GetAbbreviatedUnitsLabel( g_UserUnit ) );
int viaSelection = wxNOT_FOUND; int viaSelection = wxNOT_FOUND;
for( unsigned ii = 0; ii < aParent->GetDesignSettings().m_ViasDimensionsList.size(); ii++ ) for( unsigned ii = 0; ii < aParent->GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
{ {
VIA_DIMENSION* viaDimension = &aParent->GetDesignSettings().m_ViasDimensionsList[ii]; VIA_DIMENSION* viaDimension = &aParent->GetDesignSettings().m_ViasDimensionsList[ii];
wxString msg = StringFromValue( g_UserUnit, viaDimension->m_Diameter, false ) wxString msg = StringFromValue( m_units, viaDimension->m_Diameter, false )
+ " / " + StringFromValue( g_UserUnit, viaDimension->m_Drill, false ); + " / " + StringFromValue( m_units, viaDimension->m_Drill, false );
m_DesignRuleViasCtrl->Append( msg, viaDimension ); m_DesignRuleViasCtrl->Append( msg, viaDimension );
if( viaSelection == wxNOT_FOUND && viaDiameter == viaDimension->m_Diameter if( viaSelection == wxNOT_FOUND
&& viaDrill == viaDimension->m_Drill ) && m_viaDiameter.GetValue() == viaDimension->m_Diameter
&& m_viaDrill.GetValue() == viaDimension->m_Drill )
{ {
viaSelection = ii; viaSelection = ii;
} }
@ -246,7 +230,6 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
else if( viaType == VIA_NOT_DEFINED ) else if( viaType == VIA_NOT_DEFINED )
m_ViaTypeChoice->SetSelection( 3 ); m_ViaTypeChoice->SetSelection( 3 );
m_ViaStartLayer->SetLayersHotkeys( false ); m_ViaStartLayer->SetLayersHotkeys( false );
m_ViaStartLayer->SetNotAllowedLayerSet( LSET::AllNonCuMask() ); m_ViaStartLayer->SetNotAllowedLayerSet( LSET::AllNonCuMask() );
m_ViaStartLayer->SetBoardFrame( aParent ); m_ViaStartLayer->SetBoardFrame( aParent );
@ -256,19 +239,8 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
m_ViaEndLayer->SetBoardFrame( aParent ); m_ViaEndLayer->SetBoardFrame( aParent );
m_ViaEndLayer->Resync(); m_ViaEndLayer->Resync();
m_ViaStartLayer->Enable( viaType != VIA_THROUGH );
m_ViaStartLayer->SetLayerSelection( viaStartLayer ); m_ViaEndLayer->Enable( viaType != VIA_THROUGH );
m_ViaEndLayer->SetLayerSelection( viaEndLayer );
m_ViaStartLayer->Enable( false );
m_ViaEndLayer->Enable( false );
if( viaType != VIA_THROUGH ) // check if selected type isnt through.
{
m_ViaStartLayer->Enable();
m_ViaEndLayer->Enable();
}
} }
else else
{ {
@ -277,16 +249,10 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
if( m_tracks ) if( m_tracks )
{ {
setCommonVal( trackStartX, m_TrackStartXCtrl, m_trackStartX );
setCommonVal( trackStartY, m_TrackStartYCtrl, m_trackStartY );
setCommonVal( trackEndX, m_TrackEndXCtrl, m_trackEndX );
setCommonVal( trackEndY, m_TrackEndYCtrl, m_trackEndY );
setCommonVal( trackWidth, m_TrackWidthCtrl, m_trackWidth );
for( unsigned ii = 0; ii < aParent->GetDesignSettings().m_TrackWidthList.size(); ii++ ) for( unsigned ii = 0; ii < aParent->GetDesignSettings().m_TrackWidthList.size(); ii++ )
{ {
int width = aParent->GetDesignSettings().m_TrackWidthList[ii]; int width = aParent->GetDesignSettings().m_TrackWidthList[ii];
wxString msg = StringFromValue( g_UserUnit, width, false ); wxString msg = StringFromValue( m_units, width, false );
m_TrackWidthCtrl->Append( msg ); m_TrackWidthCtrl->Append( msg );
} }
@ -295,9 +261,6 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
m_TrackLayerCtrl->SetBoardFrame( aParent ); m_TrackLayerCtrl->SetBoardFrame( aParent );
m_TrackLayerCtrl->Resync(); m_TrackLayerCtrl->Resync();
if( trackLayer )
m_TrackLayerCtrl->SetLayerSelection( *trackLayer );
m_TrackWidthCtrl->SetFocus(); m_TrackWidthCtrl->SetFocus();
} }
else else
@ -306,38 +269,60 @@ DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParen
} }
if( hasLocked && hasUnlocked ) if( hasLocked && hasUnlocked )
{
m_lockedCbox->Set3StateValue( wxCHK_UNDETERMINED ); m_lockedCbox->Set3StateValue( wxCHK_UNDETERMINED );
}
else if( hasLocked ) else if( hasLocked )
{
m_lockedCbox->Set3StateValue( wxCHK_CHECKED ); m_lockedCbox->Set3StateValue( wxCHK_CHECKED );
}
else else
{
m_lockedCbox->Set3StateValue( wxCHK_UNCHECKED ); m_lockedCbox->Set3StateValue( wxCHK_UNCHECKED );
}
m_StdButtonsOK->SetDefault(); m_StdButtonsOK->SetDefault();
// Pressing ENTER when any of the text input fields is active applies changes // Now all widgets have the size fixed, call FinishDialogSettings
Connect( wxEVT_TEXT_ENTER, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES::onOkClick ), FinishDialogSettings();
NULL, this );
} }
bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit ) bool DIALOG_TRACK_VIA_PROPERTIES::TransferDataFromWindow()
{ {
if( !check() ) // Run validations:
return false;
if( m_vias )
{
if( !m_viaDiameter.Validate( true ) )
return false;
if( !m_viaDrill.Validate( true ) )
return false;
if( !m_trackNetclass->IsChecked() && m_viaDiameter.GetValue() <= m_viaDrill.GetValue() )
{
DisplayError( GetParent(), _( "Via drill size must be smaller than via diameter" ) );
m_ViaDrillCtrl->SelectAll();
m_ViaDrillCtrl->SetFocus();
return false;
}
if( m_ViaStartLayer->GetLayerSelection() == m_ViaEndLayer->GetLayerSelection() )
{
DisplayError( GetParent(), _( "Via start layer and end layer cannot be the same" ) );
return false;
}
}
if( m_tracks )
{
if( !m_trackWidth.Validate( true ) )
return false;
}
// If we survived that, then save the changes:
bool changeLock = m_lockedCbox->Get3StateValue() != wxCHK_UNDETERMINED; bool changeLock = m_lockedCbox->Get3StateValue() != wxCHK_UNDETERMINED;
bool setLock = m_lockedCbox->Get3StateValue() == wxCHK_CHECKED; bool setLock = m_lockedCbox->Get3StateValue() == wxCHK_CHECKED;
for( auto item : m_items ) for( auto item : m_items )
{ {
aCommit.Modify( item ); m_commit.Modify( item );
switch( item->Type() ) switch( item->Type() )
{ {
@ -346,40 +331,22 @@ bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit )
wxASSERT( m_tracks ); wxASSERT( m_tracks );
TRACK* t = static_cast<TRACK*>( item ); TRACK* t = static_cast<TRACK*>( item );
if( m_trackStartX.Valid() || m_trackStartY.Valid() ) if( !m_trackStartX.IsIndeterminate() )
{ t->SetStart( wxPoint( m_trackStartX.GetValue(), t->GetStart().y ) );
wxPoint start = t->GetStart();
if( m_trackStartX.Valid() ) if( !m_trackStartY.IsIndeterminate() )
start.x = m_trackStartX.GetValue(); t->SetStart( wxPoint( t->GetStart().x, m_trackStartY.GetValue() ) );
if( m_trackStartY.Valid() ) if( !m_trackEndX.IsIndeterminate() )
start.y = m_trackStartY.GetValue(); t->SetEnd( wxPoint( m_trackEndX.GetValue(), t->GetEnd().y ) );
t->SetStart( start ); if( !m_trackEndY.IsIndeterminate() )
} t->SetEnd( wxPoint( t->GetEnd().x, m_trackEndY.GetValue() ) );
if( m_trackEndX.Valid() || m_trackEndY.Valid() )
{
wxPoint end = t->GetEnd();
if( m_trackEndX.Valid() )
end.x = m_trackEndX.GetValue();
if( m_trackEndY.Valid() )
end.y = m_trackEndY.GetValue();
t->SetEnd( end );
}
if( m_trackNetclass->IsChecked() ) if( m_trackNetclass->IsChecked() )
{
t->SetWidth( t->GetNetClass()->GetTrackWidth() ); t->SetWidth( t->GetNetClass()->GetTrackWidth() );
} else if( !m_trackWidth.IsIndeterminate() )
else if( m_trackWidth.Valid() )
{
t->SetWidth( m_trackWidth.GetValue() ); t->SetWidth( m_trackWidth.GetValue() );
}
LAYER_NUM layer = m_TrackLayerCtrl->GetLayerSelection(); LAYER_NUM layer = m_TrackLayerCtrl->GetLayerSelection();
@ -395,28 +362,15 @@ bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit )
t->SetNetCode( m_NetComboBox->GetSelectedNet() ); t->SetNetCode( m_NetComboBox->GetSelectedNet() );
} }
break; break;
} }
case PCB_VIA_T: case PCB_VIA_T:
{ {
wxASSERT( m_vias ); wxASSERT( m_vias );
VIA* v = static_cast<VIA*>( item ); VIA* v = static_cast<VIA*>( item );
if( m_viaX.Valid() || m_viaY.Valid() ) v->SetPosition( wxPoint( m_viaX.GetValue(), m_viaY.GetValue() ) );
{
wxPoint pos = v->GetPosition();
if( m_viaX.Valid() )
pos.x = m_viaX.GetValue();
if( m_viaY.Valid() )
pos.y = m_viaY.GetValue();
v->SetPosition( pos );
}
if( m_ViaTypeChoice->GetSelection() != 3) if( m_ViaTypeChoice->GetSelection() != 3)
{ {
@ -435,7 +389,6 @@ bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit )
default: default:
break; break;
} }
} }
auto startLayer = static_cast<PCB_LAYER_ID>( m_ViaStartLayer->GetLayerSelection() ); auto startLayer = static_cast<PCB_LAYER_ID>( m_ViaStartLayer->GetLayerSelection() );
@ -472,12 +425,11 @@ bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit )
} }
else else
{ {
if( m_viaDiameter.Valid() ) if( !m_viaDiameter.IsIndeterminate() )
v->SetWidth( m_viaDiameter.GetValue() ); v->SetWidth( m_viaDiameter.GetValue() );
if( m_viaDrill.Valid() ) if( !m_viaDrill.IsIndeterminate() )
v->SetDrill( m_viaDrill.GetValue() ); v->SetDrill( m_viaDrill.GetValue() );
} }
if ( m_NetComboBox->IsUniqueNetSelected() ) if ( m_NetComboBox->IsUniqueNetSelected() )
@ -498,23 +450,17 @@ bool DIALOG_TRACK_VIA_PROPERTIES::Apply( COMMIT& aCommit )
} }
} }
m_commit.Push( _( "Edit track/via properties" ) );
return true; return true;
} }
void DIALOG_TRACK_VIA_PROPERTIES::onClose( wxCloseEvent& aEvent )
{
EndModal( 0 );
}
void DIALOG_TRACK_VIA_PROPERTIES::onTrackNetclassCheck( wxCommandEvent& aEvent ) void DIALOG_TRACK_VIA_PROPERTIES::onTrackNetclassCheck( wxCommandEvent& aEvent )
{ {
bool enableNC = aEvent.IsChecked(); bool enableNC = aEvent.IsChecked();
m_TrackWidthLabel->Enable( !enableNC ); m_trackWidth.Enable( !enableNC );
m_TrackWidthCtrl->Enable( !enableNC );
m_TrackWidthUnit->Enable( !enableNC );
} }
@ -526,26 +472,8 @@ void DIALOG_TRACK_VIA_PROPERTIES::onViaNetclassCheck( wxCommandEvent& aEvent )
m_DesignRuleViasCtrl->Enable( !enableNC ); m_DesignRuleViasCtrl->Enable( !enableNC );
m_DesignRuleViasUnit->Enable( !enableNC ); m_DesignRuleViasUnit->Enable( !enableNC );
m_ViaDiameterLabel->Enable( !enableNC ); m_viaDiameter.Enable( !enableNC );
m_ViaDiameterCtrl->Enable( !enableNC ); m_viaDrill.Enable( !enableNC );
m_ViaDiameterUnit->Enable( !enableNC );
m_ViaDrillLabel->Enable( !enableNC );
m_ViaDrillCtrl->Enable( !enableNC );
m_ViaDrillUnit->Enable( !enableNC );
}
void DIALOG_TRACK_VIA_PROPERTIES::onCancelClick( wxCommandEvent& aEvent )
{
EndModal( 0 );
}
void DIALOG_TRACK_VIA_PROPERTIES::onOkClick( wxCommandEvent& aEvent )
{
if( check() )
EndModal( 1 );
} }
@ -553,11 +481,8 @@ void DIALOG_TRACK_VIA_PROPERTIES::onViaSelect( wxCommandEvent& aEvent )
{ {
VIA_DIMENSION* viaDimension = static_cast<VIA_DIMENSION*> ( aEvent.GetClientData() ); VIA_DIMENSION* viaDimension = static_cast<VIA_DIMENSION*> ( aEvent.GetClientData() );
wxString msg = StringFromValue( g_UserUnit, viaDimension->m_Diameter, false ); m_viaDiameter.SetValue( viaDimension->m_Diameter );
m_ViaDiameterCtrl->ChangeValue( msg ); m_viaDrill.SetValue( viaDimension->m_Drill );
msg = StringFromValue( g_UserUnit, viaDimension->m_Drill, false );
m_ViaDrillCtrl->ChangeValue( msg );
} }
@ -581,55 +506,4 @@ void DIALOG_TRACK_VIA_PROPERTIES::onViaEdit( wxCommandEvent& aEvent )
m_ViaEndLayer->Enable( false ); m_ViaEndLayer->Enable( false );
} }
} }
}
bool DIALOG_TRACK_VIA_PROPERTIES::check() const
{
bool trackNetclass = m_trackNetclass->IsChecked();
bool viaNetclass = m_trackNetclass->IsChecked();
if( m_tracks && !trackNetclass && m_trackWidth.Valid() && m_trackWidth.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid track width" ) );
m_TrackWidthCtrl->SetFocus();
return false;
}
if( m_vias && !viaNetclass )
{
if( m_viaDiameter.Valid() && m_viaDiameter.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid via diameter" ) );
m_ViaDiameterCtrl->SetFocus();
return false;
}
if( m_viaDrill.Valid() && m_viaDrill.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid via drill size" ) );
m_ViaDrillCtrl->SetFocus();
return false;
}
if( m_viaDiameter.Valid() && m_viaDrill.Valid() && m_viaDiameter.GetValue() <= m_viaDrill.GetValue() )
{
DisplayError( GetParent(), _( "Via drill size has to be smaller than via diameter" ) );
m_ViaDrillCtrl->SetFocus();
return false;
}
}
if( m_vias)
{
if( m_ViaStartLayer->GetLayerSelection() == m_ViaEndLayer->GetLayerSelection() )
{
DisplayError( GetParent(), _( "Via start layer and end layer cannot be the same" ) );
return false;
}
}
return true;
} }

View File

@ -35,57 +35,29 @@ class PCB_BASE_FRAME;
class DIALOG_TRACK_VIA_PROPERTIES : public DIALOG_TRACK_VIA_PROPERTIES_BASE class DIALOG_TRACK_VIA_PROPERTIES : public DIALOG_TRACK_VIA_PROPERTIES_BASE
{ {
public: public:
DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent, const SELECTION& aItems ); DIALOG_TRACK_VIA_PROPERTIES( PCB_BASE_FRAME* aParent, const SELECTION& aItems,
COMMIT& aCommit );
///> Applies values from the dialog to the selected items. bool TransferDataFromWindow() override;
bool Apply( COMMIT& aCommit );
private: private:
void onClose( wxCloseEvent& aEvent ) override;
void onTrackNetclassCheck( wxCommandEvent& aEvent ) override; void onTrackNetclassCheck( wxCommandEvent& aEvent ) override;
void onViaNetclassCheck( wxCommandEvent& aEvent ) override; void onViaNetclassCheck( wxCommandEvent& aEvent ) override;
void onCancelClick( wxCommandEvent& aEvent ) override;
void onOkClick( wxCommandEvent& aEvent ) override;
void onViaSelect( wxCommandEvent& aEvent ); void onViaSelect( wxCommandEvent& aEvent );
void onViaEdit( wxCommandEvent& aEvent ); void onViaEdit( wxCommandEvent& aEvent );
void OnInitDlg( wxInitDialogEvent& event ) override const SELECTION& m_items; // List of items to be modified.
{ COMMIT& m_commit; // An undo record to add any changes to.
// Call the default wxDialog handler of a wxInitDialogEvent
TransferDataToWindow();
// Now all widgets have the size fixed, call FinishDialogSettings UNIT_BINDER m_trackStartX, m_trackStartY;
FinishDialogSettings(); UNIT_BINDER m_trackEndX, m_trackEndY;
} UNIT_BINDER m_trackWidth;
///> Checks if the dialog values are correct. UNIT_BINDER m_viaX, m_viaY;
bool check() const; UNIT_BINDER m_viaDiameter, m_viaDrill;
///> Sets wxTextEntry to the value stored in OPT<T> or "<...>" if it is not available. bool m_tracks; // True if dialog displays any track properties.
template<typename T> bool m_vias; // True if dialog displays any via properties.
void setCommonVal( const OPT<T>& aVal, wxTextEntry* aTxtEntry, UNIT_BINDER& aBinder )
{
if( aVal )
aBinder.SetValue( *aVal );
else
aTxtEntry->SetValue( "<...>" );
}
///> Selected items to be modified.
const SELECTION& m_items;
UNIT_BINDER m_trackStartX, m_trackStartY;
UNIT_BINDER m_trackEndX, m_trackEndY;
UNIT_BINDER m_trackWidth;
UNIT_BINDER m_viaX, m_viaY;
UNIT_BINDER m_viaDiameter, m_viaDrill;
///> Flag that determines if the dialog displays track properties.
bool m_tracks;
///> Flag that determines if the dialog displays via properties.
bool m_vias;
///> Fixme ///> Fixme
bool m_haveUniqueNet; bool m_haveUniqueNet;

View File

@ -6,7 +6,6 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "pcb_layer_box_selector.h" #include "pcb_layer_box_selector.h"
#include "widgets/text_ctrl_eval.h"
#include "widgets/widget_net_selector.h" #include "widgets/widget_net_selector.h"
#include "dialog_track_via_properties_base.h" #include "dialog_track_via_properties_base.h"
@ -19,191 +18,213 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_MainSizer = new wxBoxSizer( wxVERTICAL ); m_MainSizer = new wxBoxSizer( wxVERTICAL );
m_sbCommonSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Common:") ), wxHORIZONTAL ); m_sbCommonSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Common") ), wxHORIZONTAL );
m_staticText24 = new wxStaticText( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText24 = new wxStaticText( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Net:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText24->Wrap( -1 ); m_staticText24->Wrap( -1 );
m_sbCommonSizer->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); m_sbCommonSizer->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_NetComboBox = new WIDGET_NET_SELECTOR( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxCB_READONLY ); m_NetComboBox = new WIDGET_NET_SELECTOR( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxCB_READONLY );
m_sbCommonSizer->Add( m_NetComboBox, 1, wxALL|wxEXPAND, 5 ); m_sbCommonSizer->Add( m_NetComboBox, 6, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_sbCommonSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_lockedCbox = new wxCheckBox( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Locked"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE ); m_lockedCbox = new wxCheckBox( m_sbCommonSizer->GetStaticBox(), wxID_ANY, _("Locked"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
m_sbCommonSizer->Add( m_lockedCbox, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); m_sbCommonSizer->Add( m_lockedCbox, 2, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_MainSizer->Add( m_sbCommonSizer, 0, wxEXPAND|wxALL, 5 ); m_MainSizer->Add( m_sbCommonSizer, 0, wxEXPAND|wxALL, 5 );
m_sbTrackSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Tracks:") ), wxHORIZONTAL ); m_sbTrackSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Tracks") ), wxHORIZONTAL );
wxFlexGridSizer* fgTrackLeftGridSizer; wxFlexGridSizer* fgTrackLeftGridSizer;
fgTrackLeftGridSizer = new wxFlexGridSizer( 4, 3, 5, 5 ); fgTrackLeftGridSizer = new wxFlexGridSizer( 6, 3, 5, 5 );
fgTrackLeftGridSizer->AddGrowableCol( 1 );
fgTrackLeftGridSizer->SetFlexibleDirection( wxBOTH ); fgTrackLeftGridSizer->SetFlexibleDirection( wxBOTH );
fgTrackLeftGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); fgTrackLeftGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_TrackStartXLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Start point X:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartXLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Start point X:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackStartXLabel->Wrap( -1 ); m_TrackStartXLabel->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackStartXLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartXLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 3 );
m_TrackStartXCtrl = new TEXT_CTRL_EVAL( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartXCtrl = new wxTextCtrl( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgTrackLeftGridSizer->Add( m_TrackStartXCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartXCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 3 );
m_TrackStartXUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartXUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackStartXUnit->Wrap( -1 ); m_TrackStartXUnit->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackStartXUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartXUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 3 );
m_TrackStartYLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Start point Y:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartYLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Start point Y:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackStartYLabel->Wrap( -1 ); m_TrackStartYLabel->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackStartYLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartYLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
m_TrackStartYCtrl = new TEXT_CTRL_EVAL( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartYCtrl = new wxTextCtrl( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgTrackLeftGridSizer->Add( m_TrackStartYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND, 5 );
m_TrackStartYUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackStartYUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackStartYUnit->Wrap( -1 ); m_TrackStartYUnit->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackStartYUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackStartYUnit, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
m_TrackEndXLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("End point X:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndXLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("End point X:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackEndXLabel->Wrap( -1 ); m_TrackEndXLabel->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackEndXLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndXLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
m_TrackEndXCtrl = new TEXT_CTRL_EVAL( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndXCtrl = new wxTextCtrl( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgTrackLeftGridSizer->Add( m_TrackEndXCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndXCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
m_TrackEndXUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndXUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackEndXUnit->Wrap( -1 ); m_TrackEndXUnit->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackEndXUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndXUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 );
m_TrackEndYLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("End point Y:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndYLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("End point Y:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackEndYLabel->Wrap( -1 ); m_TrackEndYLabel->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackEndYLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndYLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
m_TrackEndYCtrl = new TEXT_CTRL_EVAL( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndYCtrl = new wxTextCtrl( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgTrackLeftGridSizer->Add( m_TrackEndYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND, 5 );
m_TrackEndYUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackEndYUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackEndYUnit->Wrap( -1 ); m_TrackEndYUnit->Wrap( -1 );
fgTrackLeftGridSizer->Add( m_TrackEndYUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackEndYUnit, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
m_sbTrackSizer->Add( fgTrackLeftGridSizer, 1, wxEXPAND, 5 );
wxFlexGridSizer* fgTrackRightSizer;
fgTrackRightSizer = new wxFlexGridSizer( 4, 3, 5, 5 );
fgTrackRightSizer->SetFlexibleDirection( wxBOTH );
fgTrackRightSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_TrackWidthLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Width:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackWidthLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Width:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackWidthLabel->Wrap( -1 ); m_TrackWidthLabel->Wrap( -1 );
fgTrackRightSizer->Add( m_TrackWidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxRIGHT, 5 ); fgTrackLeftGridSizer->Add( m_TrackWidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
m_TrackWidthCtrl = new wxComboBox( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxTE_PROCESS_ENTER ); m_TrackWidthCtrl = new wxComboBox( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxTE_PROCESS_ENTER );
fgTrackRightSizer->Add( m_TrackWidthCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( m_TrackWidthCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
m_TrackWidthUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackWidthUnit = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackWidthUnit->Wrap( -1 ); m_TrackWidthUnit->Wrap( -1 );
fgTrackRightSizer->Add( m_TrackWidthUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgTrackLeftGridSizer->Add( m_TrackWidthUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 );
fgTrackRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_trackNetclass = new wxCheckBox( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Use net class width"), wxDefaultPosition, wxDefaultSize, 0 ); m_trackNetclass = new wxCheckBox( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Use net class width"), wxDefaultPosition, wxDefaultSize, 0 );
fgTrackRightSizer->Add( m_trackNetclass, 0, wxBOTTOM|wxTOP, 5 ); fgTrackLeftGridSizer->Add( m_trackNetclass, 0, wxBOTTOM, 5 );
fgTrackRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); fgTrackLeftGridSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_sbTrackSizer->Add( fgTrackLeftGridSizer, 5, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_sbTrackSizer->Add( 0, 0, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 );
wxFlexGridSizer* fgTrackRightSizer;
fgTrackRightSizer = new wxFlexGridSizer( 1, 3, 5, 5 );
fgTrackRightSizer->AddGrowableCol( 1 );
fgTrackRightSizer->SetFlexibleDirection( wxBOTH );
fgTrackRightSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_TrackLayerLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); m_TrackLayerLabel = new wxStaticText( m_sbTrackSizer->GetStaticBox(), wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TrackLayerLabel->Wrap( -1 ); m_TrackLayerLabel->Wrap( -1 );
fgTrackRightSizer->Add( m_TrackLayerLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgTrackRightSizer->Add( m_TrackLayerLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_TrackLayerCtrl = new PCB_LAYER_BOX_SELECTOR( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); m_TrackLayerCtrl = new PCB_LAYER_BOX_SELECTOR( m_sbTrackSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgTrackRightSizer->Add( m_TrackLayerCtrl, 0, wxALIGN_CENTER_VERTICAL, 5 ); fgTrackRightSizer->Add( m_TrackLayerCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
fgTrackRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); fgTrackRightSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_sbTrackSizer->Add( fgTrackRightSizer, 1, wxEXPAND, 5 ); m_sbTrackSizer->Add( fgTrackRightSizer, 4, wxEXPAND|wxLEFT, 10 );
m_MainSizer->Add( m_sbTrackSizer, 0, wxALL|wxEXPAND, 5 ); m_MainSizer->Add( m_sbTrackSizer, 0, wxALL|wxEXPAND, 5 );
m_sbViaSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Vias:") ), wxHORIZONTAL ); m_sbViaSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Vias") ), wxHORIZONTAL );
wxFlexGridSizer* fgViaLeftSizer; wxFlexGridSizer* fgViaLeftSizer;
fgViaLeftSizer = new wxFlexGridSizer( 4, 3, 5, 5 ); fgViaLeftSizer = new wxFlexGridSizer( 6, 3, 5, 5 );
fgViaLeftSizer->AddGrowableCol( 1 );
fgViaLeftSizer->SetFlexibleDirection( wxBOTH ); fgViaLeftSizer->SetFlexibleDirection( wxBOTH );
fgViaLeftSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); fgViaLeftSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_ViaXLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Position X:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaXLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Position X:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaXLabel->Wrap( -1 ); m_ViaXLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaXLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgViaLeftSizer->Add( m_ViaXLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 3 );
m_ViaXCtrl = new TEXT_CTRL_EVAL( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_ViaXCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaXCtrl, 0, wxEXPAND, 5 ); fgViaLeftSizer->Add( m_ViaXCtrl, 0, wxEXPAND|wxTOP, 3 );
m_ViaXUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaXUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaXUnit->Wrap( -1 ); m_ViaXUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaXUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgViaLeftSizer->Add( m_ViaXUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 3 );
m_ViaYLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Position Y:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaYLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Position Y:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaYLabel->Wrap( -1 ); m_ViaYLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaYLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgViaLeftSizer->Add( m_ViaYLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
m_ViaYCtrl = new TEXT_CTRL_EVAL( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_ViaYCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgViaLeftSizer->Add( m_ViaYCtrl, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND, 5 );
m_ViaYUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaYUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaYUnit->Wrap( -1 ); m_ViaYUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaYUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgViaLeftSizer->Add( m_ViaYUnit, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
m_ViaDiameterLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Diameter:"), wxDefaultPosition, wxDefaultSize, 0 ); m_DesignRuleVias = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Design rules:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDiameterLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_ViaDiameterCtrl = new TEXT_CTRL_EVAL( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaDiameterCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDiameterUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDiameterUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_ViaDrillLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Drill:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDrillLabel, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_ViaDrillCtrl = new TEXT_CTRL_EVAL( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaDrillCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDrillUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDrillUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sbViaSizer->Add( fgViaLeftSizer, 1, wxEXPAND|wxALL, 5 );
wxFlexGridSizer* fgViaRightSizer;
fgViaRightSizer = new wxFlexGridSizer( 5, 3, 5, 5 );
fgViaRightSizer->SetFlexibleDirection( wxBOTH );
fgViaRightSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_DesignRuleVias = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Design rule vias:"), wxDefaultPosition, wxDefaultSize, 0 );
m_DesignRuleVias->Wrap( -1 ); m_DesignRuleVias->Wrap( -1 );
fgViaRightSizer->Add( m_DesignRuleVias, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgViaLeftSizer->Add( m_DesignRuleVias, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
wxArrayString m_DesignRuleViasCtrlChoices; wxArrayString m_DesignRuleViasCtrlChoices;
m_DesignRuleViasCtrl = new wxChoice( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_DesignRuleViasCtrlChoices, 0 ); m_DesignRuleViasCtrl = new wxChoice( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_DesignRuleViasCtrlChoices, 0 );
m_DesignRuleViasCtrl->SetSelection( 0 ); m_DesignRuleViasCtrl->SetSelection( 0 );
fgViaRightSizer->Add( m_DesignRuleViasCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); fgViaLeftSizer->Add( m_DesignRuleViasCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
m_DesignRuleViasUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 ); m_DesignRuleViasUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_DesignRuleViasUnit->Wrap( -1 ); m_DesignRuleViasUnit->Wrap( -1 );
fgViaRightSizer->Add( m_DesignRuleViasUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgViaLeftSizer->Add( m_DesignRuleViasUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 );
m_ViaDiameterLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Diameter:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDiameterLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_ViaDiameterCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaDiameterCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDiameterUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDiameterUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDiameterUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_ViaDrillLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Drill:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillLabel->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDrillLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_ViaDrillCtrl = new wxTextCtrl( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_ViaDrillCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_ViaDrillUnit = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaDrillUnit->Wrap( -1 );
fgViaLeftSizer->Add( m_ViaDrillUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
fgViaLeftSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_viaNetclass = new wxCheckBox( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Use net class size"), wxDefaultPosition, wxDefaultSize, 0 );
fgViaLeftSizer->Add( m_viaNetclass, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
fgViaLeftSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_sbViaSizer->Add( fgViaLeftSizer, 5, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_sbViaSizer->Add( 0, 0, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 );
wxFlexGridSizer* fgViaRightSizer;
fgViaRightSizer = new wxFlexGridSizer( 3, 3, 5, 5 );
fgViaRightSizer->AddGrowableCol( 1 );
fgViaRightSizer->SetFlexibleDirection( wxBOTH );
fgViaRightSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_ViaTypeLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Via type:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaTypeLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Via type:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaTypeLabel->Wrap( -1 ); m_ViaTypeLabel->Wrap( -1 );
fgViaRightSizer->Add( m_ViaTypeLabel, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgViaRightSizer->Add( m_ViaTypeLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP, 5 );
wxString m_ViaTypeChoiceChoices[] = { _("Through"), _("Micro"), _("Blind/buried"), wxEmptyString }; wxString m_ViaTypeChoiceChoices[] = { _("Through"), _("Micro"), _("Blind/buried"), wxEmptyString };
int m_ViaTypeChoiceNChoices = sizeof( m_ViaTypeChoiceChoices ) / sizeof( wxString ); int m_ViaTypeChoiceNChoices = sizeof( m_ViaTypeChoiceChoices ) / sizeof( wxString );
@ -211,14 +232,14 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_ViaTypeChoice->SetSelection( 0 ); m_ViaTypeChoice->SetSelection( 0 );
m_ViaTypeChoice->Enable( false ); m_ViaTypeChoice->Enable( false );
fgViaRightSizer->Add( m_ViaTypeChoice, 0, wxEXPAND, 5 ); fgViaRightSizer->Add( m_ViaTypeChoice, 0, wxEXPAND|wxLEFT, 5 );
fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_ViaStartLayerLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Start layer:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaStartLayerLabel = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Start layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaStartLayerLabel->Wrap( -1 ); m_ViaStartLayerLabel->Wrap( -1 );
fgViaRightSizer->Add( m_ViaStartLayerLabel, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); fgViaRightSizer->Add( m_ViaStartLayerLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_ViaStartLayer = new PCB_LAYER_BOX_SELECTOR( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); m_ViaStartLayer = new PCB_LAYER_BOX_SELECTOR( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgViaRightSizer->Add( m_ViaStartLayer, 0, wxEXPAND, 5 ); fgViaRightSizer->Add( m_ViaStartLayer, 0, wxEXPAND, 5 );
@ -228,7 +249,7 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_ViaEndLayerLabel1 = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("End layer:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ViaEndLayerLabel1 = new wxStaticText( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("End layer:"), wxDefaultPosition, wxDefaultSize, 0 );
m_ViaEndLayerLabel1->Wrap( -1 ); m_ViaEndLayerLabel1->Wrap( -1 );
fgViaRightSizer->Add( m_ViaEndLayerLabel1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); fgViaRightSizer->Add( m_ViaEndLayerLabel1, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_ViaEndLayer = new PCB_LAYER_BOX_SELECTOR( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); m_ViaEndLayer = new PCB_LAYER_BOX_SELECTOR( m_sbViaSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgViaRightSizer->Add( m_ViaEndLayer, 0, wxEXPAND, 5 ); fgViaRightSizer->Add( m_ViaEndLayer, 0, wxEXPAND, 5 );
@ -237,16 +258,7 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 );
fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 ); m_sbViaSizer->Add( fgViaRightSizer, 4, wxEXPAND|wxLEFT, 10 );
m_viaNetclass = new wxCheckBox( m_sbViaSizer->GetStaticBox(), wxID_ANY, _("Use net class size"), wxDefaultPosition, wxDefaultSize, 0 );
fgViaRightSizer->Add( m_viaNetclass, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP, 5 );
fgViaRightSizer->Add( 0, 0, 1, wxEXPAND, 5 );
m_sbViaSizer->Add( fgViaRightSizer, 1, wxEXPAND|wxALL, 5 );
m_MainSizer->Add( m_sbViaSizer, 0, wxALL|wxEXPAND, 5 ); m_MainSizer->Add( m_sbViaSizer, 0, wxALL|wxEXPAND, 5 );
@ -261,7 +273,7 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
m_StdButtons->AddButton( m_StdButtonsCancel ); m_StdButtons->AddButton( m_StdButtonsCancel );
m_StdButtons->Realize(); m_StdButtons->Realize();
m_MainSizer->Add( m_StdButtons, 0, wxALL|wxEXPAND, 5 ); m_MainSizer->Add( m_StdButtons, 0, wxEXPAND, 5 );
this->SetSizer( m_MainSizer ); this->SetSizer( m_MainSizer );
@ -271,24 +283,16 @@ DIALOG_TRACK_VIA_PROPERTIES_BASE::DIALOG_TRACK_VIA_PROPERTIES_BASE( wxWindow* pa
this->Centre( wxBOTH ); this->Centre( wxBOTH );
// Connect Events // Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onClose ) );
this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::OnInitDlg ) );
m_TrackWidthCtrl->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this ); m_TrackWidthCtrl->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this );
m_trackNetclass->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackNetclassCheck ), NULL, this ); m_trackNetclass->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackNetclassCheck ), NULL, this );
m_viaNetclass->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNetclassCheck ), NULL, this ); m_viaNetclass->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNetclassCheck ), NULL, this );
m_StdButtonsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onCancelClick ), NULL, this );
m_StdButtonsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this );
} }
DIALOG_TRACK_VIA_PROPERTIES_BASE::~DIALOG_TRACK_VIA_PROPERTIES_BASE() DIALOG_TRACK_VIA_PROPERTIES_BASE::~DIALOG_TRACK_VIA_PROPERTIES_BASE()
{ {
// Disconnect Events // Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onClose ) );
this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::OnInitDlg ) );
m_TrackWidthCtrl->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this ); m_TrackWidthCtrl->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this );
m_trackNetclass->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackNetclassCheck ), NULL, this ); m_trackNetclass->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onTrackNetclassCheck ), NULL, this );
m_viaNetclass->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNetclassCheck ), NULL, this ); m_viaNetclass->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onViaNetclassCheck ), NULL, this );
m_StdButtonsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onCancelClick ), NULL, this );
m_StdButtonsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TRACK_VIA_PROPERTIES_BASE::onOkClick ), NULL, this );
} }

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,6 @@
#include <wx/xrc/xmlres.h> #include <wx/xrc/xmlres.h>
#include <wx/intl.h> #include <wx/intl.h>
class PCB_LAYER_BOX_SELECTOR; class PCB_LAYER_BOX_SELECTOR;
class TEXT_CTRL_EVAL;
class WIDGET_NET_SELECTOR; class WIDGET_NET_SELECTOR;
#include "dialog_shim.h" #include "dialog_shim.h"
@ -50,16 +49,16 @@ class DIALOG_TRACK_VIA_PROPERTIES_BASE : public DIALOG_SHIM
wxCheckBox* m_lockedCbox; wxCheckBox* m_lockedCbox;
wxStaticBoxSizer* m_sbTrackSizer; wxStaticBoxSizer* m_sbTrackSizer;
wxStaticText* m_TrackStartXLabel; wxStaticText* m_TrackStartXLabel;
TEXT_CTRL_EVAL* m_TrackStartXCtrl; wxTextCtrl* m_TrackStartXCtrl;
wxStaticText* m_TrackStartXUnit; wxStaticText* m_TrackStartXUnit;
wxStaticText* m_TrackStartYLabel; wxStaticText* m_TrackStartYLabel;
TEXT_CTRL_EVAL* m_TrackStartYCtrl; wxTextCtrl* m_TrackStartYCtrl;
wxStaticText* m_TrackStartYUnit; wxStaticText* m_TrackStartYUnit;
wxStaticText* m_TrackEndXLabel; wxStaticText* m_TrackEndXLabel;
TEXT_CTRL_EVAL* m_TrackEndXCtrl; wxTextCtrl* m_TrackEndXCtrl;
wxStaticText* m_TrackEndXUnit; wxStaticText* m_TrackEndXUnit;
wxStaticText* m_TrackEndYLabel; wxStaticText* m_TrackEndYLabel;
TEXT_CTRL_EVAL* m_TrackEndYCtrl; wxTextCtrl* m_TrackEndYCtrl;
wxStaticText* m_TrackEndYUnit; wxStaticText* m_TrackEndYUnit;
wxStaticText* m_TrackWidthLabel; wxStaticText* m_TrackWidthLabel;
wxComboBox* m_TrackWidthCtrl; wxComboBox* m_TrackWidthCtrl;
@ -69,38 +68,35 @@ class DIALOG_TRACK_VIA_PROPERTIES_BASE : public DIALOG_SHIM
PCB_LAYER_BOX_SELECTOR* m_TrackLayerCtrl; PCB_LAYER_BOX_SELECTOR* m_TrackLayerCtrl;
wxStaticBoxSizer* m_sbViaSizer; wxStaticBoxSizer* m_sbViaSizer;
wxStaticText* m_ViaXLabel; wxStaticText* m_ViaXLabel;
TEXT_CTRL_EVAL* m_ViaXCtrl; wxTextCtrl* m_ViaXCtrl;
wxStaticText* m_ViaXUnit; wxStaticText* m_ViaXUnit;
wxStaticText* m_ViaYLabel; wxStaticText* m_ViaYLabel;
TEXT_CTRL_EVAL* m_ViaYCtrl; wxTextCtrl* m_ViaYCtrl;
wxStaticText* m_ViaYUnit; wxStaticText* m_ViaYUnit;
wxStaticText* m_ViaDiameterLabel;
TEXT_CTRL_EVAL* m_ViaDiameterCtrl;
wxStaticText* m_ViaDiameterUnit;
wxStaticText* m_ViaDrillLabel;
TEXT_CTRL_EVAL* m_ViaDrillCtrl;
wxStaticText* m_ViaDrillUnit;
wxStaticText* m_DesignRuleVias; wxStaticText* m_DesignRuleVias;
wxChoice* m_DesignRuleViasCtrl; wxChoice* m_DesignRuleViasCtrl;
wxStaticText* m_DesignRuleViasUnit; wxStaticText* m_DesignRuleViasUnit;
wxStaticText* m_ViaDiameterLabel;
wxTextCtrl* m_ViaDiameterCtrl;
wxStaticText* m_ViaDiameterUnit;
wxStaticText* m_ViaDrillLabel;
wxTextCtrl* m_ViaDrillCtrl;
wxStaticText* m_ViaDrillUnit;
wxCheckBox* m_viaNetclass;
wxStaticText* m_ViaTypeLabel; wxStaticText* m_ViaTypeLabel;
wxChoice* m_ViaTypeChoice; wxChoice* m_ViaTypeChoice;
wxStaticText* m_ViaStartLayerLabel; wxStaticText* m_ViaStartLayerLabel;
PCB_LAYER_BOX_SELECTOR* m_ViaStartLayer; PCB_LAYER_BOX_SELECTOR* m_ViaStartLayer;
wxStaticText* m_ViaEndLayerLabel1; wxStaticText* m_ViaEndLayerLabel1;
PCB_LAYER_BOX_SELECTOR* m_ViaEndLayer; PCB_LAYER_BOX_SELECTOR* m_ViaEndLayer;
wxCheckBox* m_viaNetclass;
wxStdDialogButtonSizer* m_StdButtons; wxStdDialogButtonSizer* m_StdButtons;
wxButton* m_StdButtonsOK; wxButton* m_StdButtonsOK;
wxButton* m_StdButtonsCancel; wxButton* m_StdButtonsCancel;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void onClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnInitDlg( wxInitDialogEvent& event ) { event.Skip(); }
virtual void onOkClick( wxCommandEvent& event ) { event.Skip(); } virtual void onOkClick( wxCommandEvent& event ) { event.Skip(); }
virtual void onTrackNetclassCheck( wxCommandEvent& event ) { event.Skip(); } virtual void onTrackNetclassCheck( wxCommandEvent& event ) { event.Skip(); }
virtual void onViaNetclassCheck( wxCommandEvent& event ) { event.Skip(); } virtual void onViaNetclassCheck( wxCommandEvent& event ) { event.Skip(); }
virtual void onCancelClick( wxCommandEvent& event ) { event.Skip(); }
public: public:

View File

@ -27,14 +27,18 @@
#include <confirm.h> #include <confirm.h>
#include <widgets/text_ctrl_eval.h> #include <widgets/text_ctrl_eval.h>
#include <core/optional.h> #include <core/optional.h>
#include <draw_frame.h>
#include "board_design_settings.h" #include "board_design_settings.h"
DIALOG_TRACK_VIA_SIZE::DIALOG_TRACK_VIA_SIZE( wxWindow* aParent, BOARD_DESIGN_SETTINGS& aSettings ) : const int minSize = (int)( 0.01 * IU_PER_MM );
DIALOG_TRACK_VIA_SIZE::DIALOG_TRACK_VIA_SIZE( EDA_DRAW_FRAME* aParent,
BOARD_DESIGN_SETTINGS& aSettings ) :
DIALOG_TRACK_VIA_SIZE_BASE( aParent ), DIALOG_TRACK_VIA_SIZE_BASE( aParent ),
m_trackWidth( aParent, m_trackWidthText, m_trackWidthLabel ), m_trackWidth( aParent, m_trackWidthLabel, m_trackWidthText, m_trackWidthLabel, false, minSize ),
m_viaDiameter( aParent, m_viaDiameterText, m_viaDiameterLabel ), m_viaDiameter( aParent, m_viaDiameterLabel, m_viaDiameterText, m_viaDiameterLabel, false, minSize ),
m_viaDrill( aParent, m_viaDrillText, m_viaDrillLabel ), m_viaDrill( aParent, m_viaDrillLabel, m_viaDrillText, m_viaDrillLabel, false, minSize ),
m_settings( aSettings ) m_settings( aSettings )
{ {
m_stdButtonsOK->SetDefault(); m_stdButtonsOK->SetDefault();
@ -49,8 +53,12 @@ bool DIALOG_TRACK_VIA_SIZE::TransferDataFromWindow()
if( !wxDialog::TransferDataFromWindow() ) if( !wxDialog::TransferDataFromWindow() )
return false; return false;
if( !check() ) if( m_viaDrill.GetValue() >= m_viaDiameter.GetValue() )
{
DisplayError( GetParent(), _( "Via drill size has to be smaller than via diameter" ) );
m_viaDrillText->SetFocus();
return false; return false;
}
// Store dialog values to the router settings // Store dialog values to the router settings
m_settings.SetCustomTrackWidth( m_trackWidth.GetValue() ); m_settings.SetCustomTrackWidth( m_trackWidth.GetValue() );
@ -74,36 +82,3 @@ bool DIALOG_TRACK_VIA_SIZE::TransferDataToWindow()
return true; return true;
} }
bool DIALOG_TRACK_VIA_SIZE::check()
{
if( m_trackWidth.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid track width" ) );
m_trackWidthText->SetFocus();
return false;
}
if( m_viaDiameter.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid via diameter" ) );
m_viaDiameterText->SetFocus();
return false;
}
if( m_viaDrill.GetValue() <= 0 )
{
DisplayError( GetParent(), _( "Invalid via drill size" ) );
m_viaDrillText->SetFocus();
return false;
}
if( m_viaDrill.GetValue() >= m_viaDiameter.GetValue() )
{
DisplayError( GetParent(), _( "Via drill size has to be smaller than via diameter" ) );
m_viaDrillText->SetFocus();
return false;
}
return true;
}

View File

@ -36,7 +36,7 @@ class DIALOG_TRACK_VIA_SIZE : public DIALOG_TRACK_VIA_SIZE_BASE
{ {
public: public:
/** Constructor */ /** Constructor */
DIALOG_TRACK_VIA_SIZE( wxWindow* aParent, BOARD_DESIGN_SETTINGS& aSettings ); DIALOG_TRACK_VIA_SIZE( EDA_DRAW_FRAME* aParent, BOARD_DESIGN_SETTINGS& aSettings );
bool TransferDataFromWindow() override; bool TransferDataFromWindow() override;
bool TransferDataToWindow() override; bool TransferDataToWindow() override;
@ -48,9 +48,6 @@ protected:
// Routings settings that are modified by the dialog. // Routings settings that are modified by the dialog.
BOARD_DESIGN_SETTINGS& m_settings; BOARD_DESIGN_SETTINGS& m_settings;
///> Checks if values given in the dialog are sensible.
bool check();
}; };
#endif // __dialog_track_via_size__ #endif // __dialog_track_via_size__

View File

@ -306,14 +306,14 @@ MODULE* MWAVE::CreateMicrowaveInductor( INDUCTOR_PATTERN& inductorPattern,
inductorPattern.m_length = min_len; inductorPattern.m_length = min_len;
// Enter the desired length. // Enter the desired length.
msg = StringFromValue( g_UserUnit, inductorPattern.m_length ); msg = StringFromValue( aPcbFrame->GetUserUnits(), inductorPattern.m_length, true );
WX_TEXT_ENTRY_DIALOG dlg( nullptr, _( "Length of Trace:" ), wxEmptyString, msg ); WX_TEXT_ENTRY_DIALOG dlg( aPcbFrame, _( "Length of Trace:" ), wxEmptyString, msg );
if( dlg.ShowModal() != wxID_OK ) if( dlg.ShowModal() != wxID_OK )
return nullptr; // canceled by user return nullptr; // canceled by user
msg = dlg.GetValue(); msg = dlg.GetValue();
inductorPattern.m_length = ValueFromString( g_UserUnit, msg ); inductorPattern.m_length = ValueFromString( aPcbFrame->GetUserUnits(), msg );
// Control values (ii = minimum length) // Control values (ii = minimum length)
if( inductorPattern.m_length < min_len ) if( inductorPattern.m_length < min_len )
@ -336,7 +336,7 @@ MODULE* MWAVE::CreateMicrowaveInductor( INDUCTOR_PATTERN& inductorPattern,
// Generate footprint. the value is also used as footprint name. // Generate footprint. the value is also used as footprint name.
msg = "L"; msg = "L";
WX_TEXT_ENTRY_DIALOG cmpdlg( nullptr, _( "Component Value:" ), wxEmptyString, msg ); WX_TEXT_ENTRY_DIALOG cmpdlg( aPcbFrame, _( "Component Value:" ), wxEmptyString, msg );
cmpdlg.SetTextValidator( FILE_NAME_CHAR_VALIDATOR( &msg ) ); cmpdlg.SetTextValidator( FILE_NAME_CHAR_VALIDATOR( &msg ) );
if( ( cmpdlg.ShowModal() != wxID_OK ) || msg.IsEmpty() ) if( ( cmpdlg.ShowModal() != wxID_OK ) || msg.IsEmpty() )

View File

@ -654,13 +654,8 @@ int EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
{ {
if ( !changeTrackWidthOnClick( selection ) ) if ( !changeTrackWidthOnClick( selection ) )
{ {
DIALOG_TRACK_VIA_PROPERTIES dlg( editFrame, selection ); DIALOG_TRACK_VIA_PROPERTIES dlg( editFrame, selection, *m_commit );
dlg.ShowModal();
if( dlg.ShowModal() )
{
dlg.Apply( *m_commit );
m_commit->Push( _( "Edit track/via properties" ) );
}
} }
} }
else if( selection.Size() == 1 ) // Properties are displayed when there is only one item selected else if( selection.Size() == 1 ) // Properties are displayed when there is only one item selected