[escher] Change dynamic view controller paradigm

Change-Id: I57fd41c9b9ad8a1e8b684b97fdf80ddffd71881d
This commit is contained in:
Émilie Feral
2017-05-03 10:26:44 +02:00
parent a1f3c21d9b
commit 70fc734f7b
61 changed files with 338 additions and 475 deletions

View File

@@ -120,7 +120,9 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
}
void AppsContainer::switchTo(App * app) {
m_window.setTitle(app->upperName());
if (app) {
m_window.setTitle(app->upperName());
}
Container::switchTo(app);
}

View File

@@ -97,18 +97,17 @@ TextFieldDelegateApp * EditExpressionController::textFieldDelegateApp() {
return (App *)app();
}
void EditExpressionController::loadView() {
m_historyController->loadView();
DynamicViewController::loadView();
}
void EditExpressionController::unloadView() {
m_historyController->unloadView();
DynamicViewController::unloadView();
}
View * EditExpressionController::createView() {
View * EditExpressionController::loadView() {
return new ContentView(this, (TableView *)m_historyController->view(), this);
}
void EditExpressionController::unloadView(View * view) {
delete view;
}
void EditExpressionController::viewDidDisappear() {
DynamicViewController::viewDidDisappear();
m_historyController->viewDidDisappear();
}
}

View File

@@ -10,17 +10,17 @@
namespace Calculation {
class HistoryController;
/* TODO: implement a split view */
class EditExpressionController : public DynamicViewController, public Shared::TextFieldDelegate {
public:
EditExpressionController(Responder * parentResponder, HistoryController * historyController, CalculationStore * calculationStore);
void didBecomeFirstResponder() override;
void viewDidDisappear() override;
bool handleEvent(Ion::Events::Event event) override;
const char * textBody();
void setTextBody(const char * text);
bool textFieldDidFinishEditing(::TextField * textField, const char * text, Ion::Events::Event event) override;
bool textFieldDidAbortEditing(::TextField * textField, const char * text) override;
void loadView() override;
void unloadView() override;
private:
class ContentView : public View {
public:
@@ -38,7 +38,8 @@ private:
TextField m_textField;
char m_textBody[TextField::maxBufferSize()];
};
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
Shared::TextFieldDelegateApp * textFieldDelegateApp() override;
HistoryController * m_historyController;
CalculationStore * m_calculationStore;

View File

@@ -171,29 +171,27 @@ int HistoryController::typeAtLocation(int i, int j) {
return 0;
}
void HistoryController::unloadView() {
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
assert(m_calculationHistory[i] != nullptr);
delete m_calculationHistory[i];
m_calculationHistory[i] = nullptr;
}
DynamicViewController::unloadView();
}
void HistoryController::scrollToCell(int i, int j) {
selectableTableView()->scrollToCell(i, j);
}
View * HistoryController::createView() {
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
assert(m_calculationHistory[i] == nullptr);
m_calculationHistory[i] = new HistoryViewCell();
}
return new CalculationSelectableTableView(this, this, this);
}
CalculationSelectableTableView * HistoryController::selectableTableView() {
return (CalculationSelectableTableView *)view();
}
View * HistoryController::loadView() {
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
m_calculationHistory[i] = new HistoryViewCell();
}
return new CalculationSelectableTableView(this, this, this);
}
void HistoryController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
delete m_calculationHistory[i];
m_calculationHistory[i] = nullptr;
}
delete view;
}
}

View File

@@ -28,10 +28,10 @@ public:
int indexFromCumulatedHeight(KDCoordinate offsetY) override;
int typeAtLocation(int i, int j) override;
void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override;
void unloadView() override;
void scrollToCell(int i, int j);
View * loadView() override;
void unloadView(View * view) override;
private:
View * createView() override;
CalculationSelectableTableView * selectableTableView();
constexpr static int k_maxNumberOfDisplayedRows = 5;
HistoryViewCell * m_calculationHistory[k_maxNumberOfDisplayedRows];

View File

@@ -36,18 +36,6 @@ KDCoordinate ListController::rowHeight(int j) {
return functionSize + k_emptyRowHeight - KDText::stringSize(" ").height();
}
void ListController::unloadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
assert(m_functionTitleCells[i] != nullptr);
delete m_functionTitleCells[i];
m_functionTitleCells[i] = nullptr;
assert(m_expressionCells[i] != nullptr);
delete m_expressionCells[i];
m_expressionCells[i] = nullptr;
}
Shared::ListController::unloadView();
}
void ListController::editExpression(Function * function, Ion::Events::Event event) {
char * initialText = nullptr;
char initialTextContent[TextField::maxBufferSize()];
@@ -111,14 +99,22 @@ void ListController::removeFunctionRow(Function * function) {
}
}
View * ListController::createView() {
View * ListController::loadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
assert(m_functionTitleCells[i] == nullptr);
m_functionTitleCells[i] = new FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator);
assert(m_expressionCells[i] == nullptr);
m_expressionCells[i] = new FunctionExpressionCell();
}
return Shared::ListController::createView();
return Shared::ListController::loadView();
}
void ListController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfRows; i++) {
delete m_functionTitleCells[i];
m_functionTitleCells[i] = nullptr;
delete m_expressionCells[i];
m_expressionCells[i] = nullptr;
}
Shared::ListController::unloadView(view);
}
}

View File

@@ -17,7 +17,6 @@ public:
const char * title() override;
int numberOfRows() override;
KDCoordinate rowHeight(int j) override;
void unloadView() override;
private:
void editExpression(Shared::Function * function, Ion::Events::Event event) override;
Shared::ListParameterController * parameterController() override;
@@ -27,7 +26,8 @@ private:
void willDisplayTitleCellAtIndex(HighlightCell * cell, int j) override;
void willDisplayExpressionCellAtIndex(HighlightCell * cell, int j) override;
void removeFunctionRow(Shared::Function * function) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
constexpr static int k_maxNumberOfRows = 5;
FunctionTitleCell * m_functionTitleCells[k_maxNumberOfRows];
Shared::FunctionExpressionCell * m_expressionCells[k_maxNumberOfRows];

View File

