From 1c4056e17acbb11fe88cde59b269fc533df0e892 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Thu, 23 Nov 2017 13:35:03 +0100 Subject: [PATCH] TEXT_CTRL_EVAL: wxTextCtrl wrapper supporting math expression evaluation --- common/CMakeLists.txt | 1 + common/widgets/text_ctrl_eval.cpp | 59 +++++++++++++++++++++++++++++++ include/widgets/text_ctrl_eval.h | 59 +++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 common/widgets/text_ctrl_eval.cpp create mode 100644 include/widgets/text_ctrl_eval.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index d5b2bee81d..f4ff414696 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -178,6 +178,7 @@ set( COMMON_WIDGET_SRCS widgets/footprint_select_widget.cpp widgets/footprint_choice.cpp widgets/indicator_icon.cpp + widgets/text_ctrl_eval.cpp widgets/unit_binder.cpp ) diff --git a/common/widgets/text_ctrl_eval.cpp b/common/widgets/text_ctrl_eval.cpp new file mode 100644 index 0000000000..04c6059847 --- /dev/null +++ b/common/widgets/text_ctrl_eval.cpp @@ -0,0 +1,59 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2017 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 3 + * 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-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +TEXT_CTRL_EVAL::TEXT_CTRL_EVAL( wxWindow* aParent, wxWindowID aId, const + wxString& aValue, const wxPoint& aPos, const wxSize& aSize, long aStyle, + const wxValidator& aValidator, const wxString& aName ) + : wxTextCtrl( aParent, aId, aValue, aPos, aSize, aStyle, aValidator, aName ) +{ + Connect( wxEVT_SET_FOCUS, + wxFocusEventHandler( TEXT_CTRL_EVAL::onTextFocusGet ), NULL, this ); + Connect( wxEVT_KILL_FOCUS, + wxFocusEventHandler( TEXT_CTRL_EVAL::onTextFocusLost ), NULL, this ); +} + + +void TEXT_CTRL_EVAL::onTextFocusGet( wxFocusEvent& aEvent ) +{ + auto oldStr = m_eval.textInput( this ); + + if( oldStr ) + SetValue( wxString::FromUTF8( oldStr ) ); + + aEvent.Skip(); +} + + +void TEXT_CTRL_EVAL::onTextFocusLost( wxFocusEvent& aEvent ) +{ + if( GetValue().IsEmpty() ) + SetValue( "0" ); + + if( m_eval.process( GetValue().mb_str(), this ) ) + SetValue( wxString::FromUTF8( m_eval.result() ) ); + + aEvent.Skip(); +} diff --git a/include/widgets/text_ctrl_eval.h b/include/widgets/text_ctrl_eval.h new file mode 100644 index 0000000000..7f99330213 --- /dev/null +++ b/include/widgets/text_ctrl_eval.h @@ -0,0 +1,59 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2017 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 3 + * 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-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef TEXT_CTRL_EVAL_H +#define TEXT_CTRL_EVAL_H + +#include +#include +#include + +/** + * @brief wxTextCtrl wrapper to handle math expression evaluation. + * Expressions are evaluated after the text control loses the focus. If user decides to modify + * the expression, he will get the original expression to modify. + */ + +class TEXT_CTRL_EVAL : public wxTextCtrl +{ +public: + TEXT_CTRL_EVAL( wxWindow* aParent, wxWindowID aId, const wxString& aValue = wxEmptyString, + const wxPoint& aPos = wxDefaultPosition, const wxSize& aSize = wxDefaultSize, + long aStyle = 0, const wxValidator& aValidator = wxDefaultValidator, + const wxString& aName = wxTextCtrlNameStr ); + + virtual ~TEXT_CTRL_EVAL() + { + } + +protected: + ///> Numeric expression evaluator + NumericEvaluator m_eval; + + void onTextFocusGet( wxFocusEvent& aEvent ); + void onTextFocusLost( wxFocusEvent& aEvent ); +}; + + +#endif /* TEXT_CTRL_EVAL_H */