diff --git a/apps/shared/text_field_and_editable_expression_view_delegate_app.cpp b/apps/shared/text_field_and_editable_expression_view_delegate_app.cpp index 2fd015231..516c4a466 100644 --- a/apps/shared/text_field_and_editable_expression_view_delegate_app.cpp +++ b/apps/shared/text_field_and_editable_expression_view_delegate_app.cpp @@ -36,7 +36,7 @@ bool TextFieldAndEditableExpressionViewDelegateApp::editableExpressionViewDidRec } AppsContainer * appsContainer = (AppsContainer *)editableExpressionView->app()->container(); VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setEditableExpressionViewCaller(editableExpressionView); + variableBoxController->setEditableExpressionViewSender(editableExpressionView); editableExpressionView->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); return true; } diff --git a/apps/shared/text_field_delegate_app.cpp b/apps/shared/text_field_delegate_app.cpp index 1678f234e..de8df6c42 100644 --- a/apps/shared/text_field_delegate_app.cpp +++ b/apps/shared/text_field_delegate_app.cpp @@ -93,7 +93,7 @@ bool TextFieldDelegateApp::textFieldDidReceiveEvent(TextField * textField, Ion:: } AppsContainer * appsContainer = (AppsContainer *)textField->app()->container(); VariableBoxController * variableBoxController = appsContainer->variableBoxController(); - variableBoxController->setTextFieldCaller(textField); + variableBoxController->setTextFieldSender(textField); textField->app()->displayModalViewController(variableBoxController, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin); return true; } diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 72c2b9b63..44be6b710 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -10,7 +10,7 @@ using namespace Poincare; VariableBoxController::ContentViewController::ContentViewController(Responder * parentResponder, GlobalContext * context) : ViewController(parentResponder), m_context(context), - m_textFieldCaller(nullptr), + m_sender(nullptr), m_firstSelectedRow(0), m_previousSelectedRow(0), m_currentPage(Page::RootMenu), @@ -18,14 +18,13 @@ VariableBoxController::ContentViewController::ContentViewController(Responder * { } -const char * VariableBoxController::ContentViewController::title() { - return I18n::translate(I18n::Message::Variables); -} - View * VariableBoxController::ContentViewController::view() { return &m_selectableTableView; } +const char * VariableBoxController::ContentViewController::title() { + return I18n::translate(I18n::Message::Variables); +} void VariableBoxController::ContentViewController::didBecomeFirstResponder() { m_selectableTableView.reloadData(); m_selectableTableView.scrollToCell(0,0); @@ -65,11 +64,7 @@ bool VariableBoxController::ContentViewController::handleEvent(Ion::Events::Even char label[3]; putLabelAtIndexInBuffer(selectedRow(), label); const char * editedText = label; - if (!m_textFieldCaller->isEditing()) { - m_textFieldCaller->setEditing(true); - } - m_textFieldCaller->insertTextAtLocation(editedText, m_textFieldCaller->cursorLocation()); - m_textFieldCaller->setCursorLocation(m_textFieldCaller->cursorLocation() + strlen(editedText)); + m_insertTextAction(m_sender, editedText); #if MATRIX_VARIABLES m_selectableTableView.deselectTable(); m_currentPage = Page::RootMenu; @@ -202,21 +197,31 @@ int VariableBoxController::ContentViewController::typeAtLocation(int i, int j) { return 0; } -const Expression * VariableBoxController::ContentViewController::expressionForIndex(int index) { - if (m_currentPage == Page::Scalar) { - const Symbol symbol = Symbol('A'+index); - return m_context->expressionForSymbol(&symbol); - } - if (m_currentPage == Page::Matrix) { - const Symbol symbol = Symbol::matrixSymbol('0'+(char)index); - return m_context->expressionForSymbol(&symbol); - } -#if LIST_VARIABLES - if (m_currentPage == Page::List) { - return nullptr; - } +void VariableBoxController::ContentViewController::setTextFieldSender(TextField * textField) { + m_sender = textField; + m_insertTextAction = &insertTextInTextField; +} + +void VariableBoxController::ContentViewController::setEditableExpressionViewSender(EditableExpressionView * editableExpressionView) { + m_sender = editableExpressionView; + m_insertTextAction = &insertTextInEditableExpressionView; +} + +void VariableBoxController::ContentViewController::reloadData() { + m_selectableTableView.reloadData(); +} + +void VariableBoxController::ContentViewController::resetPage() { +#if MATRIX_VARIABLES + m_currentPage = Page::RootMenu; +#else + m_currentPage = Page::Scalar; #endif - return nullptr; +} + +void VariableBoxController::ContentViewController::viewDidDisappear() { + m_selectableTableView.deselectTable(); + ViewController::viewDidDisappear(); } VariableBoxController::ContentViewController::Page VariableBoxController::ContentViewController::pageAtIndex(int index) { @@ -257,25 +262,38 @@ I18n::Message VariableBoxController::ContentViewController::nodeLabelAtIndex(int return labels[index]; } -void VariableBoxController::ContentViewController::setTextFieldCaller(TextField * textField) { - m_textFieldCaller = textField; -} - -void VariableBoxController::ContentViewController::reloadData() { - m_selectableTableView.reloadData(); -} - -void VariableBoxController::ContentViewController::resetPage() { -#if MATRIX_VARIABLES - m_currentPage = Page::RootMenu; -#else - m_currentPage = Page::Scalar; +const Expression * VariableBoxController::ContentViewController::expressionForIndex(int index) { + if (m_currentPage == Page::Scalar) { + const Symbol symbol = Symbol('A'+index); + return m_context->expressionForSymbol(&symbol); + } + if (m_currentPage == Page::Matrix) { + const Symbol symbol = Symbol::matrixSymbol('0'+(char)index); + return m_context->expressionForSymbol(&symbol); + } +#if LIST_VARIABLES + if (m_currentPage == Page::List) { + return nullptr; + } #endif + return nullptr; } -void VariableBoxController::ContentViewController::viewDidDisappear() { - m_selectableTableView.deselectTable(); - ViewController::viewDidDisappear(); +void VariableBoxController::ContentViewController::insertTextInTextField(void * sender, const char * textToInsert) { + TextField * textField = static_cast(sender); + if (!textField->isEditing()) { + textField->setEditing(true); + } + textField->insertTextAtLocation(textToInsert, textField->cursorLocation()); + textField->setCursorLocation(textField->cursorLocation() + strlen(textToInsert)); +} + +void VariableBoxController::ContentViewController::insertTextInEditableExpressionView(void * sender, const char * textToInsert) { + EditableExpressionView * editableExpressionView = static_cast(sender); + if (!editableExpressionView->isEditing()) { + editableExpressionView->setEditing(true); + } + editableExpressionView->insertTextAtCursor(textToInsert); } VariableBoxController::VariableBoxController(GlobalContext * context) : @@ -288,12 +306,12 @@ void VariableBoxController::didBecomeFirstResponder() { app()->setFirstResponder(&m_contentViewController); } -void VariableBoxController::setTextFieldCaller(TextField * textField) { - m_contentViewController.setTextFieldCaller(textField); +void VariableBoxController::setTextFieldSender(TextField * textField) { + m_contentViewController.setTextFieldSender(textField); } -void VariableBoxController::setEditableExpressionViewCaller(EditableExpressionView * editableExpressionView) { - //TODO +void VariableBoxController::setEditableExpressionViewSender(EditableExpressionView * editableExpressionView) { + m_contentViewController.setEditableExpressionViewSender(editableExpressionView); } void VariableBoxController::viewWillAppear() { diff --git a/apps/variable_box_controller.h b/apps/variable_box_controller.h index 1617c1a31..daa75938e 100644 --- a/apps/variable_box_controller.h +++ b/apps/variable_box_controller.h @@ -10,10 +10,11 @@ class VariableBoxController : public StackViewController { public: + typedef void (*Action)(void * sender, const char * text); VariableBoxController(Poincare::GlobalContext * context); void didBecomeFirstResponder() override; - void setTextFieldCaller(TextField * textField); - void setEditableExpressionViewCaller(EditableExpressionView * editableExpressionView); + void setTextFieldSender(TextField * textField); + void setEditableExpressionViewSender(EditableExpressionView * editableExpressionView); void viewWillAppear() override; void viewDidDisappear() override; private: @@ -32,7 +33,8 @@ private: KDCoordinate cumulatedHeightFromIndex(int j) override; int indexFromCumulatedHeight(KDCoordinate offsetY) override; int typeAtLocation(int i, int j) override; - void setTextFieldCaller(TextField * textField); + void setTextFieldSender(TextField * textField); + void setEditableExpressionViewSender(EditableExpressionView * editableExpressionView); void reloadData(); void resetPage(); void viewDidDisappear() override; @@ -56,9 +58,11 @@ private: void putLabelAtIndexInBuffer(int index, char * buffer); I18n::Message nodeLabelAtIndex(int index); const Poincare::Expression * expressionForIndex(int index); - + static void insertTextInTextField(void * sender, const char * textToInsert); + static void insertTextInEditableExpressionView(void * sender, const char * textToInsert); Poincare::GlobalContext * m_context; - TextField * m_textFieldCaller; + Responder * m_sender; + Action m_insertTextAction; int m_firstSelectedRow; int m_previousSelectedRow; Page m_currentPage; diff --git a/escher/include/escher/editable_expression_view.h b/escher/include/escher/editable_expression_view.h index 456535f0a..b6473af4a 100644 --- a/escher/include/escher/editable_expression_view.h +++ b/escher/include/escher/editable_expression_view.h @@ -25,6 +25,9 @@ public: /* Callback for MathToolbox */ void insertLayoutAtCursor(Poincare::ExpressionLayout * layout, Poincare::ExpressionLayout * pointedLayout); + /* Callback for VariableBoxController */ + void insertTextAtCursor(const char * text); + /* View */ KDSize minimalSizeForOptimalDisplay() const override; diff --git a/escher/src/editable_expression_view.cpp b/escher/src/editable_expression_view.cpp index 023028d0f..8f0ccb5c7 100644 --- a/escher/src/editable_expression_view.cpp +++ b/escher/src/editable_expression_view.cpp @@ -163,6 +163,11 @@ void EditableExpressionView::insertLayoutAtCursor(Poincare::ExpressionLayout * l } } +void EditableExpressionView::insertTextAtCursor(const char * text) { + m_expressionViewWithCursor.cursor()->insertText(text); + reload(); +} + void EditableExpressionView::reload() { m_expressionViewWithCursor.expressionView()->expressionLayout()->invalidAllSizesPositionsAndBaselines(); m_expressionViewWithCursor.cursorPositionChanged();