@@ -81,20 +81,6 @@ IntervalParameterController * ValuesController::intervalParameterController() {
return &m_intervalParameterController;
}
void ValuesController::unloadView() {
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_floatCells[i] != nullptr);
delete m_floatCells[i];
m_floatCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfFunctions; i++) {
assert(m_functionTitleCells[i] != nullptr);
delete m_functionTitleCells[i];
m_functionTitleCells[i] = nullptr;
}
Shared::ValuesController::unloadView();
}
CartesianFunction * ValuesController::functionAtColumn(int i) {
assert(i > 0);
int index = 1;
@@ -179,16 +165,26 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI
return function->evaluateAtAbscissa(abscissa, myApp->localContext());
}
View * ValuesController::createView() {
View * ValuesController::loadView() {
for (int i = 0; i < k_maxNumberOfFunctions; i++) {
assert(m_functionTitleCells[i] == nullptr);
m_functionTitleCells[i] = new FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small);
}
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_floatCells[i] == nullptr);
m_floatCells[i] = new EvenOddBufferTextCell();
}
return Shared::ValuesController::createView();
return Shared::ValuesController::loadView();
}
void ValuesController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfCells; i++) {
delete m_floatCells[i];
m_floatCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfFunctions; i++) {
delete m_functionTitleCells[i];
m_functionTitleCells[i] = nullptr;
}
Shared::ValuesController::unloadView(view);
}
}

View File

@@ -20,7 +20,6 @@ public:
int activeRow();
int activeColumn();
Shared::IntervalParameterController * intervalParameterController() override;
void unloadView() override;
private:
CartesianFunction * functionAtColumn(int i) override;
bool isDerivativeColumn(int i);
@@ -38,7 +37,8 @@ private:
CartesianFunctionStore * functionStore() const override;
FunctionParameterController m_functionParameterController;
FunctionParameterController * functionParameterController() override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
Shared::IntervalParameterController m_intervalParameterController;
DerivativeParameterController m_derivativeParameterController;
};

View File

@@ -5,4 +5,5 @@ AppsContainer container;
void ion_app() {
container.switchTo(container.appAtIndex(0));
container.run();
container.switchTo(nullptr);
}

View File

@@ -221,6 +221,7 @@ void MathToolbox::viewWillAppear() {
}
void MathToolbox::viewDidDisappear() {
Toolbox::viewDidDisappear();
m_selectableTableView.deselectTable();
}

View File

@@ -87,11 +87,11 @@ void ParametersController::setLaw(Law * law) {
}
void ParametersController::viewWillAppear() {
FloatParameterController::viewWillAppear();
for (int i = 0; i < m_law->numberOfParameter(); i++) {
contentView()->parameterDefinitionAtIndex(i)->setMessage(m_law->parameterDefinitionAtIndex(i));
}
contentView()->layoutSubviews();
FloatParameterController::viewWillAppear();
}
int ParametersController::numberOfRows() {
@@ -120,18 +120,6 @@ int ParametersController::reusableParameterCellCount(int type) {
return m_law->numberOfParameter();
}
void ParametersController::unloadView() {
assert(m_selectableTableView != nullptr);
delete m_selectableTableView;
m_selectableTableView = nullptr;
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_menuListCell[i] != nullptr);
delete m_menuListCell[i];
m_menuListCell[i] = nullptr;
}
FloatParameterController::unloadView();
}
float ParametersController::parameterAtIndex(int index) {
return m_law->parameterValueAtIndex(index);
}
@@ -165,11 +153,9 @@ I18n::Message ParametersController::okButtonText() {
return I18n::Message::Next;
}
View * ParametersController::createView() {
assert(m_selectableTableView == nullptr);
m_selectableTableView = (SelectableTableView *)FloatParameterController::createView();
View * ParametersController::loadView() {
m_selectableTableView = (SelectableTableView *)FloatParameterController::loadView();
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_menuListCell[i] == nullptr);
m_menuListCell[i] = new MessageTableCellWithEditableText(m_selectableTableView, this, m_draftTextBuffer);
}
ContentView * contentView = (ContentView *)new ContentView(this, m_selectableTableView);
@@ -179,6 +165,16 @@ View * ParametersController::createView() {
return contentView;
}
void ParametersController::unloadView(View * view) {
delete m_selectableTableView;
m_selectableTableView = nullptr;
for (int i = 0; i < k_maxNumberOfCells; i++) {
delete m_menuListCell[i];
m_menuListCell[i] = nullptr;
}
FloatParameterController::unloadView(view);
}
SelectableTableView * ParametersController::selectableTableView() {
return m_selectableTableView;
}

View File

@@ -16,7 +16,6 @@ public:
void viewWillAppear() override;
int numberOfRows() override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
void unloadView() override;
private:
HighlightCell * reusableParameterCell(int index, int type) override;
int reusableParameterCellCount(int type) override;
@@ -25,7 +24,8 @@ private:
bool setParameterAtIndex(int parameterIndex, float f) override;
bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override;
I18n::Message okButtonText() override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
class ContentView : public View {
public:
ContentView(Responder * parentResponder, SelectableTableView * selectableTableView);

View File

@@ -231,54 +231,44 @@ int CalculationController::typeAtLocation(int i, int j) {
return 4;
}
void CalculationController::unloadView() {
assert(m_r2TitleCell != nullptr);
delete m_r2TitleCell;
m_r2TitleCell = nullptr;
assert(m_columnTitleCell != nullptr);
delete m_columnTitleCell;
m_columnTitleCell = nullptr;
for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) {
assert(m_doubleCalculationCells[i] != nullptr);
delete m_doubleCalculationCells[i];
m_doubleCalculationCells[i] = nullptr;
assert(m_calculationCells[i] != nullptr);
delete m_calculationCells[i];
m_calculationCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
assert(m_titleCells[i] != nullptr);
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
TabTableController::unloadView();
}
Responder * CalculationController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}
View * CalculationController::createView() {
SelectableTableView * tableView = (SelectableTableView *)TabTableController::createView();
assert(m_r2TitleCell == nullptr);
View * CalculationController::loadView() {
SelectableTableView * tableView = (SelectableTableView *)TabTableController::loadView();
m_r2TitleCell = new EvenOddExpressionCell(1.0f, 0.5f);
assert(m_columnTitleCell == nullptr);
m_columnTitleCell = new EvenOddDoubleBufferTextCell(tableView);
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
assert(m_titleCells[i] == nullptr);
m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small);
}
for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) {
assert(m_doubleCalculationCells[i] == nullptr);
m_doubleCalculationCells[i] = new EvenOddDoubleBufferTextCell();
m_doubleCalculationCells[i]->setTextColor(Palette::GreyDark);
m_doubleCalculationCells[i]->setParentResponder(tableView);
assert(m_calculationCells[i] == nullptr);
m_calculationCells[i] = new EvenOddBufferTextCell(KDText::FontSize::Small);
m_calculationCells[i]->setTextColor(Palette::GreyDark);
}
return tableView;
}
void CalculationController::unloadView(View * view) {
delete m_r2TitleCell;
m_r2TitleCell = nullptr;
delete m_columnTitleCell;
m_columnTitleCell = nullptr;
for (int i = 0; i < k_maxNumberOfDisplayableRows/2; i++) {
delete m_doubleCalculationCells[i];
m_doubleCalculationCells[i] = nullptr;
delete m_calculationCells[i];
m_calculationCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
TabTableController::unloadView(view);
}
}

