[apps/stats] Start developping the input formula view in data

This commit is contained in:
Léa Saviot
2018-05-28 18:35:38 +02:00
parent 31ee2daf50
commit 84131db41c
8 changed files with 130 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
app_objs += $(addprefix apps/shared/,\
banner_view.o\
buffer_function_title_cell.o\
buffer_text_view_with_text_field.o\
button_with_separator.o\
cursor_view.o\
curve_view.o\

View File

@@ -0,0 +1,37 @@
#include "buffer_text_view_with_text_field.h"
namespace Shared {
BufferTextViewWithTextField::BufferTextViewWithTextField(Responder * parentResponder, TextFieldDelegate * delegate, KDText::FontSize size) :
View(),
Responder(parentResponder),
m_bufferTextView(size, 0.0f, 0.5f),
m_textField(this, m_textFieldBuffer, m_textFieldBuffer, k_textFieldBufferSize, delegate, false, size, 0.0f, 0.5f),
m_textFieldBuffer{}
{
}
KDSize BufferTextViewWithTextField::minimalSizeForOptimalDisplay() const {
return m_bufferTextView.minimalSizeForOptimalDisplay();
}
void BufferTextViewWithTextField::setBufferText(const char * text) {
m_bufferTextView.setText(text);
}
void BufferTextViewWithTextField::didBecomeFirstResponder() {
app()->setFirstResponder(&m_textField);
}
View * BufferTextViewWithTextField::subviewAtIndex(int index) {
assert(index >= 0 && index < numberOfSubviews());
View * views[] = {&m_bufferTextView, &m_textField};
return views[index];
}
void BufferTextViewWithTextField::layoutSubviews() {
m_bufferTextView.setFrame(KDRect(0, 0, k_height, k_bufferTextWidth));
m_textField.setFrame(KDRect(k_bufferTextWidth, 0, k_height, bounds().width() - k_bufferTextWidth));
}
}

View File

@@ -0,0 +1,30 @@
#ifndef SHARED_BUFFER_TEXT_VIEW_WITH_TEXT_FIELD_H
#define SHARED_BUFFER_TEXT_VIEW_WITH_TEXT_FIELD_H
#include <escher.h>
namespace Shared {
class BufferTextViewWithTextField : public View, public Responder {
public:
constexpr static KDCoordinate k_height = 50; //TODO
BufferTextViewWithTextField(Responder * parentResponder, TextFieldDelegate * delegate = nullptr, KDText::FontSize size = KDText::FontSize::Large);
KDSize minimalSizeForOptimalDisplay() const override;
void setBufferText(const char * text);
void setTextFieldText(const char * text);
// Responder
void didBecomeFirstResponder() override;
private:
constexpr static int k_textFieldBufferSize = TextField::maxBufferSize();
constexpr static KDCoordinate k_bufferTextWidth = 70; //TODO
int numberOfSubviews() const override { return 2; }
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
BufferTextView m_bufferTextView;
TextField m_textField;
char m_textFieldBuffer[k_textFieldBufferSize];
};
}
#endif

View File

@@ -9,7 +9,7 @@
namespace Shared {
class EditableCellTableViewController : public TabTableController , public RegularTableViewDataSource , public TextFieldDelegate {
class EditableCellTableViewController : public TabTableController , public RegularTableViewDataSource, public TextFieldDelegate {
public:
EditableCellTableViewController(Responder * parentResponder);
bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override;

View File

@@ -1,5 +1,4 @@
#include "store_controller.h"
#include "store_selectable_table_view.h"
#include "../apps_container.h"
#include "../constant.h"
#include <escher/metric.h>
@@ -9,6 +8,35 @@ using namespace Poincare;
namespace Shared {
StoreController::ContentView::ContentView(FloatPairStore * store, Responder * parentResponder, TableViewDataSource * dataSource, SelectableTableViewDataSource * selectionDataSource, TextFieldDelegate * textFieldDelegate) :
View(),
Responder(parentResponder),
m_dataView(store, this, dataSource, selectionDataSource),
m_formulaInputView(this, textFieldDelegate),
m_displayInputFormulaView(false)
{
m_dataView.setBackgroundColor(Palette::WallScreenDark);
m_dataView.setVerticalCellOverlap(0);
m_dataView.setMargins(k_margin, k_scrollBarMargin, k_scrollBarMargin, k_margin);
}
void StoreController::ContentView::didBecomeFirstResponder() {
app()->setFirstResponder(&m_dataView);
}
View * StoreController::ContentView::subviewAtIndex(int index) {
assert(index >= 0 && index < numberOfSubviews());
View * views[] = {&m_dataView, &m_formulaInputView};
return views[index];
}
void StoreController::ContentView::layoutSubviews() {
KDRect dataViewFrame(0, 0, bounds().width(), bounds().height() - (m_displayInputFormulaView ? BufferTextViewWithTextField::k_height : 0));
m_dataView.setFrame(dataViewFrame);
KDRect formulaFrame(0, bounds().height() - BufferTextViewWithTextField::k_height, bounds().width(), m_displayInputFormulaView ? BufferTextViewWithTextField::k_height : 0);
m_formulaInputView.setFrame(formulaFrame);
}
StoreController::StoreController(Responder * parentResponder, FloatPairStore * store, ButtonRowController * header) :
EditableCellTableViewController(parentResponder),
ButtonRowDelegate(header, nullptr),
@@ -143,12 +171,17 @@ void StoreController::didBecomeFirstResponder() {
selectCellAtLocation(0, 0);
}
EditableCellTableViewController::didBecomeFirstResponder();
app()->setFirstResponder(static_cast<ContentView *>(view()));
}
Responder * StoreController::tabController() const {
return (parentResponder()->parentResponder()->parentResponder());
}
SelectableTableView * StoreController::selectableTableView() {
return static_cast<ContentView *>(view())->dataView();
}
bool StoreController::cellAtLocationIsEditable(int columnIndex, int rowIndex) {
if (rowIndex > 0) {
return true;
@@ -178,15 +211,11 @@ int StoreController::maxNumberOfElements() const {
}
View * StoreController::loadView() {
StoreSelectableTableView * tableView = new StoreSelectableTableView(m_store, this, this, this);
tableView->setBackgroundColor(Palette::WallScreenDark);
tableView->setVerticalCellOverlap(0);
ContentView * contentView = new ContentView(m_store, this, this, this, this);
for (int i = 0; i < k_maxNumberOfEditableCells; i++) {
m_editableCells[i] = new StoreCell(tableView, this, m_draftTextBuffer);
m_editableCells[i] = new StoreCell(contentView->dataView(), this, m_draftTextBuffer);
}
tableView->setMargins(k_margin, k_scrollBarMargin, k_scrollBarMargin, k_margin - Metric::TableSeparatorThickness);
return tableView;
return contentView;
}
void StoreController::unloadView(View * view) {
@@ -194,7 +223,7 @@ void StoreController::unloadView(View * view) {
delete m_editableCells[i];
m_editableCells[i] = nullptr;
}
EditableCellTableViewController::unloadView(view);
delete view;
}
bool StoreController::cellShouldBeTransparent(int i, int j) {

View File

@@ -2,10 +2,12 @@
#define SHARED_STORE_CONTROLLER_H
#include <escher.h>
#include "buffer_text_view_with_text_field.h"
#include "editable_cell_table_view_controller.h"
#include "float_pair_store.h"
#include "store_cell.h"
#include "store_parameter_controller.h"
#include "store_selectable_table_view.h"
namespace Shared {
@@ -43,7 +45,26 @@ protected:
constexpr static int k_numberOfTitleCells = 4;
static constexpr int k_titleCellType = 0;
static constexpr int k_editableCellType = 1;
class ContentView : public View , public Responder {
public:
ContentView(FloatPairStore * store, Responder * parentResponder, TableViewDataSource * dataSource, SelectableTableViewDataSource * selectionDataSource, TextFieldDelegate * textFieldDelegate);
StoreSelectableTableView * dataView() { return &m_dataView; }
// Responder
void didBecomeFirstResponder() override;
private:
static constexpr KDCoordinate k_margin = 8;
static constexpr KDCoordinate k_scrollBarMargin = Metric::CommonRightMargin;
int numberOfSubviews() const override { return 1 + m_displayInputFormulaView; }
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
StoreSelectableTableView m_dataView;
BufferTextViewWithTextField m_formulaInputView;
bool m_displayInputFormulaView;
};
Responder * tabController() const override;
SelectableTableView * selectableTableView() override;
View * loadView() override;
void unloadView(View * view) override;
bool cellAtLocationIsEditable(int columnIndex, int rowIndex) override;
@@ -59,7 +80,6 @@ protected:
StoreParameterController m_storeParameterController;
private:
bool cellShouldBeTransparent(int i, int j);
};
}

View File

@@ -25,7 +25,7 @@ void TabTableController::willExitResponderChain(Responder * nextFirstResponder)
}
SelectableTableView * TabTableController::selectableTableView() {
return (SelectableTableView *)view();
return static_cast<SelectableTableView *>(view());
}
View * TabTableController::loadView() {

View File

@@ -15,7 +15,7 @@ public:
void viewWillAppear() override;
void willExitResponderChain(Responder * nextFirstResponder) override;
protected:
SelectableTableView * selectableTableView();
virtual SelectableTableView * selectableTableView();
virtual View * loadView() override;
void unloadView(View * view) override;
virtual Responder * tabController() const = 0;