From 077a95197ecdb1bcfba5cd10d49d6b23a348988e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 19 Dec 2017 12:18:33 +0100 Subject: [PATCH] [escher] SelectableTableView handles setting the ccell as first responder if needed --- apps/calculation/history_view_cell.h | 3 + apps/calculation/output_expressions_view.h | 3 + apps/code/console_controller.cpp | 2 - apps/code/console_edit_cell.h | 5 ++ apps/code/console_line_cell.h | 3 + apps/regression/calculation_controller.cpp | 11 +--- apps/regression/calculation_controller.h | 2 +- .../even_odd_double_buffer_text_cell.h | 3 + apps/settings/sub_controller.cpp | 22 +------ apps/settings/sub_controller.h | 3 +- .../editable_cell_table_view_controller.cpp | 20 +----- .../editable_cell_table_view_controller.h | 1 - apps/shared/float_parameter_controller.cpp | 21 +----- apps/shared/float_parameter_controller.h | 3 +- apps/shared/range_parameter_controller.cpp | 64 +++++++++---------- apps/shared/range_parameter_controller.h | 23 ++++++- apps/shared/tab_table_controller.cpp | 2 +- apps/shared/tab_table_controller.h | 2 +- apps/shared/values_controller.cpp | 2 +- escher/include/escher/button.h | 3 + escher/include/escher/editable_text_cell.h | 3 + .../escher/even_odd_editable_text_cell.h | 3 + escher/include/escher/highlight_cell.h | 4 ++ .../message_table_cell_with_editable_text.h | 3 + escher/src/selectable_table_view.cpp | 21 ++++-- 25 files changed, 111 insertions(+), 121 deletions(-) diff --git a/apps/calculation/history_view_cell.h b/apps/calculation/history_view_cell.h index 1519bc9ee..d6ca3c1d5 100644 --- a/apps/calculation/history_view_cell.h +++ b/apps/calculation/history_view_cell.h @@ -19,6 +19,9 @@ public: void reloadScroll(); void setEven(bool even) override; void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } KDColor backgroundColor() const override; void setCalculation(Calculation * calculation); int numberOfSubviews() const override; diff --git a/apps/calculation/output_expressions_view.h b/apps/calculation/output_expressions_view.h index c49ccb882..b439c218e 100644 --- a/apps/calculation/output_expressions_view.h +++ b/apps/calculation/output_expressions_view.h @@ -15,6 +15,9 @@ public: void setExpressions(Poincare::ExpressionLayout ** expressionsLayout); KDColor backgroundColor() const override; void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } void reloadCell() override; KDSize minimalSizeForOptimalDisplay() const override; void didBecomeFirstResponder() override; diff --git a/apps/code/console_controller.cpp b/apps/code/console_controller.cpp index 62da1bd0c..eba0b1396 100644 --- a/apps/code/console_controller.cpp +++ b/apps/code/console_controller.cpp @@ -198,7 +198,6 @@ void ConsoleController::willDisplayCellAtLocation(HighlightCell * cell, int i, i void ConsoleController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { if (t->selectedRow() == m_consoleStore.numberOfLines()) { m_editCell.setEditing(true); - app()->setFirstResponder(&m_editCell); return; } if (t->selectedRow()>-1) { @@ -208,7 +207,6 @@ void ConsoleController::tableViewDidChangeSelection(SelectableTableView * t, int previousCell->reloadCell(); } ConsoleLineCell * selectedCell = (ConsoleLineCell *)(t->selectedCell()); - app()->setFirstResponder(selectedCell); selectedCell->reloadCell(); } } diff --git a/apps/code/console_edit_cell.h b/apps/code/console_edit_cell.h index 9a8882bc7..bf151274a 100644 --- a/apps/code/console_edit_cell.h +++ b/apps/code/console_edit_cell.h @@ -21,6 +21,11 @@ public: // Responder void didBecomeFirstResponder() override; + /* HighlightCell */ + Responder * responder() override { + return this; + } + // Edit cell void setEditing(bool isEditing, bool reinitDraftBuffer = false); void setText(const char * text); diff --git a/apps/code/console_line_cell.h b/apps/code/console_line_cell.h index 7348062a9..80efdacbe 100644 --- a/apps/code/console_line_cell.h +++ b/apps/code/console_line_cell.h @@ -21,6 +21,9 @@ public: /* HighlightCell */ void setHighlighted(bool highlight) override; void reloadCell() override; + Responder * responder() override { + return this; + } /* View */ int numberOfSubviews() const override; diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 6d0d018fc..4b231acc6 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -90,14 +90,6 @@ void CalculationController::tableViewDidChangeSelection(SelectableTableView * t, firstSubCellSelected = myPreviousCell->firstTextSelected(); } myCell->selectFirstText(firstSubCellSelected); - app()->setFirstResponder(myCell); - } else { - if (previousSelectedCellX == 1 && previousSelectedCellY >= 0 && previousSelectedCellY <= k_totalNumberOfDoubleBufferRows) { - EvenOddDoubleBufferTextCell * myPreviousCell = (EvenOddDoubleBufferTextCell *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); - if (app()->firstResponder()->commonAncestorWith(myPreviousCell) == myPreviousCell) { - app()->setFirstResponder(t); - } - } } } @@ -250,7 +242,8 @@ Responder * CalculationController::tabController() const { } View * CalculationController::loadView() { - SelectableTableView * tableView = (SelectableTableView *)TabTableController::loadView(); + SelectableTableView * tableView = new SelectableTableView(this, this, 0, 0, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, this, true, true, Palette::WallScreenDark); +; m_r2TitleCell = new EvenOddExpressionCell(1.0f, 0.5f); m_columnTitleCell = new EvenOddDoubleBufferTextCell(tableView); for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) { diff --git a/apps/regression/calculation_controller.h b/apps/regression/calculation_controller.h index 8bbbe1fe8..2de5133d3 100644 --- a/apps/regression/calculation_controller.h +++ b/apps/regression/calculation_controller.h @@ -9,7 +9,7 @@ namespace Regression { -class CalculationController : public Shared::TabTableController, public Shared::RegularTableViewDataSource, public ButtonRowDelegate, public AlternateEmptyViewDelegate { +class CalculationController : public Shared::TabTableController, public Shared::RegularTableViewDataSource, public SelectableTableViewDelegate, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store); diff --git a/apps/regression/even_odd_double_buffer_text_cell.h b/apps/regression/even_odd_double_buffer_text_cell.h index 7929b11bc..b3e8b6b2d 100644 --- a/apps/regression/even_odd_double_buffer_text_cell.h +++ b/apps/regression/even_odd_double_buffer_text_cell.h @@ -10,6 +10,9 @@ public: const char * secondText(); void reloadCell() override; void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } void setEven(bool even) override; bool firstTextSelected(); void selectFirstText(bool selectFirstText); diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 41279ea5d..2b43bc146 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -14,7 +14,7 @@ SubController::SubController(Responder * parentResponder) : ViewController(parentResponder), m_editableCell(&m_selectableTableView, this, m_draftTextBuffer), m_selectableTableView(this, this, 0, 1, k_topBottomMargin, Metric::CommonRightMargin, - k_topBottomMargin, Metric::CommonLeftMargin, this, this), + k_topBottomMargin, Metric::CommonLeftMargin, this), m_messageTreeModel(nullptr) { for (int i = 0; i < k_totalNumberOfCell; i++) { @@ -255,26 +255,6 @@ bool SubController::textFieldDidReceiveEvent(::TextField * textField, Ion::Event return TextFieldDelegate::textFieldDidReceiveEvent(textField, event); } -void SubController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { - if (m_messageTreeModel->label() != I18n::Message::DisplayMode) { - return; - } - if (previousSelectedCellX == t->selectedColumn() && previousSelectedCellY == t->selectedRow()) { - return; - } - if (previousSelectedCellY == numberOfRows()-1) { - MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); - myCell->setEditing(false); - } - if (t->selectedRow() >= 0 && t->selectedRow() < numberOfRows()-1) { - app()->setFirstResponder(&m_selectableTableView); - } - if (t->selectedRow() == numberOfRows() -1) { - MessageTableCellWithEditableText * myNewCell = (MessageTableCellWithEditableText *)t->selectedCell(); - app()->setFirstResponder(myNewCell); - } -} - StackViewController * SubController::stackController() const { return (StackViewController *)parentResponder(); } diff --git a/apps/settings/sub_controller.h b/apps/settings/sub_controller.h index ab7893dd7..e0e1d2851 100644 --- a/apps/settings/sub_controller.h +++ b/apps/settings/sub_controller.h @@ -8,7 +8,7 @@ namespace Settings { -class SubController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource, public SelectableTableViewDelegate, public Shared::TextFieldDelegate { +class SubController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource, public Shared::TextFieldDelegate { public: SubController(Responder * parentResponder); ~SubController(); @@ -35,7 +35,6 @@ public: bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; - void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; private: StackViewController * stackController() const; void setPreferenceWithValueIndex(I18n::Message message, int valueIndex); diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index 55bd2ddfe..6220c99a0 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -19,7 +19,8 @@ bool EditableCellTableViewController::textFieldShouldFinishEditing(TextField * t || (event == Ion::Events::Down && selectedRow() < numberOfRows()-1) || (event == Ion::Events::Up && selectedRow() > 0) || (event == Ion::Events::Right && textField->cursorLocation() == textField->draftTextLength() && selectedColumn() < numberOfColumns()-1) - || (event == Ion::Events::Left && textField->cursorLocation() == 0 && selectedColumn() > 0); } + || (event == Ion::Events::Left && textField->cursorLocation() == 0 && selectedColumn() > 0); +} bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { AppsContainer * appsContainer = ((TextFieldDelegateApp *)app())->container(); @@ -42,23 +43,6 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text return true; } -void EditableCellTableViewController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { - if (previousSelectedCellX == t->selectedColumn() && previousSelectedCellY == t->selectedRow()) { - return; - } - if (cellAtLocationIsEditable(previousSelectedCellX, previousSelectedCellY)) { - EvenOddEditableTextCell * myCell = (EvenOddEditableTextCell *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); - myCell->editableTextCell()->textField()->setEditing(false); - if (app()->firstResponder() == myCell->editableTextCell()->textField()) { - app()->setFirstResponder(t); - } - } - if (cellAtLocationIsEditable(t->selectedColumn(), t->selectedRow())) { - EvenOddEditableTextCell * myCell = (EvenOddEditableTextCell *)t->selectedCell(); - app()->setFirstResponder(myCell); - } -} - int EditableCellTableViewController::numberOfRows() { int numberOfModelElements = numberOfElements(); if (numberOfModelElements >= maxNumberOfElements()) { diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index 5820d498b..22b45809c 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -14,7 +14,6 @@ public: EditableCellTableViewController(Responder * parentResponder); bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; - void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; int numberOfRows() override; void willDisplayCellAtLocationWithDisplayMode(HighlightCell * cell, int i, int j, Poincare::Expression::FloatDisplayMode FloatDisplayMode); diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index f4cc97c54..91deae47b 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -145,25 +145,6 @@ bool FloatParameterController::textFieldDidReceiveEvent(::TextField * textField, return TextFieldDelegate::textFieldDidReceiveEvent(textField, event); } -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); - } - if (t->selectedRow() == numberOfRows()-1) { - Button * myNewCell = (Button *)t->selectedCell(); - app()->setFirstResponder(myNewCell); - return; - } - if (t->selectedRow() >= 0) { - MessageTableCellWithEditableText * myNewCell = (MessageTableCellWithEditableText *)t->selectedCell(); - app()->setFirstResponder(myNewCell); - } -} - TextFieldDelegateApp * FloatParameterController::textFieldDelegateApp() { return (TextFieldDelegateApp *)app(); } @@ -190,7 +171,7 @@ I18n::Message FloatParameterController::okButtonText() { } View * FloatParameterController::loadView() { - SelectableTableView * tableView = new SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, this); + SelectableTableView * tableView = new SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this); m_okButton = new ButtonWithSeparator(tableView, okButtonText(), Invocation([](void * context, void * sender) { FloatParameterController * parameterController = (FloatParameterController *) context; parameterController->buttonAction(); diff --git a/apps/shared/float_parameter_controller.h b/apps/shared/float_parameter_controller.h index fc47b14ed..32ee269ed 100644 --- a/apps/shared/float_parameter_controller.h +++ b/apps/shared/float_parameter_controller.h @@ -10,7 +10,7 @@ namespace Shared { /* This controller edits float parameter of any model (given through * parameterAtIndex and setParameterAtIndex). */ -class FloatParameterController : public DynamicViewController, public ListViewDataSource, public SelectableTableViewDataSource, public SelectableTableViewDelegate, public TextFieldDelegate { +class FloatParameterController : public DynamicViewController, public ListViewDataSource, public SelectableTableViewDataSource, public TextFieldDelegate { public: FloatParameterController(Responder * parentResponder); void didBecomeFirstResponder() override; @@ -28,7 +28,6 @@ public: bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; - void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; protected: int activeCell(); StackViewController * stackController(); diff --git a/apps/shared/range_parameter_controller.cpp b/apps/shared/range_parameter_controller.cpp index 7801d7a3b..6bb97f66a 100644 --- a/apps/shared/range_parameter_controller.cpp +++ b/apps/shared/range_parameter_controller.cpp @@ -10,7 +10,8 @@ namespace Shared { RangeParameterController::RangeParameterController(Responder * parentResponder, InteractiveCurveViewRange * interactiveRange) : FloatParameterController(parentResponder), m_interactiveRange(interactiveRange), - m_rangeCells{}, + m_xRangeCells{}, + m_yRangeCells{}, m_yAutoCell(nullptr) { } @@ -27,10 +28,13 @@ int RangeParameterController::typeAtLocation(int i, int j) { if (j == numberOfRows()-1) { return 0; } + if (j >= 0 && j < 2) { + return 1; + } if (j == 2) { return 2; } - return 1; + return 3; } void RangeParameterController::willDisplayCellForIndex(HighlightCell * cell, int index) { @@ -59,30 +63,6 @@ bool RangeParameterController::textFieldDidFinishEditing(TextField * textField, return false; } -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); - if (t->selectedRow() >= 0) { - app()->setFirstResponder(t); - } - } - if (t->selectedRow() == numberOfRows()-1) { - Button * myNewCell = (Button *)t->selectedCell(); - app()->setFirstResponder(myNewCell); - return; - } - if (t->selectedRow() >= 0 && t->selectedRow() !=2) { - MessageTableCellWithEditableText * myNewCell = (MessageTableCellWithEditableText *)t->cellAtLocation(t->selectedColumn(), t->selectedRow()); - if ((t->selectedRow() == 0 || t->selectedRow() == 1) || !m_interactiveRange->yAuto()) { - app()->setFirstResponder(myNewCell); - } - } -} - bool RangeParameterController::handleEvent(Ion::Events::Event event) { if (activeCell() == 2 && (event == Ion::Events::OK || event == Ion::Events::EXE)) { m_interactiveRange->setYAuto(!m_interactiveRange->yAuto()); @@ -109,25 +89,37 @@ bool RangeParameterController::setParameterAtIndex(int parameterIndex, double f) HighlightCell * RangeParameterController::reusableParameterCell(int index, int type) { if (type == 2) { + assert(index == 0); return m_yAutoCell; } + if (type == 1) { + assert(index >= 0); + assert(index < k_numberOfEditableTextCell); + return m_xRangeCells[index]; + } assert(index >= 0); - assert(index < k_numberOfTextCell); - return m_rangeCells[index]; + assert(index < k_numberOfConvertibleTextCell); + return m_yRangeCells[index]; } int RangeParameterController::reusableParameterCellCount(int type) { if (type == 2) { return 1; } - return k_numberOfTextCell; + if (type == 1) { + return k_numberOfEditableTextCell; + } + return k_numberOfConvertibleTextCell; } View * RangeParameterController::loadView() { SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView(); m_yAutoCell = new MessageTableCellWithSwitch(I18n::Message::YAuto); - for (int i = 0; i < k_numberOfTextCell; i++) { - m_rangeCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default); + for (int i = 0; i < k_numberOfEditableTextCell; i++) { + m_xRangeCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default); + } + for (int i = 0; i < k_numberOfConvertibleTextCell; i++) { + m_yRangeCells[i] = new MessageTableCellWithConvertibleEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default, m_interactiveRange); } return tableView; } @@ -135,9 +127,13 @@ View * RangeParameterController::loadView() { void RangeParameterController::unloadView(View * view) { delete m_yAutoCell; m_yAutoCell = nullptr; - for (int i = 0; i < k_numberOfTextCell; i++) { - delete m_rangeCells[i]; - m_rangeCells[i] = nullptr; + for (int i = 0; i < k_numberOfEditableTextCell; i++) { + delete m_xRangeCells[i]; + m_xRangeCells[i] = nullptr; + } + for (int i = 0; i < k_numberOfConvertibleTextCell; i++) { + delete m_yRangeCells[i]; + m_yRangeCells[i] = nullptr; } FloatParameterController::unloadView(view); } diff --git a/apps/shared/range_parameter_controller.h b/apps/shared/range_parameter_controller.h index a3200dd48..db415c348 100644 --- a/apps/shared/range_parameter_controller.h +++ b/apps/shared/range_parameter_controller.h @@ -15,19 +15,36 @@ public: int typeAtLocation(int i, int j) override; void willDisplayCellForIndex(HighlightCell * cell, int index) override; bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; - void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; bool handleEvent(Ion::Events::Event event) override; private: + class MessageTableCellWithConvertibleEditableText : public MessageTableCellWithEditableText { + public: + MessageTableCellWithConvertibleEditableText(Responder * parentResponder, TextFieldDelegate * textFieldDelegate, char * draftTextBuffer, I18n::Message message, InteractiveCurveViewRange * interactiveCurveViewRange) : + MessageTableCellWithEditableText(parentResponder, textFieldDelegate, draftTextBuffer, message), + m_interactiveRange(interactiveCurveViewRange) {} + Responder * responder() override { + if (m_interactiveRange->yAuto()) { + return nullptr; + } else { + return this; + } + } + private: + InteractiveCurveViewRange * m_interactiveRange; + }; HighlightCell * reusableParameterCell(int index, int type) override; int reusableParameterCellCount(int type) override; double parameterAtIndex(int index) override; bool setParameterAtIndex(int parameterIndex, double f) override; View * loadView() override; void unloadView(View * view) override; - constexpr static int k_numberOfTextCell = 4; + constexpr static int k_numberOfEditableTextCell = 2; + constexpr static int k_numberOfConvertibleTextCell = 2; + constexpr static int k_numberOfTextCell = k_numberOfEditableTextCell+k_numberOfConvertibleTextCell; InteractiveCurveViewRange * m_interactiveRange; char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength]; - MessageTableCellWithEditableText * m_rangeCells[k_numberOfTextCell]; + MessageTableCellWithEditableText * m_xRangeCells[k_numberOfEditableTextCell]; + MessageTableCellWithConvertibleEditableText * m_yRangeCells[k_numberOfConvertibleTextCell]; MessageTableCellWithSwitch * m_yAutoCell; }; diff --git a/apps/shared/tab_table_controller.cpp b/apps/shared/tab_table_controller.cpp index ef697a408..3e8a94d06 100644 --- a/apps/shared/tab_table_controller.cpp +++ b/apps/shared/tab_table_controller.cpp @@ -29,7 +29,7 @@ SelectableTableView * TabTableController::selectableTableView() { } View * TabTableController::loadView() { - return new SelectableTableView(this, m_dataSource, 0, 0, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, this, true, true, Palette::WallScreenDark); + return new SelectableTableView(this, m_dataSource, 0, 0, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, nullptr, true, true, Palette::WallScreenDark); } void TabTableController::unloadView(View * view) { diff --git a/apps/shared/tab_table_controller.h b/apps/shared/tab_table_controller.h index 43bfac994..935dc0679 100644 --- a/apps/shared/tab_table_controller.h +++ b/apps/shared/tab_table_controller.h @@ -8,7 +8,7 @@ namespace Shared { /* Tab table controller is a controller whose view is a selectable table view * and whose one ancestor is a tab */ -class TabTableController : public DynamicViewController, public SelectableTableViewDelegate, public SelectableTableViewDataSource { +class TabTableController : public DynamicViewController, public SelectableTableViewDataSource { public: TabTableController(Responder * parentResponder, TableViewDataSource * dataSource); void didBecomeFirstResponder() override; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 670288248..8a2820213 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -304,7 +304,7 @@ double ValuesController::evaluationOfAbscissaAtColumn(double abscissa, int colum } View * ValuesController::loadView() { - SelectableTableView * tableView = new SelectableTableView(this, this, 0, 0, k_topMargin, k_rightMargin, k_bottomMargin, k_leftMargin, this, this, true, true, Palette::WallScreenDark, 13, Palette::GreyDark, Palette::GreyMiddle); + SelectableTableView * tableView = new SelectableTableView(this, this, 0, 0, k_topMargin, k_rightMargin, k_bottomMargin, k_leftMargin, this, nullptr, true, true, Palette::WallScreenDark, 13, Palette::GreyDark, Palette::GreyMiddle); m_abscissaTitleCell = new EvenOddMessageTextCell(KDText::FontSize::Small); for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) { m_abscissaCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer, KDText::FontSize::Small); diff --git a/escher/include/escher/button.h b/escher/include/escher/button.h index 4b2ad2bd7..5f9348baa 100644 --- a/escher/include/escher/button.h +++ b/escher/include/escher/button.h @@ -12,6 +12,9 @@ public: Button(Responder * parentResponder, I18n::Message textBody, Invocation invocation, KDText::FontSize size = KDText::FontSize::Small, KDColor textColor = KDColorBlack); bool handleEvent(Ion::Events::Event event) override; void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } KDSize minimalSizeForOptimalDisplay() const override; protected: MessageTextView m_messageTextView; diff --git a/escher/include/escher/editable_text_cell.h b/escher/include/escher/editable_text_cell.h index 38ba56cb9..33f1009b9 100644 --- a/escher/include/escher/editable_text_cell.h +++ b/escher/include/escher/editable_text_cell.h @@ -13,6 +13,9 @@ public: TextField * textField(); void setMargins(KDCoordinate topMargin = 0, KDCoordinate rightMargin = 0, KDCoordinate bottomMargin = 0, KDCoordinate leftMargin = 0); void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; diff --git a/escher/include/escher/even_odd_editable_text_cell.h b/escher/include/escher/even_odd_editable_text_cell.h index 4c24ff60c..d727ad3b0 100644 --- a/escher/include/escher/even_odd_editable_text_cell.h +++ b/escher/include/escher/even_odd_editable_text_cell.h @@ -11,6 +11,9 @@ public: EditableTextCell * editableTextCell(); void setEven(bool even) override; void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; diff --git a/escher/include/escher/highlight_cell.h b/escher/include/escher/highlight_cell.h index 74153790a..25e19310a 100644 --- a/escher/include/escher/highlight_cell.h +++ b/escher/include/escher/highlight_cell.h @@ -2,6 +2,7 @@ #define ESCHER_HIGHLIGHT_CELL_H #include +#include class HighlightCell : public View { public: @@ -9,6 +10,9 @@ public: virtual void setHighlighted(bool highlight); bool isHighlighted() const { return m_highlighted; } virtual void reloadCell(); + virtual Responder * responder() { + return nullptr; + } protected: bool m_highlighted; }; 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 67d6a8c8f..8d37ae5bf 100644 --- a/escher/include/escher/message_table_cell_with_editable_text.h +++ b/escher/include/escher/message_table_cell_with_editable_text.h @@ -14,6 +14,9 @@ public: bool isEditing(); void setEditing(bool isEditing); void setHighlighted(bool highlight) override; + Responder * responder() override { + return this; + } void setAccessoryText(const char * text); void setTextColor(KDColor color) override; constexpr static int k_bufferLength = TextField::maxBufferSize(); diff --git a/escher/src/selectable_table_view.cpp b/escher/src/selectable_table_view.cpp index 7141d4f70..f51f2eb73 100644 --- a/escher/src/selectable_table_view.cpp +++ b/escher/src/selectable_table_view.cpp @@ -44,10 +44,11 @@ void SelectableTableView::reloadData() { } void SelectableTableView::didEnterResponderChain(Responder * previousFirstResponder) { - selectCellAtLocation(selectedColumn(), selectedRow()); - if (m_delegate) { - m_delegate->tableViewDidChangeSelection(this, 0, -1); - } + int col = selectedColumn(); + int row = selectedRow(); + selectColumn(0); + selectRow(-1); + selectCellAtLocation(col, row); } void SelectableTableView::willExitResponderChain(Responder * nextFirstResponder) { @@ -79,8 +80,18 @@ bool SelectableTableView::selectCellAtLocation(int i, int j) { selectRow(j); if (selectedRow() >= 0) { scrollToCell(i, j); - HighlightCell * cell = cellAtLocation(i, j); + } + HighlightCell * cell = selectedCell(); + if (cell) { cell->setHighlighted(true); + // Update first responder + if (i != previousX || j != previousY) { + if (cell->responder()) { + app()->setFirstResponder(cell->responder()); + } else { + app()->setFirstResponder(this); + } + } } if (m_delegate) { m_delegate->tableViewDidChangeSelection(this, previousX, previousY);