mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
[apps/shared] Make tab table controller dynamic view controller
Change-Id: Id3a383e72173779eb295dc998f780041f62f8bf0
This commit is contained in:
@@ -9,8 +9,6 @@ namespace Graph {
|
||||
|
||||
ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController),
|
||||
m_functionTitleCells{FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small),
|
||||
FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small)},
|
||||
m_functionStore(functionStore),
|
||||
m_functionParameterController(FunctionParameterController(this)),
|
||||
m_intervalParameterController(IntervalParameterController(this, &m_interval)),
|
||||
@@ -72,21 +70,35 @@ I18n::Message ValuesController::emptyMessage() {
|
||||
}
|
||||
|
||||
void ValuesController::selectCellAtLocation(int i, int j) {
|
||||
m_selectableTableView.selectCellAtLocation(i, j);
|
||||
selectableTableView()->selectCellAtLocation(i, j);
|
||||
}
|
||||
|
||||
int ValuesController::activeRow() {
|
||||
return m_selectableTableView.selectedRow();
|
||||
return selectableTableView()->selectedRow();
|
||||
}
|
||||
|
||||
int ValuesController::activeColumn() {
|
||||
return m_selectableTableView.selectedColumn();
|
||||
return selectableTableView()->selectedColumn();
|
||||
}
|
||||
|
||||
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;
|
||||
@@ -146,12 +158,12 @@ int ValuesController::maxNumberOfFunctions() {
|
||||
|
||||
FunctionTitleCell * ValuesController::functionTitleCells(int j) {
|
||||
assert(j >= 0 && j < k_maxNumberOfFunctions);
|
||||
return &m_functionTitleCells[j];
|
||||
return m_functionTitleCells[j];
|
||||
}
|
||||
|
||||
EvenOddBufferTextCell * ValuesController::floatCells(int j) {
|
||||
assert(j >= 0 && j < k_maxNumberOfCells);
|
||||
return &m_floatCells[j];
|
||||
return m_floatCells[j];
|
||||
}
|
||||
|
||||
CartesianFunctionStore * ValuesController::functionStore() const {
|
||||
@@ -171,5 +183,17 @@ float ValuesController::evaluationOfAbscissaAtColumn(float abscissa, int columnI
|
||||
return function->evaluateAtAbscissa(abscissa, myApp->localContext());
|
||||
}
|
||||
|
||||
View * ValuesController::createView() {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ public:
|
||||
int activeRow();
|
||||
int activeColumn();
|
||||
Shared::IntervalParameterController * intervalParameterController() override;
|
||||
void unloadView() override;
|
||||
private:
|
||||
CartesianFunction * functionAtColumn(int i) override;
|
||||
bool isDerivativeColumn(int i);
|
||||
@@ -30,14 +31,15 @@ private:
|
||||
float evaluationOfAbscissaAtColumn(float abscissa, int columnIndex) override;
|
||||
constexpr static int k_maxNumberOfCells = 50;
|
||||
constexpr static int k_maxNumberOfFunctions = 5;
|
||||
FunctionTitleCell m_functionTitleCells[k_maxNumberOfFunctions];
|
||||
FunctionTitleCell * m_functionTitleCells[k_maxNumberOfFunctions];
|
||||
FunctionTitleCell * functionTitleCells(int j) override;
|
||||
EvenOddBufferTextCell m_floatCells[k_maxNumberOfCells];
|
||||
EvenOddBufferTextCell * m_floatCells[k_maxNumberOfCells];
|
||||
EvenOddBufferTextCell * floatCells(int j) override;
|
||||
CartesianFunctionStore * m_functionStore;
|
||||
CartesianFunctionStore * functionStore() const override;
|
||||
FunctionParameterController m_functionParameterController;
|
||||
FunctionParameterController * functionParameterController() override;
|
||||
View * createView() override;
|
||||
Shared::IntervalParameterController m_intervalParameterController;
|
||||
DerivativeParameterController m_derivativeParameterController;
|
||||
};
|
||||
|
||||
@@ -14,18 +14,8 @@ namespace Regression {
|
||||
CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) :
|
||||
TabTableController(parentResponder, this, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, this, true),
|
||||
ButtonRowDelegate(header, nullptr),
|
||||
m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small),
|
||||
EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)},
|
||||
m_r2TitleCell(1.0f, 0.5f),
|
||||
m_columnTitleCell(EvenOddDoubleBufferTextCell(&m_selectableTableView)),
|
||||
m_calculationCells{EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small)},
|
||||
m_store(store)
|
||||
{
|
||||
for (int k = 0; k < k_maxNumberOfDisplayableRows/2; k++) {
|
||||
m_calculationCells[k].setTextColor(Palette::GreyDark);
|
||||
m_doubleCalculationCells[k].setTextColor(Palette::GreyDark);
|
||||
m_doubleCalculationCells[k].setParentResponder(&m_selectableTableView);
|
||||
}
|
||||
m_r2Layout = new BaselineRelativeLayout(new StringLayout("r", 1, KDText::FontSize::Small), new StringLayout("2", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Superscript);
|
||||
}
|
||||
|
||||
@@ -42,7 +32,7 @@ const char * CalculationController::title() {
|
||||
|
||||
bool CalculationController::handleEvent(Ion::Events::Event event) {
|
||||
if (event == Ion::Events::Up) {
|
||||
m_selectableTableView.deselectTable();
|
||||
selectableTableView()->deselectTable();
|
||||
app()->setFirstResponder(tabController());
|
||||
return true;
|
||||
}
|
||||
@@ -50,10 +40,10 @@ bool CalculationController::handleEvent(Ion::Events::Event event) {
|
||||
}
|
||||
|
||||
void CalculationController::didBecomeFirstResponder() {
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
m_selectableTableView.selectCellAtLocation(1, 0);
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
selectableTableView()->selectCellAtLocation(1, 0);
|
||||
} else {
|
||||
m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow());
|
||||
selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow());
|
||||
}
|
||||
TabTableController::didBecomeFirstResponder();
|
||||
}
|
||||
@@ -67,7 +57,7 @@ void CalculationController::tableViewDidChangeSelection(SelectableTableView * t,
|
||||
* selected one. */
|
||||
if (t->selectedRow() == 0 && t->selectedColumn() == 0) {
|
||||
if (previousSelectedCellX == 0 && previousSelectedCellY == 1) {
|
||||
m_selectableTableView.deselectTable();
|
||||
selectableTableView()->deselectTable();
|
||||
app()->setFirstResponder(tabController());
|
||||
} else {
|
||||
t->selectCellAtLocation(previousSelectedCellX, previousSelectedCellY);
|
||||
@@ -118,7 +108,7 @@ int CalculationController::numberOfColumns() {
|
||||
void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
|
||||
EvenOddCell * myCell = (EvenOddCell *)cell;
|
||||
myCell->setEven(j%2 == 0);
|
||||
myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow());
|
||||
myCell->setHighlighted(i == selectableTableView()->selectedColumn() && j == selectableTableView()->selectedRow());
|
||||
if (j == 0 && i > 0) {
|
||||
EvenOddDoubleBufferTextCell * myCell = (EvenOddDoubleBufferTextCell *)cell;
|
||||
myCell->setFirstText("x");
|
||||
@@ -177,22 +167,22 @@ KDCoordinate CalculationController::rowHeight(int j) {
|
||||
HighlightCell * CalculationController::reusableCell(int index, int type) {
|
||||
if (type == 0) {
|
||||
assert(index < k_maxNumberOfDisplayableRows);
|
||||
return &m_titleCells[index];
|
||||
return m_titleCells[index];
|
||||
}
|
||||
if (type == 1) {
|
||||
assert(index == 0);
|
||||
return &m_r2TitleCell;
|
||||
return m_r2TitleCell;
|
||||
}
|
||||
if (type == 2) {
|
||||
assert(index == 0);
|
||||
return &m_columnTitleCell;
|
||||
return m_columnTitleCell;
|
||||
}
|
||||
if (type == 3) {
|
||||
assert(index < k_totalNumberOfRows/2);
|
||||
return &m_doubleCalculationCells[index];
|
||||
return m_doubleCalculationCells[index];
|
||||
}
|
||||
assert(index < k_totalNumberOfRows/2);
|
||||
return &m_calculationCells[index];
|
||||
return m_calculationCells[index];
|
||||
}
|
||||
|
||||
int CalculationController::reusableCellCount(int type) {
|
||||
@@ -227,8 +217,54 @@ 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);
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -31,19 +31,21 @@ 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;
|
||||
constexpr static int k_totalNumberOfRows = 11;
|
||||
constexpr static int k_totalNumberOfColumns = 2;
|
||||
constexpr static int k_maxNumberOfDisplayableRows = 10;
|
||||
static constexpr KDCoordinate k_cellHeight = 25;
|
||||
static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2;
|
||||
EvenOddMessageTextCell m_titleCells[k_maxNumberOfDisplayableRows];
|
||||
EvenOddExpressionCell m_r2TitleCell;
|
||||
EvenOddMessageTextCell * m_titleCells[k_maxNumberOfDisplayableRows];
|
||||
EvenOddExpressionCell * m_r2TitleCell;
|
||||
Poincare::ExpressionLayout * m_r2Layout;
|
||||
EvenOddDoubleBufferTextCell m_columnTitleCell;
|
||||
EvenOddDoubleBufferTextCell m_doubleCalculationCells[k_maxNumberOfDisplayableRows/2];
|
||||
EvenOddBufferTextCell m_calculationCells[k_maxNumberOfDisplayableRows/2];
|
||||
EvenOddDoubleBufferTextCell * m_columnTitleCell;
|
||||
EvenOddDoubleBufferTextCell * m_doubleCalculationCells[k_maxNumberOfDisplayableRows/2];
|
||||
EvenOddBufferTextCell * m_calculationCells[k_maxNumberOfDisplayableRows/2];
|
||||
Store * m_store;
|
||||
};
|
||||
|
||||
|
||||
@@ -12,8 +12,7 @@ using namespace Shared;
|
||||
namespace Regression {
|
||||
|
||||
StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) :
|
||||
Shared::StoreController(parentResponder, store, header),
|
||||
m_titleCells{EvenOddExpressionCell(0.5f, 0.5f), EvenOddExpressionCell(0.5f, 0.5f)}
|
||||
Shared::StoreController(parentResponder, store, header)
|
||||
{
|
||||
m_titleLayout[0] = new BaselineRelativeLayout(new StringLayout("X", 1, KDText::FontSize::Small), new StringLayout("i", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript);
|
||||
m_titleLayout[1] = new BaselineRelativeLayout(new StringLayout("Y", 1, KDText::FontSize::Small), new StringLayout("i", 1, KDText::FontSize::Small), BaselineRelativeLayout::Type::Subscript);
|
||||
@@ -37,9 +36,26 @@ 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];
|
||||
return m_titleCells[index];
|
||||
}
|
||||
|
||||
View * StoreController::createView() {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,9 +12,11 @@ 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;
|
||||
EvenOddExpressionCell m_titleCells[k_numberOfTitleCells];
|
||||
View * createView() override;
|
||||
EvenOddExpressionCell * m_titleCells[k_numberOfTitleCells];
|
||||
Poincare::ExpressionLayout * m_titleLayout[2];
|
||||
};
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ namespace Sequence {
|
||||
|
||||
ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header) :
|
||||
Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController),
|
||||
m_sequenceTitleCells{SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator),
|
||||
SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator)},
|
||||
m_sequenceStore(sequenceStore),
|
||||
m_sequenceParameterController(Shared::ValuesFunctionParameterController('n')),
|
||||
m_intervalParameterController(IntervalParameterController(this, &m_interval))
|
||||
@@ -47,6 +45,20 @@ 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;
|
||||
@@ -64,12 +76,12 @@ int ValuesController::maxNumberOfFunctions() {
|
||||
|
||||
SequenceTitleCell * ValuesController::functionTitleCells(int j) {
|
||||
assert(j >= 0 && j < k_maxNumberOfSequences);
|
||||
return &m_sequenceTitleCells[j];
|
||||
return m_sequenceTitleCells[j];
|
||||
}
|
||||
|
||||
EvenOddBufferTextCell * ValuesController::floatCells(int j) {
|
||||
assert(j >= 0 && j < k_maxNumberOfCells);
|
||||
return &m_floatCells[j];
|
||||
return m_floatCells[j];
|
||||
}
|
||||
|
||||
SequenceStore * ValuesController::functionStore() const {
|
||||
@@ -80,4 +92,16 @@ Shared::ValuesFunctionParameterController * ValuesController::functionParameterC
|
||||
return &m_sequenceParameterController;
|
||||
}
|
||||
|
||||
View * ValuesController::createView() {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,18 +15,20 @@ 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;
|
||||
int maxNumberOfFunctions() override;
|
||||
constexpr static int k_maxNumberOfCells = 30;
|
||||
constexpr static int k_maxNumberOfSequences = 3;
|
||||
SequenceTitleCell m_sequenceTitleCells[k_maxNumberOfSequences];
|
||||
SequenceTitleCell * m_sequenceTitleCells[k_maxNumberOfSequences];
|
||||
SequenceTitleCell * functionTitleCells(int j) override;
|
||||
EvenOddBufferTextCell m_floatCells[k_maxNumberOfCells];
|
||||
EvenOddBufferTextCell * m_floatCells[k_maxNumberOfCells];
|
||||
EvenOddBufferTextCell * floatCells(int j) override;
|
||||
SequenceStore * m_sequenceStore;
|
||||
SequenceStore * functionStore() const override;
|
||||
View * createView() override;
|
||||
Shared::ValuesFunctionParameterController m_sequenceParameterController;
|
||||
Shared::ValuesFunctionParameterController * functionParameterController() override;
|
||||
IntervalParameterController m_intervalParameterController;
|
||||
|
||||
@@ -22,12 +22,12 @@ bool EditableCellTableViewController::textFieldDidFinishEditing(TextField * text
|
||||
app()->displayWarning(I18n::Message::UndefinedValue);
|
||||
return false;
|
||||
}
|
||||
if (!setDataAtLocation(floatBody, m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow())) {
|
||||
if (!setDataAtLocation(floatBody, selectableTableView()->selectedColumn(), selectableTableView()->selectedRow())) {
|
||||
app()->displayWarning(I18n::Message::ForbiddenValue);
|
||||
return false;
|
||||
}
|
||||
m_selectableTableView.reloadData();
|
||||
m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()+1);
|
||||
selectableTableView()->reloadData();
|
||||
selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow()+1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -86,26 +86,26 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(H
|
||||
}
|
||||
|
||||
void EditableCellTableViewController::didBecomeFirstResponder() {
|
||||
if (m_selectableTableView.selectedRow() >= 0) {
|
||||
int selectedRow = m_selectableTableView.selectedRow();
|
||||
if (selectableTableView()->selectedRow() >= 0) {
|
||||
int selectedRow = selectableTableView()->selectedRow();
|
||||
selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow;
|
||||
int selectedColumn = m_selectableTableView.selectedColumn();
|
||||
int selectedColumn = selectableTableView()->selectedColumn();
|
||||
selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn;
|
||||
m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow);
|
||||
selectableTableView()->selectCellAtLocation(selectedColumn, selectedRow);
|
||||
TabTableController::didBecomeFirstResponder();
|
||||
}
|
||||
}
|
||||
|
||||
void EditableCellTableViewController::viewWillAppear() {
|
||||
TabTableController::viewWillAppear();
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
m_selectableTableView.selectCellAtLocation(0, 1);
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
selectableTableView()->selectCellAtLocation(0, 1);
|
||||
} else {
|
||||
int selectedRow = m_selectableTableView.selectedRow();
|
||||
int selectedRow = selectableTableView()->selectedRow();
|
||||
selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow;
|
||||
int selectedColumn = m_selectableTableView.selectedColumn();
|
||||
int selectedColumn = selectableTableView()->selectedColumn();
|
||||
selectedColumn = selectedColumn >= numberOfColumns() ? numberOfColumns() - 1 : selectedColumn;
|
||||
m_selectableTableView.selectCellAtLocation(selectedColumn, selectedRow);
|
||||
selectableTableView()->selectCellAtLocation(selectedColumn, selectedRow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,11 +10,6 @@ namespace Shared {
|
||||
StoreController::StoreController(Responder * parentResponder, FloatPairStore * store, ButtonRowController * header) :
|
||||
EditableCellTableViewController(parentResponder, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin),
|
||||
ButtonRowDelegate(header, nullptr),
|
||||
m_editableCells{EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer)},
|
||||
m_store(store),
|
||||
m_storeParameterController(this, store)
|
||||
{
|
||||
@@ -48,7 +43,7 @@ HighlightCell * StoreController::reusableCell(int index, int type) {
|
||||
return titleCells(index);
|
||||
case 1:
|
||||
assert(index < k_maxNumberOfEditableCells);
|
||||
return &m_editableCells[index];
|
||||
return m_editableCells[index];
|
||||
default:
|
||||
assert(false);
|
||||
return nullptr;
|
||||
@@ -71,36 +66,45 @@ void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int
|
||||
}
|
||||
|
||||
void StoreController::didBecomeFirstResponder() {
|
||||
if (m_selectableTableView.selectedRow() < 0) {
|
||||
m_selectableTableView.selectCellAtLocation(0, 0);
|
||||
if (selectableTableView()->selectedRow() < 0) {
|
||||
selectableTableView()->selectCellAtLocation(0, 0);
|
||||
}
|
||||
EditableCellTableViewController::didBecomeFirstResponder();
|
||||
}
|
||||
|
||||
bool StoreController::handleEvent(Ion::Events::Event event) {
|
||||
if (event == Ion::Events::Up) {
|
||||
m_selectableTableView.deselectTable();
|
||||
assert(m_selectableTableView.selectedRow() == -1);
|
||||
selectableTableView()->deselectTable();
|
||||
assert(selectableTableView()->selectedRow() == -1);
|
||||
app()->setFirstResponder(tabController());
|
||||
return true;
|
||||
}
|
||||
if (event == Ion::Events::OK && m_selectableTableView.selectedRow() == 0) {
|
||||
m_storeParameterController.selectXColumn(m_selectableTableView.selectedColumn() == 0);
|
||||
if (event == Ion::Events::OK && selectableTableView()->selectedRow() == 0) {
|
||||
m_storeParameterController.selectXColumn(selectableTableView()->selectedColumn() == 0);
|
||||
StackViewController * stack = ((StackViewController *)parentResponder()->parentResponder());
|
||||
stack->push(&m_storeParameterController);
|
||||
return true;
|
||||
}
|
||||
if (event == Ion::Events::Backspace) {
|
||||
if (m_selectableTableView.selectedRow() == 0 || m_selectableTableView.selectedRow() == numberOfRows()-1) {
|
||||
if (selectableTableView()->selectedRow() == 0 || selectableTableView()->selectedRow() == numberOfRows()-1) {
|
||||
return false;
|
||||
}
|
||||
m_store->deletePairAtIndex(m_selectableTableView.selectedRow()-1);
|
||||
m_selectableTableView.reloadData();
|
||||
m_store->deletePairAtIndex(selectableTableView()->selectedRow()-1);
|
||||
selectableTableView()->reloadData();
|
||||
return true;
|
||||
}
|
||||
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());
|
||||
}
|
||||
@@ -129,4 +133,13 @@ int StoreController::maxNumberOfElements() const {
|
||||
return FloatPairStore::k_maxNumberOfPairs;
|
||||
}
|
||||
|
||||
View * StoreController::createView() {
|
||||
SelectableTableView * tableView = (SelectableTableView*)EditableCellTableViewController::createView();
|
||||
for (int i = 0; i < k_maxNumberOfEditableCells; i++) {
|
||||
assert(m_editableCells[i] == nullptr);
|
||||
m_editableCells[i] = new EvenOddEditableTextCell(tableView, this, m_draftTextBuffer);
|
||||
}
|
||||
return tableView;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,11 +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;
|
||||
bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override;
|
||||
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
|
||||
float dataAtLocation(int columnIndex, int rowIndex) override;
|
||||
@@ -34,7 +36,7 @@ protected:
|
||||
int maxNumberOfElements() const override;
|
||||
virtual HighlightCell * titleCells(int index) = 0;
|
||||
char m_draftTextBuffer[TextField::maxBufferSize()];
|
||||
EvenOddEditableTextCell m_editableCells[k_maxNumberOfEditableCells];
|
||||
EvenOddEditableTextCell * m_editableCells[k_maxNumberOfEditableCells];
|
||||
FloatPairStore * m_store;
|
||||
StoreParameterController m_storeParameterController;
|
||||
};
|
||||
|
||||
@@ -4,30 +4,40 @@ namespace Shared {
|
||||
|
||||
TabTableController::TabTableController(Responder * parentResponder, TableViewDataSource * dataSource, KDCoordinate topMargin,
|
||||
KDCoordinate rightMargin, KDCoordinate bottomMargin, KDCoordinate leftMargin, SelectableTableViewDelegate * delegate, bool showIndicators) :
|
||||
ViewController(parentResponder),
|
||||
m_selectableTableView(SelectableTableView(this, dataSource, 0, 0, topMargin, rightMargin, bottomMargin, leftMargin,
|
||||
delegate, showIndicators, true, Palette::WallScreenDark))
|
||||
DynamicViewController(parentResponder),
|
||||
m_dataSource(dataSource),
|
||||
m_topMargin(topMargin),
|
||||
m_rightMargin(rightMargin),
|
||||
m_bottomMargin(bottomMargin),
|
||||
m_leftMargin(leftMargin),
|
||||
m_delegate(delegate),
|
||||
m_showIndicators(showIndicators)
|
||||
{
|
||||
}
|
||||
|
||||
View * TabTableController::view() {
|
||||
return &m_selectableTableView;
|
||||
}
|
||||
|
||||
void TabTableController::didBecomeFirstResponder() {
|
||||
app()->setFirstResponder(&m_selectableTableView);
|
||||
app()->setFirstResponder(selectableTableView());
|
||||
}
|
||||
|
||||
void TabTableController::viewWillAppear() {
|
||||
m_selectableTableView.reloadData();
|
||||
selectableTableView()->reloadData();
|
||||
}
|
||||
|
||||
void TabTableController::willExitResponderChain(Responder * nextFirstResponder) {
|
||||
if (nextFirstResponder == tabController()) {
|
||||
m_selectableTableView.deselectTable();
|
||||
m_selectableTableView.scrollToCell(0,0);
|
||||
selectableTableView()->deselectTable();
|
||||
selectableTableView()->scrollToCell(0,0);
|
||||
}
|
||||
}
|
||||
|
||||
SelectableTableView * TabTableController::selectableTableView() {
|
||||
return (SelectableTableView *)view();
|
||||
}
|
||||
|
||||
View * TabTableController::createView() {
|
||||
return new SelectableTableView(this, m_dataSource, 0, 0, m_topMargin, m_rightMargin, m_bottomMargin, m_leftMargin, m_delegate, m_showIndicators, true, Palette::WallScreenDark);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -8,17 +8,25 @@ namespace Shared {
|
||||
/* Tab table controller is a controller whose view is a selectable table view
|
||||
* and whose one ancestor is a tab */
|
||||
|
||||
class TabTableController : public ViewController {
|
||||
class TabTableController : public DynamicViewController {
|
||||
public:
|
||||
TabTableController(Responder * parentResponder, TableViewDataSource * dataSource, KDCoordinate topMargin,
|
||||
KDCoordinate rightMargin, KDCoordinate bottomMargin, KDCoordinate leftMargin, SelectableTableViewDelegate * delegate, bool showIndicators);
|
||||
virtual View * view() override;
|
||||
void didBecomeFirstResponder() override;
|
||||
void viewWillAppear() override;
|
||||
void willExitResponderChain(Responder * nextFirstResponder) override;
|
||||
protected:
|
||||
SelectableTableView m_selectableTableView;
|
||||
SelectableTableView * selectableTableView();
|
||||
View * createView() override;
|
||||
virtual Responder * tabController() const = 0;
|
||||
private:
|
||||
TableViewDataSource * m_dataSource;
|
||||
KDCoordinate m_topMargin;
|
||||
KDCoordinate m_rightMargin;
|
||||
KDCoordinate m_bottomMargin;
|
||||
KDCoordinate m_leftMargin;
|
||||
SelectableTableViewDelegate * m_delegate;
|
||||
bool m_showIndicators;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -11,10 +11,6 @@ namespace Shared {
|
||||
ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController) :
|
||||
EditableCellTableViewController(parentResponder, k_topMargin, k_rightMargin, k_bottomMargin, k_leftMargin),
|
||||
ButtonRowDelegate(header, nullptr),
|
||||
m_abscissaTitleCell(EvenOddMessageTextCell(KDText::FontSize::Small)),
|
||||
m_abscissaCells{EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small),
|
||||
EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small)},
|
||||
m_abscissaParameterController(ValuesParameterController(this, intervalParameterController, parameterTitle)),
|
||||
m_setIntervalButton(Button(this, I18n::Message::IntervalSet, Invocation([](void * context, void * sender) {
|
||||
ValuesController * valuesController = (ValuesController *) context;
|
||||
@@ -37,37 +33,37 @@ Interval * ValuesController::interval() {
|
||||
|
||||
bool ValuesController::handleEvent(Ion::Events::Event event) {
|
||||
if (event == Ion::Events::Down) {
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
header()->setSelectedButton(-1);
|
||||
m_selectableTableView.selectCellAtLocation(0,0);
|
||||
app()->setFirstResponder(&m_selectableTableView);
|
||||
selectableTableView()->selectCellAtLocation(0,0);
|
||||
app()->setFirstResponder(selectableTableView());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (event == Ion::Events::Up) {
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
header()->setSelectedButton(-1);
|
||||
app()->setFirstResponder(tabController());
|
||||
return true;
|
||||
}
|
||||
m_selectableTableView.deselectTable();
|
||||
selectableTableView()->deselectTable();
|
||||
header()->setSelectedButton(0);
|
||||
return true;
|
||||
}
|
||||
if (event == Ion::Events::Backspace && m_selectableTableView.selectedRow() > 0 &&
|
||||
(m_selectableTableView.selectedRow() < numberOfRows()-1 || m_interval.numberOfElements() == Interval::k_maxNumberOfElements)) {
|
||||
m_interval.deleteElementAtIndex(m_selectableTableView.selectedRow()-1);
|
||||
m_selectableTableView.reloadData();
|
||||
if (event == Ion::Events::Backspace && selectableTableView()->selectedRow() > 0 &&
|
||||
(selectableTableView()->selectedRow() < numberOfRows()-1 || m_interval.numberOfElements() == Interval::k_maxNumberOfElements)) {
|
||||
m_interval.deleteElementAtIndex(selectableTableView()->selectedRow()-1);
|
||||
selectableTableView()->reloadData();
|
||||
return true;
|
||||
}
|
||||
if (event == Ion::Events::OK) {
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
return header()->handleEvent(event);
|
||||
}
|
||||
if (m_selectableTableView.selectedRow() == 0) {
|
||||
if (m_selectableTableView.selectedColumn() == 0) {
|
||||
if (selectableTableView()->selectedRow() == 0) {
|
||||
if (selectableTableView()->selectedColumn() == 0) {
|
||||
configureAbscissa();
|
||||
return true;
|
||||
}
|
||||
@@ -76,7 +72,7 @@ bool ValuesController::handleEvent(Ion::Events::Event event) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
return header()->handleEvent(event);
|
||||
}
|
||||
return false;
|
||||
@@ -84,8 +80,8 @@ bool ValuesController::handleEvent(Ion::Events::Event event) {
|
||||
|
||||
void ValuesController::didBecomeFirstResponder() {
|
||||
EditableCellTableViewController::didBecomeFirstResponder();
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
m_selectableTableView.deselectTable();
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
selectableTableView()->deselectTable();
|
||||
header()->setSelectedButton(0);
|
||||
} else {
|
||||
header()->setSelectedButton(-1);
|
||||
@@ -94,8 +90,8 @@ void ValuesController::didBecomeFirstResponder() {
|
||||
|
||||
void ValuesController::willExitResponderChain(Responder * nextFirstResponder) {
|
||||
if (nextFirstResponder == tabController()) {
|
||||
m_selectableTableView.deselectTable();
|
||||
m_selectableTableView.scrollToCell(0,0);
|
||||
selectableTableView()->deselectTable();
|
||||
selectableTableView()->scrollToCell(0,0);
|
||||
header()->setSelectedButton(-1);
|
||||
}
|
||||
}
|
||||
@@ -171,12 +167,12 @@ HighlightCell * ValuesController::reusableCell(int index, int type) {
|
||||
switch (type) {
|
||||
case 0:
|
||||
assert(index == 0);
|
||||
return &m_abscissaTitleCell;
|
||||
return m_abscissaTitleCell;
|
||||
case 1:
|
||||
return functionTitleCells(index);
|
||||
case 2:
|
||||
assert(index < k_maxNumberOfAbscissaCells);
|
||||
return &m_abscissaCells[index];
|
||||
return m_abscissaCells[index];
|
||||
case 3:
|
||||
return floatCells(index);
|
||||
default:
|
||||
@@ -230,6 +226,18 @@ void ValuesController::viewWillAppear() {
|
||||
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();
|
||||
}
|
||||
|
||||
Function * ValuesController::functionAtColumn(int i) {
|
||||
assert(i > 0);
|
||||
return functionStore()->activeFunctionAtIndex(i-1);
|
||||
@@ -249,7 +257,7 @@ void ValuesController::configureAbscissa() {
|
||||
}
|
||||
|
||||
void ValuesController::configureFunction() {
|
||||
functionParameterController()->setFunction(functionAtColumn(m_selectableTableView.selectedColumn()));
|
||||
functionParameterController()->setFunction(functionAtColumn(selectableTableView()->selectedColumn()));
|
||||
StackViewController * stack = stackController();
|
||||
stack->push(functionParameterController());
|
||||
}
|
||||
@@ -284,5 +292,16 @@ 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);
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ 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;
|
||||
@@ -43,6 +44,7 @@ public:
|
||||
protected:
|
||||
StackViewController * stackController() const;
|
||||
bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
|
||||
View * createView() override;
|
||||
Interval m_interval;
|
||||
private:
|
||||
virtual Function * functionAtColumn(int i);
|
||||
@@ -57,11 +59,11 @@ private:
|
||||
constexpr static int k_maxNumberOfAbscissaCells = 10;
|
||||
virtual int maxNumberOfCells() = 0;
|
||||
virtual int maxNumberOfFunctions() = 0;
|
||||
EvenOddMessageTextCell m_abscissaTitleCell;
|
||||
EvenOddMessageTextCell * m_abscissaTitleCell;
|
||||
virtual FunctionTitleCell * functionTitleCells(int j) = 0;
|
||||
virtual EvenOddBufferTextCell * floatCells(int j) = 0;
|
||||
char m_draftTextBuffer[TextField::maxBufferSize()];
|
||||
EvenOddEditableTextCell m_abscissaCells[k_maxNumberOfAbscissaCells];
|
||||
EvenOddEditableTextCell * m_abscissaCells[k_maxNumberOfAbscissaCells];
|
||||
virtual FunctionStore * functionStore() const = 0;
|
||||
virtual ValuesFunctionParameterController * functionParameterController() = 0;
|
||||
ValuesParameterController m_abscissaParameterController;
|
||||
|
||||
@@ -13,16 +13,8 @@ namespace Statistics {
|
||||
CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) :
|
||||
TabTableController(parentResponder, this, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin, nullptr, true),
|
||||
ButtonRowDelegate(header, nullptr),
|
||||
m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small),
|
||||
EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)},
|
||||
m_calculationCells{EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small),
|
||||
EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small)},
|
||||
m_store(store)
|
||||
{
|
||||
for (int k = 0; k < k_maxNumberOfDisplayableRows; k++) {
|
||||
m_titleCells[k].setAlignment(1.0f, 0.5f);
|
||||
m_calculationCells[k].setTextColor(Palette::GreyDark);
|
||||
}
|
||||
}
|
||||
|
||||
const char * CalculationController::title() {
|
||||
@@ -31,7 +23,7 @@ const char * CalculationController::title() {
|
||||
|
||||
bool CalculationController::handleEvent(Ion::Events::Event event) {
|
||||
if (event == Ion::Events::Up) {
|
||||
m_selectableTableView.deselectTable();
|
||||
selectableTableView()->deselectTable();
|
||||
app()->setFirstResponder(tabController());
|
||||
return true;
|
||||
}
|
||||
@@ -39,10 +31,10 @@ bool CalculationController::handleEvent(Ion::Events::Event event) {
|
||||
}
|
||||
|
||||
void CalculationController::didBecomeFirstResponder() {
|
||||
if (m_selectableTableView.selectedRow() == -1) {
|
||||
m_selectableTableView.selectCellAtLocation(0, 0);
|
||||
if (selectableTableView()->selectedRow() == -1) {
|
||||
selectableTableView()->selectCellAtLocation(0, 0);
|
||||
} else {
|
||||
m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow());
|
||||
selectableTableView()->selectCellAtLocation(selectableTableView()->selectedColumn(), selectableTableView()->selectedRow());
|
||||
}
|
||||
TabTableController::didBecomeFirstResponder();
|
||||
}
|
||||
@@ -73,7 +65,7 @@ int CalculationController::numberOfColumns() {
|
||||
void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
|
||||
EvenOddCell * myCell = (EvenOddCell *)cell;
|
||||
myCell->setEven(j%2 == 0);
|
||||
myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow());
|
||||
myCell->setHighlighted(i == selectableTableView()->selectedColumn() && j == selectableTableView()->selectedRow());
|
||||
if (i == 0) {
|
||||
I18n::Message titles[k_totalNumberOfRows] = {I18n::Message::TotalSize, I18n::Message::Minimum, I18n::Message::Maximum, I18n::Message::Range, I18n::Message::Mean, I18n::Message::StandardDeviation, I18n::Message::Deviation, I18n::Message::FirstQuartile, I18n::Message::ThirdQuartile, I18n::Message::Median, I18n::Message::InterquartileRange, I18n::Message::Sum, I18n::Message::SquareSum};
|
||||
EvenOddMessageTextCell * myCell = (EvenOddMessageTextCell *)cell;
|
||||
@@ -101,9 +93,9 @@ KDCoordinate CalculationController::rowHeight(int j) {
|
||||
HighlightCell * CalculationController::reusableCell(int index, int type) {
|
||||
assert(index < k_totalNumberOfRows);
|
||||
if (type == 0) {
|
||||
return &m_titleCells[index];
|
||||
return m_titleCells[index];
|
||||
}
|
||||
return &m_calculationCells[index];
|
||||
return m_calculationCells[index];
|
||||
}
|
||||
|
||||
int CalculationController::reusableCellCount(int type) {
|
||||
@@ -114,8 +106,33 @@ 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() {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -29,14 +29,16 @@ 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;
|
||||
constexpr static int k_totalNumberOfRows = 13;
|
||||
constexpr static int k_maxNumberOfDisplayableRows = 11;
|
||||
static constexpr KDCoordinate k_cellHeight = 20;
|
||||
static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::CommonRightMargin/2 - Metric::CommonLeftMargin/2;
|
||||
EvenOddMessageTextCell m_titleCells[k_maxNumberOfDisplayableRows];
|
||||
EvenOddBufferTextCell m_calculationCells[k_maxNumberOfDisplayableRows];
|
||||
EvenOddMessageTextCell * m_titleCells[k_maxNumberOfDisplayableRows];
|
||||
EvenOddBufferTextCell * m_calculationCells[k_maxNumberOfDisplayableRows];
|
||||
Store * m_store;
|
||||
};
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@ using namespace Shared;
|
||||
namespace Statistics {
|
||||
|
||||
StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) :
|
||||
Shared::StoreController(parentResponder, store, header),
|
||||
m_titleCells{EvenOddMessageTextCell(KDText::FontSize::Small), EvenOddMessageTextCell(KDText::FontSize::Small)}
|
||||
Shared::StoreController(parentResponder, store, header)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -27,9 +26,18 @@ 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];
|
||||
return m_titleCells[index];
|
||||
}
|
||||
|
||||
bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) {
|
||||
@@ -43,4 +51,12 @@ bool StoreController::setDataAtLocation(float floatBody, int columnIndex, int ro
|
||||
return Shared::StoreController::setDataAtLocation(floatBody, columnIndex, rowIndex);
|
||||
}
|
||||
|
||||
View * StoreController::createView() {
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,10 +11,12 @@ 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;
|
||||
EvenOddMessageTextCell m_titleCells[k_numberOfTitleCells];
|
||||
View * createView() override;
|
||||
EvenOddMessageTextCell * m_titleCells[k_numberOfTitleCells];
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user