View File

@@ -31,10 +31,10 @@ public:
HighlightCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
int typeAtLocation(int i, int j) override;
void unloadView() override;
private:
Responder * tabController() const override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
constexpr static int k_totalNumberOfRows = 11;
constexpr static int k_totalNumberOfColumns = 2;
constexpr static int k_maxNumberOfDisplayableRows = 10;

View File

@@ -36,26 +36,24 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int
mytitleCell->setExpression(m_titleLayout[i]);
}
void StoreController::unloadView() {
for (int i = 0; i < k_numberOfTitleCells; i++) {
assert(m_titleCells[i] != nullptr);
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
Shared::StoreController::unloadView();
}
HighlightCell * StoreController::titleCells(int index) {
assert(index >= 0 && index < k_numberOfTitleCells);
return m_titleCells[index];
}
View * StoreController::createView() {
View * StoreController::loadView() {
for (int i = 0; i < k_numberOfTitleCells; i++) {
assert(m_titleCells[i] == nullptr);
m_titleCells[i] = new EvenOddExpressionCell(0.5f, 0.5f);
}
return Shared::StoreController::createView();
return Shared::StoreController::loadView();
}
void StoreController::unloadView(View * view) {
for (int i = 0; i < k_numberOfTitleCells; i++) {
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
Shared::StoreController::unloadView(view);
}
}

View File

@@ -12,10 +12,10 @@ public:
StoreController(Responder * parentResponder, Store * store, ButtonRowController * header);
~StoreController();
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
void unloadView() override;
private:
HighlightCell * titleCells(int index) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
EvenOddExpressionCell * m_titleCells[k_numberOfTitleCells];
Poincare::ExpressionLayout * m_titleLayout[2];
};

View File

@@ -80,18 +80,6 @@ void ListController::selectPreviousNewSequenceCell() {
}
}
void ListController::unloadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
assert(m_sequenceTitleCells[i] != nullptr);
delete m_sequenceTitleCells[i];
m_sequenceTitleCells[i] = nullptr;
assert(m_expressionCells[i] != nullptr);
delete m_expressionCells[i];
m_expressionCells[i] = nullptr;
}
Shared::ListController::unloadView();
}
void ListController::editExpression(Sequence * sequence, int sequenceDefinition, Ion::Events::Event event) {
char * initialText = nullptr;
char initialTextContent[TextField::maxBufferSize()];
@@ -276,14 +264,22 @@ void ListController::reinitExpression(Shared::Function * function) {
selectableTableView()->reloadData();
}
View * ListController::createView() {
View * ListController::loadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
assert(m_sequenceTitleCells[i] == nullptr);
m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator);
assert(m_expressionCells[i] == nullptr);
m_expressionCells[i] = new FunctionExpressionCell();
}
return Shared::ListController::createView();
return Shared::ListController::loadView();
}
void ListController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfRows; i++) {
delete m_sequenceTitleCells[i];
m_sequenceTitleCells[i] = nullptr;
delete m_expressionCells[i];
m_expressionCells[i] = nullptr;
}
Shared::ListController::unloadView(view);
}
}

View File

@@ -23,7 +23,6 @@ public:
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
Toolbox * toolboxForTextField(TextField * textField) override;
void selectPreviousNewSequenceCell();
void unloadView() override;
private:
Shared::TextFieldDelegateApp * textFieldDelegateApp() override;
void editExpression(Sequence * sequence, int sequenceDefinitionIndex, Ion::Events::Event event);
@@ -39,7 +38,8 @@ private:
void addEmptyFunction() override;
void editExpression(Shared::Function * function, Ion::Events::Event event) override;
void reinitExpression(Shared::Function * function) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
static constexpr KDCoordinate k_emptySubRowHeight = 30;
constexpr static int k_maxNumberOfRows = 9;
SequenceStore * m_sequenceStore;

View File

@@ -47,20 +47,6 @@ IntervalParameterController * ValuesController::intervalParameterController() {
return &m_intervalParameterController;
}
void ValuesController::unloadView() {
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_floatCells[i] != nullptr);
delete m_floatCells[i];
m_floatCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfSequences; i++) {
assert(m_sequenceTitleCells[i] != nullptr);
delete m_sequenceTitleCells[i];
m_sequenceTitleCells[i] = nullptr;
}
Shared::ValuesController::unloadView();
}
bool ValuesController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) {
if (floatBody < 0) {
return false;
@@ -98,16 +84,26 @@ Shared::ValuesFunctionParameterController * ValuesController::functionParameterC
#endif
}
View * ValuesController::createView() {
View * ValuesController::loadView() {
for (int i = 0; i < k_maxNumberOfSequences; i++) {
assert(m_sequenceTitleCells[i] == nullptr);
m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator);
}
for (int i = 0; i < k_maxNumberOfCells; i++) {
assert(m_floatCells[i] == nullptr);
m_floatCells[i] = new EvenOddBufferTextCell();
}
return Shared::ValuesController::createView();
return Shared::ValuesController::loadView();
}
void ValuesController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfCells; i++) {
delete m_floatCells[i];
m_floatCells[i] = nullptr;
}
for (int i = 0; i < k_maxNumberOfSequences; i++) {
delete m_sequenceTitleCells[i];
m_sequenceTitleCells[i] = nullptr;
}
Shared::ValuesController::unloadView(view);
}
}

View File

@@ -15,7 +15,6 @@ public:
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
I18n::Message emptyMessage() override;
IntervalParameterController * intervalParameterController() override;
void unloadView() override;
private:
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
int maxNumberOfCells() override;
@@ -28,7 +27,8 @@ private:
EvenOddBufferTextCell * floatCells(int j) override;
SequenceStore * m_sequenceStore;
SequenceStore * functionStore() const override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
#if COPY_COLUMN
Shared::ValuesFunctionParameterController m_sequenceParameterController;
#endif

