From c543145aae32c53c423f44fec2ceb79c54358acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Wed, 15 Nov 2017 15:01:40 +0100 Subject: [PATCH] [code] Optimized MenuController's script list scrolling speed. To know if the AddScript row should be displayed, we need to compute the free space size of the accordion, which is very slow. We thus memoized a bool indicating if the AddScript row should be displayed. Change-Id: Ia3891c0fc8df9b0b8bf2a9ad053be6dfc848c970 --- apps/code/accordion.cpp | 10 +++----- apps/code/accordion.h | 2 +- apps/code/menu_controller.cpp | 44 +++++++++++++++++++++-------------- apps/code/menu_controller.h | 4 +++- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/apps/code/accordion.cpp b/apps/code/accordion.cpp index 14aa4d6ee..3c8c7b108 100644 --- a/apps/code/accordion.cpp +++ b/apps/code/accordion.cpp @@ -13,10 +13,6 @@ Accordion::Accordion(char * buffer, int bufferSize) : } } -int Accordion::numberOfBuffers() { - return m_numberOfBuffers; -} - const char * Accordion::bufferAtIndex(int index) { assert(index >= 0 && index < numberOfBuffers()); cleanFreeSpace(); @@ -42,8 +38,8 @@ int Accordion::sizeOfEditableBufferAtIndex(int index) { break; } length++; - // We do not count one Free Space Marker, in order to always have at a - // Free Space of sizeat least one. + // We do not count one Free Space Marker, in order to always have at a Free + // Space of size at least one. } return length; } @@ -172,7 +168,7 @@ void Accordion::cleanFreeSpace() { && indexOfCharToChangeIntoFreeSpaceMarker < m_historySize) { m_history[indexOfCharToChangeIntoFreeSpaceMarker] = k_freeSpaceMarker; - indexOfCharToChangeIntoFreeSpaceMarker ++; + indexOfCharToChangeIntoFreeSpaceMarker++; } } diff --git a/apps/code/accordion.h b/apps/code/accordion.h index d6998d776..a7acbba73 100644 --- a/apps/code/accordion.h +++ b/apps/code/accordion.h @@ -7,7 +7,7 @@ class Accordion { public: Accordion(char * buffer, int bufferSize); - int numberOfBuffers(); + int numberOfBuffers() { return m_numberOfBuffers; } const char * bufferAtIndex(int index); char * editableBufferAtIndex(int index); int sizeOfEditableBufferAtIndex(int index); diff --git a/apps/code/menu_controller.cpp b/apps/code/menu_controller.cpp index e005bdb5e..cf1ff59ce 100644 --- a/apps/code/menu_controller.cpp +++ b/apps/code/menu_controller.cpp @@ -24,7 +24,8 @@ MenuController::MenuController(Responder * parentResponder, ScriptStore * script m_consoleController(parentResponder, m_scriptStore), m_scriptParameterController(nullptr, I18n::Message::ScriptOptions, m_scriptStore, this), m_editorController(this), - m_reloadConsoleWhenBecomingFirstResponder(false) + m_reloadConsoleWhenBecomingFirstResponder(false), + m_shouldDisplayAddScriptRow(true) { for (int i = 0; i < k_maxNumberOfDisplayableScriptCells; i++) { m_scriptCells[i].setParentResponder(&m_selectableTableView); @@ -35,11 +36,14 @@ MenuController::MenuController(Responder * parentResponder, ScriptStore * script } } +StackViewController * MenuController::stackViewController() { + return static_cast(parentResponder()->parentResponder()); +} + void MenuController::didBecomeFirstResponder() { if (m_reloadConsoleWhenBecomingFirstResponder) { reloadConsole(); } - if (footer()->selectedButton() == 0) { assert(m_selectableTableView.selectedRow() < 0); app()->setFirstResponder(&m_consoleButton); @@ -48,9 +52,14 @@ void MenuController::didBecomeFirstResponder() { if (m_selectableTableView.selectedRow() < 0) { m_selectableTableView.selectCellAtLocation(0,0); } + assert(m_selectableTableView.selectedRow() < m_scriptStore->numberOfScripts()); app()->setFirstResponder(&m_selectableTableView); } +void MenuController::viewWillAppear() { + updateAddScriptRowDisplay(); +} + bool MenuController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Down) { m_selectableTableView.deselectTable(); @@ -76,7 +85,7 @@ bool MenuController::handleEvent(Ion::Events::Event event) { assert(selectedColumn == 0); editScript(selectedRow); return true; - } else if (shouldDisplayAddScriptRow() + } else if (m_shouldDisplayAddScriptRow && selectedColumn == 0 && selectedRow == m_scriptStore->numberOfScripts()) { @@ -105,6 +114,7 @@ void MenuController::setParameteredScript() { void MenuController::addScript() { assert(m_scriptStore->numberOfScripts() < k_maxNumberOfScripts); if (m_scriptStore->addNewScript()) { + updateAddScriptRowDisplay(); m_selectableTableView.reloadData(); renameSelectedScript(); return; @@ -126,6 +136,7 @@ void MenuController::renameSelectedScript() { void MenuController::deleteScriptAtIndex(int i) { m_scriptStore->deleteScriptAtIndex(i); + updateAddScriptRowDisplay(); m_selectableTableView.reloadData(); } @@ -143,17 +154,12 @@ void MenuController::openConsoleWithScriptAtIndex(int scriptIndex) { m_reloadConsoleWhenBecomingFirstResponder = true; } -bool MenuController::shouldDisplayAddScriptRow() { - return (m_scriptStore->numberOfScripts() < k_maxNumberOfScripts - && !m_scriptStore->isFull()); -} - void MenuController::scriptContentEditionDidFinish(){ reloadConsole(); } int MenuController::numberOfRows() { - return m_scriptStore->numberOfScripts() + shouldDisplayAddScriptRow(); + return m_scriptStore->numberOfScripts() + m_shouldDisplayAddScriptRow; } void MenuController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { @@ -251,16 +257,16 @@ int MenuController::reusableCellCount(int type) { } int MenuController::typeAtLocation(int i, int j) { - assert(i>=0 && i=0 && j= 0 && i < numberOfColumns()); + assert(j >= 0 && j < numberOfRows()); + if (i == 0) { + if (j == numberOfRows()-1 && m_shouldDisplayAddScriptRow) { return AddScriptCellType; } return ScriptCellType; } - assert(i==1); - if (j==numberOfRows()-1 && shouldDisplayAddScriptRow()) { + assert(i == 1); + if (j == numberOfRows()-1 && m_shouldDisplayAddScriptRow) { return EmptyCellType; } return ScriptParameterCellType; @@ -273,7 +279,7 @@ void MenuController::willDisplayScriptTitleCellForIndex(HighlightCell * cell, in } void MenuController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { - if (shouldDisplayAddScriptRow() && selectedRow() == numberOfRows() - 1 && selectedColumn() == 1) { + if (selectedRow() == numberOfRows() - 1 && selectedColumn() == 1 && m_shouldDisplayAddScriptRow) { t->selectCellAtLocation(0, numberOfRows()-1); } } @@ -307,6 +313,7 @@ bool MenuController::textFieldDidFinishEditing(TextField * textField, const char newName = text; } if (m_scriptStore->renameScriptAtIndex(m_selectableTableView.selectedRow(), newName)) { + updateAddScriptRowDisplay(); textField->setText(newName); int currentRow = m_selectableTableView.selectedRow(); if (event == Ion::Events::Down && currentRow < numberOfRows() - 1) { @@ -330,6 +337,7 @@ bool MenuController::textFieldDidAbortEditing(TextField * textField, const char char numberedDefaultName[k_defaultScriptNameMaxSize]; numberedDefaultScriptName(numberedDefaultName); m_scriptStore->renameScriptAtIndex(m_selectableTableView.selectedRow(), const_cast(numberedDefaultName)); + updateAddScriptRowDisplay(); m_selectableTableView.reloadData(); } m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); @@ -375,8 +383,8 @@ void MenuController::intToText(int i, char * buffer) { buffer[2] = 0; } -StackViewController * MenuController::stackViewController() { - return static_cast(parentResponder()->parentResponder()); +void MenuController::updateAddScriptRowDisplay() { + m_shouldDisplayAddScriptRow = (m_scriptStore->numberOfScripts() < k_maxNumberOfScripts && !m_scriptStore->isFull()); } } diff --git a/apps/code/menu_controller.h b/apps/code/menu_controller.h index c149cf7ec..e4b062a3f 100644 --- a/apps/code/menu_controller.h +++ b/apps/code/menu_controller.h @@ -25,13 +25,13 @@ public: void deleteScriptAtIndex(int i); void reloadConsole(); void openConsoleWithScriptAtIndex(int scriptIndex); - bool shouldDisplayAddScriptRow(); void scriptContentEditionDidFinish(); /* ViewController */ View * view() override { return &m_selectableTableView; } bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; + void viewWillAppear() override; /* TableViewDataSource */ int numberOfRows() override; @@ -81,6 +81,7 @@ private: // 1 = length of null terminating char. void numberedDefaultScriptName(char * buffer); void intToText(int i, char * buffer); + void updateAddScriptRowDisplay(); ScriptStore * m_scriptStore; EvenOddEditableTextCell m_scriptCells[k_maxNumberOfDisplayableScriptCells]; /* In the initializer list of the MenuController constructor, we initialize @@ -96,6 +97,7 @@ private: ScriptParameterController m_scriptParameterController; EditorController m_editorController; bool m_reloadConsoleWhenBecomingFirstResponder; + bool m_shouldDisplayAddScriptRow; }; }