[apps] Create an abstract class of data model and of data controller

Change-Id: I764b07bde5f81068eaeebed80969f410495bf6b6
This commit is contained in:
Émilie Feral
2016-12-29 18:04:58 +01:00
parent 60cb611278
commit 4841bdb8af
5 changed files with 190 additions and 0 deletions

View File

@@ -12,6 +12,8 @@ app_objs += $(addprefix apps/,\
curve_view.o\
curve_view_with_banner.o\
curve_view_window.o\
data.o\
data_controller.o\
editable_cell_table_view_controller.o\
expression_text_field_delegate.o\
float_parameter_controller.o\

9
apps/data.cpp Normal file
View File

@@ -0,0 +1,9 @@
#include "data.h"
Data::Data() :
m_numberOfPairs(0)
{
}
int Data::numberOfPairs() {
return m_numberOfPairs;
}

19
apps/data.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef APPS_DATA_H
#define APPS_DATA_H
class Data {
public:
Data();
virtual void deletePairAtIndex(int index) = 0;
virtual void setXValueAtIndex(float f, int index) = 0;
virtual void setYValueAtIndex(float f, int index) = 0;
virtual float xValueAtIndex(int index) = 0;
virtual float yValueAtIndex(int index) = 0;
int numberOfPairs();
// TODO: decide the max number of elements after optimization
constexpr static int k_maxNumberOfPairs = 500;
protected:
int m_numberOfPairs;
};
#endif

123
apps/data_controller.cpp Normal file
View File

@@ -0,0 +1,123 @@
#include "data_controller.h"
#include "apps_container.h"
#include "constant.h"
#include <assert.h>
DataController::DataController(Responder * parentResponder, Data * data) :
EditableCellTableViewController(parentResponder, Metric::TopMargin, Metric::RightMargin, Metric::BottomMargin, Metric::LeftMargin),
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)},
m_data(data)
{
}
const char * DataController::title() const {
return "Donnees";
}
int DataController::numberOfColumns() {
return 2;
};
KDCoordinate DataController::columnWidth(int i) {
return k_cellWidth;
}
KDCoordinate DataController::cumulatedWidthFromIndex(int i) {
return i*k_cellWidth;
}
int DataController::indexFromCumulatedWidth(KDCoordinate offsetX) {
return (offsetX-1) / k_cellWidth;
}
TableViewCell * DataController::reusableCell(int index, int type) {
assert(index >= 0);
switch (type) {
case 0:
assert(index < k_numberOfTitleCells);
return &m_titleCells[index];
case 1:
assert(index < k_maxNumberOfEditableCells);
return &m_editableCells[index];
default:
assert(false);
return nullptr;
}
}
int DataController::reusableCellCount(int type) {
if (type == 0) {
return k_numberOfTitleCells;
}
return k_maxNumberOfEditableCells;
}
void DataController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) {
EditableCellTableViewController::willDisplayCellAtLocation(cell, i, j);
if (cellAtLocationIsEditable(i, j)) {
return;
}
EvenOddPointerTextCell * mytitleCell = (EvenOddPointerTextCell *)cell;
if (i == 0) {
mytitleCell->setText("Xi");
return;
}
mytitleCell->setText("Yi");
}
int DataController::typeAtLocation(int i, int j) {
return j!=0;
}
bool DataController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::Up) {
m_selectableTableView.deselectTable();
assert(m_selectableTableView.selectedRow() == -1);
app()->setFirstResponder(tabController());
return true;
}
if (event == Ion::Events::Clear) {
m_data->deletePairAtIndex(m_selectableTableView.selectedRow()-1);
m_selectableTableView.reloadData();
return true;
}
return false;
}
Responder * DataController::tabController() const {
return (parentResponder()->parentResponder());
}
bool DataController::cellAtLocationIsEditable(int columnIndex, int rowIndex) {
if (rowIndex > 0) {
return true;
}
return false;
}
void DataController::setDataAtLocation(float floatBody, int columnIndex, int rowIndex) {
if (columnIndex == 0) {
m_data->setXValueAtIndex(floatBody, rowIndex-1);
} else {
m_data->setYValueAtIndex(floatBody, rowIndex-1);
}
}
float DataController::dataAtLocation(int columnIndex, int rowIndex) {
if (columnIndex == 0) {
return m_data->xValueAtIndex(rowIndex-1);
} else {
return m_data->yValueAtIndex(rowIndex-1);
}
}
int DataController::numberOfElements() {
return m_data->numberOfPairs();
}
int DataController::maxNumberOfElements() const {
return Data::k_maxNumberOfPairs;
}

37
apps/data_controller.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef APPS_DATA_CONTROLLER_H
#define APPS_DATA_CONTROLLER_H
#include <escher.h>
#include "data.h"
#include "editable_cell_table_view_controller.h"
class DataController : public EditableCellTableViewController {
public:
DataController(Responder * parentResponder, Data * m_data);
const char * title() const override;
int numberOfColumns() override;
void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override;
KDCoordinate columnWidth(int i) override;
KDCoordinate cumulatedWidthFromIndex(int i) override;
int indexFromCumulatedWidth(KDCoordinate offsetX) override;
TableViewCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
int typeAtLocation(int i, int j) override;
bool handleEvent(Ion::Events::Event event) override;
protected:
static constexpr KDCoordinate k_cellWidth = 100;
constexpr static int k_maxNumberOfEditableCells = 20;
constexpr static int k_numberOfTitleCells = 2;
Responder * tabController() const;
bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override;
void setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override;
float dataAtLocation(int columnIndex, int rowIndex) override;
int numberOfElements() override;
int maxNumberOfElements() const override;
char m_draftTextBuffer[EditableTextCell::k_bufferLength];
EvenOddEditableTextCell m_editableCells[k_maxNumberOfEditableCells];
EvenOddPointerTextCell m_titleCells[k_numberOfTitleCells];
Data * m_data;
};
#endif