View File

@@ -114,8 +114,7 @@ void EditableCellTableViewController::didBecomeFirstResponder() {
}
}
void EditableCellTableViewController::viewWillAppear() {
TabTableController::viewWillAppear();
void EditableCellTableViewController::didEnterResponderChain(Responder * previousFirstResponder) {
if (selectedRow() == -1) {
selectCellAtLocation(0, 1);
} else {

View File

@@ -22,7 +22,7 @@ public:
KDCoordinate rowHeight(int j) override;
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
private:
TextFieldDelegateApp * textFieldDelegateApp() override;
static constexpr KDCoordinate k_cellHeight = 20;

View File

@@ -25,6 +25,7 @@ void FloatParameterController::didBecomeFirstResponder() {
}
void FloatParameterController::viewWillAppear() {
DynamicViewController::viewWillAppear();
selectableTableView()->reloadData();
if (selectedRow() == -1) {
selectCellAtLocation(0, 0);
@@ -169,13 +170,6 @@ int FloatParameterController::activeCell() {
return selectedRow();
}
void FloatParameterController::unloadView() {
assert(m_okButton != nullptr);
delete m_okButton;
m_okButton = nullptr;
DynamicViewController::unloadView();
}
StackViewController * FloatParameterController::stackController() {
return (StackViewController *)parentResponder();
}
@@ -184,16 +178,6 @@ SelectableTableView * FloatParameterController::selectableTableView() {
return (SelectableTableView *)view();
}
View * FloatParameterController::createView() {
SelectableTableView * tableView = new SelectableTableView(this, this, 0, 1, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this);
assert(m_okButton == nullptr);
m_okButton = new ButtonWithSeparator(tableView, okButtonText(), Invocation([](void * context, void * sender) {
FloatParameterController * parameterController = (FloatParameterController *) context;
parameterController->buttonAction();
}, this));
return tableView;
}
void FloatParameterController::buttonAction() {
StackViewController * stack = stackController();
stack->pop();
@@ -203,4 +187,19 @@ I18n::Message FloatParameterController::okButtonText() {
return I18n::Message::Ok;
}
View * FloatParameterController::loadView() {
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();
}, this));
return tableView;
}
void FloatParameterController::unloadView(View * view) {
delete m_okButton;
m_okButton = nullptr;
delete view;
}
}

View File

@@ -29,13 +29,13 @@ public:
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;
void unloadView() override;
protected:
int activeCell();
StackViewController * stackController();
virtual float parameterAtIndex(int index) = 0;
virtual SelectableTableView * selectableTableView();
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
private:
constexpr static int k_buttonMargin = 6;
virtual void buttonAction();

View File

@@ -16,13 +16,6 @@ int GoToParameterController::numberOfRows() {
return 2;
}
void GoToParameterController::unloadView() {
assert(m_abscisseCell != nullptr);
delete m_abscisseCell;
m_abscisseCell = nullptr;
FloatParameterController::unloadView();
}
HighlightCell * GoToParameterController::reusableParameterCell(int index, int type) {
assert(index == 0);
return m_abscisseCell;
@@ -40,11 +33,16 @@ void GoToParameterController::buttonAction() {
stack->pop();
}
View * GoToParameterController::createView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView();
assert(m_abscisseCell == nullptr);
View * GoToParameterController::loadView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView();
m_abscisseCell = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, m_abscissaSymbol);
return tableView;
}
void GoToParameterController::unloadView(View * view) {
delete m_abscisseCell;
m_abscisseCell = nullptr;
FloatParameterController::unloadView(view);
}
}

View File

@@ -12,7 +12,6 @@ class GoToParameterController : public FloatParameterController {
public:
GoToParameterController(Responder * parentResponder, InteractiveCurveViewRange * graphRange, CurveViewCursor * cursor, I18n::Message symbol);
int numberOfRows() override;
void unloadView() override;
protected:
constexpr static float k_maxDisplayableFloat = 1E8f;
CurveViewCursor * m_cursor;
@@ -20,7 +19,8 @@ private:
void buttonAction() override;
HighlightCell * reusableParameterCell(int index, int type) override;
int reusableParameterCellCount(int type) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength];
MessageTableCellWithEditableText * m_abscisseCell;
InteractiveCurveViewRange * m_graphRange;

View File

@@ -31,15 +31,6 @@ Interval * IntervalParameterController::interval() {
return m_interval;
}
void IntervalParameterController::unloadView() {
for (int i = 0; i < k_totalNumberOfCell; i++) {
assert(m_intervalCells[i] != nullptr);
delete m_intervalCells[i];
m_intervalCells[i] = nullptr;
}
FloatParameterController::unloadView();
}
float IntervalParameterController::parameterAtIndex(int index) {
GetterPointer getters[k_totalNumberOfCell] = {&Interval::start, &Interval::end, &Interval::step};
return (m_interval->*getters[index])();
@@ -75,13 +66,20 @@ int IntervalParameterController::reusableParameterCellCount(int type) {
return k_totalNumberOfCell;
}
View * IntervalParameterController::createView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView();
View * IntervalParameterController::loadView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView();
for (int i = 0; i < k_totalNumberOfCell; i++) {
assert(m_intervalCells[i] == nullptr);
m_intervalCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default);
}
return tableView;
}
void IntervalParameterController::unloadView(View * view) {
for (int i = 0; i < k_totalNumberOfCell; i++) {
delete m_intervalCells[i];
m_intervalCells[i] = nullptr;
}
FloatParameterController::unloadView(view);
}
}

View File

@@ -14,7 +14,6 @@ public:
const char * title() override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
int numberOfRows() override;
void unloadView() override;
protected:
constexpr static int k_totalNumberOfCell = 3;
bool setParameterAtIndex(int parameterIndex, float f) override;
@@ -23,7 +22,8 @@ private:
HighlightCell * reusableParameterCell(int index, int type) override;
int reusableParameterCellCount(int type) override;
float parameterAtIndex(int index) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength];
MessageTableCellWithEditableText * m_intervalCells[k_totalNumberOfCell];
};

View File

