[escher] Add methods viewWillAppear/Disappear in view controller instead

of keeping track of dataHasChanged in the selectable table view

Change-Id: Id2626f527f44714e29b9bd66e2c843193e1b57b5
This commit is contained in:
Émilie Feral
2017-02-13 16:31:05 +01:00
parent 761be1c8c7
commit 6f138e6b1c
45 changed files with 176 additions and 56 deletions

View File

@@ -85,7 +85,6 @@ void ListController::editExpression(FunctionExpressionCell * functionCell, Ion::
},
[](void * context, void * sender){
});
m_selectableTableView.dataHasChanged(true);
}
ListParameterController * ListController::parameterController() {
@@ -110,8 +109,6 @@ void ListController::configureFunction(Shared::Function * function) {
StackViewController * stack = stackController();
parameterController()->setFunction(function);
stack->push(parameterController());
// Force to reload the table (deleted functions, desactivated function)
m_selectableTableView.dataHasChanged(true);
}
void ListController::willDisplayTitleCellAtIndex(TableViewCell * cell, int j) {

View File

@@ -35,7 +35,7 @@ void FunctionParameterController::setFunction(Function * function) {
}
void FunctionParameterController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
m_selectableTableView.selectCellAtLocation(0, 0);
app()->setFirstResponder(&m_selectableTableView);
}

View File

@@ -25,7 +25,6 @@ ValuesController::ValuesController(Responder * parentResponder, FunctionStore *
m_derivativeParameterController(DerivativeParameterController(this)),
m_setIntervalButton(Button(this, "Regler l'intervalle",Invocation([](void * context, void * sender) {
ValuesController * valuesController = (ValuesController *) context;
valuesController->hasChangedTableData();
StackViewController * stack = ((StackViewController *)valuesController->stackController());
stack->push(valuesController->intervalParameterController());
}, this), KDText::FontSize::Small)),
@@ -83,20 +82,16 @@ bool ValuesController::handleEvent(Ion::Events::Event event) {
}
if (event == Ion::Events::OK) {
if (activeRow() == -1) {
m_selectableTableView.dataHasChanged(true);
return headerViewController()->handleEvent(event);
}
if (activeRow() == 0) {
if (activeColumn() == 0) {
m_selectableTableView.dataHasChanged(true);
configureAbscissa();
return true;
}
if (isDerivativeColumn(activeColumn())) {
m_selectableTableView.dataHasChanged(true);
configureDerivativeFunction();
} else {
m_selectableTableView.dataHasChanged(true);
configureFunction();
}
return true;
@@ -291,10 +286,6 @@ Responder * ValuesController::defaultController() {
return tabController();
}
void ValuesController::hasChangedTableData() {
m_selectableTableView.dataHasChanged(true);
}
void ValuesController::selectCellAtLocation(int i, int j) {
m_selectableTableView.selectCellAtLocation(i, j);
}

View File

@@ -35,7 +35,6 @@ public:
bool isEmpty() const override;
const char * emptyMessage() override;
Responder * defaultController() override;
void hasChangedTableData();
void selectCellAtLocation(int i, int j);
int activeRow();
int activeColumn();

View File

@@ -25,6 +25,7 @@ Node * NodeListViewController::nodeModel() {
void NodeListViewController::setNodeModel(Node * nodeModel) {
m_nodeModel = nodeModel;
m_selectableTableView.reloadData();
}
void NodeListViewController::setFirstSelectedRow(int firstSelectedRow) {

View File

@@ -59,7 +59,7 @@ void ImageTableView::setCalculation(Calculation * calculation, int index) {
}
void ImageTableView::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
m_isSelected = true;
if (m_selectableTableView.selectedRow() == -1) {
m_selectableTableView.selectCellAtLocation(0, 0);

View File

@@ -220,6 +220,10 @@ int CalculationController::typeAtLocation(int i, int j) {
return 3;
}
void CalculationController::viewWillAppear() {
m_selectableTableView.reloadData();
}
Responder * CalculationController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}

View File

@@ -33,6 +33,7 @@ public:
TableViewCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
int typeAtLocation(int i, int j) override;
void viewWillAppear() override;
private:
Responder * tabController() const;
constexpr static int k_totalNumberOfRows = 11;

View File

@@ -33,7 +33,7 @@ View * ChangeTypeParameterController::view() {
}
void ChangeTypeParameterController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
m_selectableTableView.selectCellAtLocation(0, 0);
app()->setFirstResponder(&m_selectableTableView);
}

View File

@@ -58,7 +58,7 @@ bool ListController::handleEvent(Ion::Events::Event event) {
}
if (event == Ion::Events::OK && m_selectableTableView.selectedColumn() == 1
&& m_selectableTableView.selectedRow() == numberOfRows() - 1) {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
app()->displayModalViewController(&m_typeStackController, 0.f, 0.f, 32, 20, 20, 20);
return true;
}

View File

@@ -105,7 +105,7 @@ bool SequenceTitleCell::handleEvent(Ion::Events::Event event) {
m_listParameterController->setSequence(m_sequence);
stack->push(m_listParameterController);
SelectableTableView * table = (SelectableTableView *)parentResponder();
table->dataHasChanged(true);
table->reloadData();
return true;
}
return false;

View File

@@ -35,7 +35,7 @@ View * TypeParameterController::view() {
}
void TypeParameterController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
m_selectableTableView.selectCellAtLocation(0, 0);
app()->setFirstResponder(&m_selectableTableView);
}

View File

@@ -35,7 +35,6 @@ View * MainController::view() {
}
void MainController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
if (m_selectableTableView.selectedRow() < 0) {
m_selectableTableView.selectCellAtLocation(0, 0);
}
@@ -45,7 +44,6 @@ void MainController::didBecomeFirstResponder() {
bool MainController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK) {
m_subController.setNodeModel(m_nodeModel->children(m_selectableTableView.selectedRow()), m_selectableTableView.selectedRow());
m_selectableTableView.dataHasChanged(true);
StackViewController * stack = stackController();
stack->push(&m_subController);
}
@@ -92,6 +90,10 @@ void MainController::willDisplayCellForIndex(TableViewCell * cell, int index) {
}
}
void MainController::viewWillAppear() {
m_selectableTableView.reloadData();
}
StackViewController * MainController::stackController() const {
return (StackViewController *)parentResponder();
}

View File

@@ -21,6 +21,7 @@ public:
TableViewCell * reusableCell(int index) override;
int reusableCellCount() override;
void willDisplayCellForIndex(TableViewCell * cell, int index) override;
void viewWillAppear() override;
private:
StackViewController * stackController() const;
constexpr static int k_totalNumberOfCell = 5;

View File

@@ -30,7 +30,6 @@ View * SubController::view() {
}
void SubController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.selectCellAtLocation(0, valueIndexAtPreferenceIndex(m_preferenceIndex));
app()->setFirstResponder(&m_selectableTableView);
}
@@ -77,6 +76,10 @@ void SubController::setNodeModel(const Node * nodeModel, int preferenceIndex) {
m_preferenceIndex = preferenceIndex;
}
void SubController::viewWillAppear() {
m_selectableTableView.reloadData();
}
StackViewController * SubController::stackController() const {
return (StackViewController *)parentResponder();
}

View File

@@ -20,6 +20,7 @@ public:
int reusableCellCount() override;
void willDisplayCellForIndex(TableViewCell * cell, int index) override;
void setNodeModel(const Node * nodeModel, int preferenceIndex);
void viewWillAppear() override;
private:
StackViewController * stackController() const;
void setPreferenceAtIndexWithValueIndex(int preferenceIndex, int valueIndex);

View File

@@ -78,14 +78,16 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(T
if (j == numberOfRows() - 1) {
/* Display an empty line only if there is enough space for a new element in
* data */
if (numberOfElements() < maxNumberOfElements()) {
if (numberOfElements() < maxNumberOfElements() && !myEditableValueCell->isEditing()) {
buffer[0] = 0;
myEditableValueCell->setText(buffer);
return;
}
}
Complex::convertFloatToText(dataAtLocation(i, j), buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, displayMode);
myEditableValueCell->setText(buffer);
if (!myEditableValueCell->isEditing()) {
Complex::convertFloatToText(dataAtLocation(i, j), buffer, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, displayMode);
myEditableValueCell->setText(buffer);
}
return;
}
}
@@ -103,4 +105,9 @@ void EditableCellTableViewController::didBecomeFirstResponder() {
app()->setFirstResponder(&m_selectableTableView);
}
void EditableCellTableViewController::viewWillAppear() {
m_selectableTableView.reloadData();
}
}

View File

@@ -23,6 +23,7 @@ public:
int indexFromCumulatedHeight(KDCoordinate offsetY) override;
void didBecomeFirstResponder() override;
void viewWillAppear() override;
protected:
SelectableTableView m_selectableTableView;
private:

View File

@@ -159,6 +159,10 @@ bool ListController::handleEvent(Ion::Events::Event event) {
return false;
}
void ListController::viewWillAppear() {
m_selectableTableView.reloadData();
}
StackViewController * ListController::stackController() const{
return (StackViewController *)(parentResponder()->parentResponder());
}

View File

@@ -26,6 +26,7 @@ public:
void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override;
void didBecomeFirstResponder() override;
bool handleEvent(Ion::Events::Event event) override;
void viewWillAppear() override;
protected:
static constexpr KDCoordinate k_emptyRowHeight = 50;
StackViewController * stackController() const;

View File

@@ -23,7 +23,7 @@ View * ListParameterController::view() {
}
void ListParameterController::didBecomeFirstResponder() {
m_selectableTableView.dataHasChanged(true);
m_selectableTableView.reloadData();
if (m_selectableTableView.selectedRow() == -1) {
m_selectableTableView.selectCellAtLocation(0, 0);
} else {

View File

@@ -79,7 +79,6 @@ bool StoreController::handleEvent(Ion::Events::Event event) {
}
if (event == Ion::Events::OK && m_selectableTableView.selectedRow() == 0) {
m_storeParameterController.selectXColumn(m_selectableTableView.selectedColumn() == 0);
m_selectableTableView.dataHasChanged(true);
StackViewController * stack = ((StackViewController *)parentResponder()->parentResponder());
stack->push(&m_storeParameterController);
return true;

View File

@@ -136,6 +136,10 @@ int CalculationController::typeAtLocation(int i, int j) {
return i;
}
void CalculationController::viewWillAppear() {
m_selectableTableView.reloadData();
}
Responder * CalculationController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}

View File

@@ -31,6 +31,7 @@ public:
TableViewCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
int typeAtLocation(int i, int j) override;
void viewWillAppear() override;
private:
Responder * tabController() const;
constexpr static int k_totalNumberOfRows = 13;

View File

@@ -12,6 +12,8 @@ public:
const char * title() const override;
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void viewWillDisappear() override;
private:
class ContentView : public View {
public:

View File

@@ -22,7 +22,6 @@ class App : public Responder {
public:
constexpr static uint8_t Magic = 0xA8;
App(Container * container, ViewController * rootViewController, const char * name = nullptr, const char * upperName = nullptr, const Image * icon = nullptr);
void setWindow(Window * window);
void setFirstResponder(Responder * responder);
Responder * firstResponder();
void processEvent(Ion::Events::Event event);
@@ -35,6 +34,11 @@ public:
const char * upperName();
const Image * icon();
uint8_t m_magic; // Poor man's RTTI
virtual void didBecomeActive(Window * window);
virtual void willBecomeInactive();
protected:
ModalViewController m_modalViewController;
private:

View File

@@ -18,6 +18,7 @@ public:
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
void didBecomeFirstResponder() override;
bool isEditing();
void setEditing(bool isEditing);
constexpr static int k_bufferLength = 255;
private:

View File

@@ -17,6 +17,7 @@ public:
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
void didBecomeFirstResponder() override;
bool isEditing();
void setEditing(bool isEditing);
private:
EditableTextCell m_editableCell;

View File

@@ -16,6 +16,8 @@ public:
void didBecomeFirstResponder() override;
bool handleEvent(Ion::Events::Event event) override;
bool setSelectedButton(int selectedButton);
void viewWillAppear() override;
void viewWillDisappear() override;
private:
class ContentView : public View {
public:

View File

@@ -16,6 +16,8 @@ public:
KDCoordinate topMargin = 0, KDCoordinate leftMargin = 0, KDCoordinate bottomMargin = 0, KDCoordinate rightMargin = 0);
void dismissModalViewController();
bool isDisplayingModal();
void viewWillAppear() override;
void viewWillDisappear() override;
private:
class ContentView : public View {
public:

View File

@@ -30,13 +30,11 @@ public:
void deselectTable();
bool selectCellAtLocation(int i, int j);
TableViewCell * selectedCell();
void dataHasChanged(bool dataHasChanged);
protected:
SelectableTableViewDelegate * m_delegate;
private:
int m_selectedCellX;
int m_selectedCellY;
bool m_dataHasChanged;
};
#endif

View File

@@ -21,6 +21,8 @@ public:
const char * title() const override;
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void viewWillDisappear() override;
private:
class ControllerView : public View {
public:

View File

@@ -17,6 +17,8 @@ public:
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
void didResignFirstResponder() override;
void viewWillAppear() override;
void viewWillDisappear() override;
private:
class ContentView : public View {
public:

View File

@@ -19,6 +19,8 @@ public:
ViewController(Responder * parentResponder);
virtual const char * title() const;
virtual View * view() = 0;
virtual void viewWillAppear();
virtual void viewWillDisappear();
};
#endif

View File

@@ -74,3 +74,15 @@ void AlternateEmptyViewController::didBecomeFirstResponder() {
app()->setFirstResponder(m_contentView.mainViewController());
}
}
void AlternateEmptyViewController::viewWillAppear() {
if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) {
m_contentView.mainViewController()->viewWillAppear();
}
}
void AlternateEmptyViewController::viewWillDisappear() {
if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) {
m_contentView.mainViewController()->viewWillDisappear();
}
}

View File

@@ -17,16 +17,6 @@ App::App(Container * container, ViewController * rootViewController, const char
{
}
void App::setWindow(Window * window) {
View * view = m_modalViewController.view();
assert(m_modalViewController.app() == this);
window->setContentView(view);
if (m_firstResponder == nullptr) {
setFirstResponder(&m_modalViewController);
}
window->redraw();
}
void App::processEvent(Ion::Events::Event event) {
Responder * responder = m_firstResponder;
bool didHandleEvent = false;
@@ -81,4 +71,19 @@ void App::displayWarning(const char * warningMessage) {
const Container * App::container() const {
return m_container;
}
}
void App::didBecomeActive(Window * window) {
View * view = m_modalViewController.view();
assert(m_modalViewController.app() == this);
window->setContentView(view);
if (m_firstResponder == nullptr) {
setFirstResponder(&m_modalViewController);
}
window->redraw();
m_modalViewController.viewWillAppear();
}
void App::willBecomeInactive() {
m_modalViewController.viewWillDisappear();
}

View File

@@ -10,8 +10,13 @@ Container::Container() :
}
void Container::switchTo(App * app) {
if (m_activeApp) {
m_activeApp->willBecomeInactive();
}
m_activeApp = app;
m_activeApp->setWindow(window());
if (m_activeApp) {
m_activeApp->didBecomeActive(window());
}
}
App * Container::activeApp() {

View File

@@ -48,6 +48,10 @@ void EditableTextCell::didBecomeFirstResponder() {
app()->setFirstResponder(&m_textField);
}
bool EditableTextCell::isEditing() {
return m_textField.isEditing();
}
void EditableTextCell::setEditing(bool isEditing) {
m_textField.setEditing(isEditing);
}

View File

@@ -48,6 +48,10 @@ void EvenOddEditableTextCell::didBecomeFirstResponder() {
app()->setFirstResponder(&m_editableCell);
}
bool EvenOddEditableTextCell::isEditing() {
return m_editableCell.isEditing();
}
void EvenOddEditableTextCell::setEditing(bool isEditing) {
m_editableCell.setEditing(isEditing);
}

View File

@@ -131,3 +131,11 @@ bool HeaderViewController::handleEvent(Ion::Events::Event event) {
}
return false;
}
void HeaderViewController::viewWillAppear() {
m_contentView.mainViewController()->viewWillAppear();
}
void HeaderViewController::viewWillDisappear() {
m_contentView.mainViewController()->viewWillDisappear();
}

View File

@@ -115,14 +115,18 @@ void ModalViewController::displayModalViewController(ViewController * vc, float
m_currentModalViewController = vc;
vc->setParentResponder(this);
m_previousResponder = app()->firstResponder();
m_regularViewController->viewWillDisappear();
m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin);
app()->setFirstResponder(vc);
m_currentModalViewController->viewWillAppear();
}
void ModalViewController::dismissModalViewController() {
m_currentModalViewController->viewWillDisappear();
m_currentModalViewController = nullptr;
app()->setFirstResponder(m_previousResponder);
m_contentView.dismissModalView();
m_regularViewController->viewWillAppear();
}
void ModalViewController::didBecomeFirstResponder() {
@@ -142,3 +146,17 @@ bool ModalViewController::handleEvent(Ion::Events::Event event) {
}
return false;
}
void ModalViewController::viewWillAppear() {
if (m_contentView.isDisplayingModal()) {
m_currentModalViewController->viewWillAppear();
}
m_regularViewController->viewWillAppear();
}
void ModalViewController::viewWillDisappear() {
if (m_contentView.isDisplayingModal()) {
m_currentModalViewController->viewWillDisappear();
}
m_regularViewController->viewWillDisappear();
}

View File

@@ -9,8 +9,7 @@ SelectableTableView::SelectableTableView(Responder * parentResponder, TableViewD
Responder(parentResponder),
m_delegate(delegate),
m_selectedCellX(0),
m_selectedCellY(-1),
m_dataHasChanged(true)
m_selectedCellY(-1)
{
}
@@ -27,11 +26,6 @@ int SelectableTableView::selectedColumn() {
}
void SelectableTableView::didBecomeFirstResponder() {
if (m_dataHasChanged) {
reloadData();
scrollToCell(m_selectedCellX, m_selectedCellY);
m_dataHasChanged = false;
}
if (m_delegate) {
m_delegate->tableViewDidChangeSelection(this, 0, -1);
}
@@ -98,7 +92,3 @@ bool SelectableTableView::handleEvent(Ion::Events::Event event) {
}
return false;
}
void SelectableTableView::dataHasChanged(bool dataHasChanged) {
m_dataHasChanged = dataHasChanged;
}

View File

@@ -91,6 +91,10 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b
m_view.pushStack(vc->title(), textColor, backgroundColor, separatorColor);
m_children[m_numberOfChildren++] = vc;
setupActiveViewController();
if (m_numberOfChildren > 1) {
m_children[m_numberOfChildren-2]->viewWillDisappear();
}
vc->viewWillAppear();
}
void StackViewController::pop() {
@@ -100,6 +104,8 @@ void StackViewController::pop() {
vc->setParentResponder(nullptr);
m_numberOfChildren--;
setupActiveViewController();
vc->viewWillDisappear();
m_children[m_numberOfChildren-1]->viewWillAppear();
}
void StackViewController::setupActiveViewController() {
@@ -129,3 +135,17 @@ bool StackViewController::handleEvent(Ion::Events::Event event) {
View * StackViewController::view() {
return &m_view;
}
void StackViewController::viewWillAppear() {
ViewController * vc = m_children[m_numberOfChildren-1];
if (m_numberOfChildren > 0 && vc) {
vc->viewWillAppear();
}
}
void StackViewController::viewWillDisappear() {
ViewController * vc = m_children[m_numberOfChildren-1];
if (m_numberOfChildren > 0 && vc) {
vc->viewWillDisappear();
}
}

View File

@@ -94,12 +94,17 @@ bool TabViewController::handleEvent(Ion::Events::Event event) {
void TabViewController::setActiveTab(int8_t i) {
ViewController * activeVC = m_children[i];
if (i != m_activeChildIndex) {
//TODO assert(i <= m_numberOfchildren);
assert(i <= m_numberOfChildren);
m_view.setActiveView(activeVC->view());
m_view.m_tabView.setActiveIndex(i);
if (m_activeChildIndex >= 0) {
m_children[m_activeChildIndex]->viewWillDisappear();
}
m_activeChildIndex = i;
}
if (i >= 0) {
m_children[i]->viewWillAppear();
}
} else {}
app()->setFirstResponder(activeVC);
}
@@ -141,3 +146,13 @@ uint8_t TabViewController::numberOfTabs() {
const char * TabViewController::tabName(uint8_t index) {
return m_children[index]->title();
}
void TabViewController::viewWillAppear() {
ViewController * activeVC = m_children[m_activeChildIndex];
activeVC->viewWillAppear();
}
void TabViewController::viewWillDisappear() {
ViewController * activeVC = m_children[m_activeChildIndex];
activeVC->viewWillDisappear();
}

View File

@@ -8,3 +8,9 @@ ViewController::ViewController(Responder * parentResponder) :
const char * ViewController::title() const {
return nullptr;
}
void ViewController::viewWillAppear() {
}
void ViewController::viewWillDisappear() {
}