[apps] Get rid of DynamicViewController

This commit is contained in:
Émilie Feral
2018-09-07 16:36:17 +02:00
parent 5712e7754c
commit 0fbab2f35c
18 changed files with 72 additions and 148 deletions

View File

@@ -41,14 +41,19 @@ void EditExpressionController::ContentView::reload() {
}
EditExpressionController::EditExpressionController(Responder * parentResponder, HistoryController * historyController, CalculationStore * calculationStore) :
DynamicViewController(parentResponder),
ViewController(parentResponder),
m_historyController(historyController),
m_calculationStore(calculationStore),
m_contentView(this, (TableView *)m_historyController->view(), this, this),
m_inputViewHeightIsMaximal(false)
{
m_cacheBuffer[0] = 0;
}
View * EditExpressionController::view() {
return &m_contentView;
}
void EditExpressionController::insertTextBody(const char * text) {
((ContentView *)view())->expressionField()->handleEventWithText(text, false, true);
}
@@ -122,14 +127,6 @@ ExpressionFieldDelegateApp * EditExpressionController::expressionFieldDelegateAp
return (App *)app();
}
View * EditExpressionController::loadView() {
return new ContentView(this, (TableView *)m_historyController->view(), this, this);
}
void EditExpressionController::unloadView(View * view) {
delete view;
}
void EditExpressionController::reloadView() {
((ContentView *)view())->reload();
m_historyController->reload();
@@ -177,7 +174,6 @@ bool EditExpressionController::inputViewDidAbortEditing(const char * text) {
}
void EditExpressionController::viewDidDisappear() {
DynamicViewController::viewDidDisappear();
m_historyController->viewDidDisappear();
}

View File

@@ -13,9 +13,10 @@ namespace Calculation {
class HistoryController;
/* TODO: implement a split view */
class EditExpressionController : public DynamicViewController, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate {
class EditExpressionController : public ViewController, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate {
public:
EditExpressionController(Responder * parentResponder, HistoryController * historyController, CalculationStore * calculationStore);
View * view() override;
void didBecomeFirstResponder() override;
void viewDidDisappear() override;
bool handleEvent(Ion::Events::Event event) override;
@@ -49,8 +50,6 @@ private:
char m_textBody[k_bufferLength];
ExpressionField m_expressionField;
};
View * loadView() override;
void unloadView(View * view) override;
void reloadView();
bool inputViewDidReceiveEvent(Ion::Events::Event event);
bool inputViewDidFinishEditing(const char * text, Poincare::LayoutRef layoutR);
@@ -60,6 +59,7 @@ private:
char m_cacheBuffer[Calculation::k_printedExpressionSize];
HistoryController * m_historyController;
CalculationStore * m_calculationStore;
ContentView m_contentView;
bool m_inputViewHeightIsMaximal;
};

View File

@@ -14,6 +14,9 @@ ListController::ListController(Responder * parentResponder, CartesianFunctionSto
m_expressionCells{},
m_parameterController(this, functionStore, I18n::Message::FunctionColor, I18n::Message::DeleteFunction)
{
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_expressionCells[i].setLeftMargin(k_expressionMargin);
}
}
const char * ListController::title() {
@@ -30,15 +33,14 @@ int ListController::maxNumberOfRows() {
HighlightCell * ListController::titleCells(int index) {
assert(index >= 0 && index < k_maxNumberOfRows);
return m_functionTitleCells[index];
return &m_functionTitleCells[index];
}
HighlightCell * ListController::expressionCells(int index) {
assert(index >= 0 && index < k_maxNumberOfRows);
return m_expressionCells[index];
return &m_expressionCells[index];
}
void ListController::willDisplayTitleCellAtIndex(HighlightCell * cell, int j) {
Shared::BufferFunctionTitleCell * myFunctionCell = (Shared::BufferFunctionTitleCell *)cell;
CartesianFunction * function = ((CartesianFunctionStore *)m_functionStore)->modelAtIndex(j);
@@ -64,23 +66,4 @@ bool ListController::removeModelRow(ExpressionModel * model) {
return false;
}
View * ListController::loadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_functionTitleCells[i] = new Shared::BufferFunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator);
m_expressionCells[i] = new FunctionExpressionCell();
m_expressionCells[i]->setLeftMargin(k_expressionMargin);
}
return Shared::FunctionListController::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::FunctionListController::unloadView(view);
}
}

View File

@@ -22,11 +22,9 @@ private:
void willDisplayTitleCellAtIndex(HighlightCell * cell, int j) override;
void willDisplayExpressionCellAtIndex(HighlightCell * cell, int j) override;
bool removeModelRow(Shared::ExpressionModel * function) override;
View * loadView() override;
void unloadView(View * view) override;
constexpr static int k_maxNumberOfRows = 5;
Shared::BufferFunctionTitleCell * m_functionTitleCells[k_maxNumberOfRows];
Shared::FunctionExpressionCell * m_expressionCells[k_maxNumberOfRows];
Shared::BufferFunctionTitleCell m_functionTitleCells[k_maxNumberOfRows];
Shared::FunctionExpressionCell m_expressionCells[k_maxNumberOfRows];
Shared::ListParameterController m_parameterController;
};

