diff --git a/apps/calculation/expression_field.cpp b/apps/calculation/expression_field.cpp index b96c4b1fed6..8096a6e1d4a 100644 --- a/apps/calculation/expression_field.cpp +++ b/apps/calculation/expression_field.cpp @@ -1,6 +1,9 @@ #include "expression_field.h" #include +#include +#include +using namespace Poincare; namespace Calculation { bool ExpressionField::handleEvent(Ion::Events::Event event) { @@ -21,7 +24,30 @@ bool ExpressionField::handleEvent(Ion::Events::Event event) { event == Ion::Events::EE)) { handleEventWithText(Poincare::Symbol::k_ans); } - return(::ExpressionField::handleEvent(event)); + if (event == Ion::Events::Minus + && isEditing() + && fieldHasOnlyAMinus()) { + setText(Poincare::Symbol::k_ans); + } + return (::ExpressionField::handleEvent(event)); +} + +bool ExpressionField::fieldHasOnlyAMinus() const { + if (editionIsInTextField()) { + const char *inputBuffer = m_textField.draftTextBuffer(); + return (inputBuffer[0] == '-' && inputBuffer[1] == '\0'); + } + Layout layout = m_layoutField.layout(); + if (layout.type() == LayoutNode::Type::HorizontalLayout && layout.numberOfChildren() == 1) { + Layout child = layout.childAtIndex(0); + if (child.type() == LayoutNode::Type::CodePointLayout) { + CodePointLayout &codePointLayout = static_cast(child); + if (codePointLayout.codePoint() == '-'){ + return true; + } + } + } + return false; } } diff --git a/apps/calculation/expression_field.h b/apps/calculation/expression_field.h index 2844046286b..33477a87444 100644 --- a/apps/calculation/expression_field.h +++ b/apps/calculation/expression_field.h @@ -13,6 +13,8 @@ class ExpressionField : public ::ExpressionField { } protected: bool handleEvent(Ion::Events::Event event) override; +private: + bool fieldHasOnlyAMinus() const; }; } diff --git a/escher/include/escher/expression_field.h b/escher/include/escher/expression_field.h index 7ecaf57d4dc..1619dfdd436 100644 --- a/escher/include/escher/expression_field.h +++ b/escher/include/escher/expression_field.h @@ -40,6 +40,10 @@ class ExpressionField : public Responder, public View { bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; +protected: + TextField m_textField; + LayoutField m_layoutField; + private: static constexpr int k_textFieldBufferSize = TextField::maxBufferSize(); static constexpr KDCoordinate k_minimalHeight = 37; @@ -49,8 +53,6 @@ class ExpressionField : public Responder, public View { constexpr static KDCoordinate k_separatorThickness = Metric::CellSeparatorThickness; KDCoordinate inputViewHeight() const; KDCoordinate m_inputViewMemoizedHeight; - TextField m_textField; - LayoutField m_layoutField; }; #endif