diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 8a0138841c..cd9f38f4cb 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -325,7 +325,6 @@ set( COMMON_SRCS hotkey_store.cpp hotkeys_basic.cpp html_messagebox.cpp - incremental_text_ctrl.cpp kiface_i.cpp kiway.cpp kiway_express.cpp diff --git a/common/incremental_text_ctrl.cpp b/common/incremental_text_ctrl.cpp deleted file mode 100644 index c68af69d4f..0000000000 --- a/common/incremental_text_ctrl.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 2015 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr - * Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you may find one here: - * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * or you may search the http://www.gnu.org website for the version 2 license, - * or you may write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include - -#include - -/** - * Check that a string looks like a floating point number that can - * be dealt with. - */ -static bool validateFloatField( const wxString& aStr ) -{ - // Skip empty fields - if( aStr.size() == 0 ) - return false; - - // a single . or , doesn't count as number, although valid in a float - if( aStr.size() == 1 ) - { - if( (aStr.compare( "." ) == 0) || - (aStr.compare( "," ) == 0) ) - return false; - } - - return true; -} - - -INCREMENTAL_TEXT_CTRL::INCREMENTAL_TEXT_CTRL() : - m_minVal( 0.0 ), - m_maxVal( 1.0 ), - m_currentValue( 0.0 ), - m_precision( 4 ) -{} - - -void INCREMENTAL_TEXT_CTRL::SetStep( double aMin, double aMax, - STEP_FUNCTION aStepFunc ) -{ - wxASSERT( aMin <= aMax ); - - m_minVal = std::min( aMin, aMax ); - m_maxVal = std::max( aMin, aMax ); - m_stepFunc = std::move( aStepFunc ); - - // finally, clamp the current value and re-display - updateTextValue(); -} - - -void INCREMENTAL_TEXT_CTRL::updateTextValue() -{ - if( m_currentValue > m_maxVal ) - m_currentValue = m_maxVal; - - if( m_currentValue < m_minVal ) - m_currentValue = m_minVal; - - wxString fmt = wxString::Format( "%%.%df", m_precision ); - setTextCtrl( wxString::Format( fmt, m_currentValue ) ); -} - - -void INCREMENTAL_TEXT_CTRL::incrementCtrlBy( double aInc ) -{ - const wxString txt = getCtrlText(); - if( !validateFloatField( txt ) ) - return; - - txt.ToDouble( &m_currentValue ); - m_currentValue += aInc; - - updateTextValue(); -} - - -void INCREMENTAL_TEXT_CTRL::incrementCtrl( bool aUp ) -{ - incrementCtrlBy( m_stepFunc( aUp, m_currentValue ) ); -} - - -void INCREMENTAL_TEXT_CTRL::SetPrecision( int aPrecision ) -{ - m_precision = aPrecision; -} - - -void INCREMENTAL_TEXT_CTRL::SetValue( double aValue ) -{ - m_currentValue = aValue; - updateTextValue(); -} - - -double INCREMENTAL_TEXT_CTRL::GetValue() -{ - // sanitise before handing the value - if the user did something - // like close a window with outstanding text changes, we need - // to clamp the value and re-interpret the text - incrementCtrlBy( 0.0 ); - - return m_currentValue; -} - - -SPIN_INCREMENTAL_TEXT_CTRL::SPIN_INCREMENTAL_TEXT_CTRL( wxSpinButton& aSpinBtn, - wxTextCtrl& aTextCtrl ): - m_spinBtn( aSpinBtn ), - m_textCtrl( aTextCtrl ) -{ - (void) m_spinBtn; - - // set always enabled, otherwise it's very hard to keep in sync - aSpinBtn.SetRange( -INT_MAX, INT_MAX ); - - auto spinUpHandler = [this] ( wxSpinEvent& event ) - { - incrementCtrl( true ); - }; - - // spin up/down if a single step of the field - auto spinDownHandler = [this] ( wxSpinEvent& event ) - { - incrementCtrl( false ); - }; - - auto mouseWheelHandler = [this] ( wxMouseEvent& aEvent ) - { - incrementCtrl( aEvent.GetWheelRotation() >= 0 ); - }; - - aSpinBtn.Bind( wxEVT_SPIN_UP, spinUpHandler ); - aSpinBtn.Bind( wxEVT_SPIN_DOWN, spinDownHandler ); - - m_textCtrl.Bind( wxEVT_MOUSEWHEEL, mouseWheelHandler ); - - m_textCtrl.Bind( wxEVT_KILL_FOCUS, &SPIN_INCREMENTAL_TEXT_CTRL::onFocusLoss, this ); -} - -SPIN_INCREMENTAL_TEXT_CTRL::~SPIN_INCREMENTAL_TEXT_CTRL() -{ - // this must be unbound, as kill focus can arrive after the - // text control is gone - m_textCtrl.Unbind( wxEVT_KILL_FOCUS, &SPIN_INCREMENTAL_TEXT_CTRL::onFocusLoss, this ); -} - - -void SPIN_INCREMENTAL_TEXT_CTRL::onFocusLoss( wxFocusEvent& aEvent ) -{ - // re-read the input and sanitize any user changes - incrementCtrlBy( 0.0 ); -} - - -void SPIN_INCREMENTAL_TEXT_CTRL::setTextCtrl( const wxString& val ) -{ - m_textCtrl.SetValue( val ); -} - - -wxString SPIN_INCREMENTAL_TEXT_CTRL::getCtrlText() const -{ - return m_textCtrl.GetValue(); -} - diff --git a/common/widgets/gal_options_panel.cpp b/common/widgets/gal_options_panel.cpp index 16667682d9..0269328b05 100644 --- a/common/widgets/gal_options_panel.cpp +++ b/common/widgets/gal_options_panel.cpp @@ -22,11 +22,16 @@ */ +#include +#include +#include +#include +#include + #include #include -#include #include /* @@ -34,7 +39,7 @@ */ static const double gridThicknessMin = 1.0; static const double gridThicknessMax = 10.0; -static const double gridThicknessStep = 1.0; +static const double gridThicknessStep = 0.5; static const double gridMinSpacingMin = 5; static const double gridMinSpacingMax = 200; @@ -85,7 +90,7 @@ GAL_OPTIONS_PANEL::GAL_OPTIONS_PANEL( wxWindow* aParent, KIGFX::GAL_DISPLAY_OPTI sGridSettings->Add( m_gridStyle, 0, wxALL|wxEXPAND, 5 ); wxFlexGridSizer* sGridSettingsGrid; - sGridSettingsGrid = new wxFlexGridSizer( 0, 4, 0, 0 ); + sGridSettingsGrid = new wxFlexGridSizer( 0, 3, 0, 0 ); sGridSettingsGrid->AddGrowableCol( 1 ); sGridSettingsGrid->SetFlexibleDirection( wxBOTH ); sGridSettingsGrid->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); @@ -95,14 +100,12 @@ GAL_OPTIONS_PANEL::GAL_OPTIONS_PANEL( wxWindow* aParent, KIGFX::GAL_DISPLAY_OPTI l_gridLineWidth->Wrap( -1 ); sGridSettingsGrid->Add( l_gridLineWidth, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_gridLineWidth = new wxTextCtrl( sGridSettings->GetStaticBox(), wxID_ANY ); + m_gridLineWidth = new wxSpinCtrlDouble( sGridSettings->GetStaticBox(), wxID_ANY ); + m_gridLineWidth->SetRange( gridThicknessMin, gridThicknessMax ); + m_gridLineWidth->SetIncrement( gridThicknessStep ); + m_gridLineWidth->SetDigits( 1 ); sGridSettingsGrid->Add( m_gridLineWidth, 0, wxEXPAND | wxTOP | wxBOTTOM, 5 ); - m_gridLineWidthSpinBtn = new wxSpinButton( sGridSettings->GetStaticBox(), - wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS ); - sGridSettingsGrid->Add( m_gridLineWidthSpinBtn, 0, - wxEXPAND | wxTOP | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 3 ); - l_gridLineWidthUnits = new wxStaticText( sGridSettings->GetStaticBox(), wxID_ANY, _( "px" ) ); l_gridLineWidthUnits->Wrap( -1 ); @@ -113,14 +116,12 @@ GAL_OPTIONS_PANEL::GAL_OPTIONS_PANEL( wxWindow* aParent, KIGFX::GAL_DISPLAY_OPTI l_gridMinSpacing->Wrap( -1 ); sGridSettingsGrid->Add( l_gridMinSpacing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_gridMinSpacing = new wxTextCtrl( sGridSettings->GetStaticBox(), wxID_ANY); + m_gridMinSpacing = new wxSpinCtrlDouble( sGridSettings->GetStaticBox(), wxID_ANY); + m_gridMinSpacing->SetRange( gridMinSpacingMin, gridMinSpacingMax ); + m_gridMinSpacing->SetIncrement( gridMinSpacingStep ); + m_gridMinSpacing->SetDigits( 0 ); sGridSettingsGrid->Add( m_gridMinSpacing, 0, wxEXPAND | wxTOP | wxBOTTOM, 5 ); - m_gridMinSpacingSpinBtn = new wxSpinButton( sGridSettings->GetStaticBox(), - wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS ); - sGridSettingsGrid->Add( m_gridMinSpacingSpinBtn, 0, - wxEXPAND | wxTOP | wxBOTTOM | wxALIGN_CENTER_VERTICAL, 3 ); - l_gridMinSpacingUnits = new wxStaticText( sGridSettings->GetStaticBox(), wxID_ANY, _( "px" ) ); l_gridMinSpacingUnits->Wrap( -1 ); @@ -129,21 +130,6 @@ GAL_OPTIONS_PANEL::GAL_OPTIONS_PANEL( wxWindow* aParent, KIGFX::GAL_DISPLAY_OPTI sGridSettings->Add( sGridSettingsGrid, 1, wxALL | wxEXPAND, 5 ); sLeftSizer->Add( sGridSettings, 0, wxTOP | wxBOTTOM | wxRIGHT | wxEXPAND, 5 ); - - // bind the spin buttons and text boxes - m_gridSizeIncrementer = std::make_unique( - *m_gridLineWidthSpinBtn, *m_gridLineWidth ); - - m_gridSizeIncrementer->SetStep( gridThicknessMin, gridThicknessMax, - gridThicknessStep ); - m_gridSizeIncrementer->SetPrecision( 0 ); - - m_gridMinSpacingIncrementer = std::make_unique( - *m_gridMinSpacingSpinBtn, *m_gridMinSpacing ); - - m_gridMinSpacingIncrementer->SetStep( gridMinSpacingMin, gridMinSpacingMax, - gridMinSpacingStep ); - m_gridMinSpacingIncrementer->SetPrecision( 0 ); // restrict to ints } /* @@ -199,9 +185,9 @@ bool GAL_OPTIONS_PANEL::TransferDataToWindow() m_gridStyle->SetSelection( UTIL::GetConfigForVal( gridStyleSelectMap, m_galOptions.m_gridStyle ) ); - m_gridSizeIncrementer->SetValue( m_galOptions.m_gridLineWidth ); + m_gridLineWidth->SetValue( m_galOptions.m_gridLineWidth ); - m_gridMinSpacingIncrementer->SetValue( m_galOptions.m_gridMinSpacing ); + m_gridMinSpacing->SetValue( m_galOptions.m_gridMinSpacing ); m_cursorShape->SetSelection( m_galOptions.m_fullscreenCursor ); @@ -216,9 +202,9 @@ bool GAL_OPTIONS_PANEL::TransferDataFromWindow() m_galOptions.m_gridStyle = UTIL::GetValFromConfig( gridStyleSelectMap, m_gridStyle->GetSelection() ); - m_galOptions.m_gridLineWidth = std::floor( m_gridSizeIncrementer->GetValue() + 0.5 ); + m_galOptions.m_gridLineWidth = m_gridLineWidth->GetValue(); - m_galOptions.m_gridMinSpacing = m_gridMinSpacingIncrementer->GetValue(); + m_galOptions.m_gridMinSpacing = m_gridMinSpacing->GetValue(); m_galOptions.m_fullscreenCursor = m_cursorShape->GetSelection(); diff --git a/include/incremental_text_ctrl.h b/include/incremental_text_ctrl.h deleted file mode 100644 index 893fb6d6a6..0000000000 --- a/include/incremental_text_ctrl.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 2013 CERN - * @author Maciej Suminski - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you may find one here: - * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * or you may search the http://www.gnu.org website for the version 2 license, - * or you may write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef INCREMENTAL_TEXT_CTRL__H_ -#define INCREMENTAL_TEXT_CTRL__H_ - -#include -#include - -#include - -/** - * Class that governs a textual control holding a number that can - * be incremented/decremented according to some scheme (often just - * a constant step). - */ -class INCREMENTAL_TEXT_CTRL -{ -public: - - /** - * A callable object type that can be used to provide a step - * value. Client can provide one of these to use for implementing - * non-linear stepping, or stepping based on external parameters, - * such as unit selection. - * - * @param aUp true if the next step is upwards - * @param aCurrVal the current value of the control - */ - using STEP_FUNCTION = std::function; - - INCREMENTAL_TEXT_CTRL(); - - virtual ~INCREMENTAL_TEXT_CTRL() {} - - /** - * Set the value of the text control, but obey the limits - * currently set. - * - * @param aValue the control value to set - */ - void SetValue( double aValue ); - - /** - * Get the current value of the control - */ - double GetValue(); - - /** - * Function SetStep() - * - * Set the stepping parameters of the control. The range is - * enforced by not allowing the scroll to exceed it, and on - * loss of focus, the control is also clamped to the range. - * - * @param aMin the minium value allowed - * @param aMax the maximum value allows - * @param aNewFunc the step function used to calculate the next step - */ - void SetStep( double aMin, double aMax, STEP_FUNCTION aNewFunc ); - - /** - * Function SetStep() - * - * Shortcut method to set step parameters when the step is constant - * - * @param aMin the minium value allowed - * @param aMax the maximum value allows - * @param aStep the constant step size - */ - void SetStep( double aMin, double aMax, double aStep ) - { - SetStep( aMin, aMax, - [aStep] ( bool aUp, double aCurrent ) { return aUp ? aStep : -aStep; } ); - } - - /** - * Set the number of decimal places to display - */ - void SetPrecision( int aPrecision ); - -protected: - - /** - * Increment the control by the given amount - */ - void incrementCtrlBy( double aInc); - - /** - * Single increment up or down by one step - */ - void incrementCtrl( bool aUp ); - - /** - * Update the text control value with the current value, - * clamping to limits as needed - */ - void updateTextValue(); - - /* - * Implementation-specific interfaces - */ - - /** - * Set the text control string value after an increment. - */ - virtual void setTextCtrl( const wxString& aVal ) = 0; - - /** - * @return the current string value of the text control - */ - virtual wxString getCtrlText() const = 0; - -private: - - double m_minVal; - double m_maxVal; - - ///< Current value of the control - double m_currentValue; - - ///< Precision to display - int m_precision; - - ///< The function used to determine the step - STEP_FUNCTION m_stepFunc; -}; - - -/** - * Class SPIN_INCREMENTING_TEXT_CTRL - * - * An incrementable text control, with WX spin buttons for clickable - * control. - */ -class SPIN_INCREMENTAL_TEXT_CTRL: public INCREMENTAL_TEXT_CTRL -{ -public: - - /** - * Constructor - * - * @param aSpinBtn the spin button to control the value - * @param aTextCtrl the text control that will display the value - */ - SPIN_INCREMENTAL_TEXT_CTRL( wxSpinButton& aSpinBtn, - wxTextCtrl& aTextCtrl ); - - ~SPIN_INCREMENTAL_TEXT_CTRL(); - -protected: - - ///> @copydoc INCREMENTAL_TEXT_CTRL::setTextCtrl() - void setTextCtrl( const wxString& val ) override; - - ///> @copydoc INCREMENTAL_TEXT_CTRL::getCtrlText() - wxString getCtrlText() const override; - -private: - - void onFocusLoss( wxFocusEvent& aEvent ); - - wxSpinButton& m_spinBtn; - wxTextCtrl& m_textCtrl; -}; - -#endif /* INCREMENTAL_TEXT_CTRL__H_ */ diff --git a/include/widgets/gal_options_panel.h b/include/widgets/gal_options_panel.h index 18cb4a3bbc..9ee6fe9ea5 100644 --- a/include/widgets/gal_options_panel.h +++ b/include/widgets/gal_options_panel.h @@ -24,12 +24,14 @@ #ifndef WIDGETS_GAL_OPTIONS_PANEL__H_ #define WIDGETS_GAL_OPTIONS_PANEL__H_ -#include -#include +#include #include -class INCREMENTAL_TEXT_CTRL; +class wxBoxSizer; +class wxRadioBox; +class wxSpinCtrlDouble; +class wxStaticText; class GAL_OPTIONS_PANEL: public wxPanel { @@ -54,13 +56,11 @@ private: wxRadioBox* m_gridStyle; wxStaticText* l_gridLineWidth; - wxTextCtrl* m_gridLineWidth; - wxSpinButton* m_gridLineWidthSpinBtn; + wxSpinCtrlDouble* m_gridLineWidth; wxStaticText* l_gridLineWidthUnits; wxStaticText* l_gridMinSpacing; - wxTextCtrl* m_gridMinSpacing; - wxSpinButton* m_gridMinSpacingSpinBtn; + wxSpinCtrlDouble* m_gridMinSpacing; wxStaticText* l_gridMinSpacingUnits; wxRadioBox* m_cursorShape; @@ -68,9 +68,6 @@ private: ///> The GAL options to read/write KIGFX::GAL_DISPLAY_OPTIONS& m_galOptions; - - std::unique_ptr m_gridSizeIncrementer; - std::unique_ptr m_gridMinSpacingIncrementer; };