From 23d49f768f742cabd49f2fd2a25f22cea1a23d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 14 Dec 2017 15:23:21 +0100 Subject: [PATCH] [expression_editor] Use ExpressionEditorView. Change-Id: Ib4080fd76f7040be6ad8ebfda10d2e2070c7381c --- apps/expression_editor/Makefile | 7 +++- apps/expression_editor/app.cpp | 2 +- apps/expression_editor/controller.cpp | 39 +++++++++---------- apps/expression_editor/controller.h | 21 ++-------- .../expression_view_with_cursor.cpp | 3 +- 5 files changed, 31 insertions(+), 41 deletions(-) diff --git a/apps/expression_editor/Makefile b/apps/expression_editor/Makefile index bdee10973..7edd46555 100644 --- a/apps/expression_editor/Makefile +++ b/apps/expression_editor/Makefile @@ -18,4 +18,9 @@ tests += $(addprefix apps/expression_editor/test/,\ dummy_test.cpp\ ) -test_objs += $(addprefix apps/expression_editor/, controller.o) +test_objs += $(addprefix apps/expression_editor/,\ + controller.o\ + expression_editor_view.o\ + expression_view_with_cursor.o\ + scrollable_expression_view_with_cursor.o\ +) diff --git a/apps/expression_editor/app.cpp b/apps/expression_editor/app.cpp index 9c7111f02..5ef392b9c 100644 --- a/apps/expression_editor/app.cpp +++ b/apps/expression_editor/app.cpp @@ -22,7 +22,7 @@ App::Descriptor * App::Snapshot::descriptor() { App::App(Container * container, Snapshot * snapshot) : ::App(container, snapshot, &m_controller), - m_controller(&m_modalViewController, snapshot->expressionAndLayout()) + m_controller(&m_modalViewController, snapshot->expressionAndLayout()->expressionLayout()) { } diff --git a/apps/expression_editor/controller.cpp b/apps/expression_editor/controller.cpp index a62313cdc..bbf0ee478 100644 --- a/apps/expression_editor/controller.cpp +++ b/apps/expression_editor/controller.cpp @@ -2,29 +2,26 @@ namespace ExpressionEditor { -Controller::ContentView::ContentView(ExpressionAndLayout * expressionAndLayout) : - SolidColorView(KDColorWhite), - m_expressionView() -{ - m_expressionView.setExpressionLayout(expressionAndLayout->expressionLayout()); -} - -void Controller::ContentView::layoutSubviews() { - m_expressionView.setFrame(KDRect( - k_margin, - k_margin, - bounds().width() - 2 * k_margin, - bounds().height() - 2 * k_margin)); -} - -KDSize Controller::ContentView::minimalSizeForOptimalDisplay() const { - return m_expressionView.minimalSizeForOptimalDisplay(); -} - -Controller::Controller(Responder * parentResponder, ExpressionAndLayout * expressionAndLayout) : +Controller::Controller(Responder * parentResponder, Poincare::ExpressionLayout * expressionLayout) : ViewController(parentResponder), - m_view(expressionAndLayout) + m_view(parentResponder, expressionLayout, &m_cursor) { + m_cursor.setPointedExpressionLayout(expressionLayout); +} + +void Controller::didBecomeFirstResponder() { + m_view.layoutSubviews(); + /* TODO We need the layout to be done in order to scroll to the cursor. We + * thus made ExpressionViewWithCursor's layoutSubviews() public, which is the + * solution used in ModalViewController for instance. A cleaner solution would + * be to split viewWillAppear into loadViewIfNeeded() and viewWillAppear(), in + * order to change App::didBecomeActive to: + * m_modalViewController.loadViewIfNeeded(); + * window->setContentView(view); + * m_modalViewController.viewWillAppear(); + * The scrolling could then be done in viewWillAppear(), without calling + * layoutSubviews() manually. */ + m_view.scrollableExpressionViewWithCursor()->scrollToCursor(); } bool Controller::handleEvent(Ion::Events::Event event) { diff --git a/apps/expression_editor/controller.h b/apps/expression_editor/controller.h index 56b268c99..f09630034 100644 --- a/apps/expression_editor/controller.h +++ b/apps/expression_editor/controller.h @@ -4,6 +4,7 @@ #include #include #include "expression_and_layout.h" +#include "expression_editor_view.h" extern "C" { #include } @@ -12,26 +13,12 @@ namespace ExpressionEditor { class Controller : public ViewController { public: - Controller(Responder * parentResponder, ExpressionAndLayout * expressionAndLayout); + Controller(Responder * parentResponder, Poincare::ExpressionLayout * expressionLayout); View * view() override { return &m_view; } + void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; - private: - class ContentView : public SolidColorView { - public: - ContentView(ExpressionAndLayout * expressionAndLayout); - int numberOfSubviews() const override { return 1; } - View * subviewAtIndex(int index) override { - assert(index == 0); - return &m_expressionView; - } - void layoutSubviews() override; - KDSize minimalSizeForOptimalDisplay() const override; - private: - constexpr static KDCoordinate k_margin = 10; - ExpressionView m_expressionView; - }; - ContentView m_view; + ExpressionEditorView m_view; Poincare::ExpressionLayoutCursor m_cursor; }; diff --git a/apps/expression_editor/expression_view_with_cursor.cpp b/apps/expression_editor/expression_view_with_cursor.cpp index 66f1b8d6e..0c83c41ce 100644 --- a/apps/expression_editor/expression_view_with_cursor.cpp +++ b/apps/expression_editor/expression_view_with_cursor.cpp @@ -20,7 +20,8 @@ KDRect ExpressionViewWithCursor::cursorRect() { } KDSize ExpressionViewWithCursor::minimalSizeForOptimalDisplay() const { - return m_expressionView.minimalSizeForOptimalDisplay(); + KDSize expressionViewSize = m_expressionView.minimalSizeForOptimalDisplay(); + return KDSize(expressionViewSize.width()+1, m_expressionView.minimalSizeForOptimalDisplay().height()); // +1 for the cursor } View * ExpressionViewWithCursor::subviewAtIndex(int index) {