View File

@@ -19,6 +19,9 @@ ListController::ListController(Responder * parentResponder, SequenceStore * sequ
m_typeStackController(nullptr, &m_typeParameterController, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark),
m_sequenceToolbox()
{
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_expressionCells[i].setLeftMargin(k_expressionMargin);
}
}
const char * ListController::title() {
@@ -173,15 +176,14 @@ int ListController::maxNumberOfRows() {
HighlightCell * ListController::titleCells(int index) {
assert(index >= 0 && index < k_maxNumberOfRows);
return m_sequenceTitleCells[index];
return &m_sequenceTitleCells[index];
}
HighlightCell * ListController::expressionCells(int index) {
assert(index >= 0 && index < k_maxNumberOfRows);
return m_expressionCells[index];
return &m_expressionCells[index];
}
void ListController::willDisplayTitleCellAtIndex(HighlightCell * cell, int j) {
SequenceTitleCell * myCell = (SequenceTitleCell *)cell;
Sequence * sequence = m_sequenceStore->modelAtIndex(modelIndexForRow(j));
@@ -290,23 +292,4 @@ void ListController::reinitExpression(Shared::ExpressionModel * model) {
selectableTableView()->reloadData();
}
View * ListController::loadView() {
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator);
m_expressionCells[i] = new FunctionExpressionCell();
m_expressionCells[i]->setLeftMargin(k_expressionMargin);
}
return Shared::FunctionListController::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::FunctionListController::unloadView(view);
}
}

View File

@@ -43,13 +43,11 @@ private:
void reinitExpression(Shared::ExpressionModel * model) override;
void editExpression(Shared::ExpressionModel * model, Ion::Events::Event event) override;
bool removeModelRow(Shared::ExpressionModel * model) override;
View * loadView() override;
void unloadView(View * view) override;
static constexpr KDCoordinate k_emptySubRowHeight = 30;
constexpr static int k_maxNumberOfRows = 3*MaxNumberOfSequences;
SequenceStore * m_sequenceStore;
SequenceTitleCell * m_sequenceTitleCells[k_maxNumberOfRows];
Shared::FunctionExpressionCell * m_expressionCells[k_maxNumberOfRows];
SequenceTitleCell m_sequenceTitleCells[k_maxNumberOfRows];
Shared::FunctionExpressionCell m_expressionCells[k_maxNumberOfRows];
ListParameterController m_parameterController;
TypeParameterController m_typeParameterController;
StackViewController m_typeStackController;

View File

