mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
responder, scroll to the bottom of the table (and not the last cell). Indeed, the last cell might be to big to be displayed and scroll to it might scroll to its top. This fixes the following bug: input 1/2/3/4/5/6/7/8, OK, up, down. We did not scroll to the bottom of the table.
63 lines
2.8 KiB
C++
63 lines
2.8 KiB
C++
#ifndef CALCULATION_EDIT_EXPRESSION_CONTROLLER_H
|
|
#define CALCULATION_EDIT_EXPRESSION_CONTROLLER_H
|
|
|
|
#include <escher.h>
|
|
#include <poincare/layout.h>
|
|
#include "expression_field.h"
|
|
#include "../shared/text_field_delegate.h"
|
|
#include "../shared/layout_field_delegate.h"
|
|
#include "history_controller.h"
|
|
#include "calculation_store.h"
|
|
#include "selectable_table_view.h"
|
|
|
|
namespace Calculation {
|
|
|
|
/* TODO: implement a split view */
|
|
class EditExpressionController : public ViewController, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate {
|
|
public:
|
|
EditExpressionController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, HistoryController * historyController, CalculationStore * calculationStore);
|
|
View * view() override { return &m_contentView; }
|
|
void didBecomeFirstResponder() override;
|
|
void viewWillAppear() override;
|
|
void insertTextBody(const char * text);
|
|
|
|
/* TextFieldDelegate */
|
|
bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override;
|
|
bool textFieldDidFinishEditing(::TextField * textField, const char * text, Ion::Events::Event event) override;
|
|
bool textFieldDidAbortEditing(::TextField * textField) override;
|
|
|
|
/* LayoutFieldDelegate */
|
|
bool layoutFieldDidReceiveEvent(::LayoutField * layoutField, Ion::Events::Event event) override;
|
|
bool layoutFieldDidFinishEditing(::LayoutField * layoutField, Poincare::Layout layoutR, Ion::Events::Event event) override;
|
|
bool layoutFieldDidAbortEditing(::LayoutField * layoutField) override;
|
|
void layoutFieldDidChangeSize(::LayoutField * layoutField) override;
|
|
|
|
private:
|
|
class ContentView : public View {
|
|
public:
|
|
ContentView(Responder * parentResponder, CalculationSelectableTableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate);
|
|
void reload();
|
|
CalculationSelectableTableView * mainView() { return m_mainView; }
|
|
ExpressionField * expressionField() { return &m_expressionField; }
|
|
private:
|
|
int numberOfSubviews() const override { return 2; }
|
|
View * subviewAtIndex(int index) override;
|
|
void layoutSubviews(bool force = false) override;
|
|
CalculationSelectableTableView * m_mainView;
|
|
ExpressionField m_expressionField;
|
|
};
|
|
void reloadView();
|
|
bool inputViewDidReceiveEvent(Ion::Events::Event event, bool shouldDuplicateLastCalculation);
|
|
bool inputViewDidFinishEditing(const char * text, Poincare::Layout layoutR);
|
|
bool inputViewDidAbortEditing(const char * text);
|
|
static constexpr int k_cacheBufferSize = Constant::MaxSerializedExpressionSize;
|
|
char m_cacheBuffer[k_cacheBufferSize];
|
|
HistoryController * m_historyController;
|
|
CalculationStore * m_calculationStore;
|
|
ContentView m_contentView;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|