From 3ce2c91c7fb3fc555effd69a98305cad1792050f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 19 Dec 2016 17:32:54 +0100 Subject: [PATCH] [apps/statistics] Make data controller inherits from editable cell table view controller Change-Id: I06051c40edff8eac8ac326b061bb7e03bf74ef8a --- apps/statistics/data_controller.cpp | 130 ++++++++-------------------- apps/statistics/data_controller.h | 22 ++--- 2 files changed, 44 insertions(+), 108 deletions(-) diff --git a/apps/statistics/data_controller.cpp b/apps/statistics/data_controller.cpp index 99b987cd9..98f888d1b 100644 --- a/apps/statistics/data_controller.cpp +++ b/apps/statistics/data_controller.cpp @@ -7,12 +7,11 @@ namespace Statistics { DataController::DataController(Responder * parentResponder, Data * data) : - ViewController(parentResponder), + 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_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, Metric::BottomMargin, Metric::LeftMargin, this)), m_data(data) { } @@ -21,54 +20,10 @@ const char * DataController::title() const { return "Donnees"; } -View * DataController::view() { - return &m_selectableTableView; -} - -bool DataController::textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) { - App * myApp = (App *)app(); - return myApp->textFieldDidReceiveEvent(textField, event); -} - -bool DataController::textFieldDidFinishEditing(TextField * textField, const char * text) { - AppsContainer * appsContainer = (AppsContainer *)app()->container(); - Context * globalContext = appsContainer->globalContext(); - if (m_selectableTableView.selectedColumn() == 0) { - float floatBody = Expression::parse(text)->approximate(*globalContext); - m_data->setValueAtIndex(floatBody, m_selectableTableView.selectedRow()-1); - } else { - int size = Expression::parse(text)->approximate(*globalContext); - m_data->setSizeAtIndex(size, m_selectableTableView.selectedRow()-1); - } - willDisplayCellAtLocation(m_selectableTableView.cellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()), m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); - m_selectableTableView.reloadData(); - return true; -} - -void DataController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) { - if (previousSelectedCellY > 0) { - EvenOddEditableTextCell * myCell = (EvenOddEditableTextCell *)t->cellAtLocation(previousSelectedCellX, previousSelectedCellY); - myCell->setEditing(false); - app()->setFirstResponder(t); - } - if (t->selectedRow() > 0) { - EvenOddEditableTextCell * myCell = (EvenOddEditableTextCell *)t->cellAtLocation(t->selectedColumn(), t->selectedRow()); - app()->setFirstResponder(myCell); - } -} - -int DataController::numberOfRows() { - return m_data->numberOfPairs() + 2; -}; - int DataController::numberOfColumns() { return 2; }; -KDCoordinate DataController::rowHeight(int j) { - return k_cellHeight; -} - KDCoordinate DataController::columnWidth(int i) { return k_cellWidth; } @@ -77,18 +32,10 @@ KDCoordinate DataController::cumulatedWidthFromIndex(int i) { return i*k_cellWidth; } -KDCoordinate DataController::cumulatedHeightFromIndex(int j) { - return j*k_cellHeight; -} - int DataController::indexFromCumulatedWidth(KDCoordinate offsetX) { return (offsetX-1) / k_cellWidth; } -int DataController::indexFromCumulatedHeight(KDCoordinate offsetY) { - return (offsetY-1) / k_cellHeight; -} - TableViewCell * DataController::reusableCell(int index, int type) { assert(index >= 0); switch (type) { @@ -112,53 +59,19 @@ int DataController::reusableCellCount(int type) { } void DataController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { - EvenOddCell * myCell = (EvenOddCell *)cell; - myCell->setEven(j%2 == 0); - myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow()); - if (j == 0) { - EvenOddPointerTextCell * mytitleCell = (EvenOddPointerTextCell *)cell; - if (i == 0) { - mytitleCell->setText("Valeurs"); - return; - } - mytitleCell->setText("Effectifs"); + EditableCellTableViewController::willDisplayCellAtLocation(cell, i, j); + EvenOddPointerTextCell * mytitleCell = (EvenOddPointerTextCell *)cell; + if (i == 0) { + mytitleCell->setText("Valeurs"); return; } - // The cell is editable - EvenOddEditableTextCell * myEditableValueCell = (EvenOddEditableTextCell *)cell; - char buffer[Constant::FloatBufferSizeInScientificMode]; - // Special case 1: last row - if (j == numberOfRows() - 1) { - /* Display an empty line only if there is enough space for a new element in - * data */ - int numberOfPairs = m_data->numberOfPairs(); - if (numberOfPairs < Data::k_maxNumberOfPairs) { - buffer[0] = 0; - myEditableValueCell->setText(buffer); - return; - } - } - if (i == 0) { - Float(m_data->valueAtIndex(j-1)).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); - } else { - Float(m_data->sizeAtIndex(j-1)).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); - } - myEditableValueCell->setText(buffer); + mytitleCell->setText("Effectifs"); } int DataController::typeAtLocation(int i, int j) { return j!=0; } -void DataController::didBecomeFirstResponder() { - if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(0, 0); - } else { - m_selectableTableView.selectCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); - } - app()->setFirstResponder(&m_selectableTableView); -} - bool DataController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { m_selectableTableView.deselectTable(); @@ -173,4 +86,35 @@ Responder * DataController::tabController() const { return (parentResponder()->parentResponder()); } +bool DataController::cellAtLocationIsEditable(int columnIndex, int rowIndex) { + if (rowIndex > 0) { + return true; + } + return false; +} + +void DataController::setElementLinkedToCellLocationInModel(float floatBody, int columnIndex, int rowIndex) { + if (columnIndex == 0) { + m_data->setValueAtIndex(floatBody, rowIndex-1); + } else { + m_data->setSizeAtIndex(floatBody, rowIndex-1); + } +} + +float DataController::elementInModelLinkedToCellLocation(int columnIndex, int rowIndex) { + if (columnIndex == 0) { + return m_data->valueAtIndex(rowIndex-1); + } else { + return m_data->sizeAtIndex(rowIndex-1); + } +} + +int DataController::modelNumberOfElements() { + return m_data->numberOfPairs(); +} + +int DataController::modelMaxNumberOfElements() const { + return Data::k_maxNumberOfPairs; +} + } diff --git a/apps/statistics/data_controller.h b/apps/statistics/data_controller.h index 881ed9ce6..8e7f97abd 100644 --- a/apps/statistics/data_controller.h +++ b/apps/statistics/data_controller.h @@ -3,44 +3,36 @@ #include #include "data.h" +#include "../editable_cell_table_view_controller.h" namespace Statistics { -class DataController : public ViewController, public TableViewDataSource, public SelectableTableViewDelegate, public TextFieldDelegate { +class DataController : public EditableCellTableViewController { public: DataController(Responder * parentResponder, Data * m_data); const char * title() const override; - virtual View * view() override; - - bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; - bool textFieldDidFinishEditing(TextField * textField, const char * text) override; - void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; - - int numberOfRows() override; int numberOfColumns() override; void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override; KDCoordinate columnWidth(int i) override; - KDCoordinate rowHeight(int j) override; KDCoordinate cumulatedWidthFromIndex(int i) override; - KDCoordinate cumulatedHeightFromIndex(int j) override; int indexFromCumulatedWidth(KDCoordinate offsetX) override; - int indexFromCumulatedHeight(KDCoordinate offsetY) override; TableViewCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; - - void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; private: - static constexpr KDCoordinate k_cellHeight = 30; 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 setElementLinkedToCellLocationInModel(float floatBody, int columnIndex, int rowIndex) override; + float elementInModelLinkedToCellLocation(int columnIndex, int rowIndex) override; + int modelNumberOfElements() override; + int modelMaxNumberOfElements() const override; char m_draftTextBuffer[EditableTextCell::k_bufferLength]; EvenOddEditableTextCell m_editableCells[k_maxNumberOfEditableCells]; EvenOddPointerTextCell m_titleCells[k_numberOfTitleCells]; - SelectableTableView m_selectableTableView; Data * m_data; };