From 4841bdb8af4ec0176c56ff69dd250df0cc446abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 29 Dec 2016 18:04:58 +0100 Subject: [PATCH] [apps] Create an abstract class of data model and of data controller Change-Id: I764b07bde5f81068eaeebed80969f410495bf6b6 --- apps/Makefile | 2 + apps/data.cpp | 9 +++ apps/data.h | 19 ++++++ apps/data_controller.cpp | 123 +++++++++++++++++++++++++++++++++++++++ apps/data_controller.h | 37 ++++++++++++ 5 files changed, 190 insertions(+) create mode 100644 apps/data.cpp create mode 100644 apps/data.h create mode 100644 apps/data_controller.cpp create mode 100644 apps/data_controller.h diff --git a/apps/Makefile b/apps/Makefile index 103696197..8509e8e10 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -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\ diff --git a/apps/data.cpp b/apps/data.cpp new file mode 100644 index 000000000..b6a94d1e0 --- /dev/null +++ b/apps/data.cpp @@ -0,0 +1,9 @@ +#include "data.h" + +Data::Data() : + m_numberOfPairs(0) +{ +} +int Data::numberOfPairs() { + return m_numberOfPairs; +} \ No newline at end of file diff --git a/apps/data.h b/apps/data.h new file mode 100644 index 000000000..f353800fc --- /dev/null +++ b/apps/data.h @@ -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 diff --git a/apps/data_controller.cpp b/apps/data_controller.cpp new file mode 100644 index 000000000..4cc31900e --- /dev/null +++ b/apps/data_controller.cpp @@ -0,0 +1,123 @@ +#include "data_controller.h" +#include "apps_container.h" +#include "constant.h" +#include + +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; +} diff --git a/apps/data_controller.h b/apps/data_controller.h new file mode 100644 index 000000000..200c1d73c --- /dev/null +++ b/apps/data_controller.h @@ -0,0 +1,37 @@ +#ifndef APPS_DATA_CONTROLLER_H +#define APPS_DATA_CONTROLLER_H + +#include +#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