@@ -235,7 +235,7 @@ bool ListController::handleEvent(Ion::Events::Event event) {
return false;
}
void ListController::viewWillAppear() {
void ListController::didEnterResponderChain(Responder * previousFirstResponder) {
selectableTableView()->reloadData();
}
@@ -246,16 +246,6 @@ void ListController::willExitResponderChain(Responder * nextFirstResponder) {
}
}
void ListController::unloadView() {
assert(m_emptyCell != nullptr);
delete m_emptyCell;
m_emptyCell = nullptr;
assert(m_addNewFunction != nullptr);
delete m_addNewFunction;
m_addNewFunction = nullptr;
DynamicViewController::unloadView();
}
StackViewController * ListController::stackController() const{
return (StackViewController *)(parentResponder()->parentResponder()->parentResponder());
}
@@ -275,14 +265,6 @@ SelectableTableView * ListController::selectableTableView() {
return (SelectableTableView *)view();
}
View * ListController::createView() {
assert(m_emptyCell == nullptr);
m_emptyCell = new EvenOddCell();
assert(m_addNewFunction == nullptr);
m_addNewFunction = new NewFunctionCell(m_addNewMessage);
return new SelectableTableView(this, this, 0, 0, 0, 0, 0, 0, this, false, true);
}
TabViewController * ListController::tabController() const{
return (TabViewController *)(parentResponder()->parentResponder()->parentResponder()->parentResponder());
}
@@ -305,4 +287,18 @@ void ListController::removeFunctionRow(Function * function) {
m_functionStore->removeFunction(function);
}
View * ListController::loadView() {
m_emptyCell = new EvenOddCell();
m_addNewFunction = new NewFunctionCell(m_addNewMessage);
return new SelectableTableView(this, this, 0, 0, 0, 0, 0, 0, this, false, true);
}
void ListController::unloadView(View * view) {
delete m_emptyCell;
m_emptyCell = nullptr;
delete m_addNewFunction;
m_addNewFunction = nullptr;
delete view;
}
}

View File

@@ -26,16 +26,16 @@ public:
Button * buttonAtIndex(int index, ButtonRowController::Position position) const override;
void didBecomeFirstResponder() override;
bool handleEvent(Ion::Events::Event event) override;
void viewWillAppear() override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
void willExitResponderChain(Responder * nextFirstResponder) override;
void unloadView() override;
protected:
static constexpr KDCoordinate k_emptyRowHeight = 50;
StackViewController * stackController() const;
void configureFunction(Function * function);
virtual void reinitExpression(Function * function);
SelectableTableView * selectableTableView();
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
FunctionStore * m_functionStore;
private:
static constexpr KDCoordinate k_functionNameWidth = 65;

View File

@@ -121,28 +121,24 @@ int RangeParameterController::reusableParameterCellCount(int type) {
return k_numberOfTextCell;
}
void RangeParameterController::unloadView() {
assert(m_yAutoCell != nullptr);
delete m_yAutoCell;
m_yAutoCell = nullptr;
for (int i = 0; i < k_numberOfTextCell; i++) {
assert(m_rangeCells[i] != nullptr);
delete m_rangeCells[i];
m_rangeCells[i] = nullptr;
}
FloatParameterController::unloadView();
}
View * RangeParameterController::createView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView();
assert(m_yAutoCell == nullptr);
View * RangeParameterController::loadView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView();
m_yAutoCell = new MessageTableCellWithSwitch(I18n::Message::YAuto);
for (int i = 0; i < k_numberOfTextCell; i++) {
assert(m_rangeCells[i] == nullptr);
m_rangeCells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default);
}
return tableView;
}
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;
}
FloatParameterController::unloadView(view);
}
}

View File

@@ -17,13 +17,13 @@ public:
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;
void unloadView() override;
private:
HighlightCell * reusableParameterCell(int index, int type) override;
int reusableParameterCellCount(int type) override;
float parameterAtIndex(int index) override;
bool setParameterAtIndex(int parameterIndex, float f) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
constexpr static int k_numberOfTextCell = 4;
InteractiveCurveViewRange * m_interactiveRange;
char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength];

View File

@@ -96,15 +96,6 @@ bool StoreController::handleEvent(Ion::Events::Event event) {
return false;
}
void StoreController::unloadView() {
for (int i = 0; i < k_maxNumberOfEditableCells; i++) {
assert(m_editableCells[i] != nullptr);
delete m_editableCells[i];
m_editableCells[i] = nullptr;
}
EditableCellTableViewController::unloadView();
}
Responder * StoreController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}
@@ -133,13 +124,20 @@ int StoreController::maxNumberOfElements() const {
return FloatPairStore::k_maxNumberOfPairs;
}
View * StoreController::createView() {
SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView();
View * StoreController::loadView() {
SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::loadView();
for (int i = 0; i < k_maxNumberOfEditableCells; i++) {
assert(m_editableCells[i] == nullptr);
m_editableCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer);
}
return tableView;
}
void StoreController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfEditableCells; i++) {
delete m_editableCells[i];
m_editableCells[i] = nullptr;
}
EditableCellTableViewController::unloadView(view);
}
}

View File

@@ -22,13 +22,13 @@ public:
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
void unloadView() override;
protected:
static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2;
constexpr static int k_maxNumberOfEditableCells = 22;
constexpr static int k_numberOfTitleCells = 2;
Responder * tabController() const override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override;
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
float dataAtLocation(int columnIndex, int rowIndex) override;

View File

@@ -19,6 +19,7 @@ void TabTableController::didBecomeFirstResponder() {
}
void TabTableController::viewWillAppear() {
DynamicViewController::viewWillAppear();
selectableTableView()->reloadData();
}
@@ -33,10 +34,13 @@ SelectableTableView * TabTableController::selectableTableView() {
return (SelectableTableView *)view();
}
View * TabTableController::createView() {
View * TabTableController::loadView() {
return new SelectableTableView(this, m_dataSource, 0, 0, m_topMargin, m_rightMargin, m_bottomMargin, m_leftMargin, this, m_showIndicators, true, Palette::WallScreenDark);
}
void TabTableController::unloadView(View * view) {
delete view;
}
}

View File

@@ -17,7 +17,8 @@ public:
void willExitResponderChain(Responder * nextFirstResponder) override;
protected:
SelectableTableView * selectableTableView();
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
virtual Responder * tabController() const = 0;
private:
TableViewDataSource * m_dataSource;

View File

