diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index b02f63211..cd7702e93 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -9,7 +9,7 @@ using namespace Poincare; namespace Calculation { -EditExpressionController::ContentView::ContentView(Responder * parentResponder, TableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate) : +EditExpressionController::ContentView::ContentView(Responder * parentResponder, CalculationSelectableTableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate) : View(), m_mainView(subview), m_expressionField(parentResponder, inputEventHandlerDelegate, textFieldDelegate, layoutFieldDelegate) @@ -42,7 +42,7 @@ EditExpressionController::EditExpressionController(Responder * parentResponder, ViewController(parentResponder), m_historyController(historyController), m_calculationStore(calculationStore), - m_contentView(this, (TableView *)m_historyController->view(), inputEventHandlerDelegate, this, this) + m_contentView(this, static_cast(m_historyController->view()), inputEventHandlerDelegate, this, this) { m_cacheBuffer[0] = 0; } @@ -53,8 +53,7 @@ void EditExpressionController::insertTextBody(const char * text) { } void EditExpressionController::didBecomeFirstResponder() { - int lastRow = m_calculationStore->numberOfCalculations() > 0 ? m_calculationStore->numberOfCalculations()-1 : 0; - m_contentView.mainView()->scrollToCell(0, lastRow); + m_contentView.mainView()->scrollToBottom(); m_contentView.expressionField()->setEditing(true, false); Container::activeApp()->setFirstResponder(m_contentView.expressionField()); } diff --git a/apps/calculation/edit_expression_controller.h b/apps/calculation/edit_expression_controller.h index fe2d4c44c..eee1c4033 100644 --- a/apps/calculation/edit_expression_controller.h +++ b/apps/calculation/edit_expression_controller.h @@ -8,6 +8,7 @@ #include "../shared/layout_field_delegate.h" #include "history_controller.h" #include "calculation_store.h" +#include "selectable_table_view.h" namespace Calculation { @@ -34,15 +35,15 @@ public: private: class ContentView : public View { public: - ContentView(Responder * parentResponder, TableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate); + ContentView(Responder * parentResponder, CalculationSelectableTableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate); void reload(); - TableView * mainView() { return m_mainView; } + 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; - TableView * m_mainView; + CalculationSelectableTableView * m_mainView; ExpressionField m_expressionField; }; void reloadView(); diff --git a/apps/calculation/selectable_table_view.cpp b/apps/calculation/selectable_table_view.cpp index de77af0f7..9020cab1c 100644 --- a/apps/calculation/selectable_table_view.cpp +++ b/apps/calculation/selectable_table_view.cpp @@ -12,6 +12,12 @@ CalculationSelectableTableView::CalculationSelectableTableView(Responder * paren setDecoratorType(ScrollView::Decorator::Type::None); } +void CalculationSelectableTableView::scrollToBottom() { + KDCoordinate contentOffsetX = contentOffset().x(); + KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling(); + setContentOffset(KDPoint(contentOffsetX, contentOffsetY)); +} + void CalculationSelectableTableView::scrollToCell(int i, int j) { if (m_contentView.bounds().height() < bounds().height()) { setTopMargin(bounds().height() - m_contentView.bounds().height()); @@ -21,9 +27,8 @@ void CalculationSelectableTableView::scrollToCell(int i, int j) { ::SelectableTableView::scrollToCell(i, j); ScrollView::layoutSubviews(); if (m_contentView.bounds().height() - contentOffset().y() < bounds().height()) { - KDCoordinate contentOffsetX = contentOffset().x(); - KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling(); - setContentOffset(KDPoint(contentOffsetX, contentOffsetY)); + // Avoid empty space at the end of the table + scrollToBottom(); } } diff --git a/apps/calculation/selectable_table_view.h b/apps/calculation/selectable_table_view.h index 07823d9f1..d1740ab78 100644 --- a/apps/calculation/selectable_table_view.h +++ b/apps/calculation/selectable_table_view.h @@ -9,6 +9,7 @@ class CalculationSelectableTableView : public ::SelectableTableView { public: CalculationSelectableTableView(Responder * parentResponder, TableViewDataSource * dataSource, SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate = nullptr); + void scrollToBottom(); void scrollToCell(int i, int j) override; void scrollToSubviewOfTypeOfCellAtLocation(HistoryViewCellDataSource::SubviewType subviewType, int i, int j); };