26#include <wx/clipbrd.h>
27#include <wx/stattext.h>
28#include <wx/textentry.h>
34#include "wx/dcclient.h"
41 wxStaticText* aUnitLabel,
bool allowEval,
bool aBindFrameEvents ) :
42 UNIT_BINDER( aParent, aParent, aLabel, aValueCtrl, aUnitLabel, allowEval, aBindFrameEvents )
47 wxStaticText* aLabel, wxWindow* aValueCtrl, wxStaticText* aUnitLabel,
48 bool aAllowEval,
bool aBindFocusEvent ) :
49 m_bindFocusEvent( aBindFocusEvent ),
51 m_valueCtrl( aValueCtrl ),
52 m_unitLabel( aUnitLabel ),
53 m_iuScale( &aUnitsProvider->GetIuScale() ),
54 m_negativeZero( false ),
58 m_unitsInValue( false ),
59 m_originTransforms( aUnitsProvider->GetOriginTransforms() ),
62 init( aUnitsProvider );
64 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
70 int minWidth = dc.GetTextExtent( wxT(
"XXX.XXXXXXX" ) ).GetWidth();
72 if(
minSize.GetWidth() < minWidth )
77 textEntry->ChangeValue( wxT(
"-0" ) );
79 textEntry->ChangeValue( wxT(
"0" ) );
103 aEventSource->Connect( EDA_EVT_UNITS_CHANGED,
170 if(
m_units != EDA_UNITS::UNSCALED
171 &&
m_units != EDA_UNITS::DEGREES
172 &&
m_units != EDA_UNITS::PERCENT )
189 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
195 textEntry->SelectAll();
205 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
213 if( oldStr.length() && oldStr != textEntry->GetValue() )
215 textEntry->SetValue( oldStr );
226 textEntry->SelectAll();
236 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
248 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
254 textEntry->ChangeValue( value );
258 if( wxTheClipboard->Open() )
260 wxString sel = textEntry->GetStringSelection();
261 bool clipTarget = wxTheClipboard->IsUsingPrimarySelection();
262 wxTheClipboard->UsePrimarySelection(
true );
263 wxTheClipboard->SetData(
new wxTextDataObject( sel ) );
264 wxTheClipboard->UsePrimarySelection( clipTarget );
265 wxTheClipboard->Close();
279 wxString desc = aLabel->GetLabel();
281 desc.EndsWith( wxT(
":" ), &desc );
298 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
318 textEntry->SelectAll();
321 wxPostEvent(
this, wxCommandEvent( DELAY_FOCUS ) );
335 textEntry->SelectAll();
338 wxPostEvent(
this, wxCommandEvent( DELAY_FOCUS ) );
367 if( displayValue == 0 && !std::signbit( displayValue ) &&
m_negativeZero )
382 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
383 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
385 wxString value = aValue;
389 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
396 textEntry->SetValue( value );
397 else if( staticText )
398 staticText->SetLabel( value );
430 if( displayValue == 0 && !std::signbit( displayValue ) &&
m_negativeZero )
445 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
446 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
448 wxString value = aValue;
452 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
459 textEntry->ChangeValue( value );
460 else if( staticText )
461 staticText->SetLabel( value );
473 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
474 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
482 value = textEntry->GetValue();
484 else if( staticText )
486 value = staticText->GetLabel();
504 int64_t tmp = aValue;
505 if( !aValueUsesUserUnits )
510 aValue =
static_cast<double>( tmp ) /
scale;
512 if( !aValueUsesUserUnits )
522 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
523 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
531 value = textEntry->GetValue();
533 else if( staticText )
535 value = staticText->GetLabel();
558 wxTextEntry* te =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
569 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
570 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
575 return textEntry->GetValue();
576 else if( staticText )
577 return staticText->GetLabel();
579 return wxEmptyString;
630 UNIT_BINDER( aParent, nullptr, nullptr, nullptr, true, false )
651 [&]( wxShowEvent& e )
The base frame for deriving all KiCad main window classes.
The base class for create windows for drawing purpose.
wxString OriginalText() const
void SetDefaultUnits(EDA_UNITS aUnits)
bool Process(const wxString &aString)
void SetControl(wxWindow *aControl)
PROPERTY_EDITOR_UNIT_BINDER(EDA_DRAW_FRAME *aParent)
virtual ~PROPERTY_EDITOR_UNIT_BINDER()
const EDA_IU_SCALE & GetIuScale() const
EDA_UNITS GetUserUnits() const
ORIGIN_TRANSFORMS::COORD_TYPES_T m_coordType
Type of coordinate for display origin transforms.
virtual void ChangeDoubleValue(double aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion WITHOUT trigger...
wxString GetOriginalText() const
Return the pre-evaluated text (or the current text if evaluation is not supported).
void onKillFocus(wxFocusEvent &aEvent)
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
void onClick(wxMouseEvent &aEvent)
virtual void SetPrecision(int aLength)
Normally not needed, but can be used to set the precision when using internal units that are floats (...
virtual void SetUnits(EDA_UNITS aUnits)
Normally not needed (as the UNIT_BINDER inherits from the parent frame), but can be used to set to DE...
const EDA_IU_SCALE * m_iuScale
virtual EDA_ANGLE GetAngleValue()
bool m_negativeZero
Indicates "-0" should be displayed for 0.
wxStaticText * m_unitLabel
Can be nullptr.
bool m_unitsInValue
Units label should be included in value text.
void onSetFocus(wxFocusEvent &aEvent)
UNIT_BINDER(EDA_DRAW_FRAME *aParent, wxStaticText *aLabel, wxWindow *aValueCtrl, wxStaticText *aUnitLabel, bool aAllowEval=true, bool aBindFocusEvent=true)
ORIGIN_TRANSFORMS & m_originTransforms
A reference to an ORIGIN_TRANSFORMS object.
bool m_bindFocusEvent
The bound widgets.
long m_selStart
Selection start and end of the original text.
virtual double GetDoubleValue()
Return the current value in Internal Units.
double setPrecision(double aValue, bool aValueUsesUserUnits)
When m_precision > 0 truncate the value aValue to show only m_precision digits in mantissa.
bool IsIndeterminate() const
Return true if the control holds the indeterminate value (for instance, if it represents a multiple s...
void SetDataType(EDA_DATA_TYPE aDataType)
Used to override the datatype of the displayed property (default is DISTANCE)
void delayedFocusHandler(wxCommandEvent &aEvent)
virtual void SetAngleValue(const EDA_ANGLE &aValue)
void SetLabel(const wxString &aLabel)
void init(UNITS_PROVIDER *aProvider)
virtual void ChangeAngleValue(const EDA_ANGLE &aValue)
virtual void SetDoubleValue(double aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
virtual ~UNIT_BINDER() override
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
virtual void ChangeValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion WITHOUT trigger...
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void Show(bool aShow, bool aResize=false)
Show/hide the label, widget and units label.
void onUnitsChanged(wxCommandEvent &aEvent)
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
This file is part of the common library.
const int minSize
Push and Shove router track width and via size dialog.
EDA_DATA_TYPE
The type of unit.
double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value "val" given in a real unit such as "in", "mm" or "deg".
long long int ValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application.
wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
double DoubleValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Function DoubleValueFromString converts aTextValue to a double.
double ToUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
wxString GetLabel(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
int GetUserUnits()
Return the currently selected user unit value for the interface.
#define INDETERMINATE_ACTION
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...
wxDEFINE_EVENT(DELAY_FOCUS, wxCommandEvent)
wxString valueDescriptionFromLabel(wxStaticText *aLabel)