@@ -227,20 +227,8 @@ Responder * ValuesController::defaultController() {
}
void ValuesController::viewWillAppear() {
header()->setSelectedButton(-1);
EditableCellTableViewController::viewWillAppear();
}
void ValuesController::unloadView() {
assert(m_abscissaTitleCell != nullptr);
delete m_abscissaTitleCell;
m_abscissaTitleCell = nullptr;
for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) {
assert(m_abscissaCells[i] != nullptr);
delete m_abscissaCells[i];
m_abscissaCells[i] = nullptr;
}
EditableCellTableViewController::unloadView();
header()->setSelectedButton(-1);
}
Function * ValuesController::functionAtColumn(int i) {
@@ -305,16 +293,24 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI
return function->evaluateAtAbscissa(abscissa, myApp->localContext());
}
View * ValuesController::createView() {
SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView();
assert(m_abscissaTitleCell == nullptr);
View * ValuesController::loadView() {
SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::loadView();
m_abscissaTitleCell = new EvenOddMessageTextCell(KDText::FontSize::Small);
for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) {
assert(m_abscissaCells[i] == nullptr);
m_abscissaCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer, KDText::FontSize::Small);
}
return tableView;
}
void ValuesController::unloadView(View * view) {
delete m_abscissaTitleCell;
m_abscissaTitleCell = nullptr;
for (int i = 0; i < k_maxNumberOfAbscissaCells; i++) {
delete m_abscissaCells[i];
m_abscissaCells[i] = nullptr;
}
EditableCellTableViewController::unloadView(view);
}
}

View File

@@ -34,7 +34,6 @@ public:
bool isEmpty() const override;
Responder * defaultController() override;
void viewWillAppear() override;
void unloadView() override;
static constexpr KDCoordinate k_topMargin = 10;
static constexpr KDCoordinate k_bottomMargin = 5;
static constexpr KDCoordinate k_leftMargin = 1;
@@ -44,7 +43,8 @@ public:
protected:
StackViewController * stackController() const;
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
Interval m_interval;
private:
virtual Function * functionAtColumn(int i);

View File

@@ -111,32 +111,29 @@ int CalculationController::typeAtLocation(int i, int j) {
return i;
}
void CalculationController::unloadView() {
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
assert(m_titleCells[i] != nullptr);
delete m_titleCells[i];
m_titleCells[i] = nullptr;
assert(m_calculationCells[i] != nullptr);
delete m_calculationCells[i];
m_calculationCells[i] = nullptr;
}
TabTableController::unloadView();
}
Responder * CalculationController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}
View * CalculationController::createView() {
View * CalculationController::loadView() {
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
assert(m_titleCells[i] == nullptr);
m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small);
m_titleCells[i]->setAlignment(1.0f, 0.5f);
assert(m_calculationCells[i] == nullptr);
m_calculationCells[i] = new EvenOddBufferTextCell(KDText::FontSize::Small);
m_calculationCells[i]->setTextColor(Palette::GreyDark);
}
return TabTableController::createView();
return TabTableController::loadView();
}
void CalculationController::unloadView(View * view) {
for (int i = 0; i < k_maxNumberOfDisplayableRows; i++) {
delete m_titleCells[i];
m_titleCells[i] = nullptr;
delete m_calculationCells[i];
m_calculationCells[i] = nullptr;
}
TabTableController::unloadView(view);
}
}

View File

@@ -29,10 +29,10 @@ public:
HighlightCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
int typeAtLocation(int i, int j) override;
void unloadView() override;
private:
Responder * tabController() const override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
constexpr static int k_totalNumberOfRows = 13;
constexpr static int k_maxNumberOfDisplayableRows = 11;
static constexpr KDCoordinate k_cellHeight = 20;

View File

