From b36e5dc67c17d541609f527ad0a41e3330b7284a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 1 Mar 2017 16:02:27 +0100 Subject: [PATCH] [escher] Generelize header view controller to button row controller and use it to add two buttons: "tracer" "afficher valeurs" Change-Id: I8ee9afec9e381de367133e6b3f5ceb738b9790ab --- apps/graph/app.cpp | 9 +- apps/graph/app.h | 7 +- apps/graph/graph/graph_controller.cpp | 2 +- apps/graph/graph/graph_controller.h | 2 +- apps/graph/list/list_controller.cpp | 4 +- apps/graph/list/list_controller.h | 2 +- apps/graph/values/values_controller.cpp | 2 +- apps/graph/values/values_controller.h | 2 +- apps/regression/app.cpp | 6 +- apps/regression/app.h | 6 +- apps/regression/calculation_controller.cpp | 4 +- apps/regression/calculation_controller.h | 4 +- apps/regression/graph_controller.cpp | 4 +- apps/regression/graph_controller.h | 2 +- apps/regression/store_controller.cpp | 2 +- apps/regression/store_controller.h | 2 +- apps/sequence/app.cpp | 9 +- apps/sequence/app.h | 7 +- apps/sequence/graph/graph_controller.cpp | 2 +- apps/sequence/graph/graph_controller.h | 2 +- apps/sequence/list/list_controller.cpp | 4 +- apps/sequence/list/list_controller.h | 2 +- apps/sequence/values/values_controller.cpp | 2 +- apps/sequence/values/values_controller.h | 2 +- apps/shared/function_graph_controller.cpp | 2 +- apps/shared/function_graph_controller.h | 2 +- .../interactive_curve_view_controller.cpp | 22 +- .../interactive_curve_view_controller.h | 8 +- apps/shared/list_controller.cpp | 43 +++- apps/shared/list_controller.h | 8 +- apps/shared/store_controller.cpp | 4 +- apps/shared/store_controller.h | 4 +- apps/shared/values_controller.cpp | 26 +- apps/shared/values_controller.h | 8 +- apps/statistics/app.cpp | 8 +- apps/statistics/app.h | 8 +- apps/statistics/box_controller.cpp | 4 +- apps/statistics/box_controller.h | 4 +- apps/statistics/calculation_controller.cpp | 4 +- apps/statistics/calculation_controller.h | 4 +- apps/statistics/histogram_controller.cpp | 20 +- apps/statistics/histogram_controller.h | 8 +- apps/statistics/store_controller.cpp | 2 +- apps/statistics/store_controller.h | 2 +- escher/Makefile | 3 +- escher/include/escher.h | 3 +- escher/include/escher/button.h | 1 - escher/include/escher/button_row_controller.h | 71 ++++++ .../include/escher/header_view_controller.h | 46 ---- escher/include/escher/header_view_delegate.h | 18 -- escher/src/button.cpp | 4 - escher/src/button_row_controller.cpp | 226 ++++++++++++++++++ escher/src/header_view_controller.cpp | 141 ----------- escher/src/header_view_delegate.cpp | 20 -- 54 files changed, 460 insertions(+), 354 deletions(-) create mode 100644 escher/include/escher/button_row_controller.h delete mode 100644 escher/include/escher/header_view_controller.h delete mode 100644 escher/include/escher/header_view_delegate.h create mode 100644 escher/src/button_row_controller.cpp delete mode 100644 escher/src/header_view_controller.cpp delete mode 100644 escher/src/header_view_delegate.cpp diff --git a/apps/graph/app.cpp b/apps/graph/app.cpp index 0892f92d5..772bf86d6 100644 --- a/apps/graph/app.cpp +++ b/apps/graph/app.cpp @@ -10,16 +10,17 @@ App::App(Container * container, Context * context) : TextFieldDelegateApp(container, &m_inputViewController, "Fonctions", "FONCTIONS", ImageStore::GraphIcon), m_functionStore(CartesianFunctionStore()), m_xContext(VariableContext('x', context)), - m_listController(ListController(&m_listHeader, &m_functionStore, &m_listHeader)), - m_listHeader(HeaderViewController(&m_listStackViewController, &m_listController, &m_listController)), + m_listController(ListController(&m_listFooter, &m_functionStore, &m_listHeader, &m_listFooter)), + m_listFooter(ButtonRowController(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey)), + m_listHeader(ButtonRowController(&m_listStackViewController, &m_listFooter, &m_listController)), m_listStackViewController(StackViewController(&m_tabViewController, &m_listHeader)), m_graphController(GraphController(&m_graphAlternateEmptyViewController, &m_functionStore, &m_graphHeader)), m_graphAlternateEmptyViewController(AlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController)), - m_graphHeader(HeaderViewController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), + m_graphHeader(ButtonRowController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), m_graphStackViewController(StackViewController(&m_tabViewController, &m_graphHeader)), m_valuesController(&m_valuesAlternateEmptyViewController, &m_functionStore, &m_valuesHeader), m_valuesAlternateEmptyViewController(AlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController)), - m_valuesHeader(HeaderViewController(&m_valuesStackViewController, &m_valuesAlternateEmptyViewController, &m_valuesController)), + m_valuesHeader(ButtonRowController(&m_valuesStackViewController, &m_valuesAlternateEmptyViewController, &m_valuesController)), m_valuesStackViewController(StackViewController(&m_tabViewController, &m_valuesHeader)), m_tabViewController(&m_inputViewController, &m_listStackViewController, &m_graphStackViewController, &m_valuesStackViewController), m_inputViewController(&m_modalViewController, &m_tabViewController, this) diff --git a/apps/graph/app.h b/apps/graph/app.h index ebbb14ea8..ea8f037bf 100644 --- a/apps/graph/app.h +++ b/apps/graph/app.h @@ -24,15 +24,16 @@ private: CartesianFunctionStore m_functionStore; Poincare::VariableContext m_xContext; ListController m_listController; - HeaderViewController m_listHeader; + ButtonRowController m_listFooter; + ButtonRowController m_listHeader; StackViewController m_listStackViewController; GraphController m_graphController; AlternateEmptyViewController m_graphAlternateEmptyViewController; - HeaderViewController m_graphHeader; + ButtonRowController m_graphHeader; StackViewController m_graphStackViewController; ValuesController m_valuesController; AlternateEmptyViewController m_valuesAlternateEmptyViewController; - HeaderViewController m_valuesHeader; + ButtonRowController m_valuesHeader; StackViewController m_valuesStackViewController; TabViewController m_tabViewController; InputViewController m_inputViewController; diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index 3e542295f..01e730655 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -5,7 +5,7 @@ using namespace Poincare; namespace Graph { -GraphController::GraphController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header) : +GraphController::GraphController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header) : FunctionGraphController(parentResponder, header, &m_graphRange, &m_view), m_bannerView(BannerView()), m_view(GraphView(functionStore, &m_graphRange, &m_cursor, &m_bannerView, &m_cursorView)), diff --git a/apps/graph/graph/graph_controller.h b/apps/graph/graph/graph_controller.h index dbe7c3d85..93cf8192a 100644 --- a/apps/graph/graph/graph_controller.h +++ b/apps/graph/graph/graph_controller.h @@ -11,7 +11,7 @@ namespace Graph { class GraphController : public Shared::FunctionGraphController { public: - GraphController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header); + GraphController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header); const char * emptyMessage() override; private: BannerView * bannerView() override; diff --git a/apps/graph/list/list_controller.cpp b/apps/graph/list/list_controller.cpp index 597b32de3..cf4600181 100644 --- a/apps/graph/list/list_controller.cpp +++ b/apps/graph/list/list_controller.cpp @@ -6,8 +6,8 @@ using namespace Shared; namespace Graph { -ListController::ListController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header) : - Shared::ListController(parentResponder, functionStore, header, "Ajouter une fonction"), +ListController::ListController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header, ButtonRowController * footer) : + Shared::ListController(parentResponder, functionStore, header, footer, "Ajouter une fonction"), m_functionTitleCells{FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), FunctionTitleCell(FunctionTitleCell::Orientation::VerticalIndicator)}, m_parameterController(ListParameterController(this, functionStore)) diff --git a/apps/graph/list/list_controller.h b/apps/graph/list/list_controller.h index ea90d3e22..c6d6955a4 100644 --- a/apps/graph/list/list_controller.h +++ b/apps/graph/list/list_controller.h @@ -13,7 +13,7 @@ namespace Graph { class ListController : public Shared::ListController { public: - ListController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header); + ListController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header, ButtonRowController * footer); const char * title() const override; int numberOfRows() override; KDCoordinate rowHeight(int j) override; diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 7fd051ee9..cea06944c 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -5,7 +5,7 @@ using namespace Shared; namespace Graph { -ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header) : +ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header) : Shared::ValuesController(parentResponder, header, 'x'), m_functionTitleCells{FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small), FunctionTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator, KDText::FontSize::Small)}, diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index ae410e8cf..e564da59d 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -11,7 +11,7 @@ namespace Graph { class ValuesController : public Shared::ValuesController { public: - ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, HeaderViewController * header); + ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, ButtonRowController * header); bool handleEvent(Ion::Events::Event event) override; int numberOfColumns() override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; diff --git a/apps/regression/app.cpp b/apps/regression/app.cpp index cd6101fcf..aa8fd0181 100644 --- a/apps/regression/app.cpp +++ b/apps/regression/app.cpp @@ -10,13 +10,13 @@ App::App(Container * container) : m_store(), m_calculationController(CalculationController(&m_calculationAlternateEmptyViewController, &m_calculationHeader, &m_store)), m_calculationAlternateEmptyViewController(AlternateEmptyViewController(&m_calculationHeader, &m_calculationController, &m_calculationController)), - m_calculationHeader(HeaderViewController(&m_tabViewController, &m_calculationAlternateEmptyViewController, &m_calculationController)), + m_calculationHeader(ButtonRowController(&m_tabViewController, &m_calculationAlternateEmptyViewController, &m_calculationController)), m_graphController(GraphController(&m_graphAlternateEmptyViewController, &m_graphHeader, &m_store)), m_graphAlternateEmptyViewController(AlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController)), - m_graphHeader(HeaderViewController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), + m_graphHeader(ButtonRowController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), m_graphStackViewController(StackViewController(&m_tabViewController, &m_graphHeader)), m_storeController(StoreController(&m_storeHeader, &m_store, &m_storeHeader)), - m_storeHeader(HeaderViewController(&m_storeStackViewController, &m_storeController, &m_storeController)), + m_storeHeader(ButtonRowController(&m_storeStackViewController, &m_storeController, &m_storeController)), m_storeStackViewController(StackViewController(&m_tabViewController, &m_storeHeader)), m_tabViewController(&m_modalViewController, &m_storeStackViewController, &m_graphStackViewController, &m_calculationHeader) { diff --git a/apps/regression/app.h b/apps/regression/app.h index 7db5c00ef..a477739da 100644 --- a/apps/regression/app.h +++ b/apps/regression/app.h @@ -17,13 +17,13 @@ private: Store m_store; CalculationController m_calculationController; AlternateEmptyViewController m_calculationAlternateEmptyViewController; - HeaderViewController m_calculationHeader; + ButtonRowController m_calculationHeader; GraphController m_graphController; AlternateEmptyViewController m_graphAlternateEmptyViewController; - HeaderViewController m_graphHeader; + ButtonRowController m_graphHeader; StackViewController m_graphStackViewController; StoreController m_storeController; - HeaderViewController m_storeHeader; + ButtonRowController m_storeHeader; StackViewController m_storeStackViewController; TabViewController m_tabViewController; }; diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 8789eb043..6fa7b0cdb 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -8,9 +8,9 @@ using namespace Poincare; namespace Regression { -CalculationController::CalculationController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store) : +CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) : ViewController(parentResponder), - HeaderViewDelegate(headerViewController), + ButtonRowDelegate(header, nullptr), m_titleCells{EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small)}, m_columnTitleCell(EvenOddDoubleBufferTextCell(&m_selectableTableView)), diff --git a/apps/regression/calculation_controller.h b/apps/regression/calculation_controller.h index 66840c37d..ae402e21e 100644 --- a/apps/regression/calculation_controller.h +++ b/apps/regression/calculation_controller.h @@ -7,10 +7,10 @@ namespace Regression { -class CalculationController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate, public TableViewDataSource, public SelectableTableViewDelegate { +class CalculationController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate, public TableViewDataSource, public SelectableTableViewDelegate { public: - CalculationController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store); + CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store); const char * title() const override; View * view() override; bool handleEvent(Ion::Events::Event event) override; diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index 4ccb06257..ea5a44bd1 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -6,8 +6,8 @@ using namespace Shared; namespace Regression { -GraphController::GraphController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store) : - InteractiveCurveViewController(parentResponder, headerViewController, store, &m_view), +GraphController::GraphController(Responder * parentResponder, ButtonRowController * header, Store * store) : + InteractiveCurveViewController(parentResponder, header, store, &m_view), m_bannerView(BannerView()), m_view(GraphView(store, &m_cursor, &m_bannerView, &m_cursorView)), m_store(store), diff --git a/apps/regression/graph_controller.h b/apps/regression/graph_controller.h index 1d6177e08..8d612e0d7 100644 --- a/apps/regression/graph_controller.h +++ b/apps/regression/graph_controller.h @@ -14,7 +14,7 @@ namespace Regression { class GraphController : public Shared::InteractiveCurveViewController { public: - GraphController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store); + GraphController(Responder * parentResponder, ButtonRowController * header, Store * store); ViewController * initialisationParameterController() override; bool isEmpty() const override; const char * emptyMessage() override; diff --git a/apps/regression/store_controller.cpp b/apps/regression/store_controller.cpp index fee346a6d..64ce0087a 100644 --- a/apps/regression/store_controller.cpp +++ b/apps/regression/store_controller.cpp @@ -11,7 +11,7 @@ using namespace Shared; namespace Regression { -StoreController::StoreController(Responder * parentResponder, Store * store, HeaderViewController * header) : +StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) : Shared::StoreController(parentResponder, store, header), m_titleCells{EvenOddExpressionCell(0.5f, 0.5f), EvenOddExpressionCell(0.5f, 0.5f)} { diff --git a/apps/regression/store_controller.h b/apps/regression/store_controller.h index dc6aa9f2a..9e27bad66 100644 --- a/apps/regression/store_controller.h +++ b/apps/regression/store_controller.h @@ -9,7 +9,7 @@ namespace Regression { class StoreController : public Shared::StoreController { public: - StoreController(Responder * parentResponder, Store * store, HeaderViewController * header); + StoreController(Responder * parentResponder, Store * store, ButtonRowController * header); void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; private: HighlightCell * titleCells(int index) override; diff --git a/apps/sequence/app.cpp b/apps/sequence/app.cpp index c98f6e2f8..9287fe8ee 100644 --- a/apps/sequence/app.cpp +++ b/apps/sequence/app.cpp @@ -9,16 +9,17 @@ App::App(Container * container, Context * context) : TextFieldDelegateApp(container, &m_inputViewController, "Suites", "SUITES", ImageStore::SequenceIcon), m_sequenceStore(SequenceStore()), m_nContext(LocalContext(context)), - m_listController(&m_listHeader, &m_sequenceStore, &m_listHeader), - m_listHeader(HeaderViewController(nullptr, &m_listController, &m_listController)), + m_listController(&m_listFooter, &m_sequenceStore, &m_listHeader, &m_listFooter), + m_listFooter(ButtonRowController(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey)), + m_listHeader(ButtonRowController(nullptr, &m_listFooter, &m_listController)), m_listStackViewController(StackViewController(&m_tabViewController, &m_listHeader)), m_graphController(&m_graphAlternateEmptyViewController, &m_sequenceStore, &m_graphHeader), m_graphAlternateEmptyViewController(AlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController)), - m_graphHeader(HeaderViewController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), + m_graphHeader(ButtonRowController(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController)), m_graphStackViewController(StackViewController(&m_tabViewController, &m_graphHeader)), m_valuesController(&m_valuesAlternateEmptyViewController, &m_sequenceStore, &m_valuesHeader), m_valuesAlternateEmptyViewController(AlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController)), - m_valuesHeader(HeaderViewController(nullptr, &m_valuesAlternateEmptyViewController, &m_valuesController)), + m_valuesHeader(ButtonRowController(nullptr, &m_valuesAlternateEmptyViewController, &m_valuesController)), m_valuesStackViewController(StackViewController(&m_tabViewController, &m_valuesHeader)), m_tabViewController(&m_inputViewController, &m_listStackViewController, &m_graphStackViewController, &m_valuesStackViewController), m_inputViewController(&m_modalViewController, &m_tabViewController, this) diff --git a/apps/sequence/app.h b/apps/sequence/app.h index e03060650..3da374b10 100644 --- a/apps/sequence/app.h +++ b/apps/sequence/app.h @@ -22,15 +22,16 @@ private: SequenceStore m_sequenceStore; LocalContext m_nContext; ListController m_listController; - HeaderViewController m_listHeader; + ButtonRowController m_listFooter; + ButtonRowController m_listHeader; StackViewController m_listStackViewController; GraphController m_graphController; AlternateEmptyViewController m_graphAlternateEmptyViewController; - HeaderViewController m_graphHeader; + ButtonRowController m_graphHeader; StackViewController m_graphStackViewController; ValuesController m_valuesController; AlternateEmptyViewController m_valuesAlternateEmptyViewController; - HeaderViewController m_valuesHeader; + ButtonRowController m_valuesHeader; StackViewController m_valuesStackViewController; TabViewController m_tabViewController; InputViewController m_inputViewController; diff --git a/apps/sequence/graph/graph_controller.cpp b/apps/sequence/graph/graph_controller.cpp index a9a5c4641..23d5e654b 100644 --- a/apps/sequence/graph/graph_controller.cpp +++ b/apps/sequence/graph/graph_controller.cpp @@ -4,7 +4,7 @@ using namespace Shared; namespace Sequence { -GraphController::GraphController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header) : +GraphController::GraphController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header) : FunctionGraphController(parentResponder, header, &m_graphRange, &m_view), m_bannerView(BannerView()), m_view(GraphView(sequenceStore, &m_graphRange, &m_cursor, &m_bannerView, &m_cursorView)), diff --git a/apps/sequence/graph/graph_controller.h b/apps/sequence/graph/graph_controller.h index a795d9f8e..8e7143a8d 100644 --- a/apps/sequence/graph/graph_controller.h +++ b/apps/sequence/graph/graph_controller.h @@ -13,7 +13,7 @@ namespace Sequence { class GraphController : public Shared::FunctionGraphController { public: - GraphController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header); + GraphController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header); void viewWillAppear() override; const char * emptyMessage() override; TermSumController * termSumController(); diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index bf83b03c5..5360a5fd4 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -7,8 +7,8 @@ using namespace Poincare; namespace Sequence { -ListController::ListController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header) : - Shared::ListController(parentResponder, sequenceStore, header, "Ajouter une suite"), +ListController::ListController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer) : + Shared::ListController(parentResponder, sequenceStore, header, footer, "Ajouter une suite"), m_sequenceStore(sequenceStore), m_sequenceTitleCells{SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::VerticalIndicator), diff --git a/apps/sequence/list/list_controller.h b/apps/sequence/list/list_controller.h index cb54bfd2f..bf0dd26af 100644 --- a/apps/sequence/list/list_controller.h +++ b/apps/sequence/list/list_controller.h @@ -16,7 +16,7 @@ namespace Sequence { class ListController : public Shared::ListController, public Shared::TextFieldDelegate { public: - ListController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header); + ListController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header, ButtonRowController * footer); const char * title() const override; int numberOfRows() override; virtual KDCoordinate rowHeight(int j) override; diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index 010c69040..8ebee56db 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -5,7 +5,7 @@ using namespace Shared; namespace Sequence { -ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header) : +ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header) : Shared::ValuesController(parentResponder, header, 'n'), m_sequenceTitleCells{SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator), SequenceTitleCell(FunctionTitleCell::Orientation::HorizontalIndicator)}, diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index 8936856fb..972a45e91 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -9,7 +9,7 @@ namespace Sequence { class ValuesController : public Shared::ValuesController { public: - ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, HeaderViewController * header); + ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, ButtonRowController * header); int numberOfColumns() override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; const char * emptyMessage() override; diff --git a/apps/shared/function_graph_controller.cpp b/apps/shared/function_graph_controller.cpp index f06b64fbf..5754ba48f 100644 --- a/apps/shared/function_graph_controller.cpp +++ b/apps/shared/function_graph_controller.cpp @@ -8,7 +8,7 @@ using namespace Poincare; namespace Shared { -FunctionGraphController::FunctionGraphController(Responder * parentResponder, HeaderViewController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView) : +FunctionGraphController::FunctionGraphController(Responder * parentResponder, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView) : InteractiveCurveViewController(parentResponder, header, interactiveRange, curveView), m_indexFunctionSelectedByCursor(0), m_initialisationParameterController(InitialisationParameterController(this, interactiveRange)) diff --git a/apps/shared/function_graph_controller.h b/apps/shared/function_graph_controller.h index f13e4ea7b..c22da9b49 100644 --- a/apps/shared/function_graph_controller.h +++ b/apps/shared/function_graph_controller.h @@ -12,7 +12,7 @@ namespace Shared { class FunctionGraphController : public InteractiveCurveViewController, public InteractiveCurveViewRangeDelegate { public: - FunctionGraphController(Responder * parentResponder, HeaderViewController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView); + FunctionGraphController(Responder * parentResponder, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView); bool isEmpty() const override; ViewController * initialisationParameterController() override; void viewWillAppear() override; diff --git a/apps/shared/interactive_curve_view_controller.cpp b/apps/shared/interactive_curve_view_controller.cpp index 75009e926..88294df40 100644 --- a/apps/shared/interactive_curve_view_controller.cpp +++ b/apps/shared/interactive_curve_view_controller.cpp @@ -7,9 +7,9 @@ using namespace Poincare; namespace Shared { -InteractiveCurveViewController::InteractiveCurveViewController(Responder * parentResponder, HeaderViewController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView) : +InteractiveCurveViewController::InteractiveCurveViewController(Responder * parentResponder, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView) : ViewController(parentResponder), - HeaderViewDelegate(header), + ButtonRowDelegate(header, nullptr), m_cursor(), m_cursorView(CursorView()), m_rangeParameterController(RangeParameterController(this, interactiveRange)), @@ -43,7 +43,7 @@ View * InteractiveCurveViewController::view() { bool InteractiveCurveViewController::handleEvent(Ion::Events::Event event) { if (!curveView()->isMainViewSelected()) { if (event == Ion::Events::Down) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); curveView()->selectMainView(true); app()->setFirstResponder(this); reloadBannerView(); @@ -51,7 +51,7 @@ bool InteractiveCurveViewController::handleEvent(Ion::Events::Event event) { return true; } if (event == Ion::Events::Up) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); app()->setFirstResponder(tabController()); return true; } @@ -89,7 +89,7 @@ bool InteractiveCurveViewController::handleEvent(Ion::Events::Event event) { return false; } curveView()->selectMainView(false); - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); return true; } if (event == Ion::Events::OK) { @@ -118,7 +118,7 @@ void InteractiveCurveViewController::didBecomeFirstResponder() { curveView()->reload(); } if (!curveView()->isMainViewSelected()) { - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); } } @@ -130,16 +130,16 @@ ViewController * InteractiveCurveViewController::zoomParameterController() { return &m_zoomParameterController; } -int InteractiveCurveViewController::numberOfButtons() const { +int InteractiveCurveViewController::numberOfButtons(ButtonRowController::Position) const { if (isEmpty()) { return 0; } return 3; } -Button * InteractiveCurveViewController::buttonAtIndex(int index) { - Button * buttons[3] = {&m_rangeButton, &m_zoomButton, &m_defaultInitialisationButton}; - return buttons[index]; +Button * InteractiveCurveViewController::buttonAtIndex(int index, ButtonRowController::Position position) const { + const Button * buttons[3] = {&m_rangeButton, &m_zoomButton, &m_defaultInitialisationButton}; + return (Button *)buttons[index]; } Responder * InteractiveCurveViewController::defaultController() { @@ -148,7 +148,7 @@ Responder * InteractiveCurveViewController::defaultController() { void InteractiveCurveViewController::viewWillAppear() { curveView()->selectMainView(true); - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); reloadBannerView(); curveView()->reload(); curveView()->setOkView(&m_okView); diff --git a/apps/shared/interactive_curve_view_controller.h b/apps/shared/interactive_curve_view_controller.h index f018ec1b8..8f866db6b 100644 --- a/apps/shared/interactive_curve_view_controller.h +++ b/apps/shared/interactive_curve_view_controller.h @@ -12,9 +12,9 @@ namespace Shared { -class InteractiveCurveViewController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class InteractiveCurveViewController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - InteractiveCurveViewController(Responder * parentResponder, HeaderViewController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView); + InteractiveCurveViewController(Responder * parentResponder, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView); View * view() override; const char * title() const override; bool handleEvent(Ion::Events::Event event) override; @@ -24,8 +24,8 @@ public: ViewController * zoomParameterController(); virtual ViewController * initialisationParameterController() = 0; - int numberOfButtons() const override; - Button * buttonAtIndex(int index) override; + int numberOfButtons(ButtonRowController::Position position) const override; + Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; Responder * defaultController() override; diff --git a/apps/shared/list_controller.cpp b/apps/shared/list_controller.cpp index e9bd10541..ccbe15fdb 100644 --- a/apps/shared/list_controller.cpp +++ b/apps/shared/list_controller.cpp @@ -3,12 +3,16 @@ namespace Shared { -ListController::ListController(Responder * parentResponder, FunctionStore * functionStore, HeaderViewController * header, const char * text) : +ListController::ListController(Responder * parentResponder, FunctionStore * functionStore, ButtonRowController * header, ButtonRowController * footer, const char * text) : ViewController(parentResponder), - HeaderViewDelegate(header), + ButtonRowDelegate(header, footer), m_selectableTableView(SelectableTableView(this, this, 0, 0, 0, 0, nullptr, false, true)), m_functionStore(functionStore), - m_addNewFunction(text) + m_addNewFunction(text), + m_plotButton(this, "Tracer", Invocation([](void * context, void * sender) { + }, this), KDText::FontSize::Large), + m_valuesButton(this, "Afficher les valeurs", Invocation([](void * context, void * sender) { + }, this), KDText::FontSize::Large) { } @@ -121,6 +125,21 @@ void ListController::willDisplayCellAtLocation(HighlightCell * cell, int i, int myCell->setHighlighted(i == m_selectableTableView.selectedColumn() && j == m_selectableTableView.selectedRow()); } +int ListController::numberOfButtons(ButtonRowController::Position position) const { + if (position == ButtonRowController::Position::Bottom) { + return 2; + } + return 0; +} + +Button * ListController::buttonAtIndex(int index, ButtonRowController::Position position) const { + if (position == ButtonRowController::Position::Top) { + return nullptr; + } + const Button * buttons[2] = {&m_plotButton, &m_valuesButton}; + return (Button *)buttons[index]; +} + void ListController::didBecomeFirstResponder() { if (m_selectableTableView.selectedRow() == -1) { m_selectableTableView.selectCellAtLocation(1, 0); @@ -135,11 +154,25 @@ void ListController::didBecomeFirstResponder() { bool ListController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { + if (m_selectableTableView.selectedRow() == -1) { + footer()->setSelectedButton(-1); + m_selectableTableView.selectCellAtLocation(1, numberOfRows()-1); + app()->setFirstResponder(&m_selectableTableView); + return true; + } m_selectableTableView.deselectTable(); assert(m_selectableTableView.selectedRow() == -1); app()->setFirstResponder(tabController()); return true; } + if (event == Ion::Events::Down) { + if (m_selectableTableView.selectedRow() == -1) { + return false; + } + m_selectableTableView.deselectTable(); + footer()->setSelectedButton(0); + return true; + } if (event == Ion::Events::OK) { switch (m_selectableTableView.selectedColumn()) { case 0: @@ -188,7 +221,7 @@ void ListController::viewWillAppear() { } StackViewController * ListController::stackController() const{ - return (StackViewController *)(parentResponder()->parentResponder()); + return (StackViewController *)(parentResponder()->parentResponder()->parentResponder()); } void ListController::configureFunction(Shared::Function * function) { @@ -203,7 +236,7 @@ void ListController::reinitExpression(Function * function) { } Responder * ListController::tabController() const{ - return (parentResponder()->parentResponder()->parentResponder()); + return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); } int ListController::functionIndexForRow(int j) { diff --git a/apps/shared/list_controller.h b/apps/shared/list_controller.h index d79fdda5d..d2d53c26b 100644 --- a/apps/shared/list_controller.h +++ b/apps/shared/list_controller.h @@ -8,9 +8,9 @@ namespace Shared { -class ListController : public ViewController, public HeaderViewDelegate, public TableViewDataSource { +class ListController : public ViewController, public ButtonRowDelegate, public TableViewDataSource { public: - ListController(Responder * parentResponder, FunctionStore * functionStore, HeaderViewController * header, const char * text); + ListController(Responder * parentResponder, FunctionStore * functionStore, ButtonRowController * header, ButtonRowController * footer, const char * text); View * view() override; int numberOfColumns() override; KDCoordinate columnWidth(int i) override; @@ -22,6 +22,8 @@ public: HighlightCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; + int numberOfButtons(ButtonRowController::Position position) const override; + Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; void didBecomeFirstResponder() override; bool handleEvent(Ion::Events::Event event) override; void viewWillAppear() override; @@ -46,6 +48,8 @@ private: virtual void willDisplayExpressionCellAtIndex(HighlightCell * cell, int j) = 0; EvenOddCell m_emptyCell; NewFunctionCell m_addNewFunction; + Button m_plotButton; + Button m_valuesButton; }; } diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 619874352..46402bbe3 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -7,9 +7,9 @@ using namespace Poincare; namespace Shared { -StoreController::StoreController(Responder * parentResponder, FloatPairStore * store, HeaderViewController * header) : +StoreController::StoreController(Responder * parentResponder, FloatPairStore * store, ButtonRowController * header) : EditableCellTableViewController(parentResponder, Metric::CommonTopMargin, Metric::CommonRightMargin, Metric::CommonBottomMargin, Metric::CommonLeftMargin), - HeaderViewDelegate(header), + ButtonRowDelegate(header, nullptr), 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), diff --git a/apps/shared/store_controller.h b/apps/shared/store_controller.h index 91222314d..b5717c95c 100644 --- a/apps/shared/store_controller.h +++ b/apps/shared/store_controller.h @@ -8,9 +8,9 @@ namespace Shared { -class StoreController : public EditableCellTableViewController, public HeaderViewDelegate { +class StoreController : public EditableCellTableViewController, public ButtonRowDelegate { public: - StoreController(Responder * parentResponder, FloatPairStore * store, HeaderViewController * header); + StoreController(Responder * parentResponder, FloatPairStore * store, ButtonRowController * header); const char * title() const override; int numberOfColumns() override; KDCoordinate columnWidth(int i) override; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 8a9e481de..31d7c0df1 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -8,9 +8,9 @@ using namespace Poincare; namespace Shared { -ValuesController::ValuesController(Responder * parentResponder, HeaderViewController * header, char symbol) : +ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, char symbol) : EditableCellTableViewController(parentResponder, k_topMargin, k_rightMargin, k_bottomMargin, k_leftMargin), - HeaderViewDelegate(header), + ButtonRowDelegate(header, nullptr), m_abscissaTitleCell(EvenOddPointerTextCell(KDText::FontSize::Small)), m_abscissaCells{EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), EvenOddEditableTextCell(&m_selectableTableView, this, m_draftTextBuffer, KDText::FontSize::Small), @@ -39,7 +39,7 @@ Interval * ValuesController::interval() { bool ValuesController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Down) { if (m_selectableTableView.selectedRow() == -1) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); m_selectableTableView.selectCellAtLocation(0,0); app()->setFirstResponder(&m_selectableTableView); return true; @@ -49,12 +49,12 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { if (m_selectableTableView.selectedRow() == -1) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); app()->setFirstResponder(tabController()); return true; } m_selectableTableView.deselectTable(); - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); return true; } if (event == Ion::Events::Backspace && m_selectableTableView.selectedRow() > 0 && @@ -65,7 +65,7 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { } if (event == Ion::Events::OK) { if (m_selectableTableView.selectedRow() == -1) { - return headerViewController()->handleEvent(event); + return header()->handleEvent(event); } if (m_selectableTableView.selectedRow() == 0) { if (m_selectableTableView.selectedColumn() == 0) { @@ -78,7 +78,7 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { return false; } if (m_selectableTableView.selectedRow() == -1) { - return headerViewController()->handleEvent(event); + return header()->handleEvent(event); } return false; } @@ -87,9 +87,9 @@ void ValuesController::didBecomeFirstResponder() { EditableCellTableViewController::didBecomeFirstResponder(); if (m_selectableTableView.selectedRow() == -1) { m_selectableTableView.deselectTable(); - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); } else { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); } } @@ -97,15 +97,15 @@ ViewController * ValuesController::intervalParameterController() { return &m_intervalParameterController; } -int ValuesController::numberOfButtons() const { +int ValuesController::numberOfButtons(ButtonRowController::Position) const { if (isEmpty()) { return 0; } return 1; } -Button * ValuesController::buttonAtIndex(int index) { - return &m_setIntervalButton; +Button * ValuesController::buttonAtIndex(int index, ButtonRowController::Position position) const { + return (Button *)&m_setIntervalButton; } void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { @@ -225,7 +225,7 @@ Responder * ValuesController::defaultController() { } void ValuesController::viewWillAppear() { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); EditableCellTableViewController::viewWillAppear(); } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index f3339f0ac..6fd650fe1 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -12,16 +12,16 @@ namespace Shared { -class ValuesController : public EditableCellTableViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class ValuesController : public EditableCellTableViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - ValuesController(Responder * parentResponder, HeaderViewController * header, char symbol); + ValuesController(Responder * parentResponder, ButtonRowController * header, char symbol); const char * title() const override; Interval * interval(); virtual bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; ViewController * intervalParameterController(); - int numberOfButtons() const override; - Button * buttonAtIndex(int index) override; + int numberOfButtons(ButtonRowController::Position) const override; + Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; virtual void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; KDCoordinate columnWidth(int i) override; KDCoordinate cumulatedWidthFromIndex(int i) override; diff --git a/apps/statistics/app.cpp b/apps/statistics/app.cpp index ad15d2ef7..8bf0818e9 100644 --- a/apps/statistics/app.cpp +++ b/apps/statistics/app.cpp @@ -10,16 +10,16 @@ App::App(Container * container) : m_store(), m_calculationController(CalculationController(&m_calculationAlternateEmptyViewController, &m_calculationHeader, &m_store)), m_calculationAlternateEmptyViewController(AlternateEmptyViewController(&m_calculationHeader, &m_calculationController, &m_calculationController)), - m_calculationHeader(HeaderViewController(&m_tabViewController, &m_calculationAlternateEmptyViewController, &m_calculationController)), + m_calculationHeader(ButtonRowController(&m_tabViewController, &m_calculationAlternateEmptyViewController, &m_calculationController)), m_boxController(BoxController(&m_boxAlternateEmptyViewController, &m_boxHeader, &m_store)), m_boxAlternateEmptyViewController(AlternateEmptyViewController(&m_boxHeader, &m_boxController, &m_boxController)), - m_boxHeader(HeaderViewController(&m_tabViewController, &m_boxAlternateEmptyViewController, &m_boxController)), + m_boxHeader(ButtonRowController(&m_tabViewController, &m_boxAlternateEmptyViewController, &m_boxController)), m_histogramController(HistogramController(&m_histogramAlternateEmptyViewController, &m_histogramHeader, &m_store)), m_histogramAlternateEmptyViewController(AlternateEmptyViewController(&m_histogramHeader, &m_histogramController, &m_histogramController)), - m_histogramHeader(HeaderViewController(&m_histogramStackViewController, &m_histogramAlternateEmptyViewController, &m_histogramController)), + m_histogramHeader(ButtonRowController(&m_histogramStackViewController, &m_histogramAlternateEmptyViewController, &m_histogramController)), m_histogramStackViewController(StackViewController(&m_tabViewController, &m_histogramHeader)), m_storeController(&m_storeHeader, &m_store, &m_storeHeader), - m_storeHeader(HeaderViewController(&m_storeStackViewController, &m_storeController, &m_storeController)), + m_storeHeader(ButtonRowController(&m_storeStackViewController, &m_storeController, &m_storeController)), m_storeStackViewController(StackViewController(&m_tabViewController, &m_storeHeader)), m_tabViewController(&m_modalViewController, &m_storeStackViewController, &m_histogramStackViewController, &m_boxHeader, &m_calculationHeader) { diff --git a/apps/statistics/app.h b/apps/statistics/app.h index 74f395c6b..2f591fa86 100644 --- a/apps/statistics/app.h +++ b/apps/statistics/app.h @@ -18,16 +18,16 @@ private: Store m_store; CalculationController m_calculationController; AlternateEmptyViewController m_calculationAlternateEmptyViewController; - HeaderViewController m_calculationHeader; + ButtonRowController m_calculationHeader; BoxController m_boxController; AlternateEmptyViewController m_boxAlternateEmptyViewController; - HeaderViewController m_boxHeader; + ButtonRowController m_boxHeader; HistogramController m_histogramController; AlternateEmptyViewController m_histogramAlternateEmptyViewController; - HeaderViewController m_histogramHeader; + ButtonRowController m_histogramHeader; StackViewController m_histogramStackViewController; StoreController m_storeController; - HeaderViewController m_storeHeader; + ButtonRowController m_storeHeader; StackViewController m_storeStackViewController; TabViewController m_tabViewController; }; diff --git a/apps/statistics/box_controller.cpp b/apps/statistics/box_controller.cpp index c5e9f84c6..794bae33b 100644 --- a/apps/statistics/box_controller.cpp +++ b/apps/statistics/box_controller.cpp @@ -7,9 +7,9 @@ using namespace Poincare; namespace Statistics { -BoxController::BoxController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store) : +BoxController::BoxController(Responder * parentResponder, ButtonRowController * header, Store * store) : ViewController(parentResponder), - HeaderViewDelegate(headerViewController), + ButtonRowDelegate(header, nullptr), m_boxBannerView(BoxBannerView()), m_view(BoxView(store, &m_boxBannerView)), m_store(store) diff --git a/apps/statistics/box_controller.h b/apps/statistics/box_controller.h index ccaec3655..a1bf7e3b7 100644 --- a/apps/statistics/box_controller.h +++ b/apps/statistics/box_controller.h @@ -8,9 +8,9 @@ namespace Statistics { -class BoxController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class BoxController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - BoxController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store); + BoxController(Responder * parentResponder, ButtonRowController * header, Store * store); const char * title() const override; View * view() override; bool handleEvent(Ion::Events::Event event) override; diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index 5d8f2d989..7f865cdfd 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -9,9 +9,9 @@ using namespace Poincare; namespace Statistics { -CalculationController::CalculationController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store) : +CalculationController::CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store) : ViewController(parentResponder), - HeaderViewDelegate(headerViewController), + ButtonRowDelegate(header, nullptr), m_titleCells{EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small)}, m_calculationCells{EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), EvenOddBufferTextCell(KDText::FontSize::Small), diff --git a/apps/statistics/calculation_controller.h b/apps/statistics/calculation_controller.h index 7004fc556..22c70b1c8 100644 --- a/apps/statistics/calculation_controller.h +++ b/apps/statistics/calculation_controller.h @@ -6,10 +6,10 @@ namespace Statistics { -class CalculationController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate, public TableViewDataSource { +class CalculationController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate, public TableViewDataSource { public: - CalculationController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store); + CalculationController(Responder * parentResponder, ButtonRowController * header, Store * store); const char * title() const override; View * view() override; bool handleEvent(Ion::Events::Event event) override; diff --git a/apps/statistics/histogram_controller.cpp b/apps/statistics/histogram_controller.cpp index 9603f82db..1d275042d 100644 --- a/apps/statistics/histogram_controller.cpp +++ b/apps/statistics/histogram_controller.cpp @@ -10,9 +10,9 @@ using namespace Shared; namespace Statistics { -HistogramController::HistogramController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store) : +HistogramController::HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store) : ViewController(parentResponder), - HeaderViewDelegate(headerViewController), + ButtonRowDelegate(header, nullptr), m_bannerView(HistogramBannerView()), m_view(HistogramView(store, &m_bannerView)), m_settingButton(Button(this, "Reglages de l'histogramme", Invocation([](void * context, void * sender) { @@ -46,7 +46,7 @@ HistogramParameterController * HistogramController::histogramParameterController bool HistogramController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Down) { if (!m_view.isMainViewSelected()) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); m_view.selectMainView(true); reloadBannerView(); m_view.reload(); @@ -56,12 +56,12 @@ bool HistogramController::handleEvent(Ion::Events::Event event) { } if (event == Ion::Events::Up) { if (!m_view.isMainViewSelected()) { - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); app()->setFirstResponder(tabController()); return true; } m_view.selectMainView(false); - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); return true; } if (m_view.isMainViewSelected() && (event == Ion::Events::Left || event == Ion::Events::Right)) { @@ -91,20 +91,20 @@ void HistogramController::didBecomeFirstResponder() { initBarSelection(); } if (!m_view.isMainViewSelected()) { - headerViewController()->setSelectedButton(0); + header()->setSelectedButton(0); } else { m_view.setHighlight(m_store->startOfBarAtIndex(m_selectedBarIndex), m_store->endOfBarAtIndex(m_selectedBarIndex)); } } -int HistogramController::numberOfButtons() const { +int HistogramController::numberOfButtons(ButtonRowController::Position) const { if (isEmpty()) { return 0; } return 1; } -Button * HistogramController::buttonAtIndex(int index) { - return &m_settingButton; +Button * HistogramController::buttonAtIndex(int index, ButtonRowController::Position) const { + return (Button *)&m_settingButton; } bool HistogramController::isEmpty() const { @@ -124,7 +124,7 @@ Responder * HistogramController::defaultController() { void HistogramController::viewWillAppear() { m_view.selectMainView(true); - headerViewController()->setSelectedButton(-1); + header()->setSelectedButton(-1); reloadBannerView(); m_view.reload(); } diff --git a/apps/statistics/histogram_controller.h b/apps/statistics/histogram_controller.h index e22b972cc..d97097fd1 100644 --- a/apps/statistics/histogram_controller.h +++ b/apps/statistics/histogram_controller.h @@ -10,10 +10,10 @@ namespace Statistics { -class HistogramController : public ViewController, public HeaderViewDelegate, public AlternateEmptyViewDelegate { +class HistogramController : public ViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - HistogramController(Responder * parentResponder, HeaderViewController * headerViewController, Store * store); + HistogramController(Responder * parentResponder, ButtonRowController * header, Store * store); const char * title() const override; View * view() override; StackViewController * stackController(); @@ -21,8 +21,8 @@ public: bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; - int numberOfButtons() const override; - Button * buttonAtIndex(int index) override; + int numberOfButtons(ButtonRowController::Position) const override; + Button * buttonAtIndex(int index, ButtonRowController::Position position) const override; bool isEmpty() const override; const char * emptyMessage() override; diff --git a/apps/statistics/store_controller.cpp b/apps/statistics/store_controller.cpp index cde235d5d..705681e81 100644 --- a/apps/statistics/store_controller.cpp +++ b/apps/statistics/store_controller.cpp @@ -8,7 +8,7 @@ using namespace Shared; namespace Statistics { -StoreController::StoreController(Responder * parentResponder, Store * store, HeaderViewController * header) : +StoreController::StoreController(Responder * parentResponder, Store * store, ButtonRowController * header) : Shared::StoreController(parentResponder, store, header), m_titleCells{EvenOddPointerTextCell(KDText::FontSize::Small), EvenOddPointerTextCell(KDText::FontSize::Small)} { diff --git a/apps/statistics/store_controller.h b/apps/statistics/store_controller.h index 7a90738a5..6b3799521 100644 --- a/apps/statistics/store_controller.h +++ b/apps/statistics/store_controller.h @@ -9,7 +9,7 @@ namespace Statistics { class StoreController : public Shared::StoreController { public: - StoreController(Responder * parentResponder, Store * store, HeaderViewController * header); + StoreController(Responder * parentResponder, Store * store, ButtonRowController * header); void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; private: HighlightCell * titleCells(int index) override; diff --git a/escher/Makefile b/escher/Makefile index 5cfc2f56e..1b9732665 100644 --- a/escher/Makefile +++ b/escher/Makefile @@ -5,6 +5,7 @@ objs += $(addprefix escher/src/,\ app.o\ buffer_text_view.o\ button.o\ + button_row_controller.o\ chevron_view.o\ container.o\ editable_text_cell.o\ @@ -16,8 +17,6 @@ objs += $(addprefix escher/src/,\ expression_table_cell.o\ expression_table_cell_with_pointer.o\ expression_view.o\ - header_view_controller.o\ - header_view_delegate.o\ highlight_cell.o\ image_view.o\ invocation.o\ diff --git a/escher/include/escher.h b/escher/include/escher.h index 03f740d54..5d1b2544d 100644 --- a/escher/include/escher.h +++ b/escher/include/escher.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -17,8 +18,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/escher/include/escher/button.h b/escher/include/escher/button.h index 1afc9d7b5..74df45378 100644 --- a/escher/include/escher/button.h +++ b/escher/include/escher/button.h @@ -9,7 +9,6 @@ class Button : public View, public Responder { public: Button(Responder * parentResponder, const char * textBody, Invocation invocation, KDText::FontSize size = KDText::FontSize::Small); - void drawRect(KDContext * ctx, KDRect rect) const override; bool handleEvent(Ion::Events::Event event) override; void setBackgroundColor(KDColor backgroundColor); KDSize minimalSizeForOptimalDisplay() override; diff --git a/escher/include/escher/button_row_controller.h b/escher/include/escher/button_row_controller.h new file mode 100644 index 000000000..bf7d36e52 --- /dev/null +++ b/escher/include/escher/button_row_controller.h @@ -0,0 +1,71 @@ +#ifndef BUTTON_ROW_CONTROLLER_H +#define BUTTON_ROW_CONTROLLER_H + +#include +#include +#include +#include +#include + +class ButtonRowDelegate; + +class ButtonRowController : public ViewController { +public: + enum class Position { + Top, + Bottom + }; + enum class Style { + PlainWhite, + EmbossedGrey + }; + ButtonRowController(Responder * parentResponder, ViewController * mainViewController, ButtonRowDelegate * delegate, Position position = Position::Top, Style = Style::PlainWhite); + View * view() override; + const char * title() const override; + void didBecomeFirstResponder() override; + bool handleEvent(Ion::Events::Event event) override; + bool setSelectedButton(int selectedButton); + void viewWillAppear() override; + void viewWillDisappear() override; +private: + class ContentView : public View { + public: + ContentView(ViewController * mainViewController, ButtonRowDelegate * delegate, Position position, Style style); + int numberOfButtons() const; + Button * buttonAtIndex(int index) const; + int numberOfSubviews() const override; + View * subviewAtIndex(int index) override; + void layoutSubviews() override; + void drawRect(KDContext * ctx, KDRect rect) const override; + bool setSelectedButton(int selectedButton, App * app); + int selectedButton(); + ViewController * mainViewController() const; + ButtonRowDelegate * buttonRowDelegate() const; + private: + constexpr static KDCoordinate k_plainStyleHeight = 20; + constexpr static KDCoordinate k_embossedStyleHeight = 46; + constexpr static KDCoordinate k_embossedStyleHeightMargin = 5; + constexpr static KDColor k_separatorHeaderColor = KDColor::RGB24(0xDEE0E2); + constexpr static KDColor k_selectedBackgroundColor = KDColor::RGB24(0x426DA7); + ViewController * m_mainViewController; + int m_selectedButton; + ButtonRowDelegate * m_delegate; + Position m_position; + Style m_style; + }; + ContentView m_contentView; +}; + +class ButtonRowDelegate { +public: + ButtonRowDelegate(ButtonRowController * header, ButtonRowController * footer); + virtual int numberOfButtons(ButtonRowController::Position position) const; + virtual Button * buttonAtIndex(int index, ButtonRowController::Position position) const; + ButtonRowController * header(); + ButtonRowController * footer(); +private: + ButtonRowController * m_header; + ButtonRowController * m_footer; +}; + +#endif diff --git a/escher/include/escher/header_view_controller.h b/escher/include/escher/header_view_controller.h deleted file mode 100644 index 2c03ea0fa..000000000 --- a/escher/include/escher/header_view_controller.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef HEADER_VIEW_CONTROLLER_H -#define HEADER_VIEW_CONTROLLER_H - -#include -#include -#include -#include -#include -#include - -class HeaderViewController : public ViewController { -public: - HeaderViewController(Responder * parentResponder, ViewController * mainViewController, HeaderViewDelegate * delegate); - View * view() override; - const char * title() const override; - void didBecomeFirstResponder() override; - bool handleEvent(Ion::Events::Event event) override; - bool setSelectedButton(int selectedButton); - void viewWillAppear() override; - void viewWillDisappear() override; -private: - class ContentView : public View { - public: - ContentView(ViewController * mainViewController, HeaderViewDelegate * delegate); - int numberOfButtons() const; - Button * buttonAtIndex(int index); - int numberOfSubviews() const override; - View * subviewAtIndex(int index) override; - void layoutSubviews() override; - void drawRect(KDContext * ctx, KDRect rect) const override; - bool setSelectedButton(int selectedButton, App * app); - int selectedButton(); - ViewController * mainViewController() const; - HeaderViewDelegate * headerViewDelegate() const; - private: - constexpr static KDCoordinate k_headerHeight = 20; - constexpr static KDColor k_separatorHeaderColor = KDColor::RGB24(0xDEE0E2); - constexpr static KDColor k_selectedBackgroundColor = KDColor::RGB24(0x426DA7); - ViewController * m_mainViewController; - int m_selectedButton; - HeaderViewDelegate * m_delegate; - }; - ContentView m_contentView; -}; - -#endif diff --git a/escher/include/escher/header_view_delegate.h b/escher/include/escher/header_view_delegate.h deleted file mode 100644 index fe7fe4986..000000000 --- a/escher/include/escher/header_view_delegate.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef ESCHER_HEADER_VIEW_DELEGATE_H -#define ESCHER_HEADER_VIEW_DELEGATE_H - -#include - -class HeaderViewController; - -class HeaderViewDelegate { -public: - HeaderViewDelegate(HeaderViewController * headerViewController); - virtual int numberOfButtons() const; - virtual Button * buttonAtIndex(int index); - HeaderViewController * headerViewController(); -private: - HeaderViewController * m_headerViewController; -}; - -#endif diff --git a/escher/src/button.cpp b/escher/src/button.cpp index 54a86e63f..1d5a5b84d 100644 --- a/escher/src/button.cpp +++ b/escher/src/button.cpp @@ -9,10 +9,6 @@ Button::Button(Responder * parentResponder, const char * textBody, Invocation in { } -void Button::drawRect(KDContext * ctx, KDRect rect) const { - ctx->fillRect(rect, m_backgroundColor); -} - int Button::numberOfSubviews() const { return 1; } diff --git a/escher/src/button_row_controller.cpp b/escher/src/button_row_controller.cpp new file mode 100644 index 000000000..5829d78a8 --- /dev/null +++ b/escher/src/button_row_controller.cpp @@ -0,0 +1,226 @@ +#include +#include +#include +#include + +ButtonRowDelegate::ButtonRowDelegate(ButtonRowController * header, ButtonRowController * footer) : + m_header(header), + m_footer(footer) +{ +} + +int ButtonRowDelegate::numberOfButtons(ButtonRowController::Position position) const { + return 0; +} + +Button * ButtonRowDelegate::buttonAtIndex(int index, ButtonRowController::Position position) const { + assert(false); + return nullptr; +} + +ButtonRowController * ButtonRowDelegate::footer() { + return m_footer; +} + +ButtonRowController * ButtonRowDelegate::header() { + return m_header; +} + +ButtonRowController::ContentView::ContentView(ViewController * mainViewController, ButtonRowDelegate * delegate, Position position, Style style) : + View(), + m_mainViewController(mainViewController), + m_selectedButton(-1), + m_delegate(delegate), + m_position(position), + m_style(style) +{ +} + +int ButtonRowController::ContentView::numberOfButtons() const { + return m_delegate->numberOfButtons(m_position); +} + +Button * ButtonRowController::ContentView::buttonAtIndex(int index) const { + return m_delegate->buttonAtIndex(index, m_position); +} + +int ButtonRowController::ContentView::numberOfSubviews() const { + return numberOfButtons() + 1; +} + +View * ButtonRowController::ContentView::subviewAtIndex(int index) { + if (index == 0) { + return m_mainViewController->view(); + } else { + return buttonAtIndex(index - 1); + } +} + +void ButtonRowController::ContentView::layoutSubviews() { + /* Position the main view */ + if (numberOfButtons() == 0) { + KDCoordinate margin = m_position == Position::Top ? 1 : 0; + KDRect mainViewFrame(0, margin, bounds().width(), bounds().height()-margin); + m_mainViewController->view()->setFrame(mainViewFrame); + return; + } + KDCoordinate rowHeight = m_style == Style::PlainWhite ? k_plainStyleHeight : k_embossedStyleHeight; + KDCoordinate frameOrigin = m_position == Position::Top ? rowHeight+1 : 0; + KDRect mainViewFrame(0, frameOrigin, bounds().width(), bounds().height() - rowHeight - 1); + m_mainViewController->view()->setFrame(mainViewFrame); + + /* Position buttons */ + int nbOfButtons = numberOfButtons(); + KDCoordinate widthMargin = 0; + KDCoordinate buttonHeightMargin = 0; + KDCoordinate buttonHeight = rowHeight; + if (m_style == Style::EmbossedGrey) { + KDCoordinate totalButtonWidth = 0; + for (int i = 0; i < nbOfButtons; i++) { + Button * button = buttonAtIndex(i); + totalButtonWidth += button->minimalSizeForOptimalDisplay().width(); + } + widthMargin = roundf((bounds().width() - totalButtonWidth)/(nbOfButtons+1)); + buttonHeightMargin = k_embossedStyleHeightMargin; + buttonHeight = rowHeight- 2*k_embossedStyleHeightMargin; + } + KDCoordinate yOrigin = m_position == Position::Top ? buttonHeightMargin : bounds().height()-rowHeight+buttonHeightMargin; + int currentXOrigin = widthMargin; + for (int i = 0; i < numberOfButtons(); i++) { + Button * button = buttonAtIndex(i); + KDCoordinate buttonWidth = button->minimalSizeForOptimalDisplay().width(); + KDRect buttonFrame(currentXOrigin, yOrigin, buttonWidth, buttonHeight); + button->setFrame(buttonFrame); + currentXOrigin += buttonWidth + widthMargin; + } +} + +void ButtonRowController::ContentView::drawRect(KDContext * ctx, KDRect rect) const { + if (numberOfButtons() == 0) { + if (m_position == Position::Top) { + ctx->fillRect(KDRect(0, 0, bounds().width(), 1), Palette::GreyWhite); + } + return; + } + if (m_style == Style::PlainWhite) { + if (m_position == Position::Top) { + ctx->fillRect(KDRect(0, 0, bounds().width(), k_plainStyleHeight), KDColorWhite); + ctx->fillRect(KDRect(0, k_plainStyleHeight, bounds().width(), 1), Palette::GreyWhite); + } else { + ctx->fillRect(KDRect(0, bounds().height() - k_plainStyleHeight, bounds().width(), k_plainStyleHeight), KDColorWhite); + ctx->fillRect(KDRect(0, bounds().height() - k_plainStyleHeight-1, bounds().width(), 1), Palette::GreyWhite); + } + return; + } + if (m_position == Position::Top) { + ctx->fillRect(KDRect(0, 0, bounds().width(), k_embossedStyleHeight), Palette::GreyWhite); + ctx->fillRect(KDRect(0, k_embossedStyleHeight, bounds().width(), 1), Palette::GreyMiddle); + } else { + ctx->fillRect(KDRect(0, bounds().height() - k_embossedStyleHeight, bounds().width(), k_embossedStyleHeight), Palette::GreyWhite); + ctx->fillRect(KDRect(0, bounds().height() - k_embossedStyleHeight-1, bounds().width(), 1), Palette::GreyMiddle); + } + KDCoordinate y0 = m_position == Position::Top ? k_embossedStyleHeightMargin-1 : bounds().height()-k_embossedStyleHeight+k_embossedStyleHeightMargin-1; + KDCoordinate y1 = m_position == Position::Top ? k_embossedStyleHeight-k_embossedStyleHeightMargin-2 : bounds().height()-k_embossedStyleHeightMargin; + KDCoordinate totalButtonWidth = 0; + for (int i = 0; i < numberOfButtons(); i++) { + Button * button = buttonAtIndex(i); + totalButtonWidth += button->minimalSizeForOptimalDisplay().width(); + } + KDCoordinate widthMargin = roundf((bounds().width() - totalButtonWidth)/(numberOfButtons()+1)); + + int currentXOrigin = widthMargin-1; + for (int i = 0; i < numberOfButtons(); i++) { + Button * button = buttonAtIndex(i); + KDCoordinate buttonWidth = button->minimalSizeForOptimalDisplay().width(); + ctx->fillRect(KDRect(currentXOrigin, y0, 1, y1-y0+1), Palette::GreyMiddle); + ctx->fillRect(KDRect(currentXOrigin-1, y0, 1, y1-y0+2), Palette::GreyDark); + ctx->fillRect(KDRect(currentXOrigin, y0, buttonWidth+2, 1), Palette::GreyMiddle); + ctx->fillRect(KDRect(currentXOrigin, y1, buttonWidth+2, 1), Palette::GreyMiddle); + ctx->fillRect(KDRect(currentXOrigin, y1+1, buttonWidth+2, 1), Palette::GreyDark); + ctx->fillRect(KDRect(currentXOrigin+1+buttonWidth, y0, 1, y1-y0+1), Palette::GreyMiddle); + currentXOrigin += buttonWidth + widthMargin; + } +} + +bool ButtonRowController::ContentView::setSelectedButton(int selectedButton, App * application) { + if (selectedButton < -1 || selectedButton >= numberOfButtons() || selectedButton == m_selectedButton) { + return false; + } + if (m_selectedButton >= 0) { + Button * button = buttonAtIndex(m_selectedButton); + button->setBackgroundColor(KDColorWhite); + } + m_selectedButton = selectedButton; + if (m_selectedButton >= 0) { + Button * button = buttonAtIndex(selectedButton); + button->setBackgroundColor(Palette::Select); + application->setFirstResponder(button); + return true; + } + return false; +} + +int ButtonRowController::ContentView::selectedButton() { + return m_selectedButton; +} + +ViewController * ButtonRowController::ContentView::mainViewController() const { + return m_mainViewController; +} + +ButtonRowDelegate * ButtonRowController::ContentView::buttonRowDelegate() const { + return m_delegate; +} + +ButtonRowController::ButtonRowController(Responder * parentResponder, ViewController * mainViewController, ButtonRowDelegate * delegate, Position position, Style style) : + ViewController(parentResponder), + m_contentView(ContentView(mainViewController, delegate, position, style)) +{ +} + +View * ButtonRowController::view() { + return &m_contentView; +} + +const char * ButtonRowController::title() const { + return m_contentView.mainViewController()->title(); +} + +void ButtonRowController::didBecomeFirstResponder(){ + m_contentView.layoutSubviews(); + app()->setFirstResponder(m_contentView.mainViewController()); +} + +bool ButtonRowController::setSelectedButton(int selectedButton) { + App * application = app(); + return m_contentView.setSelectedButton(selectedButton, application); +} + +bool ButtonRowController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::Left) { + if (m_contentView.selectedButton() == 0) { + } else { + setSelectedButton(m_contentView.selectedButton() - 1); + } + return true; + } + if (event == Ion::Events::Right) { + if (m_contentView.selectedButton() == - 1) { + } else { + setSelectedButton(m_contentView.selectedButton() + 1); + } + return true; + } + if (event == Ion::Events::OK) { + return true; + } + return false; +} + +void ButtonRowController::viewWillAppear() { + m_contentView.mainViewController()->viewWillAppear(); +} + +void ButtonRowController::viewWillDisappear() { + m_contentView.mainViewController()->viewWillDisappear(); +} diff --git a/escher/src/header_view_controller.cpp b/escher/src/header_view_controller.cpp deleted file mode 100644 index 77f173775..000000000 --- a/escher/src/header_view_controller.cpp +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include -#include - -HeaderViewController::ContentView::ContentView(ViewController * mainViewController, HeaderViewDelegate * delegate) : - View(), - m_mainViewController(mainViewController), - m_selectedButton(-1), - m_delegate(delegate) -{ -} - -int HeaderViewController::ContentView::numberOfButtons() const { - return m_delegate->numberOfButtons(); -} - -Button * HeaderViewController::ContentView::buttonAtIndex(int index) { - return m_delegate->buttonAtIndex(index); -} - -int HeaderViewController::ContentView::numberOfSubviews() const { - return numberOfButtons() + 1; -} - -View * HeaderViewController::ContentView::subviewAtIndex(int index) { - if (index == 0) { - return m_mainViewController->view(); - } else { - return buttonAtIndex(index - 1); - } -} - -void HeaderViewController::ContentView::layoutSubviews() { - if (numberOfButtons() == 0) { - KDRect mainViewFrame(0, 1, bounds().width(), bounds().height() - 1); - m_mainViewController->view()->setFrame(mainViewFrame); - return; - } - KDRect mainViewFrame(0, k_headerHeight + 1, bounds().width(), bounds().height() - k_headerHeight - 1); - m_mainViewController->view()->setFrame(mainViewFrame); - int currentXOrigin = 0; - for (int i = 0; i < numberOfButtons(); i++) { - Button * button = buttonAtIndex(i); - KDCoordinate buttonWidth = button->minimalSizeForOptimalDisplay().width(); - KDRect buttonFrame(currentXOrigin, 0, buttonWidth, k_headerHeight); - button->setFrame(buttonFrame); - currentXOrigin += buttonWidth; - } -} - -void HeaderViewController::ContentView::drawRect(KDContext * ctx, KDRect rect) const { - if (numberOfButtons() > 0) { - ctx->fillRect(KDRect(0, 0, bounds().width(), k_headerHeight), KDColorWhite); - ctx->fillRect(KDRect(0, k_headerHeight, bounds().width(), 1), Palette::GreyWhite); - } else { - ctx->fillRect(KDRect(0, 0, bounds().width(), 1), Palette::GreyWhite); - } -} - -bool HeaderViewController::ContentView::setSelectedButton(int selectedButton, App * application) { - if (selectedButton < -1 || selectedButton >= numberOfButtons() || selectedButton == m_selectedButton) { - return false; - } - if (m_selectedButton >= 0) { - Button * button = buttonAtIndex(m_selectedButton); - button->setBackgroundColor(KDColorWhite); - } - m_selectedButton = selectedButton; - if (m_selectedButton >= 0) { - Button * button = buttonAtIndex(selectedButton); - button->setBackgroundColor(Palette::Select); - application->setFirstResponder(button); - return true; - } - return false; -} - -int HeaderViewController::ContentView::selectedButton() { - return m_selectedButton; -} - -ViewController * HeaderViewController::ContentView::mainViewController() const { - return m_mainViewController; -} - -HeaderViewDelegate * HeaderViewController::ContentView::headerViewDelegate() const { - return m_delegate; -} - -HeaderViewController::HeaderViewController(Responder * parentResponder, ViewController * mainViewController, HeaderViewDelegate * delegate) : - ViewController(parentResponder), - m_contentView(ContentView(mainViewController, delegate)) -{ -} - -View * HeaderViewController::view() { - return &m_contentView; -} - -const char * HeaderViewController::title() const { - return m_contentView.mainViewController()->title(); -} - -void HeaderViewController::didBecomeFirstResponder(){ - m_contentView.layoutSubviews(); - app()->setFirstResponder(m_contentView.mainViewController()); -} - -bool HeaderViewController::setSelectedButton(int selectedButton) { - App * application = app(); - return m_contentView.setSelectedButton(selectedButton, application); -} - -bool HeaderViewController::handleEvent(Ion::Events::Event event) { - if (event == Ion::Events::Left) { - if (m_contentView.selectedButton() == 0) { - } else { - setSelectedButton(m_contentView.selectedButton() - 1); - } - return true; - } - if (event == Ion::Events::Right) { - if (m_contentView.selectedButton() == - 1) { - } else { - setSelectedButton(m_contentView.selectedButton() + 1); - } - return true; - } - if (event == Ion::Events::OK) { - return true; - } - return false; -} - -void HeaderViewController::viewWillAppear() { - m_contentView.mainViewController()->viewWillAppear(); -} - -void HeaderViewController::viewWillDisappear() { - m_contentView.mainViewController()->viewWillDisappear(); -} diff --git a/escher/src/header_view_delegate.cpp b/escher/src/header_view_delegate.cpp deleted file mode 100644 index 2b704c929..000000000 --- a/escher/src/header_view_delegate.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -HeaderViewDelegate::HeaderViewDelegate(HeaderViewController * headerViewController) : - m_headerViewController(headerViewController) -{ -} - -int HeaderViewDelegate::numberOfButtons() const { - return 0; -} - -Button * HeaderViewDelegate::buttonAtIndex(int index) { - assert(false); - return nullptr; -} - -HeaderViewController * HeaderViewDelegate::headerViewController() { - return m_headerViewController; -}