From 400e2e5a3706724a8f704a24f8462aa0839bb8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 12:24:13 +0100 Subject: [PATCH] [apps/probability] Improve titles and parameter definitions layout Change-Id: I84e04b9900d92b0a4d61c19dc27be426f9b9117c --- apps/probability/app.cpp | 2 +- apps/probability/calculation_controller.cpp | 68 ++++++++++++------- apps/probability/calculation_controller.h | 7 +- apps/probability/law_controller.cpp | 39 +++++++---- apps/probability/law_controller.h | 15 +++- apps/probability/parameters_controller.cpp | 62 +++++++++-------- apps/probability/parameters_controller.h | 9 +-- escher/include/escher/stack_view_controller.h | 1 - escher/src/stack_view_controller.cpp | 5 -- 9 files changed, 128 insertions(+), 80 deletions(-) diff --git a/apps/probability/app.cpp b/apps/probability/app.cpp index 816510d30..b7ea97389 100644 --- a/apps/probability/app.cpp +++ b/apps/probability/app.cpp @@ -6,7 +6,7 @@ namespace Probability { App::App(Container * container) : TextFieldDelegateApp(container, &m_stackViewController, "Probabilites", "PROBABILITES", ImageStore::ProbabilityIcon), m_lawController(LawController(nullptr)), - m_stackViewController(&m_modalViewController, &m_lawController, true) + m_stackViewController(&m_modalViewController, &m_lawController) { } diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 9f4b72ad2..4efbf78fe 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -9,6 +9,7 @@ namespace Probability { CalculationController::ContentView::ContentView(Responder * parentResponder, CalculationController * calculationController, Calculation * calculation) : + m_titleView(PointerTextView(KDText::FontSize::Small, "Calculer les probabilites", 0.5f, 0.5f, Palette::GreyDark, Palette::WallScreen)), m_lawCurveView(LawCurveView()), m_imageTableView(ImageTableView(parentResponder, calculation, calculationController)), m_calculationCell{EditableTextCell(parentResponder, calculationController, m_draftTextBuffer), @@ -29,34 +30,37 @@ void CalculationController::ContentView::setCalculation(Calculation * calculatio } int CalculationController::ContentView::numberOfSubviews() const { - return 2*m_calculation->numberOfParameters() + 2; + return 2*m_calculation->numberOfParameters() + 3; } View * CalculationController::ContentView::subviewAtIndex(int index) { - assert(index >= 0 && index < 8); + assert(index >= 0 && index < 9); if (index == 0) { - return &m_lawCurveView; + return &m_titleView; } if (index == 1) { - return &m_imageTableView; + return &m_lawCurveView; } if (index == 2) { + return &m_imageTableView; + } + if (index == 3) { m_text[0].setText(m_calculation->legendForParameterAtIndex(0)); m_text[0].setAlignment(0.5f, 0.5f); return &m_text[0]; } - if (index == 4) { + if (index == 5) { m_text[1].setText(m_calculation->legendForParameterAtIndex(1)); m_text[1].setAlignment(0.5f, 0.5f); return &m_text[1]; } - if (index == 6) { + if (index == 7) { m_text[2].setText(m_calculation->legendForParameterAtIndex(2)); m_text[2].setAlignment(0.5f, 0.5f); return &m_text[2]; } - if (index == 3 || index == 5 || index == 7) { - return &m_calculationCell[(index - 3)/2]; + if (index == 4 || index == 6 || index == 8) { + return &m_calculationCell[(index - 4)/2]; } return nullptr; } @@ -69,26 +73,28 @@ void CalculationController::ContentView::willDisplayEditableCellAtIndex(int inde void CalculationController::ContentView::layoutSubviews() { markRectAsDirty(bounds()); + KDCoordinate titleHeight = KDText::stringSize("", KDText::FontSize::Small).height()+k_titleHeightMargin; + m_titleView.setFrame(KDRect(0, 0, bounds().width(), titleHeight)); KDSize charSize = KDText::stringSize(" "); KDCoordinate xCoordinate = 0; - m_lawCurveView.setFrame(KDRect(0, ImageTableView::k_imageHeight, bounds().width(), bounds().height() - ImageTableView::k_imageHeight)); - m_imageTableView.setFrame(KDRect(xCoordinate, 0, ImageTableView::k_imageWidth, 3*ImageTableView::k_imageHeight)); - xCoordinate += ImageTableView::k_imageWidth + k_textMargin; + m_lawCurveView.setFrame(KDRect(0, titleHeight+ImageTableView::k_imageHeight, bounds().width(), bounds().height() - ImageTableView::k_imageHeight-titleHeight)); + m_imageTableView.setFrame(KDRect(xCoordinate, titleHeight, ImageTableView::k_imageWidth, 3*ImageTableView::k_imageHeight)); + xCoordinate += ImageTableView::k_imageWidth + k_textWidthMargin; KDCoordinate numberOfCharacters = strlen(m_calculation->legendForParameterAtIndex(0)); - m_text[0].setFrame(KDRect(xCoordinate, 0, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); - xCoordinate += numberOfCharacters*charSize.width() + k_textMargin; - m_calculationCell[0].setFrame(KDRect(xCoordinate, 0, k_textFieldWidth, ImageTableView::k_imageHeight)); - xCoordinate += k_textFieldWidth + k_textMargin; + m_text[0].setFrame(KDRect(xCoordinate, titleHeight, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); + xCoordinate += numberOfCharacters*charSize.width() + k_textWidthMargin; + m_calculationCell[0].setFrame(KDRect(xCoordinate, titleHeight, k_textFieldWidth, ImageTableView::k_imageHeight)); + xCoordinate += k_textFieldWidth + k_textWidthMargin; numberOfCharacters = strlen(m_calculation->legendForParameterAtIndex(1)); - m_text[1].setFrame(KDRect(xCoordinate, 0, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); - xCoordinate += numberOfCharacters*charSize.width() + k_textMargin; - m_calculationCell[1].setFrame(KDRect(xCoordinate, 0, k_textFieldWidth, ImageTableView::k_imageHeight)); - xCoordinate += k_textFieldWidth + k_textMargin; + m_text[1].setFrame(KDRect(xCoordinate, titleHeight, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); + xCoordinate += numberOfCharacters*charSize.width() + k_textWidthMargin; + m_calculationCell[1].setFrame(KDRect(xCoordinate, titleHeight, k_textFieldWidth, ImageTableView::k_imageHeight)); + xCoordinate += k_textFieldWidth + k_textWidthMargin; if (m_calculation->numberOfParameters() > 2) { numberOfCharacters = strlen(m_calculation->legendForParameterAtIndex(2));; - m_text[2].setFrame(KDRect(xCoordinate, 0, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); - xCoordinate += numberOfCharacters*charSize.width() + k_textMargin; - m_calculationCell[2].setFrame(KDRect(xCoordinate, 0, k_textFieldWidth, ImageTableView::k_imageHeight)); + m_text[2].setFrame(KDRect(xCoordinate, titleHeight, numberOfCharacters*charSize.width(), ImageTableView::k_imageHeight)); + xCoordinate += numberOfCharacters*charSize.width() + k_textWidthMargin; + m_calculationCell[2].setFrame(KDRect(xCoordinate, titleHeight, k_textFieldWidth, ImageTableView::k_imageHeight)); } for (int k = 0; k < m_calculation->numberOfParameters(); k++) { willDisplayEditableCellAtIndex(k); @@ -125,7 +131,7 @@ View * CalculationController::view() { } const char * CalculationController::title() const { - return "Calculer les probabilites"; + return m_titleBuffer; } void CalculationController::reload() { @@ -208,6 +214,7 @@ bool CalculationController::textFieldDidFinishEditing(TextField * textField, con } void CalculationController::didBecomeFirstResponder() { + updateTitle(); for (int subviewIndex = 0; subviewIndex < 2; subviewIndex++) { EditableTextCell * calculCell = m_contentView.calculationCellAtIndex(subviewIndex); calculCell->setHighlighted(false); @@ -227,4 +234,19 @@ void CalculationController::selectSubview(int subviewIndex) { m_highlightedSubviewIndex = subviewIndex; } +void CalculationController::updateTitle() { + int currentChar = 0; + for (int index = 0; index < m_law->numberOfParameter(); index++) { + m_titleBuffer[currentChar++] = m_law->parameterNameAtIndex(index)[0]; + strlcpy(m_titleBuffer+currentChar, " = ", 4); + currentChar += 3; + char buffer[Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; + Float(m_law->parameterValueAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Expression::DisplayMode::Auto); + strlcpy(m_titleBuffer+currentChar, buffer, strlen(buffer)+1); + currentChar += strlen(buffer); + m_titleBuffer[currentChar++] = ' '; + } + m_titleBuffer[currentChar-1] = 0; +} + } diff --git a/apps/probability/calculation_controller.h b/apps/probability/calculation_controller.h index 377dcea1a..512f4fab6 100644 --- a/apps/probability/calculation_controller.h +++ b/apps/probability/calculation_controller.h @@ -23,6 +23,7 @@ public: bool textFieldDidReceiveEvent(TextField * textField, Ion::Events::Event event) override; bool textFieldDidFinishEditing(TextField * textField, const char * text) override; private: + void updateTitle(); Calculation * m_calculation; class ContentView : public View { public: @@ -38,9 +39,11 @@ private: constexpr static int k_maxNumberOfEditableFields = 3; private: constexpr static KDCoordinate k_textFieldWidth = 50; - constexpr static KDCoordinate k_textMargin = 5; + constexpr static KDCoordinate k_textWidthMargin = 5; + constexpr static KDCoordinate k_titleHeightMargin = 5; int numberOfSubviews() const override; View * subviewAtIndex(int index) override; + PointerTextView m_titleView; LawCurveView m_lawCurveView; ImageTableView m_imageTableView; PointerTextView m_text[k_maxNumberOfEditableFields]; @@ -51,6 +54,8 @@ private: ContentView m_contentView; Law * m_law; int m_highlightedSubviewIndex; + constexpr static int k_maxNumberOfTitleCharacters = 30; + char m_titleBuffer[k_maxNumberOfTitleCharacters]; }; } diff --git a/apps/probability/law_controller.cpp b/apps/probability/law_controller.cpp index d73727002..045e9e5e4 100644 --- a/apps/probability/law_controller.cpp +++ b/apps/probability/law_controller.cpp @@ -19,6 +19,30 @@ namespace Probability { +LawController::ContentView::ContentView(SelectableTableView * selectableTableView) : + m_titleView(PointerTextView(KDText::FontSize::Small, "Choisir le type de loi", 0.5f, 0.5f, Palette::GreyDark, Palette::WallScreen)), + m_selectableTableView(selectableTableView) +{ +} + +int LawController::ContentView::numberOfSubviews() const { + return 2; +} + +View * LawController::ContentView::subviewAtIndex(int index) { + assert(index >= 0 && index < 2); + if (index == 0) { + return &m_titleView; + } + return m_selectableTableView; +} + +void LawController::ContentView::layoutSubviews() { + KDCoordinate titleHeight = KDText::stringSize("", KDText::FontSize::Small).height()+k_titleMargin; + m_titleView.setFrame(KDRect(0, 0, bounds().width(), titleHeight)); + m_selectableTableView->setFrame(KDRect(0, titleHeight, bounds().width(), bounds().height()-titleHeight)); +} + static const char * sMessages[] = { "Binomiale", "Uniforme", @@ -29,8 +53,9 @@ static const char * sMessages[] = { LawController::LawController(Responder * parentResponder) : ViewController(parentResponder), - m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, + m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin-ContentView::k_titleMargin, Metric::RightMargin, Metric::BottomMargin, Metric::LeftMargin)), + m_contentView(&m_selectableTableView), m_law(nullptr), m_parametersController(ParametersController(nullptr)) { @@ -38,14 +63,7 @@ LawController::LawController(Responder * parentResponder) : } View * LawController::view() { - return &m_selectableTableView; -} - -const char * LawController::title() const { - if (m_law == nullptr) { - return "Choisir le type de Loi"; - } - return m_law->title(); + return &m_contentView; } void Probability::LawController::didBecomeFirstResponder() { @@ -54,8 +72,6 @@ void Probability::LawController::didBecomeFirstResponder() { m_law = nullptr; m_parametersController.setLaw(m_law); } - StackViewController * stack = (StackViewController *)parentResponder(); - stack->updateTitle(); if (m_selectableTableView.selectedRow() == -1) { m_selectableTableView.selectCellAtLocation(0, 0); } else { @@ -68,7 +84,6 @@ bool Probability::LawController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { StackViewController * stack = (StackViewController *)parentResponder(); setLawAccordingToIndex(m_selectableTableView.selectedRow()); - stack->updateTitle(); stack->push(&m_parametersController); return true; } diff --git a/apps/probability/law_controller.h b/apps/probability/law_controller.h index 1128129d5..6ab933f52 100644 --- a/apps/probability/law_controller.h +++ b/apps/probability/law_controller.h @@ -12,7 +12,6 @@ class LawController : public ViewController, public SimpleListViewDataSource { public: LawController(Responder * parentResponder); View * view() override; - const char * title() const override; bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; @@ -22,12 +21,22 @@ public: TableViewCell * reusableCell(int index) override; int reusableCellCount() override; private: + class ContentView : public View { + public: + ContentView(SelectableTableView * selectableTableView); + constexpr static KDCoordinate k_titleMargin = 8; + private: + int numberOfSubviews() const override; + View * subviewAtIndex(int index) override; + void layoutSubviews() override; + PointerTextView m_titleView;; + SelectableTableView * m_selectableTableView; + }; void setLawAccordingToIndex(int index); constexpr static int k_totalNumberOfModels = 5; - // !!! CAUTION: The order here is important - // The cells should be initialized *before* the listview! Cell m_cells[k_totalNumberOfModels]; SelectableTableView m_selectableTableView; + ContentView m_contentView; const char ** m_messages; Law * m_law; ParametersController m_parametersController; diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index 1e3e2c45b..b714580ea 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -7,6 +7,7 @@ namespace Probability { ParametersController::ContentView::ContentView(Responder * parentResponder, SelectableTableView * selectableTableView) : + m_numberOfParameters(1), m_nextButton(Button(parentResponder, "Suivant", Invocation([](void * context, void * sender) { ParametersController * parameterController = (ParametersController *) context; CalculationController * calculationController = parameterController->calculationController(); @@ -14,9 +15,9 @@ ParametersController::ContentView::ContentView(Responder * parentResponder, Sele calculationController->selectSubview(1); calculationController->reload(); StackViewController * stack = parameterController->stackController(); - stack->updateTitle(); stack->push(calculationController); }, parentResponder), KDText::FontSize::Large)), + m_titleView(PointerTextView(KDText::FontSize::Small, "Choisir les parametres", 0.5f, 0.5f, Palette::GreyDark, Palette::WallScreen)), m_firstParameterDefinition(PointerTextView(KDText::FontSize::Small, nullptr, 0.5f, 0.5f, KDColorBlack, Palette::WallScreen)), m_secondParameterDefinition(PointerTextView(KDText::FontSize::Small, nullptr, 0.5f, 0.5f, KDColorBlack, Palette::WallScreen)), m_selectableTableView(selectableTableView) @@ -40,30 +41,45 @@ void ParametersController::ContentView::drawRect(KDContext * ctx, KDRect rect) c ctx->fillRect(KDRect(0, tableHeight, bounds().width(), bounds().height() - tableHeight), Palette::WallScreen); } +void ParametersController::ContentView::setNumberOfParameters(int numberOfParameters) { + m_numberOfParameters = numberOfParameters; +} + int ParametersController::ContentView::numberOfSubviews() const { - return 4; + return m_numberOfParameters+3; } View * ParametersController::ContentView::subviewAtIndex(int index) { - assert(index >= 0 && index < 4); + assert(index >= 0 && index < 5); if (index == 0) { - return m_selectableTableView; + return &m_titleView; } if (index == 1) { - return &m_nextButton; + return m_selectableTableView; } if (index == 2) { + return &m_nextButton; + } + if (index == 3) { return &m_firstParameterDefinition; } return &m_secondParameterDefinition; } void ParametersController::ContentView::layoutSubviews() { - int tableHeight = m_selectableTableView->size().height() + Metric::TopMargin + Metric::BottomMargin; - m_selectableTableView->setFrame(KDRect(0, 0, bounds().width(), tableHeight)); - m_nextButton.setFrame(KDRect(Metric::LeftMargin, tableHeight, bounds().width() - Metric::RightMargin - Metric::LeftMargin, k_buttonHeight)); - m_firstParameterDefinition.setFrame(KDRect(0, tableHeight + k_buttonHeight, bounds().width(), k_textHeight)); - m_secondParameterDefinition.setFrame(KDRect(0, tableHeight + k_buttonHeight + k_textHeight, bounds().width(), k_textHeight)); + KDCoordinate titleHeight = KDText::stringSize("", KDText::FontSize::Small).height()+k_titleMargin; + m_titleView.setFrame(KDRect(0, 0, bounds().width(), titleHeight)); + KDCoordinate tableHeight = m_selectableTableView->size().height() + Metric::TopMargin + Metric::BottomMargin; + m_selectableTableView->setFrame(KDRect(0, titleHeight, bounds().width(), tableHeight)); + m_nextButton.setFrame(KDRect(Metric::LeftMargin, titleHeight+tableHeight, bounds().width() - Metric::RightMargin - Metric::LeftMargin, k_buttonHeight)); + KDCoordinate textHeight = KDText::stringSize("", KDText::FontSize::Small).height(); + KDCoordinate defOrigin = (titleHeight+tableHeight+k_buttonHeight)/2+(bounds().height()-textHeight)/2; + m_secondParameterDefinition.setFrame(KDRectZero); + if (m_numberOfParameters == 2) { + defOrigin = (titleHeight+tableHeight+k_buttonHeight)/2+(bounds().height()-2*textHeight-k_textMargin)/2; + m_secondParameterDefinition.setFrame(KDRect(0, defOrigin+textHeight+k_textMargin, bounds().width(), textHeight)); + } + m_firstParameterDefinition.setFrame(KDRect(0, defOrigin, bounds().width(), textHeight)); } /* Parameters Controller */ @@ -84,30 +100,18 @@ View * ParametersController::view() { } const char * ParametersController::title() const { - if (!m_buttonSelected) { - return "Choisir les parametres"; + if (m_law != nullptr) { + return m_law->title(); } - return m_titleBuffer; + return ""; } void ParametersController::setLaw(Law * law) { m_law = law; - m_calculationController.setLaw(law); -} - -void ParametersController::updateTitle() { - int currentChar = 0; - for (int index = 0; index < m_law->numberOfParameter(); index++) { - m_titleBuffer[currentChar++] = m_law->parameterNameAtIndex(index)[0]; - strlcpy(m_titleBuffer+currentChar, " = ", 4); - currentChar += 3; - char buffer[Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; - Float(m_law->parameterValueAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Expression::DisplayMode::Auto); - strlcpy(m_titleBuffer+currentChar, buffer, strlen(buffer)+1); - currentChar += strlen(buffer); - m_titleBuffer[currentChar++] = ' '; + if (m_law != nullptr) { + m_contentView.setNumberOfParameters(m_law->numberOfParameter()); } - m_titleBuffer[currentChar-1] = 0; + m_calculationController.setLaw(law); } bool ParametersController::handleEvent(Ion::Events::Event event) { @@ -116,7 +120,6 @@ bool ParametersController::handleEvent(Ion::Events::Event event) { m_contentView.button()->setBackgroundColor(Palette::Select); m_selectableTableView.deselectTable(); app()->setFirstResponder(m_contentView.button()); - updateTitle(); return true; } if (event == Ion::Events::Up && m_buttonSelected) { @@ -135,7 +138,6 @@ void ParametersController::didBecomeFirstResponder() { } m_contentView.layoutSubviews(); m_buttonSelected = false; - stackController()->updateTitle(); m_contentView.button()->setBackgroundColor(KDColorWhite); FloatParameterController::didBecomeFirstResponder(); } diff --git a/apps/probability/parameters_controller.h b/apps/probability/parameters_controller.h index 3bed94bbb..8bbde1136 100644 --- a/apps/probability/parameters_controller.h +++ b/apps/probability/parameters_controller.h @@ -25,7 +25,6 @@ public: private: float parameterAtIndex(int index) override; void setParameterAtIndex(int parameterIndex, float f) override; - void updateTitle(); class ContentView : public View { public: ContentView(Responder * parentResponder, SelectableTableView * selectableTableView); @@ -33,12 +32,16 @@ private: PointerTextView * parameterDefinitionAtIndex(int index); void drawRect(KDContext * ctx, KDRect rect) const override; void layoutSubviews() override; + void setNumberOfParameters(int numberOfParameters); private: constexpr static KDCoordinate k_buttonHeight = 40; - constexpr static KDCoordinate k_textHeight = 30; + constexpr static KDCoordinate k_textMargin = 5; + constexpr static KDCoordinate k_titleMargin = 5; int numberOfSubviews() const override; View * subviewAtIndex(int index) override; + int m_numberOfParameters; Button m_nextButton; + PointerTextView m_titleView; PointerTextView m_firstParameterDefinition; PointerTextView m_secondParameterDefinition; SelectableTableView * m_selectableTableView; @@ -50,8 +53,6 @@ private: Law * m_law; bool m_buttonSelected; CalculationController m_calculationController; - constexpr static int k_maxNumberOfTitleCharacters = 30; - char m_titleBuffer[k_maxNumberOfTitleCharacters]; }; } diff --git a/escher/include/escher/stack_view_controller.h b/escher/include/escher/stack_view_controller.h index 3fbcc25a4..3465a17af 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -14,7 +14,6 @@ public: /* Push creates a new StackView and adds it */ void push(ViewController * vc); - void updateTitle(); void pop(); diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 5add39220..1f6a8d507 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -86,11 +86,6 @@ const char * StackViewController::title() const { } } -void StackViewController::updateTitle() { - m_view.popStack(); - m_view.pushStack(m_children[m_numberOfChildren-1]->title()); -} - void StackViewController::push(ViewController * vc) { m_view.pushStack(vc->title()); m_children[m_numberOfChildren++] = vc;