@@ -6,8 +6,8 @@ using namespace Poincare;
namespace Sequence {
SequenceTitleCell::SequenceTitleCell(Orientation orientation) :
Shared::FunctionTitleCell(orientation),
SequenceTitleCell::SequenceTitleCell() :
Shared::FunctionTitleCell(),
m_titleTextView(0.5f, 0.5f)
{
}

View File

@@ -7,7 +7,7 @@ namespace Sequence {
class SequenceTitleCell : public Shared::FunctionTitleCell {
public:
SequenceTitleCell(Orientation orientation);
SequenceTitleCell();
void setLayout(Poincare::LayoutReference layout);
void setEven(bool even) override;
void setHighlighted(bool highlight) override;

View File

@@ -85,7 +85,8 @@ Shared::ValuesFunctionParameterController * ValuesController::functionParameterC
View * ValuesController::loadView() {
for (int i = 0; i < k_maxNumberOfSequences; i++) {
m_sequenceTitleCells[i] = new SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator);
m_sequenceTitleCells[i] = new SequenceTitleCell();
m_sequenceTitleCells[i]->setOrientation(FunctionTitleCell::Orientation::HorizontalIndicator);
}
for (int i = 0; i < k_maxNumberOfCells; i++) {
m_floatCells[i] = new EvenOddBufferTextCell();

View File

@@ -7,7 +7,7 @@ namespace Shared {
class BufferFunctionTitleCell : public FunctionTitleCell {
public:
BufferFunctionTitleCell(Orientation orientation, KDText::FontSize size = KDText::FontSize::Large);
BufferFunctionTitleCell(Orientation orientation = Orientation::VerticalIndicator, KDText::FontSize size = KDText::FontSize::Large);
void setEven(bool even) override;
void setHighlighted(bool highlight) override;
void setColor(KDColor color) override;

View File

@@ -4,10 +4,10 @@
namespace Shared {
ExpressionModelListController::ExpressionModelListController(Responder * parentResponder, I18n::Message text) :
DynamicViewController(parentResponder),
m_addNewMessage(text),
m_addNewModel(nullptr)
ViewController(parentResponder),
m_addNewModel()
{
m_addNewModel.setMessage(text);
}
/* Table Data Source */
@@ -116,18 +116,4 @@ bool ExpressionModelListController::isAddEmptyRow(int j) {
return j == modelStore()->numberOfModels();
}
SelectableTableView * ExpressionModelListController::selectableTableView() {
return (SelectableTableView *)view();
}
void ExpressionModelListController::loadAddModelCell() {
m_addNewModel = new EvenOddMessageTextCell();
m_addNewModel->setMessage(m_addNewMessage);
}
void ExpressionModelListController::unloadAddModelCell() {
delete m_addNewModel;
m_addNewModel = nullptr;
}
}

View File

@@ -7,7 +7,7 @@
namespace Shared {
class ExpressionModelListController : public DynamicViewController, public SelectableTableViewDataSource {
class ExpressionModelListController : public ViewController, public SelectableTableViewDataSource {
public:
ExpressionModelListController(Responder * parentResponder, I18n::Message text);
protected:
@@ -24,14 +24,11 @@ protected:
virtual bool removeModelRow(ExpressionModel * function);
virtual int modelIndexForRow(int j);
virtual bool isAddEmptyRow(int j);
/* Dynamic View Controller */
virtual SelectableTableView * selectableTableView();
void loadAddModelCell();
void unloadAddModelCell();
/* View Controller */
virtual SelectableTableView * selectableTableView() = 0;
virtual ExpressionModelStore * modelStore() = 0;
virtual InputViewController * inputController() = 0;
I18n::Message m_addNewMessage;
EvenOddMessageTextCell * m_addNewModel;
EvenOddMessageTextCell m_addNewModel;
};
}

View File

@@ -7,7 +7,8 @@ FunctionListController::FunctionListController(Responder * parentResponder, Func
ExpressionModelListController(parentResponder, text),
ButtonRowDelegate(header, footer),
m_functionStore(functionStore),
m_emptyCell(nullptr),
m_selectableTableView(this, this, this, this),
m_emptyCell(),
m_plotButton(this, I18n::Message::Plot, Invocation([](void * context, void * sender) {
FunctionListController * list = (FunctionListController *)context;
TabViewController * tabController = list->tabController();
@@ -19,6 +20,9 @@ FunctionListController::FunctionListController(Responder * parentResponder, Func
tabController->setActiveTab(2);
}, this), KDText::FontSize::Small, Palette::PurpleBright)
{
m_selectableTableView.setMargins(0);
m_selectableTableView.setVerticalCellOverlap(0);
m_selectableTableView.setShowsIndicators(false);
}
int FunctionListController::numberOfColumns() {
@@ -79,9 +83,9 @@ HighlightCell * FunctionListController::reusableCell(int index, int type) {
case 1:
return expressionCells(index);
case 2:
return m_emptyCell;
return &m_emptyCell;
case 3:
return m_addNewModel;
return &m_addNewModel;
default:
assert(false);
return nullptr;
@@ -212,21 +216,4 @@ TabViewController * FunctionListController::tabController() const{
return (TabViewController *)(parentResponder()->parentResponder()->parentResponder()->parentResponder());
}
View * FunctionListController::loadView() {
loadAddModelCell();
m_emptyCell = new EvenOddCell();
SelectableTableView * selectableTableView = new SelectableTableView(this, this, this, this);
selectableTableView->setMargins(0);
selectableTableView->setVerticalCellOverlap(0);
selectableTableView->setShowsIndicators(false);
return selectableTableView;
}
void FunctionListController::unloadView(View * view) {
unloadAddModelCell();
delete m_emptyCell;
m_emptyCell = nullptr;
delete view;
}
}

View File

@@ -37,13 +37,15 @@ public:
bool handleEvent(Ion::Events::Event event) override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
void willExitResponderChain(Responder * nextFirstResponder) override;
/* ViewController */
View * view() override { return &m_selectableTableView; }
/* SelectableTableViewDelegate*/
void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override;
/* ExpressionModelListController */
SelectableTableView * selectableTableView() override { return &m_selectableTableView; }
protected:
StackViewController * stackController() const;
void configureFunction(Function * function);
View * loadView() override;
void unloadView(View * view) override;
FunctionStore * m_functionStore;
private:
static constexpr KDCoordinate k_functionNameWidth = 65;
@@ -58,7 +60,8 @@ private:
virtual HighlightCell * titleCells(int index) = 0;
virtual HighlightCell * expressionCells(int index) = 0;
virtual void willDisplayTitleCellAtIndex(HighlightCell * cell, int j) = 0;
EvenOddCell * m_emptyCell;
SelectableTableView m_selectableTableView;
EvenOddCell m_emptyCell;
Button m_plotButton;
Button m_valuesButton;
};

View File

@@ -9,6 +9,11 @@ FunctionTitleCell::FunctionTitleCell(Orientation orientation) :
{
}
void FunctionTitleCell::setOrientation(Orientation orientation) {
m_orientation = orientation;
reloadCell();
}
void FunctionTitleCell::setColor(KDColor color) {
m_functionColor = color;
reloadCell();

View File

@@ -11,7 +11,8 @@ public:
HorizontalIndicator,
VerticalIndicator
};
FunctionTitleCell(Orientation orientation);
FunctionTitleCell(Orientation orientation = Orientation::VerticalIndicator);
void setOrientation(Orientation orientation);
virtual void setColor(KDColor color);
void drawRect(KDContext * ctx, KDRect rect) const override;
protected:

View File

@@ -10,6 +10,8 @@ ListController::ListController(Responder * parentResponder, EquationStore * equa
ExpressionModelListController(parentResponder, I18n::Message::AddEquation),
ButtonRowDelegate(nullptr, footer),
m_equationStore(equationStore),
m_equationListView(this, this, this),
m_expressionCells{},
m_resolveButton(this, equationStore->numberOfDefinedModels() > 1 ? I18n::Message::ResolveSystem : I18n::Message::ResolveEquation, Invocation([](void * context, void * sender) {
ListController * list = (ListController *)context;
list->resolveEquations();
@@ -17,6 +19,11 @@ ListController::ListController(Responder * parentResponder, EquationStore * equa
m_modelsParameterController(this, equationStore, this),
m_modelsStackController(nullptr, &m_modelsParameterController, KDColorWhite, Palette::PurpleDark, Palette::PurpleDark)
{
m_addNewModel.setAlignment(0.3f, 0.5f); // (EquationListView::k_braceTotalWidth+k_expressionMargin) / (Ion::Display::Width-m_addNewModel.text().size()) = (30+5)/(320-200)
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_expressionCells[i].setLeftMargin(EquationListView::k_braceTotalWidth+k_expressionMargin);
m_expressionCells[i].setEven(true);
}
}
int ListController::numberOfButtons(ButtonRowController::Position position) const {
@@ -45,9 +52,9 @@ HighlightCell * ListController::reusableCell(int index, int type) {
assert(index < k_maxNumberOfRows);
switch (type) {
case 0:
return m_expressionCells[index];
return &m_expressionCells[index];
case 1:
return m_addNewModel;
return &m_addNewModel;
default:
assert(false);
return nullptr;
@@ -208,35 +215,13 @@ bool ListController::removeModelRow(ExpressionModel * model) {
}
void ListController::reloadBrace() {
EquationListView * listView = static_cast<EquationListView *>(view());
EquationListView::BraceStyle braceStyle = m_equationStore->numberOfModels() <= 1 ? EquationListView::BraceStyle::None : (m_equationStore->numberOfModels() == m_equationStore->maxNumberOfModels() ? EquationListView::BraceStyle::Full : EquationListView::BraceStyle::OneRowShort);
listView->setBraceStyle(braceStyle);
listView->layoutSubviews();
m_equationListView.setBraceStyle(braceStyle);
m_equationListView.layoutSubviews();
}
SelectableTableView * ListController::selectableTableView() {
return static_cast<EquationListView *>(view())->selectableTableView();
}
View * ListController::loadView() {
loadAddModelCell();
m_addNewModel->setAlignment(0.3f, 0.5f); // (EquationListView::k_braceTotalWidth+k_expressionMargin) / (Ion::Display::Width-m_addNewModel.text().size()) = (30+5)/(320-200)
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_expressionCells[i] = new EvenOddExpressionCell();
m_expressionCells[i]->setLeftMargin(EquationListView::k_braceTotalWidth+k_expressionMargin);
m_expressionCells[i]->setEven(true);
}
EquationListView * listView = new EquationListView(this, this, this);
return listView;
}
void ListController::unloadView(View * view) {
unloadAddModelCell();
for (int i = 0; i < k_maxNumberOfRows; i++) {
delete m_expressionCells[i];
m_expressionCells[i] = nullptr;
}
delete view;
return m_equationListView.selectableTableView();
}
Shared::TextFieldDelegateApp * ListController::textFieldDelegateApp() {

View File

@@ -34,6 +34,8 @@ public:
void didBecomeFirstResponder() override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
void editExpression(Shared::ExpressionModel * model, Ion::Events::Event event) override { return Shared::ExpressionModelListController::editExpression(model, event); }
/* ViewController */
View * view() override { return &m_equationListView; }
/* Text/Layout Field Delegate */
Shared::TextFieldDelegateApp * textFieldDelegateApp() override;
Shared::ExpressionFieldDelegateApp * expressionFieldDelegateApp() override;
@@ -50,13 +52,12 @@ private:
void addEmptyModel() override;
bool removeModelRow(Shared::ExpressionModel * function) override;
void reloadBrace();
View * loadView() override;
void unloadView(View * view) override;
Shared::ExpressionModelStore * modelStore() override { return m_equationStore; }
StackViewController * stackController() const;
InputViewController * inputController() override;
EquationStore * m_equationStore;
EvenOddExpressionCell * m_expressionCells[k_maxNumberOfRows];
EquationListView m_equationListView;
EvenOddExpressionCell m_expressionCells[k_maxNumberOfRows];
Button m_resolveButton;
EquationModelsParameterController m_modelsParameterController;
StackViewController m_modelsStackController;