diff --git a/apps/sequence/values/interval_parameter_controller.cpp b/apps/sequence/values/interval_parameter_controller.cpp index 085ffc1cd..c89618475 100644 --- a/apps/sequence/values/interval_parameter_controller.cpp +++ b/apps/sequence/values/interval_parameter_controller.cpp @@ -21,7 +21,6 @@ void IntervalParameterController::willDisplayCellForIndex(HighlightCell * cell, bool IntervalParameterController::setParameterAtIndex(int parameterIndex, float f) { if (f <= 0) { - app()->displayWarning(I18n::Message::ForbiddenValue); return false; } SetterPointer setters[k_totalNumberOfCell] = {&Interval::setStart, &Interval::setEnd, &Interval::setStep}; diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index 299f63ce2..4e342ad18 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -24,11 +24,36 @@ View * FloatParameterController::view() { } void FloatParameterController::didBecomeFirstResponder() { - m_selectableTableView.reloadData(); - m_selectableTableView.selectCellAtLocation(0, 0); + if (m_selectableTableView.selectedRow() >= 0) { + int selectedRow = m_selectableTableView.selectedRow(); + selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow; + int selectedColumn = m_selectableTableView.selectedColumn(); + selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn; + m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow); + } app()->setFirstResponder(&m_selectableTableView); } +void FloatParameterController::viewWillAppear() { + m_selectableTableView.reloadData(); + if (m_selectableTableView.selectedRow() == -1) { + m_selectableTableView.selectCellAtLocation(0, 0); + } else { + int selectedRow = m_selectableTableView.selectedRow(); + selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow; + int selectedColumn = m_selectableTableView.selectedColumn(); + selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn; + m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow); + } +} + +void FloatParameterController::willExitResponderChain(Responder * nextFirstResponder) { + if (parentResponder() == nullptr) { + m_selectableTableView.deselectTable(); + m_selectableTableView.scrollToCell(0,0); + } +} + bool FloatParameterController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Back) { for (int i = 0; i < numberOfRows()-1; i++) { @@ -89,6 +114,9 @@ void FloatParameterController::willDisplayCellForIndex(HighlightCell * cell, int return; } MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *) cell; + if (myCell->isEditing()) { + return; + } char buffer[Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; Complex::convertFloatToText(parameterAtIndex(index), buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); myCell->setAccessoryText(buffer); @@ -103,15 +131,20 @@ bool FloatParameterController::textFieldDidFinishEditing(TextField * textField, return false; } if (!setParameterAtIndex(m_selectableTableView.selectedRow(), floatBody)) { + app()->displayWarning(I18n::Message::ForbiddenValue); return false; } willDisplayCellForIndex(m_selectableTableView.cellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()), activeCell()); + m_selectableTableView.reloadData(); m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()+1); return true; } void FloatParameterController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { + if (previousSelectedCellX == t->selectedColumn() && previousSelectedCellY == t->selectedRow()) { + return; + } if (previousSelectedCellY >= 0 && previousSelectedCellY < numberOfRows()-1) { MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); myCell->setEditing(false); diff --git a/apps/shared/float_parameter_controller.h b/apps/shared/float_parameter_controller.h index 414f8765f..89ba2f6c8 100644 --- a/apps/shared/float_parameter_controller.h +++ b/apps/shared/float_parameter_controller.h @@ -15,6 +15,8 @@ public: FloatParameterController(Responder * parentResponder, I18n::Message okButtonText = I18n::Message::Ok); View * view() override; void didBecomeFirstResponder() override; + void viewWillAppear() override; + void willExitResponderChain(Responder * nextFirstResponder) override; bool handleEvent(Ion::Events::Event event) override; int typeAtLocation(int i, int j) override; diff --git a/apps/shared/range_parameter_controller.cpp b/apps/shared/range_parameter_controller.cpp index 05501eb59..255632787 100644 --- a/apps/shared/range_parameter_controller.cpp +++ b/apps/shared/range_parameter_controller.cpp @@ -70,6 +70,9 @@ bool RangeParameterController::textFieldDidFinishEditing(TextField * textField, } void RangeParameterController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { + if (previousSelectedCellX == t->selectedColumn() && previousSelectedCellY == t->selectedRow()) { + return; + } if (previousSelectedCellY < numberOfRows()-1 && previousSelectedCellY >= 0 && previousSelectedCellY !=2) { MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); myCell->setEditing(false); diff --git a/escher/include/escher/message_table_cell_with_editable_text.h b/escher/include/escher/message_table_cell_with_editable_text.h index c878e159f..86ab2fb9d 100644 --- a/escher/include/escher/message_table_cell_with_editable_text.h +++ b/escher/include/escher/message_table_cell_with_editable_text.h @@ -11,6 +11,7 @@ public: View * accessoryView() const override; const char * editedText() const; void didBecomeFirstResponder() override; + bool isEditing(); void setEditing(bool isEditing); void setHighlighted(bool highlight) override; void setAccessoryText(const char * text); diff --git a/escher/src/message_table_cell_with_editable_text.cpp b/escher/src/message_table_cell_with_editable_text.cpp index cee862df5..b76d2fbf6 100644 --- a/escher/src/message_table_cell_with_editable_text.cpp +++ b/escher/src/message_table_cell_with_editable_text.cpp @@ -21,6 +21,10 @@ void MessageTableCellWithEditableText::didBecomeFirstResponder() { app()->setFirstResponder(&m_textField); } +bool MessageTableCellWithEditableText::isEditing() { + return m_textField.isEditing(); +} + void MessageTableCellWithEditableText::setEditing(bool isEditing) { m_textField.setEditing(isEditing); }