@@ -30,15 +30,6 @@ void HistogramParameterController::willDisplayCellForIndex(HighlightCell * cell,
FloatParameterController::willDisplayCellForIndex(cell, index);
}
void HistogramParameterController::unloadView() {
for (int i = 0; i < k_numberOfCells; i++) {
assert(m_cells[i] != nullptr);
delete m_cells[i];
m_cells[i] = nullptr;
}
FloatParameterController::unloadView();
}
float HistogramParameterController::parameterAtIndex(int index) {
assert(index >= 0 && index < k_numberOfCells);
if (index == 0) {
@@ -76,14 +67,21 @@ int HistogramParameterController::reusableParameterCellCount(int type) {
return k_numberOfCells;
}
View * HistogramParameterController::createView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::createView();
View * HistogramParameterController::loadView() {
SelectableTableView * tableView = (SelectableTableView *)FloatParameterController::loadView();
for (int i = 0; i < k_numberOfCells; i++) {
assert(m_cells[i] == nullptr);
m_cells[i] = new MessageTableCellWithEditableText(tableView, this, m_draftTextBuffer, I18n::Message::Default);
}
return tableView;
}
void HistogramParameterController::unloadView(View * view) {
for (int i = 0; i < k_numberOfCells; i++) {
delete m_cells[i];
m_cells[i] = nullptr;
}
FloatParameterController::unloadView(view);
}
}

View File

@@ -13,13 +13,13 @@ public:
const char * title() override;
int numberOfRows() override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
void unloadView() override;
private:
HighlightCell * reusableParameterCell(int index, int type) override;
int reusableParameterCellCount(int type) override;
float parameterAtIndex(int index) override;
bool setParameterAtIndex(int parameterIndex, float f) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
char m_draftTextBuffer[MessageTableCellWithEditableText::k_bufferLength];
constexpr static int k_numberOfCells = 2;
MessageTableCellWithEditableText * m_cells[k_numberOfCells];

View File

@@ -26,15 +26,6 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int
mytitleCell->setMessage(I18n::Message::Sizes);
}
void StoreController::unloadView() {
for (int i = 0; i < k_numberOfTitleCells; i++) {
assert(m_titleCells[i] != nullptr);
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
Shared::StoreController::unloadView();
}
HighlightCell * StoreController::titleCells(int index) {
assert(index >= 0 && index < k_numberOfTitleCells);
return m_titleCells[index];
@@ -51,12 +42,19 @@ bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int ro
return Shared::StoreController::setDataAtLocation(floatBody, columnIndex, rowIndex);
}
View * StoreController::createView() {
View * StoreController::loadView() {
for (int i = 0; i < k_numberOfTitleCells; i++) {
assert(m_titleCells[i] == nullptr);
m_titleCells[i] = new EvenOddMessageTextCell(KDText::FontSize::Small);
}
return Shared::StoreController::createView();
return Shared::StoreController::loadView();
}
void StoreController::unloadView(View * view) {
for (int i = 0; i < k_numberOfTitleCells; i++) {
delete m_titleCells[i];
m_titleCells[i] = nullptr;
}
Shared::StoreController::unloadView(view);
}
}

View File

@@ -11,11 +11,11 @@ class StoreController : public Shared::StoreController {
public:
StoreController(Responder * parentResponder, Store * store, ButtonRowController * header);
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override;
void unloadView() override;
private:
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
HighlightCell * titleCells(int index) override;
View * createView() override;
View * loadView() override;
void unloadView(View * view) override;
EvenOddMessageTextCell * m_titleCells[k_numberOfTitleCells];
};

View File

@@ -264,5 +264,6 @@ void VariableBoxController::viewWillAppear() {
}
void VariableBoxController::viewDidDisappear() {
StackViewController::viewDidDisappear();
m_contentViewController.deselectTable();
}

View File

@@ -15,8 +15,6 @@ public:
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void viewDidDisappear() override;
void loadView() override;
void unloadView() override;
private:
class ContentView : public View {
public:

View File

@@ -28,8 +28,6 @@ public:
bool setSelectedButton(int selectedButton);
void viewWillAppear() override;
void viewDidDisappear() override;
void loadView() override;
void unloadView() override;
private:
class ContentView : public View {
public:
@@ -66,10 +64,6 @@ public:
virtual Button * buttonAtIndex(int index, ButtonRowController::Position position) const;
ButtonRowController * header();
ButtonRowController * footer();
/* By default these two functions do not load anything. They should be
* overrided if the delegate dynamically allocate the button views. */
virtual void loadButtonView();
virtual void unloadButtonView();
private:
ButtonRowController * m_header;
ButtonRowController * m_footer;

View File

@@ -15,10 +15,13 @@ public:
DynamicViewController(Responder * parentResponder);
~DynamicViewController();
View * view() override;
virtual void loadView() override;
virtual void unloadView() override;
void viewWillAppear() override;
void viewDidDisappear() override;
private:
virtual View * createView() = 0;
void loadViewIfNeeded();
void unloadViewIfNeeded();
virtual View * loadView() = 0;
virtual void unloadView(View * view) = 0;
View * m_view;
};

View File

@@ -17,8 +17,6 @@ public:
bool isDisplayingModal();
void viewWillAppear() override;
void viewDidDisappear() override;
void loadView() override;
void unloadView() override;
private:
class ContentView : public View {
public:

View File

@@ -23,8 +23,6 @@ public:
void didBecomeFirstResponder() override;
void viewWillAppear() override;
void viewDidDisappear() override;
void loadView() override;
void unloadView() override;
private:
class Frame {
public:

View File

@@ -20,8 +20,6 @@ public:
void willResignFirstResponder() override;
void viewWillAppear() override;
void viewDidDisappear() override;
void loadView() override;
void unloadView() override;
private:
ViewController * activeViewController();
class ContentView : public View {

View File

@@ -32,8 +32,6 @@ public:
ViewController(Responder * parentResponder);
virtual const char * title();
virtual View * view() = 0;
virtual void loadView();
virtual void unloadView();
virtual void viewWillAppear();
virtual void viewDidDisappear();
};

View File

@@ -86,15 +86,3 @@ void AlternateEmptyViewController::viewDidDisappear() {
m_contentView.mainViewController()->viewDidDisappear();
}
}
void AlternateEmptyViewController::loadView() {
if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) {
m_contentView.mainViewController()->loadView();
}
}
void AlternateEmptyViewController::unloadView() {
if (!m_contentView.alternateEmptyViewDelegate()->isEmpty()) {
m_contentView.mainViewController()->unloadView();
}
}

View File

@@ -91,11 +91,10 @@ const Container * App::container() const {
}
void App::didBecomeActive(Window * window) {
m_modalViewController.loadView();
View * view = m_modalViewController.view();
assert(m_modalViewController.app() == this);
window->setContentView(view);
m_modalViewController.viewWillAppear();
window->setContentView(view);
setFirstResponder(&m_modalViewController);
window->redraw();
}
@@ -106,5 +105,4 @@ void App::willBecomeInactive() {
}
setFirstResponder(nullptr);
m_modalViewController.viewDidDisappear();
m_modalViewController.unloadView();
}

View File

@@ -26,12 +26,6 @@ ButtonRowController * ButtonRowDelegate::header() {
return m_header;
}
void ButtonRowDelegate::loadButtonView() {
}
void ButtonRowDelegate::unloadButtonView() {
}
ButtonRowController::ContentView::ContentView(ViewController * mainViewController, ButtonRowDelegate * delegate, Position position, Style style) :
View(),
m_mainViewController(mainViewController),
@@ -230,21 +224,10 @@ bool ButtonRowController::handleEvent(Ion::Events::Event event) {
void ButtonRowController::viewWillAppear() {
/* We need to layout subviews at first appearance because the number of
* buttons might have changed between 2 appearences. */
m_contentView.mainViewController()->viewWillAppear();
m_contentView.layoutSubviews();
m_contentView.mainViewController()->viewWillAppear();
}
void ButtonRowController::viewDidDisappear() {
m_contentView.mainViewController()->viewDidDisappear();
}
void ButtonRowController::loadView() {
m_contentView.buttonRowDelegate()->loadButtonView();
m_contentView.mainViewController()->loadView();
m_contentView.layoutSubviews();
}
void ButtonRowController::unloadView() {
m_contentView.buttonRowDelegate()->unloadButtonView();
m_contentView.mainViewController()->unloadView();
}
}

View File

@@ -9,24 +9,32 @@ DynamicViewController::DynamicViewController(Responder * parentResponder) :
}
DynamicViewController::~DynamicViewController() {
if (m_view) {
delete m_view;
m_view = nullptr;
}
assert(m_view == nullptr);
}
View * DynamicViewController::view() {
assert(m_view != nullptr);
loadViewIfNeeded();
return m_view;
}
void DynamicViewController::loadView() {
assert(m_view == nullptr);
m_view = createView();
void DynamicViewController::viewWillAppear() {
loadViewIfNeeded();
}
void DynamicViewController::unloadView() {
assert(m_view != nullptr);
delete m_view;
m_view = nullptr;
void DynamicViewController::viewDidDisappear() {
unloadViewIfNeeded();
}
void DynamicViewController::loadViewIfNeeded() {
if (m_view == nullptr) {
m_view = loadView();
assert(m_view != nullptr);
}
}
void DynamicViewController::unloadViewIfNeeded() {
if (m_view != nullptr) {
unloadView(m_view);
m_view = nullptr;
}
}

View File

@@ -57,8 +57,10 @@ KDRect ModalViewController::ContentView::frame() {
}
void ModalViewController::ContentView::layoutSubviews() {
assert(m_regularView != nullptr);
m_regularView->setFrame(bounds());
if (numberOfSubviews() == 2) {
assert(m_currentModalView != nullptr);
m_currentModalView->setFrame(frame());
}
}
@@ -110,8 +112,6 @@ void ModalViewController::displayModalViewController(ViewController * vc, float
m_currentModalViewController = vc;
vc->setParentResponder(this);
m_previousResponder = app()->firstResponder();
m_regularViewController->viewDidDisappear();
vc->loadView();
m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin);
m_currentModalViewController->viewWillAppear();
app()->setFirstResponder(vc);
@@ -119,10 +119,8 @@ void ModalViewController::displayModalViewController(ViewController * vc, float
void ModalViewController::dismissModalViewController() {
m_currentModalViewController->viewDidDisappear();
m_regularViewController->viewWillAppear();
app()->setFirstResponder(m_previousResponder);
m_contentView.dismissModalView();
m_currentModalViewController->unloadView();
m_currentModalViewController = nullptr;
}
@@ -145,6 +143,8 @@ bool ModalViewController::handleEvent(Ion::Events::Event event) {
}
void ModalViewController::viewWillAppear() {
m_contentView.setMainView(m_regularViewController->view());
m_contentView.layoutSubviews();
if (m_contentView.isDisplayingModal()) {
m_currentModalViewController->viewWillAppear();
}
@@ -157,19 +157,3 @@ void ModalViewController::viewDidDisappear() {
}
m_regularViewController->viewDidDisappear();
}
void ModalViewController::loadView() {
if (m_contentView.isDisplayingModal()) {
m_currentModalViewController->loadView();
}
m_regularViewController->loadView();
m_contentView.setMainView(m_regularViewController->view());
m_contentView.layoutSubviews();
}
void ModalViewController::unloadView() {
if (m_contentView.isDisplayingModal()) {
m_currentModalViewController->unloadView();
}
m_regularViewController->unloadView();
}

View File

@@ -89,7 +89,6 @@ void StackViewController::push(ViewController * vc, KDColor textColor, KDColor b
setupActiveViewController();
if (m_numberOfChildren > 1) {
m_childrenFrame[m_numberOfChildren-2].viewController()->viewDidDisappear();
m_childrenFrame[m_numberOfChildren-2].viewController()->unloadView();
}
}
@@ -98,10 +97,9 @@ void StackViewController::pop() {
assert(m_numberOfChildren > 0);
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
m_numberOfChildren--;
vc->viewDidDisappear();
setupActiveViewController();
vc->setParentResponder(nullptr);
vc->unloadView();
vc->viewDidDisappear();
}
void StackViewController::pushModel(Frame frame) {
@@ -111,7 +109,6 @@ void StackViewController::pushModel(Frame frame) {
void StackViewController::setupActiveViewController() {
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
vc->setParentResponder(this);
vc->loadView();
m_view.setContentView(vc->view());
vc->viewWillAppear();
vc->setParentResponder(this);
@@ -136,8 +133,14 @@ View * StackViewController::view() {
}
void StackViewController::viewWillAppear() {
/* Load the stack view */
for (int i = 0; i < m_numberOfChildren; i++) {
m_view.pushStack(m_childrenFrame[i]);
}
/* Load the visible controller view */
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
if (m_numberOfChildren > 0 && vc) {
m_view.setContentView(vc->view());
vc->viewWillAppear();
}
}
@@ -147,27 +150,7 @@ void StackViewController::viewDidDisappear() {
if (m_numberOfChildren > 0 && vc) {
vc->viewDidDisappear();
}
}
void StackViewController::loadView() {
/* Load the stack view */
for (int i = 0; i < m_numberOfChildren; i++) {
m_view.pushStack(m_childrenFrame[i]);
}
/* Load the visible controller view */
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
if (m_numberOfChildren > 0 && vc) {
vc->loadView();
m_view.setContentView(vc->view());
}
}
void StackViewController::unloadView() {
for (int i = 0; i < m_numberOfChildren; i++) {
m_view.popStack();
}
ViewController * vc = m_childrenFrame[m_numberOfChildren-1].viewController();
if (m_numberOfChildren > 0 && vc) {
vc->unloadView();
}
}

View File

@@ -114,19 +114,15 @@ void TabViewController::setActiveTab(int8_t i, bool forceReactive) {
ViewController * activeVC = m_children[i];
if (i != m_activeChildIndex || forceReactive) {
if (i != m_activeChildIndex) {
activeVC->loadView();
m_view.setActiveView(activeVC->view());
}
m_view.m_tabView.setActiveIndex(i);
if (i >= 0) {
m_children[i]->viewWillAppear();
}
m_view.m_tabView.setActiveIndex(i);
}
app()->setFirstResponder(activeVC);
if (i != m_activeChildIndex || forceReactive) {
if (m_activeChildIndex >= 0 && m_activeChildIndex != i) {
m_children[m_activeChildIndex]->viewDidDisappear();
m_children[m_activeChildIndex]->unloadView();
}
m_activeChildIndex = i;
}
@@ -166,15 +162,6 @@ const char * TabViewController::tabName(uint8_t index) {
}
void TabViewController::viewWillAppear() {
activeViewController()->viewWillAppear();
m_view.m_tabView.setActiveIndex(m_activeChildIndex);
}
void TabViewController::viewDidDisappear() {
activeViewController()->viewDidDisappear();
}
void TabViewController::loadView() {
if (m_view.m_tabView.numberOfTabs() != m_numberOfChildren) {
for (int i=0; i<m_numberOfChildren; i++) {
m_view.m_tabView.addTab(m_children[i]);
@@ -183,12 +170,13 @@ void TabViewController::loadView() {
if (m_activeChildIndex < 0) {
m_activeChildIndex = 0;
}
m_children[m_activeChildIndex]->loadView();
m_view.setActiveView(m_children[m_activeChildIndex]->view());
activeViewController()->viewWillAppear();
m_view.m_tabView.setActiveIndex(m_activeChildIndex);
}
void TabViewController::unloadView() {
activeViewController()->unloadView();
void TabViewController::viewDidDisappear() {
activeViewController()->viewDidDisappear();
}
ViewController * TabViewController::activeViewController() {

View File

@@ -15,8 +15,3 @@ void ViewController::viewWillAppear() {
void ViewController::viewDidDisappear() {
}
void ViewController::loadView() {
}
void ViewController::unloadView() {
}