26#include <wx/clipbrd.h>
27#include <wx/combobox.h>
28#include <wx/stattext.h>
29#include <wx/textentry.h>
35#include "wx/dcclient.h"
42 wxStaticText* aUnitLabel,
bool allowEval,
bool aBindFrameEvents ) :
43 UNIT_BINDER( aParent, aParent, aLabel, aValueCtrl, aUnitLabel, allowEval, aBindFrameEvents )
48 wxStaticText* aLabel, wxWindow* aValueCtrl, wxStaticText* aUnitLabel,
49 bool aAllowEval,
bool aBindFocusEvent ) :
50 m_bindFocusEvent( aBindFocusEvent ),
52 m_valueCtrl( aValueCtrl ),
53 m_unitLabel( aUnitLabel ),
54 m_iuScale( &aUnitsProvider->GetIuScale() ),
55 m_negativeZero( false ),
59 m_unitsInValue( false ),
60 m_originTransforms( aUnitsProvider->GetOriginTransforms() ),
63 init( aUnitsProvider );
65 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
74 int minWidth = dc.GetTextExtent( wxT(
"XXX.XXXXXXXXXX" ) ).GetWidth();
76 if(
minSize.GetWidth() < minWidth )
81 textEntry->ChangeValue( wxT(
"-0" ) );
83 textEntry->ChangeValue( wxT(
"0" ) );
109 aEventSource->Connect( EDA_EVT_UNITS_CHANGED,
178 if(
m_units != EDA_UNITS::UNSCALED
179 &&
m_units != EDA_UNITS::DEGREES
180 &&
m_units != EDA_UNITS::PERCENT )
184 wxComboBox*
const combo =
dynamic_cast<wxComboBox*
>(
m_valueCtrl );
185 std::vector<long long int> comboValues;
190 for(
unsigned int i = 0; i < combo->GetCount(); i++ )
192 const wxString value = combo->GetString( i );
195 comboValues.push_back( conv );
218 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
224 textEntry->SelectAll();
234 wxComboBox* combo =
dynamic_cast<wxComboBox*
>(
m_valueCtrl );
237 const wxString value = combo->GetStringSelection();
238 const long long int conv =
249 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
257 if( oldStr.length() && oldStr != textEntry->GetValue() )
259 textEntry->ChangeValue( oldStr );
270 textEntry->SelectAll();
280 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
284 wxString value = textEntry->GetValue();
287 if( success && !value.IsEmpty() )
295 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
301 textEntry->ChangeValue( value );
305 if( wxTheClipboard->Open() )
307 wxString sel = textEntry->GetStringSelection();
308 bool clipTarget = wxTheClipboard->IsUsingPrimarySelection();
309 wxTheClipboard->UsePrimarySelection(
true );
310 wxTheClipboard->SetData(
new wxTextDataObject( sel ) );
311 wxTheClipboard->UsePrimarySelection( clipTarget );
312 wxTheClipboard->Close();
326 wxString desc = aLabel->GetLabel();
328 desc.EndsWith( wxT(
":" ), &desc );
345 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
365 textEntry->SelectAll();
368 wxPostEvent(
this, wxCommandEvent( DELAY_FOCUS ) );
382 textEntry->SelectAll();
385 wxPostEvent(
this, wxCommandEvent( DELAY_FOCUS ) );
414 if( displayValue == 0 && !std::signbit( displayValue ) &&
m_negativeZero )
429 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
430 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
432 wxString value = aValue;
436 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
443 textEntry->SetValue( value );
444 else if( staticText )
445 staticText->SetLabel( value );
463 textValue = wxT(
"-" ) + textValue;
475 if( displayValue == 0 && !std::signbit( displayValue ) &&
m_negativeZero )
476 textValue = wxT(
"-" ) + textValue;
502 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
503 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
505 wxString value = aValue;
509 if( !(
m_units == EDA_UNITS::DEGREES ||
m_units == EDA_UNITS::PERCENT ) )
516 textEntry->ChangeValue( value );
517 else if( staticText )
518 staticText->SetLabel( value );
530 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
531 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
536 value = textEntry->GetValue();
541 value = textEntry->GetValue();
543 else if( staticText )
545 value = staticText->GetLabel();
563 int64_t tmp = aValue;
564 if( !aValueUsesUserUnits )
569 aValue =
static_cast<double>( tmp ) /
scale;
571 if( !aValueUsesUserUnits )
581 wxTextEntry* textEntry =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
582 wxStaticText* staticText =
dynamic_cast<wxStaticText*
>(
m_valueCtrl );
587 value = textEntry->GetValue();
592 value = textEntry->GetValue();
594 else if( staticText )
596 value = staticText->GetLabel();
619 wxComboBox* cb =
dynamic_cast<wxComboBox*
>(
m_valueCtrl );
624 for(
long long int value : aOptions )
633 wxComboBox* cb =
dynamic_cast<wxComboBox*
>(
m_valueCtrl );
638 for(
double value : aOptions )
647 wxTextEntry* te =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
658 wxTextEntry* te =
dynamic_cast<wxTextEntry*
>(
m_valueCtrl );
661 return te->GetValue().IsEmpty();
716 UNIT_BINDER( aParent, nullptr, nullptr, nullptr, true, false )
737 [&]( 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
double setPrecision(double aValue, bool aValueUsesUserUnits) const
When m_precision > 0 truncate the value aValue to show only m_precision digits in mantissa.
ORIGIN_TRANSFORMS::COORD_TYPES_T m_coordType
Type of coordinate for display origin transforms.
wxString getTextForValue(long long int aValue) const
virtual void ChangeDoubleValue(double aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion WITHOUT trigger...
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...
wxString getTextForDoubleValue(double aValue) const
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)
void onComboBox(wxCommandEvent &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 void SetDoubleOptionsList(std::span< const double > aOptions)
virtual double GetDoubleValue()
Return the current value in Internal Units.
virtual void SetOptionsList(std::span< const long long int > aOptions)
Set the list of options for a combobox control.
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.
bool IsNull() const
Return true if the control holds no value (ie: empty string, not 0).
void onUnitsChanged(wxCommandEvent &aEvent)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message 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.
KICOMMON_API double FromUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Return in internal units the value aValue given in a real unit such as "in", "mm",...
KICOMMON_API 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.
KICOMMON_API 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.
KICOMMON_API 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.
KICOMMON_API 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...
KICOMMON_API 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)