From 39b0bd9b66548ba5b915be4f23ac1bb51319c8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 30 Jan 2017 14:45:08 +0100 Subject: [PATCH 01/17] [apps] Display the preferences in the title bar Change-Id: Ib1defef85b68a48f667127c583901b659db1cbaf --- apps/apps_container.cpp | 5 +++++ apps/apps_container.h | 1 + apps/apps_window.cpp | 4 ++++ apps/apps_window.h | 1 + apps/settings/sub_controller.cpp | 3 +++ apps/title_bar_view.cpp | 31 +++++++++++++++++++++++++++++-- apps/title_bar_view.h | 3 +++ 7 files changed, 46 insertions(+), 2 deletions(-) diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index cfb3d9669..d2c8599db 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -18,6 +18,7 @@ AppsContainer::AppsContainer() : m_preferences(Preferences()), m_variableBoxController(&m_globalContext) { + refreshPreferences(); } int AppsContainer::numberOfApps() { @@ -71,6 +72,10 @@ void AppsContainer::switchTo(App * app) { Container::switchTo(app); } +void AppsContainer::refreshPreferences() { + m_window.refreshPreferences(&m_preferences); +} + Window * AppsContainer::window() { return &m_window; } diff --git a/apps/apps_container.h b/apps/apps_container.h index cfa5a7219..fa1c8185c 100644 --- a/apps/apps_container.h +++ b/apps/apps_container.h @@ -29,6 +29,7 @@ public: VariableBoxController * variableBoxController(); bool handleEvent(Ion::Events::Event event) override; void switchTo(App * app) override; + void refreshPreferences(); private: Window * window() override; static constexpr int k_numberOfApps = 9; diff --git a/apps/apps_window.cpp b/apps/apps_window.cpp index daa22be70..6ef170aa4 100644 --- a/apps/apps_window.cpp +++ b/apps/apps_window.cpp @@ -18,6 +18,10 @@ void AppsWindow::updateBatteryLevel() { m_titleBarView.setChargeState(Ion::Battery::Charge::EMPTY); } +void AppsWindow::refreshPreferences(Preferences * preferences) { + m_titleBarView.setPreferences(preferences); +} + int AppsWindow::numberOfSubviews() const { return (m_contentView == nullptr ? 1 : 2); } diff --git a/apps/apps_window.h b/apps/apps_window.h index 4f05157c6..5af6c7849 100644 --- a/apps/apps_window.h +++ b/apps/apps_window.h @@ -9,6 +9,7 @@ public: AppsWindow(); void setTitle(const char * title); void updateBatteryLevel(); + void refreshPreferences(Preferences * preferences); private: constexpr static KDCoordinate k_titleBarHeight = 18; int numberOfSubviews() const override; diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 9db5ee706..87e4583cc 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -1,4 +1,5 @@ #include "sub_controller.h" +#include "../apps_container.h" #include namespace Settings { @@ -33,6 +34,8 @@ void SubController::didBecomeFirstResponder() { bool SubController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { setPreferenceAtIndexWithValueIndex(m_preferenceIndex, m_selectableTableView.selectedRow()); + AppsContainer * myContainer = (AppsContainer * )app()->container(); + myContainer->refreshPreferences(); StackViewController * stack = stackController(); stack->pop(); } diff --git a/apps/title_bar_view.cpp b/apps/title_bar_view.cpp index fbaf8cd48..adf20a97e 100644 --- a/apps/title_bar_view.cpp +++ b/apps/title_bar_view.cpp @@ -5,7 +5,8 @@ extern "C" { TitleBarView::TitleBarView() : View(), - m_titleView(KDText::FontSize::Small, nullptr, 0.5f, 0.5f, KDColorWhite, Palette::YellowDark) + m_titleView(KDText::FontSize::Small, nullptr, 0.5f, 0.5f, KDColorWhite, Palette::YellowDark), + m_preferenceView(KDText::FontSize::Small, 1.0f, 0.5, KDColorWhite, Palette::YellowDark) { } @@ -23,18 +24,44 @@ void TitleBarView::setChargeState(Ion::Battery::Charge chargeState) { } int TitleBarView::numberOfSubviews() const { - return 2; + return 3; } View * TitleBarView::subviewAtIndex(int index) { if (index == 0) { return &m_titleView; } + if (index == 1) { + return &m_preferenceView; + } return &m_batteryView; } void TitleBarView::layoutSubviews() { m_titleView.setFrame(bounds()); + m_preferenceView.setFrame(KDRect(0, 0, m_preferenceView.minimalSizeForOptimalDisplay())); KDSize batterySize = m_batteryView.minimalSizeForOptimalDisplay(); m_batteryView.setFrame(KDRect(bounds().width() - batterySize.width() - k_batteryLeftMargin, (bounds().height()- batterySize.height())/2, batterySize)); } + +void TitleBarView::setPreferences(Preferences * preferences) { + char buffer[13]; + int numberOfChar = 0; + if (preferences->displayMode() == Preferences::DisplayMode::Scientific) { + strlcpy(buffer, "sci/", 5); + numberOfChar += 4; + } + if (preferences->numberType() == Preferences::NumberType::Complex) { + strlcpy(buffer+numberOfChar, "cplx/", 6); + numberOfChar += 5; + } + if (preferences->angleUnit() == Preferences::AngleUnit::Radian) { + strlcpy(buffer+numberOfChar, "rad", 4); + } else { + strlcpy(buffer+numberOfChar, "deg", 4); + } + numberOfChar += 3; + buffer[numberOfChar] = 0; + m_preferenceView.setText(buffer); + layoutSubviews(); +} diff --git a/apps/title_bar_view.h b/apps/title_bar_view.h index a0dd33e86..d93c54581 100644 --- a/apps/title_bar_view.h +++ b/apps/title_bar_view.h @@ -3,6 +3,7 @@ #include #include "battery_view.h" +#include "preferences.h" class TitleBarView : public View { public: @@ -10,6 +11,7 @@ public: void drawRect(KDContext * ctx, KDRect rect) const override; void setTitle(const char * title); void setChargeState(Ion::Battery::Charge chargeState); + void setPreferences(Preferences * preferences); private: constexpr static KDCoordinate k_batteryLeftMargin = 5; int numberOfSubviews() const override; @@ -17,6 +19,7 @@ private: View * subviewAtIndex(int index) override; PointerTextView m_titleView; BatteryView m_batteryView; + BufferTextView m_preferenceView; }; #endif From 7f658266c3e3910f8d6a2f477b1ae92453910c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 30 Jan 2017 14:53:42 +0100 Subject: [PATCH 02/17] [poincare] [apps] Merge Display mode enum class of Float and Preferences Change-Id: I50498ff0f12991fdd905421441eee7a477d53a4d --- apps/curve_view.cpp | 2 +- apps/graph/graph/graph_controller.cpp | 6 +++--- apps/preferences.cpp | 6 +++--- apps/preferences.h | 12 +++++------- apps/probability/calculation_controller.cpp | 2 +- apps/probability/parameters_controller.cpp | 2 +- apps/settings/sub_controller.cpp | 2 +- apps/title_bar_view.cpp | 2 +- poincare/include/poincare/float.h | 10 +++++----- poincare/src/float.cpp | 8 ++++---- poincare/test/float.cpp | 14 +++++++------- 11 files changed, 32 insertions(+), 34 deletions(-) diff --git a/apps/curve_view.cpp b/apps/curve_view.cpp index f7a236290..8e09dd6e7 100644 --- a/apps/curve_view.cpp +++ b/apps/curve_view.cpp @@ -83,7 +83,7 @@ void CurveView::computeLabels(Axis axis) { for (int index = 0; index < numberOfLabels(axis); index++) { Float(2.0f*step*(ceilf(min(axis)/(2.0f*step)))+index*2.0f*step).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), - Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Decimal); + Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Auto); //TODO: check for size of label? strlcpy(label(axis, index), buffer, strlen(buffer)+1); } diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index 79f67f0dc..c4469daa9 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -113,7 +113,7 @@ void GraphController::reloadBannerView() { const char * legend = "x = "; int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); - Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Decimal); + Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer, 0); legend = "00(x) = "; @@ -121,7 +121,7 @@ void GraphController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); Function * f = m_functionStore->activeFunctionAtIndex(m_indexFunctionSelectedByCursor); buffer[1] = f->name()[0]; - Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Decimal); + Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer+1, 1); if (m_bannerView.displayDerivative()) { @@ -129,7 +129,7 @@ void GraphController::reloadBannerView() { buffer[1] = '\''; App * graphApp = (Graph::App *)app(); float y = f->approximateDerivative(m_cursor.x(), graphApp->localContext()); - Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Decimal); + Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer, 2); } } diff --git a/apps/preferences.cpp b/apps/preferences.cpp index c32c32aec..ae0a744d1 100644 --- a/apps/preferences.cpp +++ b/apps/preferences.cpp @@ -2,7 +2,7 @@ Preferences::Preferences() : m_angleUnit(AngleUnit::Degree), - m_displayMode(DisplayMode::Auto), + m_displayMode(Float::DisplayMode::Auto), m_numberType(NumberType::Reel), m_complexFormat(ComplexFormat::Cartesian), m_language(Language::French) @@ -19,11 +19,11 @@ void Preferences::setAngleUnit(AngleUnit angleUnit) { } } -Preferences::DisplayMode Preferences::displayMode() const { +Float::DisplayMode Preferences::displayMode() const { return m_displayMode; } -void Preferences::setDisplayMode(DisplayMode displayMode) { +void Preferences::setDisplayMode(Float::DisplayMode displayMode) { if (displayMode != m_displayMode) { m_displayMode = displayMode; } diff --git a/apps/preferences.h b/apps/preferences.h index 40c494754..39c8aea52 100644 --- a/apps/preferences.h +++ b/apps/preferences.h @@ -1,16 +1,14 @@ #ifndef APPS_PREFERENCES_H #define APPS_PREFERENCES_H +#include + class Preferences { public: enum class AngleUnit { Degree = 0, Radian = 1 }; - enum class DisplayMode { - Auto = 0, - Scientific = 1 - }; enum class NumberType { Reel = 0, Complex = 1 @@ -26,8 +24,8 @@ public: Preferences(); AngleUnit angleUnit() const; void setAngleUnit(AngleUnit angleUnit); - DisplayMode displayMode() const; - void setDisplayMode(DisplayMode displayMode); + Float::DisplayMode displayMode() const; + void setDisplayMode(Float::DisplayMode displayMode); NumberType numberType() const; void setNumberType(NumberType numberType); ComplexFormat complexFormat() const; @@ -36,7 +34,7 @@ public: void setLanguage(Language language); private: AngleUnit m_angleUnit; - DisplayMode m_displayMode; + Float::DisplayMode m_displayMode; NumberType m_numberType; ComplexFormat m_complexFormat; Language m_language; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 9d3f514c2..58e2010bf 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -63,7 +63,7 @@ View * CalculationController::ContentView::subviewAtIndex(int index) { void CalculationController::ContentView::willDisplayEditableCellAtIndex(int index) { char buffer[Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; - Float(m_calculation->parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Decimal); + Float(m_calculation->parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Auto); m_calculationCell[index].setText(buffer); } diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index e10edb319..a33cece2d 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -102,7 +102,7 @@ void ParametersController::updateTitle() { 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, Float::DisplayMode::Decimal); + Float(m_law->parameterValueAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Auto); strlcpy(m_titleBuffer+currentChar, buffer, strlen(buffer)+1); currentChar += strlen(buffer); m_titleBuffer[currentChar++] = ' '; diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 87e4583cc..06b4a9cbd 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -83,7 +83,7 @@ void SubController::setPreferenceAtIndexWithValueIndex(int preferenceIndex, int m_preferences->setAngleUnit((Preferences::AngleUnit)valueIndex); break; case 1: - m_preferences->setDisplayMode((Preferences::DisplayMode)valueIndex); + m_preferences->setDisplayMode((Float::DisplayMode)valueIndex); break; case 2: m_preferences->setNumberType((Preferences::NumberType)valueIndex); diff --git a/apps/title_bar_view.cpp b/apps/title_bar_view.cpp index adf20a97e..3ec615bd3 100644 --- a/apps/title_bar_view.cpp +++ b/apps/title_bar_view.cpp @@ -47,7 +47,7 @@ void TitleBarView::layoutSubviews() { void TitleBarView::setPreferences(Preferences * preferences) { char buffer[13]; int numberOfChar = 0; - if (preferences->displayMode() == Preferences::DisplayMode::Scientific) { + if (preferences->displayMode() == Float::DisplayMode::Scientific) { strlcpy(buffer, "sci/", 5); numberOfChar += 4; } diff --git a/poincare/include/poincare/float.h b/poincare/include/poincare/float.h index 6c0fbaf54..3d85027fd 100644 --- a/poincare/include/poincare/float.h +++ b/poincare/include/poincare/float.h @@ -18,13 +18,13 @@ public: bool valueEquals(const Expression * e) const override; enum class DisplayMode { - Scientific, - Decimal + Auto, + Scientific }; void setNumberOfSignificantDigits(int numberOfDigits); /* The parameter 'DisplayMode' refers to the way to display float 'scientific' - * or 'decimal'. The scientific mode returns float with style -1.2E2 whereas - * the decimal mode tries to return 'natural' float like (0.021) and switches + * or 'auto'. The scientific mode returns float with style -1.2E2 whereas + * the auto mode tries to return 'natural' float like (0.021) and switches * to scientific mode if the float is too small or too big regarding the * number of significant difits. If the buffer size is too small to display * the right number of significant digits, the function forces the scientific @@ -42,7 +42,7 @@ public: private: /* We here define the buffer size to write the lengthest float possible. * At maximum, the number has 7 significant digits so, in the worst case it - * has the form -1.999999e-38 (7+6+1 char) (the decimal mode is always + * has the form -1.999999e-38 (7+6+1 char) (the auto mode is always * shorter. */ constexpr static int k_maxBufferLength = 7+6+1; /* convertFloatToTextPrivate return the string length of the buffer (does not count the 0 last char)*/ diff --git a/poincare/src/float.cpp b/poincare/src/float.cpp index c652a4942..002b14596 100644 --- a/poincare/src/float.cpp +++ b/poincare/src/float.cpp @@ -93,7 +93,7 @@ int Float::convertFloatToText(char * buffer, int bufferSize, * fit the buffer size. If the buffer size is still to small, we only write * the beginning of the float and truncate it (which can result in a non sense * text) */ - if (mode == DisplayMode::Decimal && requiredLength >= bufferSize) { + if (mode == DisplayMode::Auto && requiredLength >= bufferSize) { requiredLength = convertFloatToTextPrivate(tempBuffer, numberOfSignificantDigits, DisplayMode::Scientific); } if (requiredLength >= bufferSize) { @@ -132,7 +132,7 @@ int Float::convertFloatToTextPrivate(char * buffer, int numberOfSignificantDigit } DisplayMode displayMode = mode; - if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == DisplayMode::Decimal) { + if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == DisplayMode::Auto) { displayMode = DisplayMode::Scientific; } @@ -181,13 +181,13 @@ int Float::convertFloatToTextPrivate(char * buffer, int numberOfSignificantDigit } // Suppress the decimal marker if no fractional part - if (displayMode == DisplayMode::Decimal && availableCharsForMantissaWithoutSign == exponentInBase10+2) { + if (displayMode == DisplayMode::Auto && availableCharsForMantissaWithoutSign == exponentInBase10+2) { availableCharsForMantissaWithSign--; } // Print mantissa printBase10IntegerWithDecimalMarker(buffer, availableCharsForMantissaWithSign, mantissa, decimalMarkerPosition); - if (displayMode == DisplayMode::Decimal) { + if (displayMode == DisplayMode::Auto) { buffer[availableCharsForMantissaWithSign] = 0; return availableCharsForMantissaWithSign; } diff --git a/poincare/test/float.cpp b/poincare/test/float.cpp index ecc80170c..097eb28ff 100644 --- a/poincare/test/float.cpp +++ b/poincare/test/float.cpp @@ -25,21 +25,21 @@ QUIZ_CASE(poincare_float_to_text) { assert(strcmp(buffer, "0.0E0") == 0); Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7); assert(strcmp(buffer, "1.0E28") == 0); - Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Decimal); + Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); assert(strcmp(buffer, "1.0E28") == 0); - Float(1000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Decimal); + Float(1000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); assert(strcmp(buffer, "1000000") == 0); - Float(10000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Decimal); + Float(10000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); assert(strcmp(buffer, "1.0E7") == 0); - Float(0.000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Decimal); + Float(0.000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); assert(strcmp(buffer, "0.000001") == 0); - Float(0.0000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Decimal); + Float(0.0000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); assert(strcmp(buffer, "1.0E-7") == 0); char buffer2[6]; - Float(123.421f).convertFloatToText(buffer2, 6, 4, Float::DisplayMode::Decimal); + Float(123.421f).convertFloatToText(buffer2, 6, 4, Float::DisplayMode::Auto); assert(strcmp(buffer2, "123.4") == 0); char buffer3[6]; - Float(123.421f).convertFloatToText(buffer3, 6, 5, Float::DisplayMode::Decimal); + Float(123.421f).convertFloatToText(buffer3, 6, 5, Float::DisplayMode::Auto); assert(strcmp(buffer3, "1.2E2") == 0); } From 2ae41a3d4669a2a221c705dc7fb962966324b453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 30 Jan 2017 15:03:55 +0100 Subject: [PATCH 03/17] [apps/calculation] Enable to recompute calculation in history Change-Id: I6ad431ac4bd712acb48c7dc609846112a7fcb3e4 --- apps/calculation/history_controller.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index e17c93c87..0b053d021 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -66,9 +66,8 @@ bool HistoryController::handleEvent(Ion::Events::Event event) { } else { char outputText[Calculation::k_maximalExpressionTextLength]; calculation->output()->writeTextInBuffer(outputText, Calculation::k_maximalExpressionTextLength); - /* TODO: this will work when we will parse float */ - //App * calculationApp = (App *)app(); - //newCalculation.setContent(outputText, calculationApp->localContext()); + App * calculationApp = (App *)app(); + newCalculation.setContent(outputText, calculationApp->localContext()); } m_selectableTableView.deselectTable(); m_calculationStore->push(&newCalculation); From e95114029848cb8c734d69e0cdb275a41d088224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 10:25:23 +0100 Subject: [PATCH 04/17] [poincare] Change method createLayout() to createLayout(DisplayMode) Change-Id: Ifb1027d38b53a50a0ada80e11b68d44e72ac9099 --- apps/curve_view.cpp | 2 +- apps/graph/graph/graph_controller.cpp | 6 +++--- apps/preferences.cpp | 6 +++--- apps/preferences.h | 6 +++--- apps/probability/calculation_controller.cpp | 2 +- apps/probability/parameters_controller.cpp | 2 +- apps/settings/sub_controller.cpp | 2 +- apps/title_bar_view.cpp | 2 +- poincare/include/poincare/absolute_value.h | 2 +- poincare/include/poincare/addition.h | 2 +- poincare/include/poincare/expression.h | 6 +++++- poincare/include/poincare/float.h | 6 +----- poincare/include/poincare/fraction.h | 2 +- poincare/include/poincare/function.h | 2 +- poincare/include/poincare/integer.h | 2 +- poincare/include/poincare/integral.h | 2 +- poincare/include/poincare/logarithm.h | 2 +- poincare/include/poincare/matrix.h | 2 +- poincare/include/poincare/multiplication.h | 2 +- poincare/include/poincare/nth_root.h | 2 +- poincare/include/poincare/opposite.h | 2 +- poincare/include/poincare/parenthesis.h | 2 +- poincare/include/poincare/power.h | 2 +- poincare/include/poincare/product.h | 2 +- poincare/include/poincare/square_root.h | 2 +- poincare/include/poincare/subtraction.h | 2 +- poincare/include/poincare/sum.h | 2 +- poincare/include/poincare/symbol.h | 2 +- poincare/src/absolute_value.cpp | 4 ++-- poincare/src/addition.cpp | 6 +++--- poincare/src/float.cpp | 4 ++-- poincare/src/fraction.cpp | 4 ++-- poincare/src/function.cpp | 6 +++--- poincare/src/integer.cpp | 2 +- poincare/src/integral.cpp | 6 +++--- poincare/src/logarithm.cpp | 8 ++++---- poincare/src/matrix.cpp | 4 ++-- poincare/src/multiplication.cpp | 6 +++--- poincare/src/nth_root.cpp | 4 ++-- poincare/src/opposite.cpp | 4 ++-- poincare/src/parenthesis.cpp | 4 ++-- poincare/src/power.cpp | 4 ++-- poincare/src/product.cpp | 6 +++--- poincare/src/square_root.cpp | 4 ++-- poincare/src/subtraction.cpp | 6 +++--- poincare/src/sum.cpp | 6 +++--- poincare/src/symbol.cpp | 2 +- poincare/test/float.cpp | 14 +++++++------- 48 files changed, 90 insertions(+), 90 deletions(-) diff --git a/apps/curve_view.cpp b/apps/curve_view.cpp index 8e09dd6e7..5acfbe2e0 100644 --- a/apps/curve_view.cpp +++ b/apps/curve_view.cpp @@ -83,7 +83,7 @@ void CurveView::computeLabels(Axis axis) { for (int index = 0; index < numberOfLabels(axis); index++) { Float(2.0f*step*(ceilf(min(axis)/(2.0f*step)))+index*2.0f*step).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), - Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Auto); + Constant::ShortNumberOfSignificantDigits, Expression::DisplayMode::Auto); //TODO: check for size of label? strlcpy(label(axis, index), buffer, strlen(buffer)+1); } diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index c4469daa9..3f9dc1b9e 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -113,7 +113,7 @@ void GraphController::reloadBannerView() { const char * legend = "x = "; int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); - Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); + Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer, 0); legend = "00(x) = "; @@ -121,7 +121,7 @@ void GraphController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); Function * f = m_functionStore->activeFunctionAtIndex(m_indexFunctionSelectedByCursor); buffer[1] = f->name()[0]; - Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); + Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer+1, 1); if (m_bannerView.displayDerivative()) { @@ -129,7 +129,7 @@ void GraphController::reloadBannerView() { buffer[1] = '\''; App * graphApp = (Graph::App *)app(); float y = f->approximateDerivative(m_cursor.x(), graphApp->localContext()); - Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Float::DisplayMode::Auto); + Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); m_bannerView.setLegendAtIndex(buffer, 2); } } diff --git a/apps/preferences.cpp b/apps/preferences.cpp index ae0a744d1..6a0d92337 100644 --- a/apps/preferences.cpp +++ b/apps/preferences.cpp @@ -2,7 +2,7 @@ Preferences::Preferences() : m_angleUnit(AngleUnit::Degree), - m_displayMode(Float::DisplayMode::Auto), + m_displayMode(Expression::DisplayMode::Auto), m_numberType(NumberType::Reel), m_complexFormat(ComplexFormat::Cartesian), m_language(Language::French) @@ -19,11 +19,11 @@ void Preferences::setAngleUnit(AngleUnit angleUnit) { } } -Float::DisplayMode Preferences::displayMode() const { +Expression::DisplayMode Preferences::displayMode() const { return m_displayMode; } -void Preferences::setDisplayMode(Float::DisplayMode displayMode) { +void Preferences::setDisplayMode(Expression::DisplayMode displayMode) { if (displayMode != m_displayMode) { m_displayMode = displayMode; } diff --git a/apps/preferences.h b/apps/preferences.h index 39c8aea52..b694d70b6 100644 --- a/apps/preferences.h +++ b/apps/preferences.h @@ -24,8 +24,8 @@ public: Preferences(); AngleUnit angleUnit() const; void setAngleUnit(AngleUnit angleUnit); - Float::DisplayMode displayMode() const; - void setDisplayMode(Float::DisplayMode displayMode); + Expression::DisplayMode displayMode() const; + void setDisplayMode(Expression::DisplayMode displayMode); NumberType numberType() const; void setNumberType(NumberType numberType); ComplexFormat complexFormat() const; @@ -34,7 +34,7 @@ public: void setLanguage(Language language); private: AngleUnit m_angleUnit; - Float::DisplayMode m_displayMode; + Expression::DisplayMode m_displayMode; NumberType m_numberType; ComplexFormat m_complexFormat; Language m_language; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 58e2010bf..9f4b72ad2 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -63,7 +63,7 @@ View * CalculationController::ContentView::subviewAtIndex(int index) { void CalculationController::ContentView::willDisplayEditableCellAtIndex(int index) { char buffer[Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; - Float(m_calculation->parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Float::DisplayMode::Auto); + Float(m_calculation->parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Expression::DisplayMode::Auto); m_calculationCell[index].setText(buffer); } diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index a33cece2d..1e3e2c45b 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -102,7 +102,7 @@ void ParametersController::updateTitle() { 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, Float::DisplayMode::Auto); + 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++] = ' '; diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 06b4a9cbd..8238af296 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -83,7 +83,7 @@ void SubController::setPreferenceAtIndexWithValueIndex(int preferenceIndex, int m_preferences->setAngleUnit((Preferences::AngleUnit)valueIndex); break; case 1: - m_preferences->setDisplayMode((Float::DisplayMode)valueIndex); + m_preferences->setDisplayMode((Expression::DisplayMode)valueIndex); break; case 2: m_preferences->setNumberType((Preferences::NumberType)valueIndex); diff --git a/apps/title_bar_view.cpp b/apps/title_bar_view.cpp index 3ec615bd3..c4a2c1380 100644 --- a/apps/title_bar_view.cpp +++ b/apps/title_bar_view.cpp @@ -47,7 +47,7 @@ void TitleBarView::layoutSubviews() { void TitleBarView::setPreferences(Preferences * preferences) { char buffer[13]; int numberOfChar = 0; - if (preferences->displayMode() == Float::DisplayMode::Scientific) { + if (preferences->displayMode() == Expression::DisplayMode::Scientific) { strlcpy(buffer, "sci/", 5); numberOfChar += 4; } diff --git a/poincare/include/poincare/absolute_value.h b/poincare/include/poincare/absolute_value.h index 8fb91d56f..c1fd0591d 100644 --- a/poincare/include/poincare/absolute_value.h +++ b/poincare/include/poincare/absolute_value.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index f31bdadbf..7767e9f69 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -17,7 +17,7 @@ class Addition : public Expression { Expression * clone() const override; Expression * cloneWithDifferentOperands(Expression** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; bool isCommutative() const override; private: float operateApproximatevelyOn(float a, float b) const; diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 33b1cd746..6b6eacdab 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -33,10 +33,14 @@ class Expression { Symbol, Tangent, }; + enum class DisplayMode { + Auto = 0, + Scientific = 1 + }; static Expression * parse(char const * string); virtual ~Expression(); - virtual ExpressionLayout * createLayout() const = 0; // Returned object must be deleted + virtual ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const = 0; // Returned object must be deleted virtual const Expression * operand(int i) const = 0; virtual int numberOfOperands() const = 0; virtual Expression * clone() const = 0; diff --git a/poincare/include/poincare/float.h b/poincare/include/poincare/float.h index 3d85027fd..15e5df79a 100644 --- a/poincare/include/poincare/float.h +++ b/poincare/include/poincare/float.h @@ -10,17 +10,13 @@ public: const char * fractionalPart, int fractionalPartLength, const char * exponent, int exponentLength, bool exponentNegative); - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * evaluate(Context& context) const override; Type type() const override; Expression * clone() const override; bool valueEquals(const Expression * e) const override; - enum class DisplayMode { - Auto, - Scientific - }; void setNumberOfSignificantDigits(int numberOfDigits); /* The parameter 'DisplayMode' refers to the way to display float 'scientific' * or 'auto'. The scientific mode returns float with style -1.2E2 whereas diff --git a/poincare/include/poincare/fraction.h b/poincare/include/poincare/fraction.h index 96a0c5987..1d7eac4db 100644 --- a/poincare/include/poincare/fraction.h +++ b/poincare/include/poincare/fraction.h @@ -8,7 +8,7 @@ class Fraction : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Type type() const override; Expression * cloneWithDifferentOperands(Expression** newOperands, diff --git a/poincare/include/poincare/function.h b/poincare/include/poincare/function.h index 173b54881..36319c209 100644 --- a/poincare/include/poincare/function.h +++ b/poincare/include/poincare/function.h @@ -13,7 +13,7 @@ public: ~Function(); void setArgument(Expression ** args, int numberOfArguments, bool clone = true); void setArgument(ListData * listData, bool clone = true); - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; const Expression * operand(int i) const override; int numberOfOperands() const override; Expression * clone() const override; diff --git a/poincare/include/poincare/integer.h b/poincare/include/poincare/integer.h index df8491fa9..c6ab9a488 100644 --- a/poincare/include/poincare/integer.h +++ b/poincare/include/poincare/integer.h @@ -31,7 +31,7 @@ class Integer : public LeafExpression { bool valueEquals(const Expression * e) const override; Expression * clone() const override; - virtual ExpressionLayout * createLayout() const override; + virtual ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * evaluate(Context& context) const override; private: diff --git a/poincare/include/poincare/integral.h b/poincare/include/poincare/integral.h index fe4aab97f..beaf25765 100644 --- a/poincare/include/poincare/integral.h +++ b/poincare/include/poincare/integral.h @@ -11,7 +11,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; private: struct DetailedResult { diff --git a/poincare/include/poincare/logarithm.h b/poincare/include/poincare/logarithm.h index 38bfba520..77f1d943d 100644 --- a/poincare/include/poincare/logarithm.h +++ b/poincare/include/poincare/logarithm.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/matrix.h b/poincare/include/poincare/matrix.h index 84da1a2eb..028352c30 100644 --- a/poincare/include/poincare/matrix.h +++ b/poincare/include/poincare/matrix.h @@ -13,7 +13,7 @@ class Matrix : public Expression { const Expression * operand(int i) const override; int numberOfOperands() const override; Expression * clone() const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * evaluate(Context& context) const override; Type type() const override; diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index e03d20905..907273ecb 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -9,7 +9,7 @@ class Multiplication : public BinaryOperation { using BinaryOperation::BinaryOperation; public: Type type() const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * cloneWithDifferentOperands(Expression** newOperands, int numnerOfOperands, bool cloneOperands = true) const override; diff --git a/poincare/include/poincare/nth_root.h b/poincare/include/poincare/nth_root.h index 9880ba20f..b9bb45693 100644 --- a/poincare/include/poincare/nth_root.h +++ b/poincare/include/poincare/nth_root.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index e17796cec..828110254 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -13,7 +13,7 @@ class Opposite : public Expression { int numberOfOperands() const override; Expression * clone() const override; Expression * evaluate(Context& context) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Type type() const override; Expression * cloneWithDifferentOperands(Expression** newOperands, diff --git a/poincare/include/poincare/parenthesis.h b/poincare/include/poincare/parenthesis.h index 5b183ad87..3c5bf103f 100644 --- a/poincare/include/poincare/parenthesis.h +++ b/poincare/include/poincare/parenthesis.h @@ -10,7 +10,7 @@ class Parenthesis : public Expression { const Expression * operand(int i) const override; int numberOfOperands() const override; Expression * clone() const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * evaluate(Context& context) const override; Type type() const override; diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index 746f53659..54f22e4f5 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -9,7 +9,7 @@ class Power : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Type type() const override; Expression * cloneWithDifferentOperands(Expression** newOperands, diff --git a/poincare/include/poincare/product.h b/poincare/include/poincare/product.h index 7096461a1..248092658 100644 --- a/poincare/include/poincare/product.h +++ b/poincare/include/poincare/product.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/square_root.h b/poincare/include/poincare/square_root.h index 766d7d753..abe81f2ec 100644 --- a/poincare/include/poincare/square_root.h +++ b/poincare/include/poincare/square_root.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index 6194fa151..e6516dded 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -9,7 +9,7 @@ class Subtraction : public BinaryOperation { using BinaryOperation::BinaryOperation; public: - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Type type() const override; Expression * cloneWithDifferentOperands(Expression** newOperands, diff --git a/poincare/include/poincare/sum.h b/poincare/include/poincare/sum.h index b7311eabd..4903ae09f 100644 --- a/poincare/include/poincare/sum.h +++ b/poincare/include/poincare/sum.h @@ -10,7 +10,7 @@ public: Type type() const override; Expression * cloneWithDifferentOperands(Expression ** newOperands, int numberOfOperands, bool cloneOperands = true) const override; - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; }; #endif diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index 6b80bfdd3..cf33aa767 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -9,7 +9,7 @@ public: Ans = '^' }; Symbol(char name); - ExpressionLayout * createLayout() const override; + ExpressionLayout * createLayout(DisplayMode displayMode = DisplayMode::Auto) const override; float approximate(Context& context) const override; Expression * evaluate(Context& context) const override; Type type() const override; diff --git a/poincare/src/absolute_value.cpp b/poincare/src/absolute_value.cpp index b3d657652..3306463e4 100644 --- a/poincare/src/absolute_value.cpp +++ b/poincare/src/absolute_value.cpp @@ -28,6 +28,6 @@ float AbsoluteValue::approximate(Context& context) const { return fabsf(m_args[0]->approximate(context)); } -ExpressionLayout * AbsoluteValue::createLayout() const { - return new AbsoluteValueLayout(m_args[0]->createLayout()); +ExpressionLayout * AbsoluteValue::createLayout(DisplayMode displayMode) const { + return new AbsoluteValueLayout(m_args[0]->createLayout(displayMode)); } \ No newline at end of file diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index c63fb06e9..8422f241b 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -76,13 +76,13 @@ Expression * Addition::cloneWithDifferentOperands(Expression** newOperands, return new Addition(newOperands, numberOfOperands, cloneOperands); } -ExpressionLayout * Addition::createLayout() const { +ExpressionLayout * Addition::createLayout(DisplayMode displayMode) const { int number_of_children = 2*m_numberOfOperands-1; ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(number_of_children*sizeof(ExpressionLayout *)); - children_layouts[0] = m_operands[0]->createLayout(); + children_layouts[0] = m_operands[0]->createLayout(displayMode); for (int i=1; itype() == Type::Opposite ? new ParenthesisLayout(m_operands[i]->createLayout()) : m_operands[i]->createLayout(); + children_layouts[2*i] = m_operands[i]->type() == Type::Opposite ? new ParenthesisLayout(m_operands[i]->createLayout(displayMode)) : m_operands[i]->createLayout(displayMode); } return new HorizontalLayout(children_layouts, number_of_children); } diff --git a/poincare/src/float.cpp b/poincare/src/float.cpp index 002b14596..39a978104 100644 --- a/poincare/src/float.cpp +++ b/poincare/src/float.cpp @@ -65,9 +65,9 @@ Expression::Type Float::type() const { return Type::Float; } -ExpressionLayout * Float::createLayout() const { +ExpressionLayout * Float::createLayout(DisplayMode displayMode) const { char buffer[k_maxBufferLength]; - convertFloatToText(buffer, k_maxBufferLength, m_numberOfSignificantDigits); + convertFloatToText(buffer, k_maxBufferLength, m_numberOfSignificantDigits, displayMode); int size = 0; while (buffer[size] != 0) { size++; diff --git a/poincare/src/fraction.cpp b/poincare/src/fraction.cpp index 692b3ec76..00a0373d8 100644 --- a/poincare/src/fraction.cpp +++ b/poincare/src/fraction.cpp @@ -13,8 +13,8 @@ Expression * Fraction::cloneWithDifferentOperands(Expression** newOperands, return new Fraction(newOperands, cloneOperands); } -ExpressionLayout * Fraction::createLayout() const { - return new FractionLayout(m_operands[0]->createLayout(), m_operands[1]->createLayout()); +ExpressionLayout * Fraction::createLayout(DisplayMode displayMode) const { + return new FractionLayout(m_operands[0]->createLayout(displayMode), m_operands[1]->createLayout(displayMode)); } float Fraction::approximate(Context& context) const { diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index f2de243ea..64666ee7f 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -65,13 +65,13 @@ Expression * Function::clone() const { return this->cloneWithDifferentOperands(m_args, m_numberOfArguments, true); } -ExpressionLayout * Function::createLayout() const { +ExpressionLayout * Function::createLayout(DisplayMode displayMode) const { ExpressionLayout ** grandChildrenLayouts = (ExpressionLayout **)malloc((2*m_numberOfArguments-1)*sizeof(ExpressionLayout *)); int layoutIndex = 0; - grandChildrenLayouts[layoutIndex++] = m_args[0]->createLayout(); + grandChildrenLayouts[layoutIndex++] = m_args[0]->createLayout(displayMode); for (int i = 1; i < m_numberOfArguments; i++) { grandChildrenLayouts[layoutIndex++] = new StringLayout(",", 1); - grandChildrenLayouts[layoutIndex++] = m_args[i]->createLayout(); + grandChildrenLayouts[layoutIndex++] = m_args[i]->createLayout(displayMode); } ExpressionLayout * argumentLayouts = new HorizontalLayout(grandChildrenLayouts, 2*m_numberOfArguments-1); ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index fa40731ff..ffa6be176 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -316,7 +316,7 @@ Expression::Type Integer::type() const { return Type::Integer; } -ExpressionLayout * Integer::createLayout() const { +ExpressionLayout * Integer::createLayout(DisplayMode displayMode) const { char buffer[255]; Integer base = Integer(10); diff --git a/poincare/src/integral.cpp b/poincare/src/integral.cpp index c853474a7..ad99cf7e6 100644 --- a/poincare/src/integral.cpp +++ b/poincare/src/integral.cpp @@ -41,11 +41,11 @@ float Integral::approximate(Context& context) const { #endif } -ExpressionLayout * Integral::createLayout() const { +ExpressionLayout * Integral::createLayout(DisplayMode displayMode) const { ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); - childrenLayouts[0] = m_args[0]->createLayout(); + childrenLayouts[0] = m_args[0]->createLayout(displayMode); childrenLayouts[1] = new StringLayout("dx", 2); - return new IntegralLayout(m_args[1]->createLayout(), m_args[2]->createLayout(), new HorizontalLayout(childrenLayouts, 2)); + return new IntegralLayout(m_args[1]->createLayout(displayMode), m_args[2]->createLayout(displayMode), new HorizontalLayout(childrenLayouts, 2)); } float Integral::functionValueAtAbscissa(float x, VariableContext xContext) const { diff --git a/poincare/src/logarithm.cpp b/poincare/src/logarithm.cpp index 3b3d3dcc5..55bb812c8 100644 --- a/poincare/src/logarithm.cpp +++ b/poincare/src/logarithm.cpp @@ -34,12 +34,12 @@ float Logarithm::approximate(Context& context) const { return log10f(m_args[1]->approximate(context))/log10f(m_args[0]->approximate(context)); } -ExpressionLayout * Logarithm::createLayout() const { +ExpressionLayout * Logarithm::createLayout(DisplayMode displayMode) const { if (m_numberOfArguments == 1) { - return Function::createLayout(); + return Function::createLayout(displayMode); } ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); - childrenLayouts[0] = new BaselineRelativeLayout(new StringLayout(m_name, strlen(m_name)), m_args[0]->createLayout(), BaselineRelativeLayout::Type::Subscript); - childrenLayouts[1] = new ParenthesisLayout(m_args[1]->createLayout()); + childrenLayouts[0] = new BaselineRelativeLayout(new StringLayout(m_name, strlen(m_name)), m_args[0]->createLayout(displayMode), BaselineRelativeLayout::Type::Subscript); + childrenLayouts[1] = new ParenthesisLayout(m_args[1]->createLayout(displayMode)); return new HorizontalLayout(childrenLayouts, 2); } diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 976606b25..fc33c83fd 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -41,10 +41,10 @@ Expression * Matrix::clone() const { return this->cloneWithDifferentOperands(m_matrixData->operands(), numberOfOperands(), true); } -ExpressionLayout * Matrix::createLayout() const { +ExpressionLayout * Matrix::createLayout(DisplayMode displayMode) const { ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(numberOfOperands()*sizeof(ExpressionLayout *)); for (int i = 0; i < numberOfOperands(); i++) { - childrenLayouts[i] = operand(i)->createLayout(); + childrenLayouts[i] = operand(i)->createLayout(displayMode); } return new MatrixLayout(childrenLayouts, numberOfRows(), numberOfColumns()); } diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index f216e33ea..0d7a9f285 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -12,11 +12,11 @@ Expression::Type Multiplication::type() const { return Expression::Type::Multiplication; } -ExpressionLayout * Multiplication::createLayout() const { +ExpressionLayout * Multiplication::createLayout(DisplayMode displayMode) const { ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(3*sizeof(ExpressionLayout *)); - children_layouts[0] = m_operands[0]->createLayout(); + children_layouts[0] = m_operands[0]->createLayout(displayMode); children_layouts[1] = new StringLayout("*", 1); - children_layouts[2] = m_operands[1]->type() == Type::Opposite ? new ParenthesisLayout(m_operands[1]->createLayout()) : m_operands[1]->createLayout(); + children_layouts[2] = m_operands[1]->type() == Type::Opposite ? new ParenthesisLayout(m_operands[1]->createLayout(displayMode)) : m_operands[1]->createLayout(displayMode); return new HorizontalLayout(children_layouts, 3); } diff --git a/poincare/src/nth_root.cpp b/poincare/src/nth_root.cpp index d379b065d..759f6c85d 100644 --- a/poincare/src/nth_root.cpp +++ b/poincare/src/nth_root.cpp @@ -28,6 +28,6 @@ float NthRoot::approximate(Context& context) const { return powf(m_args[0]->approximate(context), 1.0f/m_args[1]->approximate(context)); } -ExpressionLayout * NthRoot::createLayout() const { - return new NthRootLayout(m_args[0]->createLayout(), m_args[1]->createLayout()); +ExpressionLayout * NthRoot::createLayout(DisplayMode displayMode) const { + return new NthRootLayout(m_args[0]->createLayout(displayMode), m_args[1]->createLayout(displayMode)); } \ No newline at end of file diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index 99834ef16..fd1f355d1 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -49,11 +49,11 @@ Expression * Opposite::evaluate(Context& context) const { return result; } -ExpressionLayout * Opposite::createLayout() const { +ExpressionLayout * Opposite::createLayout(DisplayMode displayMode) const { ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); char string[2] = {'-', '\0'}; children_layouts[0] = new StringLayout(string, 1); - children_layouts[1] = m_operand->type() == Type::Opposite ? new ParenthesisLayout(m_operand->createLayout()) : m_operand->createLayout(); + children_layouts[1] = m_operand->type() == Type::Opposite ? new ParenthesisLayout(m_operand->createLayout(displayMode)) : m_operand->createLayout(displayMode); return new HorizontalLayout(children_layouts, 2); } diff --git a/poincare/src/parenthesis.cpp b/poincare/src/parenthesis.cpp index 250f82a35..1bd678e05 100644 --- a/poincare/src/parenthesis.cpp +++ b/poincare/src/parenthesis.cpp @@ -31,8 +31,8 @@ Expression * Parenthesis::clone() const { return this->cloneWithDifferentOperands((Expression**) &m_operand, 1, true); } -ExpressionLayout * Parenthesis::createLayout() const { - return new ParenthesisLayout(m_operand->createLayout()); +ExpressionLayout * Parenthesis::createLayout(DisplayMode displayMode) const { + return new ParenthesisLayout(m_operand->createLayout(displayMode)); } float Parenthesis::approximate(Context& context) const { diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 96bc42078..2beb35070 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -43,11 +43,11 @@ Expression * Power::cloneWithDifferentOperands(Expression** newOperands, return new Power(newOperands, cloneOperands); } -ExpressionLayout * Power::createLayout() const { +ExpressionLayout * Power::createLayout(DisplayMode displayMode) const { Expression * indiceOperand = m_operands[1]; // Delete eventual parentheses of the indice in the pretty print if (m_operands[1]->type() == Type::Parenthesis) { indiceOperand = (Expression *)m_operands[1]->operand(0); } - return new BaselineRelativeLayout(m_operands[0]->createLayout(),indiceOperand->createLayout(), BaselineRelativeLayout::Type::Superscript); + return new BaselineRelativeLayout(m_operands[0]->createLayout(displayMode),indiceOperand->createLayout(displayMode), BaselineRelativeLayout::Type::Superscript); } diff --git a/poincare/src/product.cpp b/poincare/src/product.cpp index 2765e736c..fb4f7dc79 100644 --- a/poincare/src/product.cpp +++ b/poincare/src/product.cpp @@ -42,9 +42,9 @@ float Product::approximate(Context& context) const { return result; } -ExpressionLayout * Product::createLayout() const { +ExpressionLayout * Product::createLayout(DisplayMode displayMode) const { ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); childrenLayouts[0] = new StringLayout("n=", 2); - childrenLayouts[1] = m_args[1]->createLayout(); - return new ProductLayout(new HorizontalLayout(childrenLayouts, 2), m_args[2]->createLayout(), m_args[0]->createLayout()); + childrenLayouts[1] = m_args[1]->createLayout(displayMode); + return new ProductLayout(new HorizontalLayout(childrenLayouts, 2), m_args[2]->createLayout(displayMode), m_args[0]->createLayout(displayMode)); } diff --git a/poincare/src/square_root.cpp b/poincare/src/square_root.cpp index 2456de922..ed07983e9 100644 --- a/poincare/src/square_root.cpp +++ b/poincare/src/square_root.cpp @@ -28,6 +28,6 @@ float SquareRoot::approximate(Context& context) const { return powf(m_args[0]->approximate(context), 1.0f/2.0f); } -ExpressionLayout * SquareRoot::createLayout() const { - return new NthRootLayout(m_args[0]->createLayout(),nullptr); +ExpressionLayout * SquareRoot::createLayout(DisplayMode displayMode) const { + return new NthRootLayout(m_args[0]->createLayout(displayMode),nullptr); } \ No newline at end of file diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index 7df835b29..a7f6a3e73 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -23,12 +23,12 @@ Expression::Type Subtraction::type() const { return Expression::Type::Subtraction; } -ExpressionLayout * Subtraction::createLayout() const { +ExpressionLayout * Subtraction::createLayout(DisplayMode displayMode) const { ExpressionLayout** children_layouts = (ExpressionLayout **)malloc(3*sizeof(ExpressionLayout *)); - children_layouts[0] = m_operands[0]->createLayout(); + children_layouts[0] = m_operands[0]->createLayout(displayMode); char string[2] = {'-', '\0'}; children_layouts[1] = new StringLayout(string, 1); - children_layouts[2] = m_operands[1]->type() == Type::Opposite ? new ParenthesisLayout(m_operands[1]->createLayout()) : m_operands[1]->createLayout(); + children_layouts[2] = m_operands[1]->type() == Type::Opposite ? new ParenthesisLayout(m_operands[1]->createLayout(displayMode)) : m_operands[1]->createLayout(displayMode); return new HorizontalLayout(children_layouts, 3); } diff --git a/poincare/src/sum.cpp b/poincare/src/sum.cpp index 4700b0257..49f005cbe 100644 --- a/poincare/src/sum.cpp +++ b/poincare/src/sum.cpp @@ -42,9 +42,9 @@ float Sum::approximate(Context& context) const { return result; } -ExpressionLayout * Sum::createLayout() const { +ExpressionLayout * Sum::createLayout(DisplayMode displayMode) const { ExpressionLayout ** childrenLayouts = (ExpressionLayout **)malloc(2*sizeof(ExpressionLayout *)); childrenLayouts[0] = new StringLayout("n=", 2); - childrenLayouts[1] = m_args[1]->createLayout(); - return new SumLayout(new HorizontalLayout(childrenLayouts, 2), m_args[2]->createLayout(), m_args[0]->createLayout()); + childrenLayouts[1] = m_args[1]->createLayout(displayMode); + return new SumLayout(new HorizontalLayout(childrenLayouts, 2), m_args[2]->createLayout(displayMode), m_args[0]->createLayout(displayMode)); } diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index 33aefd4c1..71bd034f2 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -31,7 +31,7 @@ const char Symbol::name() const { return m_name; } -ExpressionLayout * Symbol::createLayout() const { +ExpressionLayout * Symbol::createLayout(DisplayMode displayMode) const { if (m_name == SpecialSymbols::Ans) { return new StringLayout("ans", 4); } diff --git a/poincare/test/float.cpp b/poincare/test/float.cpp index 097eb28ff..d65fc34c5 100644 --- a/poincare/test/float.cpp +++ b/poincare/test/float.cpp @@ -25,21 +25,21 @@ QUIZ_CASE(poincare_float_to_text) { assert(strcmp(buffer, "0.0E0") == 0); Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7); assert(strcmp(buffer, "1.0E28") == 0); - Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); + Float(10000000000000000000000000000.0f).convertFloatToText(buffer, 14, 7, Expression::DisplayMode::Auto); assert(strcmp(buffer, "1.0E28") == 0); - Float(1000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); + Float(1000000.0f).convertFloatToText(buffer, 14, 7, Expression::DisplayMode::Auto); assert(strcmp(buffer, "1000000") == 0); - Float(10000000.0f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); + Float(10000000.0f).convertFloatToText(buffer, 14, 7, Expression::DisplayMode::Auto); assert(strcmp(buffer, "1.0E7") == 0); - Float(0.000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); + Float(0.000001f).convertFloatToText(buffer, 14, 7, Expression::DisplayMode::Auto); assert(strcmp(buffer, "0.000001") == 0); - Float(0.0000001f).convertFloatToText(buffer, 14, 7, Float::DisplayMode::Auto); + Float(0.0000001f).convertFloatToText(buffer, 14, 7, Expression::DisplayMode::Auto); assert(strcmp(buffer, "1.0E-7") == 0); char buffer2[6]; - Float(123.421f).convertFloatToText(buffer2, 6, 4, Float::DisplayMode::Auto); + Float(123.421f).convertFloatToText(buffer2, 6, 4, Expression::DisplayMode::Auto); assert(strcmp(buffer2, "123.4") == 0); char buffer3[6]; - Float(123.421f).convertFloatToText(buffer3, 6, 5, Float::DisplayMode::Auto); + Float(123.421f).convertFloatToText(buffer3, 6, 5, Expression::DisplayMode::Auto); assert(strcmp(buffer3, "1.2E2") == 0); } From 689c43c640123b06e426c324a1101fbef3b51479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 10:30:48 +0100 Subject: [PATCH 05/17] [kandinsky] [apps/probability] Clean deleted files Change-Id: I3cf8fc422f48904356e6c1555cfd752d144d68c9 --- apps/probability/images/probability_icon.png | Bin 440 -> 0 bytes kandinsky/fonts/ProggyClean.ttf | Bin 41208 -> 0 bytes kandinsky/fonts/largePixelFont.ttf | Bin 223324 -> 0 bytes kandinsky/fonts/smallPixelFont.ttf | Bin 170944 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/probability/images/probability_icon.png delete mode 100644 kandinsky/fonts/ProggyClean.ttf delete mode 100644 kandinsky/fonts/largePixelFont.ttf delete mode 100644 kandinsky/fonts/smallPixelFont.ttf diff --git a/apps/probability/images/probability_icon.png b/apps/probability/images/probability_icon.png deleted file mode 100644 index e8dbe4dc8b7b86db79487598e18d7575d749d014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&o z%G1R$B;xSVb8C4U0(e*+EOu;6Qj=lcC@Vej!G;AM91s6~zqRVyx<{{{mG0m6xaIl@ zquv?I5AriG%;TsO({I_s&)-tRoZa%Lbs7h!Xc$N5R51=u+YN%A4AK)>6O=YF>bM9t zG-|MAD6e9e)sfX8wuo~UzPMpgy}VcN%xP&DM`r(~v8;?|&ER@VpAAPKS|I6tkVJh3R1 k!7(L2DOJHUH!(dmC^a#qvhZXoC^#8BUHx3vIVCg!07C1A?*IS* diff --git a/kandinsky/fonts/ProggyClean.ttf b/kandinsky/fonts/ProggyClean.ttf deleted file mode 100644 index 0270cdfe3caa811e1b252cdcc5b179989c1b8ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41208 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%0AgIm#BK$TI}|a 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

o0<@n1n=#Rgg ze7OL{e7XGcKS6)`=EFJOCsBr~ohkV1r!1JOG3scd!KX1uO@`Dgd+q7yuXpU=n~C0OkQ$0$>$r z=M7V7f$$yxhX9-aa1Ou~0Ji`NKyEI90E7VHa1h8P3V>Ju z5&%dB00ICUc#i^pu>b(ygK!}OKm&jY00#g*03raS04M;B3pMBm7aa)vyl0wezt__w z-OqcLrXefu@W_N_Bv5U>&fbkWUEXVP2JnD*9=DcW+wlHPRJ@x1r`(}MMWn)l!S zR2M+{p3UnlPf!pj3Fvb$5E6s|;Xx#zk1;@O5Dz2-NkDRt3Zw=4-xz2TGz0X&CD1Bp z1L%W$phM6J&iicV8mI=u1}}mCJ$MEDAHe?+ybk_P z;QtKt@xKD^fd3147yMtrd*J^D-Ut78@B#R*!I$8_0pEh}z<>AU3>XW30Mh*rKqUS* z_zC3m@~cQ~+oJFaR(Hz$5^sv)*|C zmH=1u= diff --git a/kandinsky/fonts/smallPixelFont.ttf b/kandinsky/fonts/smallPixelFont.ttf deleted file mode 100644 index 9f5671cc393869fa9472e1808cecb368f0d072c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170944 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 From b37688745e2743319303cbda5cb8ccd00c559611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 10:31:30 +0100 Subject: [PATCH 06/17] [apps/calculation] Create input and output layout according to display mode set in preference Change-Id: If161958b2fcdad802fda5f8e0c44f8a5fc9d9ef1 --- apps/apps_container.cpp | 2 +- apps/calculation/app.cpp | 7 +- apps/calculation/app.h | 5 +- apps/calculation/calculation.cpp | 95 ++++++++----------- apps/calculation/calculation.h | 13 ++- apps/calculation/calculation_store.cpp | 8 +- apps/calculation/calculation_store.h | 3 +- .../edit_expression_controller.cpp | 4 +- apps/calculation/history_controller.cpp | 10 +- 9 files changed, 74 insertions(+), 73 deletions(-) diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index d2c8599db..e395b13af 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -10,7 +10,7 @@ AppsContainer::AppsContainer() : m_homeApp(this), m_graphApp(this, &m_globalContext), m_probabilityApp(this), - m_calculationApp(this, &m_globalContext), + m_calculationApp(this, &m_globalContext, &m_preferences), m_regressionApp(this), m_settingsApp(this, &m_preferences), m_statisticsApp(this), diff --git a/apps/calculation/app.cpp b/apps/calculation/app.cpp index aa703240b..737c56172 100644 --- a/apps/calculation/app.cpp +++ b/apps/calculation/app.cpp @@ -3,9 +3,10 @@ namespace Calculation { -App::App(Container * container, Context * context) : +App::App(Container * container, Context * context, Preferences * preferences) : TextFieldDelegateApp(container, &m_editExpressionController, "Calculs", "CALCULS", ImageStore::CalculationIcon), m_localContext(LocalContext((GlobalContext *)context, &m_calculationStore)), + m_preferences(preferences), m_calculationStore(CalculationStore()), m_historyController(HistoryController(&m_editExpressionController, &m_calculationStore)), m_editExpressionController(EditExpressionController(&m_modalViewController, &m_historyController, &m_calculationStore)) @@ -16,4 +17,8 @@ Context * App::localContext() { return &m_localContext; } +Preferences * App::preferences() { + return m_preferences; +} + } diff --git a/apps/calculation/app.h b/apps/calculation/app.h index d16b11d57..5ed227e23 100644 --- a/apps/calculation/app.h +++ b/apps/calculation/app.h @@ -5,16 +5,19 @@ #include "local_context.h" #include "history_controller.h" #include "../text_field_delegate_app.h" +#include "../preferences.h" #include namespace Calculation { class App : public TextFieldDelegateApp { public: - App(Container * container, Context * context); + App(Container * container, Context * context, Preferences * preferences); Context * localContext() override; + Preferences * preferences(); private: LocalContext m_localContext; + Preferences * m_preferences; CalculationStore m_calculationStore; HistoryController m_historyController; EditExpressionController m_editExpressionController; diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 8e967b41d..349f2b966 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -11,59 +11,6 @@ Calculation::Calculation() : { } -Calculation & Calculation::operator= (const Calculation & other) { - strlcpy(m_text, other.m_text, sizeof(m_text)); - if (m_input != nullptr) { - delete m_input; - } - m_input = nullptr; - if (other.m_input) { - m_input = Expression::parse(m_text); - } - if (m_inputLayout != nullptr) { - delete m_inputLayout; - } - m_inputLayout = nullptr; - if (m_input && other.m_inputLayout) { - m_inputLayout = m_input->createLayout(); - } - if (m_output != nullptr) { - delete m_output; - } - m_output = nullptr; - if (other.m_output) { - m_output = other.m_output->clone(); - } - if (m_outputLayout != nullptr) { - delete m_outputLayout; - } - m_outputLayout = nullptr; - if (m_output && other.m_outputLayout) { - m_outputLayout = m_output->createLayout(); - } - return *this; -} - -void Calculation::setContent(const char * c, Context * context) { - strlcpy(m_text, c, sizeof(m_text)); - if (m_input != nullptr) { - delete m_input; - } - m_input = Expression::parse(m_text); - if (m_inputLayout != nullptr) { - delete m_inputLayout; - } - m_inputLayout = m_input->createLayout(); - if (m_output != nullptr) { - delete m_outputLayout; - } - m_output = m_input->evaluate(*context); - if (m_outputLayout != nullptr) { - delete m_outputLayout; - } - m_outputLayout = m_output->createLayout(); -} - Calculation::~Calculation() { if (m_inputLayout != nullptr) { delete m_inputLayout; @@ -79,6 +26,46 @@ Calculation::~Calculation() { } } +void Calculation::reset() { + m_text[0] = 0; + if (m_input != nullptr) { + delete m_input; + } + m_input = nullptr; + if (m_inputLayout != nullptr) { + delete m_inputLayout; + } + m_inputLayout = nullptr; + if (m_output != nullptr) { + delete m_output; + } + m_output = nullptr; + if (m_outputLayout != nullptr) { + delete m_outputLayout; + } + m_outputLayout = nullptr; +} + +void Calculation::setContent(const char * c, Context * context, Preferences * preferences) { + strlcpy(m_text, c, sizeof(m_text)); + if (m_input != nullptr) { + delete m_input; + } + m_input = Expression::parse(m_text); + if (m_inputLayout != nullptr) { + delete m_inputLayout; + } + m_inputLayout = m_input->createLayout(preferences->displayMode()); + if (m_output != nullptr) { + delete m_output; + } + m_output = m_input->evaluate(*context); + if (m_outputLayout != nullptr) { + delete m_outputLayout; + } + m_outputLayout = m_output->createLayout(preferences->displayMode()); +} + const char * Calculation::text() { return m_text; } @@ -100,7 +87,7 @@ ExpressionLayout * Calculation::outputLayout() { } bool Calculation::isEmpty() { - if (m_input == nullptr) { + if (m_output == nullptr) { return true; } return false; diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index 907a3dd27..477e16fad 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -2,20 +2,27 @@ #define CALCULATION_CALCULATION_H #include +#include "../preferences.h" namespace Calculation { class Calculation { public: Calculation(); - ~Calculation(); // Delete expression and layout, if needed - Calculation & operator= (const Calculation & other); + ~Calculation(); // Delete expression and layout, if needed + /* The copy assignment operator is deleted as its default implementation does + * not create new expressions. The new object thus become obsolete as soon + * as the copy is deleted (because of our implementation of deletion). To + * avoid any use of obsolete object, we prevent to copy and assign. */ + Calculation & operator= (const Calculation & other) = delete; + /* c.reset() is the equivalent of c = Calculation() without copy assingment. */ + void reset(); const char * text(); Expression * input(); ExpressionLayout * inputLayout(); Expression * output(); ExpressionLayout * outputLayout(); - void setContent(const char * c, Context * context); + void setContent(const char * c, Context * context, Preferences * preferences); bool isEmpty(); constexpr static int k_maximalExpressionTextLength = 255; private: diff --git a/apps/calculation/calculation_store.cpp b/apps/calculation/calculation_store.cpp index e2c574966..af8995875 100644 --- a/apps/calculation/calculation_store.cpp +++ b/apps/calculation/calculation_store.cpp @@ -8,9 +8,9 @@ CalculationStore::CalculationStore() : { } -Calculation * CalculationStore::push(Calculation * c) { +Calculation * CalculationStore::push(const char * text, Context * context, Preferences * preferences) { Calculation * result = m_start; - *m_start++ = *c; + m_start++->setContent(text, context, preferences); if (m_start >= m_calculations + k_maxNumberOfCalculations) { m_start = m_calculations; } @@ -45,7 +45,7 @@ int CalculationStore::numberOfCalculations() { } void CalculationStore::deleteCalculationAtIndex(int i) { - *calculationAtIndex(i) = Calculation(); + calculationAtIndex(i)->reset(); } void CalculationStore::deleteAll() { @@ -53,7 +53,7 @@ void CalculationStore::deleteAll() { Calculation * currentCalc= m_start; while (currentCalc < m_calculations + k_maxNumberOfCalculations) { if (!currentCalc->isEmpty()) { - *currentCalc = Calculation(); + currentCalc->reset(); } currentCalc++; } diff --git a/apps/calculation/calculation_store.h b/apps/calculation/calculation_store.h index 8fc8e9a10..0008b6761 100644 --- a/apps/calculation/calculation_store.h +++ b/apps/calculation/calculation_store.h @@ -2,6 +2,7 @@ #define CALCULATION_CALCULATION_STORE_H #include "calculation.h" +#include "../preferences.h" namespace Calculation { @@ -11,7 +12,7 @@ class CalculationStore { public: CalculationStore(); Calculation * calculationAtIndex(int i); - Calculation * push(Calculation * c); + Calculation * push(const char * text, Context * context, Preferences * preferences); void deleteCalculationAtIndex(int i); void deleteAll(); int numberOfCalculations(); diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index d4edfe778..bc5653310 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -80,10 +80,8 @@ bool EditExpressionController::textFieldDidReceiveEvent(::TextField * textField, } bool EditExpressionController::textFieldDidFinishEditing(::TextField * textField, const char * text) { - Calculation calculation = Calculation(); App * calculationApp = (App *)app(); - calculation.setContent(textBody(), calculationApp->localContext()); - m_calculationStore->push(&calculation); + m_calculationStore->push(textBody(), calculationApp->localContext(), calculationApp->preferences()); m_historyController->reload(); m_contentView.mainView()->scrollToCell(0, m_historyController->numberOfRows()-1); m_contentView.textField()->setText(""); diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index 0b053d021..9561c2be1 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -60,17 +60,17 @@ bool HistoryController::handleEvent(Ion::Events::Event event) { HistoryViewCell::SubviewType subviewType = selectedCell->selectedSubviewType(); EditExpressionController * editController = (EditExpressionController *)parentResponder(); Calculation * calculation = m_calculationStore->calculationAtIndex(focusRow); - Calculation newCalculation; + const char * text; if (subviewType == HistoryViewCell::SubviewType::Input) { - newCalculation = *calculation; + text = calculation->text(); } else { char outputText[Calculation::k_maximalExpressionTextLength]; calculation->output()->writeTextInBuffer(outputText, Calculation::k_maximalExpressionTextLength); - App * calculationApp = (App *)app(); - newCalculation.setContent(outputText, calculationApp->localContext()); + text = outputText; } m_selectableTableView.deselectTable(); - m_calculationStore->push(&newCalculation); + App * calculationApp = (App *)app(); + m_calculationStore->push(text, calculationApp->localContext(), calculationApp->preferences()); reload(); m_selectableTableView.scrollToCell(0, numberOfRows()-1); app()->setFirstResponder(editController); From 7a2ec6ebfca5a11bed1a4e7c0cab8d2507d10450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 12:12:53 +0100 Subject: [PATCH 07/17] [apps/prbability] Use special char for parameter names Change-Id: I9c4c64021f6a2366a5f993f13d28dce194600132 --- apps/probability/law/exponential_law.cpp | 3 ++- apps/probability/law/normal_law.cpp | 6 ++++-- apps/probability/law/poisson_law.cpp | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/probability/law/exponential_law.cpp b/apps/probability/law/exponential_law.cpp index 75d278bbd..97645a626 100644 --- a/apps/probability/law/exponential_law.cpp +++ b/apps/probability/law/exponential_law.cpp @@ -25,7 +25,8 @@ bool ExponentialLaw::isContinuous() const { const char * ExponentialLaw::parameterNameAtIndex(int index) { assert(index == 0); - return "l"; + constexpr static char name[] = {Ion::Charset::SmallLambda, 0}; + return name; } const char * ExponentialLaw::parameterDefinitionAtIndex(int index) { diff --git a/apps/probability/law/normal_law.cpp b/apps/probability/law/normal_law.cpp index 3f8b4af3d..0e6400751 100644 --- a/apps/probability/law/normal_law.cpp +++ b/apps/probability/law/normal_law.cpp @@ -26,9 +26,11 @@ bool NormalLaw::isContinuous() const { const char * NormalLaw::parameterNameAtIndex(int index) { assert(index >= 0 && index < 2); if (index == 0) { - return "u"; + constexpr static char meanName[] = {Ion::Charset::SmallMu, 0}; + return meanName; } else { - return "o"; + constexpr static char devName[] = {Ion::Charset::SmallSigma, 0}; + return devName; } } diff --git a/apps/probability/law/poisson_law.cpp b/apps/probability/law/poisson_law.cpp index 6bd772702..2da5e5073 100644 --- a/apps/probability/law/poisson_law.cpp +++ b/apps/probability/law/poisson_law.cpp @@ -1,6 +1,7 @@ #include "poisson_law.h" #include #include +#include namespace Probability { @@ -23,12 +24,14 @@ bool PoissonLaw::isContinuous() const { const char * PoissonLaw::parameterNameAtIndex(int index) { assert(index == 0); - return "l"; + constexpr static char name[] = {Ion::Charset::SmallLambda, 0}; + return name; } const char * PoissonLaw::parameterDefinitionAtIndex(int index) { assert(index == 0); - return "l : parametre"; + constexpr static char meanDef[] = {Ion::Charset::SmallLambda, ' ', ':', ' ', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'r', 'e', 0}; + return meanDef; } float PoissonLaw::xMin() { 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 08/17] [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; From 6050fdb4f83f2e00d845eaa15b3c3c719cc55e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 13:43:02 +0100 Subject: [PATCH 09/17] [apps/probability] Improve colors Change-Id: Iee9f176c9ce2521b71acdfb1ddeac9c8f515a7f9 --- apps/probability/law_curve_view.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/probability/law_curve_view.cpp b/apps/probability/law_curve_view.cpp index bf199e452..90d3ad4f2 100644 --- a/apps/probability/law_curve_view.cpp +++ b/apps/probability/law_curve_view.cpp @@ -23,13 +23,13 @@ void LawCurveView::setCalculation(Calculation * calculation) { void LawCurveView::drawRect(KDContext * ctx, KDRect rect) const { float lowerBound = m_calculation->lowerBound(); float upperBound = m_calculation->upperBound(); - ctx->fillRect(bounds(), KDColorWhite); + ctx->fillRect(bounds(), Palette::WallScreen); drawAxes(ctx, rect, Axis::Horizontal); drawLabels(ctx, rect, Axis::Horizontal, false); if (m_law->isContinuous()) { - drawCurve(ctx, rect, m_law, KDColorRed, true, lowerBound, upperBound, true); + drawCurve(ctx, rect, m_law, Palette::YellowDark, true, lowerBound, upperBound, true); } else { - drawHistogram(ctx, rect, m_law, 0, 1, false, KDColorBlue, KDColorRed, lowerBound, upperBound); + drawHistogram(ctx, rect, m_law, 0, 1, false, Palette::GreyMiddle, Palette::YellowDark, lowerBound, upperBound); } } From d1adce7fea782a583fd7bc4223861d7d3c071150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 13:48:15 +0100 Subject: [PATCH 10/17] [apps] Clean typo Change-Id: I0d0df0073ae1dd905f7441c52d9809e6007d886c --- apps/preferences.cpp | 2 +- apps/preferences.h | 2 +- apps/regression/calculation_controller.cpp | 2 +- apps/settings/main_controller.cpp | 6 +++--- apps/settings/sub_controller.cpp | 3 ++- apps/settings/sub_controller.h | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/preferences.cpp b/apps/preferences.cpp index 6a0d92337..9bfb4ae4f 100644 --- a/apps/preferences.cpp +++ b/apps/preferences.cpp @@ -4,7 +4,7 @@ Preferences::Preferences() : m_angleUnit(AngleUnit::Degree), m_displayMode(Expression::DisplayMode::Auto), m_numberType(NumberType::Reel), - m_complexFormat(ComplexFormat::Cartesian), + m_complexFormat(ComplexFormat::Algebric), m_language(Language::French) { } diff --git a/apps/preferences.h b/apps/preferences.h index b694d70b6..013e14b57 100644 --- a/apps/preferences.h +++ b/apps/preferences.h @@ -14,7 +14,7 @@ public: Complex = 1 }; enum class ComplexFormat { - Cartesian = 0, + Algebric = 0, Polar = 1 }; enum class Language { diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index fb2243b3a..19c48b5d3 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -23,7 +23,7 @@ CalculationController::CalculationController(Responder * parentResponder, Header } const char * CalculationController::title() const { - return "Statistics"; + return "Statistiques"; } View * CalculationController::view() { diff --git a/apps/settings/main_controller.cpp b/apps/settings/main_controller.cpp index 80fe29294..ebe6fe13c 100644 --- a/apps/settings/main_controller.cpp +++ b/apps/settings/main_controller.cpp @@ -6,12 +6,12 @@ namespace Settings { const SettingsNode angleChildren[2] = {SettingsNode("Degre"), SettingsNode("Radian")}; const SettingsNode displayModeChildren[2] = {SettingsNode("Auto"), SettingsNode("Scientifique")}; const SettingsNode numberTypeChildren[2] = {SettingsNode("Reel"), SettingsNode("Complexe")}; -const SettingsNode complexFormatChildren[2] = {SettingsNode("Cartesien"), SettingsNode("Polaire")}; -const SettingsNode languageChildren[2] = {SettingsNode("Anglais"), SettingsNode("Francais")}; +const SettingsNode complexFormatChildren[2] = {SettingsNode("Algebrique"), SettingsNode("Polaire")}; +const SettingsNode languageChildren[3] = {SettingsNode("Anglais"), SettingsNode("Francais"), SettingsNode("Espagnol")}; const SettingsNode menu[5] = {SettingsNode("Unite d'angles", angleChildren, 2), SettingsNode("Format resultat", displayModeChildren, 2), SettingsNode("Reel ou complexe", numberTypeChildren, 2), SettingsNode("Format complexe", complexFormatChildren, 2), - SettingsNode("Langue", languageChildren, 2)}; + SettingsNode("Langue", languageChildren, 3)}; const SettingsNode model = SettingsNode("Parametres", menu, 5); MainController::MainController(Responder * parentResponder, Preferences * preferences) : diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 8238af296..7af1b5643 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -6,7 +6,8 @@ namespace Settings { SubController::SubController(Responder * parentResponder, Preferences * preferences) : ViewController(parentResponder), - m_cells{MenuListCell(nullptr, KDText::FontSize::Large), MenuListCell(nullptr, KDText::FontSize::Large)}, + m_cells{MenuListCell(nullptr, KDText::FontSize::Large), MenuListCell(nullptr, KDText::FontSize::Large), + MenuListCell(nullptr, KDText::FontSize::Large)}, m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, Metric::BottomMargin, Metric::LeftMargin)), m_nodeModel(nullptr), diff --git a/apps/settings/sub_controller.h b/apps/settings/sub_controller.h index e3c6d152c..a79c7b31d 100644 --- a/apps/settings/sub_controller.h +++ b/apps/settings/sub_controller.h @@ -24,7 +24,7 @@ private: StackViewController * stackController() const; void setPreferenceAtIndexWithValueIndex(int preferenceIndex, int valueIndex); int valueIndexAtPreferenceIndex(int preferenceIndex); - constexpr static int k_totalNumberOfCell = 2; + constexpr static int k_totalNumberOfCell = 3; MenuListCell m_cells[k_totalNumberOfCell]; SelectableTableView m_selectableTableView; Node * m_nodeModel; From 5e3de6eec97f1dfb7ba7d8d10f128706dfd6d4c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 14:17:21 +0100 Subject: [PATCH 11/17] [apps/probability] Improve stack title colors Change-Id: Ifd6f79030e0ef13c478fae307205c71955ce4593 --- apps/probability/law_controller.cpp | 2 +- apps/probability/parameters_controller.cpp | 2 +- escher/include/escher/stack_view_controller.h | 12 +++---- escher/src/stack_view_controller.cpp | 31 ++++++++++--------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/apps/probability/law_controller.cpp b/apps/probability/law_controller.cpp index 045e9e5e4..915fd0cf2 100644 --- a/apps/probability/law_controller.cpp +++ b/apps/probability/law_controller.cpp @@ -84,7 +84,7 @@ bool Probability::LawController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { StackViewController * stack = (StackViewController *)parentResponder(); setLawAccordingToIndex(m_selectableTableView.selectedRow()); - stack->push(&m_parametersController); + stack->push(&m_parametersController, KDColorWhite, Palette::PurpleBright, Palette::PurpleBright); return true; } return false; diff --git a/apps/probability/parameters_controller.cpp b/apps/probability/parameters_controller.cpp index b714580ea..a90d05f86 100644 --- a/apps/probability/parameters_controller.cpp +++ b/apps/probability/parameters_controller.cpp @@ -15,7 +15,7 @@ ParametersController::ContentView::ContentView(Responder * parentResponder, Sele calculationController->selectSubview(1); calculationController->reload(); StackViewController * stack = parameterController->stackController(); - stack->push(calculationController); + stack->push(calculationController, KDColorWhite, Palette::SubTab, Palette::SubTab); }, 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)), diff --git a/escher/include/escher/stack_view_controller.h b/escher/include/escher/stack_view_controller.h index 3465a17af..1093879b9 100644 --- a/escher/include/escher/stack_view_controller.h +++ b/escher/include/escher/stack_view_controller.h @@ -13,7 +13,7 @@ public: KDColor textColor = Palette::SubTab, KDColor backgroundColor = KDColorWhite, KDColor separatorColor = Palette::GreyBright); /* Push creates a new StackView and adds it */ - void push(ViewController * vc); + void push(ViewController * vc, KDColor textColor = Palette::SubTab, KDColor backgroundColor = KDColorWhite, KDColor separatorColor = Palette::GreyBright); void pop(); @@ -24,9 +24,9 @@ public: private: class ControllerView : public View { public: - ControllerView(bool displayFirstStackHeader, KDColor textColor, KDColor backgroundColor, KDColor separatorColor); + ControllerView(bool displayFirstStackHeader); void setContentView(View * view); - void pushStack(const char * name); + void pushStack(const char * name, KDColor textColor, KDColor backgroundColor, KDColor separatorColor); void popStack(); protected: #if ESCHER_VIEW_LOGGING @@ -42,9 +42,6 @@ private: View * m_contentView; int8_t m_numberOfStacks; bool m_displayFirstStackHeader; - KDColor m_textColor; - KDColor m_backgroundColor; - KDColor m_separatorColor; }; ControllerView m_view; @@ -54,6 +51,9 @@ private: ViewController * m_children[k_maxNumberOfChildren]; uint8_t m_numberOfChildren; ViewController * m_rootViewController; + KDColor m_textColor; + KDColor m_backgroundColor; + KDColor m_separatorColor; }; #endif diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 1f6a8d507..799f4dabf 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -4,14 +4,11 @@ extern "C" { #include #include -StackViewController::ControllerView::ControllerView(bool displayFirstStackHeader, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) : +StackViewController::ControllerView::ControllerView(bool displayFirstStackHeader) : View(), m_contentView(nullptr), m_numberOfStacks(0), - m_displayFirstStackHeader(displayFirstStackHeader), - m_textColor(textColor), - m_backgroundColor(backgroundColor), - m_separatorColor(separatorColor) + m_displayFirstStackHeader(displayFirstStackHeader) { } @@ -21,11 +18,11 @@ void StackViewController::ControllerView::setContentView(View * view) { markRectAsDirty(bounds()); } -void StackViewController::ControllerView::pushStack(const char * name) { +void StackViewController::ControllerView::pushStack(const char * name, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) { m_stackViews[m_numberOfStacks].setName(name); - m_stackViews[m_numberOfStacks].setTextColor(m_textColor); - m_stackViews[m_numberOfStacks].setBackgroundColor(m_backgroundColor); - m_stackViews[m_numberOfStacks].setSeparatorColor(m_separatorColor); + m_stackViews[m_numberOfStacks].setTextColor(textColor); + m_stackViews[m_numberOfStacks].setBackgroundColor(backgroundColor); + m_stackViews[m_numberOfStacks].setSeparatorColor(separatorColor); m_numberOfStacks++; } @@ -68,11 +65,15 @@ const char * StackViewController::ControllerView::className() const { } #endif -StackViewController::StackViewController(Responder * parentResponder, ViewController * rootViewController, bool displayFirstStackHeader, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) : +StackViewController::StackViewController(Responder * parentResponder, ViewController * rootViewController, + bool displayFirstStackHeader, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) : ViewController(parentResponder), - m_view(ControllerView(displayFirstStackHeader, textColor, backgroundColor, separatorColor)), + m_view(ControllerView(displayFirstStackHeader)), m_numberOfChildren(0), - m_rootViewController(rootViewController) + m_rootViewController(rootViewController), + m_textColor(textColor), + m_backgroundColor(backgroundColor), + m_separatorColor(separatorColor) { // push(rootViewController); } @@ -86,8 +87,8 @@ const char * StackViewController::title() const { } } -void StackViewController::push(ViewController * vc) { - m_view.pushStack(vc->title()); +void StackViewController::push(ViewController * vc, KDColor textColor, KDColor backgroundColor, KDColor separatorColor) { + m_view.pushStack(vc->title(), textColor, backgroundColor, separatorColor); m_children[m_numberOfChildren++] = vc; setupActiveViewController(); } @@ -123,7 +124,7 @@ bool StackViewController::handleEvent(Ion::Events::Event event) { View * StackViewController::view() { if (m_rootViewController != nullptr) { - push(m_rootViewController); + push(m_rootViewController, m_textColor, m_backgroundColor, m_separatorColor); m_rootViewController = nullptr; } return &m_view; From f20f3518d39dbd5e11ce5d2629f2d7731db2e2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 14:47:11 +0100 Subject: [PATCH 12/17] [apps/graph/graph] Adjust display mode in banner view according to preferences Change-Id: Id634a6128c7e395a35ba5df40c904a372ae80661 --- apps/apps_container.cpp | 2 +- apps/graph/app.cpp | 7 ++++++- apps/graph/app.h | 5 ++++- apps/graph/graph/graph_controller.cpp | 7 ++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index e395b13af..5e189b92d 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -8,7 +8,7 @@ AppsContainer::AppsContainer() : Container(), m_window(AppsWindow()), m_homeApp(this), - m_graphApp(this, &m_globalContext), + m_graphApp(this, &m_globalContext, &m_preferences), m_probabilityApp(this), m_calculationApp(this, &m_globalContext, &m_preferences), m_regressionApp(this), diff --git a/apps/graph/app.cpp b/apps/graph/app.cpp index be898f627..a4cc1f27f 100644 --- a/apps/graph/app.cpp +++ b/apps/graph/app.cpp @@ -3,10 +3,11 @@ namespace Graph { -App::App(Container * container, Context * context) : +App::App(Container * container, Context * context, Preferences * preferences) : TextFieldDelegateApp(container, &m_inputViewController, "Fonctions", "FONCTIONS", ImageStore::GraphIcon), m_functionStore(FunctionStore()), m_xContext(VariableContext('x', context)), + m_preferences(preferences), m_listController(ListController(&m_listHeader, &m_functionStore, &m_listHeader)), m_listHeader(HeaderViewController(nullptr, &m_listController, &m_listController)), m_listStackViewController(StackViewController(&m_tabViewController, &m_listHeader)), @@ -31,4 +32,8 @@ Context * App::localContext() { return &m_xContext; } +Preferences * App::preferences() { + return m_preferences; +} + } diff --git a/apps/graph/app.h b/apps/graph/app.h index 6b17e2068..80bfa74ad 100644 --- a/apps/graph/app.h +++ b/apps/graph/app.h @@ -8,17 +8,20 @@ #include "list/list_controller.h" #include "values/values_controller.h" #include "../text_field_delegate_app.h" +#include "../preferences.h" namespace Graph { class App : public TextFieldDelegateApp { public: - App(Container * container, Context * context); + App(Container * container, Context * context, Preferences * preferences); InputViewController * inputViewController(); Context * localContext() override; + Preferences * preferences(); private: FunctionStore m_functionStore; VariableContext m_xContext; + Preferences * m_preferences; ListController m_listController; HeaderViewController m_listHeader; StackViewController m_listStackViewController; diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index 3f9dc1b9e..27339ab4f 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -109,11 +109,12 @@ bool GraphController::handleEnter() { } void GraphController::reloadBannerView() { + App * myApp = (App *)app(); char buffer[k_maxNumberOfCharacters+Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; const char * legend = "x = "; int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); - Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); + Float(m_cursor.x()).convertFloatToText(buffer+ legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, myApp->preferences()->displayMode()); m_bannerView.setLegendAtIndex(buffer, 0); legend = "00(x) = "; @@ -121,7 +122,7 @@ void GraphController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); Function * f = m_functionStore->activeFunctionAtIndex(m_indexFunctionSelectedByCursor); buffer[1] = f->name()[0]; - Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); + Float(m_cursor.y()).convertFloatToText(buffer+legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, myApp->preferences()->displayMode()); m_bannerView.setLegendAtIndex(buffer+1, 1); if (m_bannerView.displayDerivative()) { @@ -129,7 +130,7 @@ void GraphController::reloadBannerView() { buffer[1] = '\''; App * graphApp = (Graph::App *)app(); float y = f->approximateDerivative(m_cursor.x(), graphApp->localContext()); - Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); + Float(y).convertFloatToText(buffer + legendLength, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, myApp->preferences()->displayMode()); m_bannerView.setLegendAtIndex(buffer, 2); } } From b78aaf08d7793dc5f528252e14815ba50c317956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 14:48:01 +0100 Subject: [PATCH 13/17] [apps/graph/values] Adjust display mode in values page according to preferences Change-Id: I79e8bee7f35904cd54c74dce9cd456d921103e1d --- apps/editable_cell_table_view_controller.cpp | 4 ++-- apps/editable_cell_table_view_controller.h | 3 ++- apps/graph/values/values_controller.cpp | 8 ++++---- apps/regression/store_controller.cpp | 2 +- apps/statistics/store_controller.cpp | 2 +- apps/store_controller.cpp | 4 ++++ apps/store_controller.h | 1 + 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/editable_cell_table_view_controller.cpp b/apps/editable_cell_table_view_controller.cpp index 0697752a7..74c680616 100644 --- a/apps/editable_cell_table_view_controller.cpp +++ b/apps/editable_cell_table_view_controller.cpp @@ -63,7 +63,7 @@ int EditableCellTableViewController::indexFromCumulatedHeight(KDCoordinate offse return (offsetY-1) / k_cellHeight; } -void EditableCellTableViewController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { +void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(TableViewCell * cell, int i, int j, Expression::DisplayMode displayMode) { EvenOddCell * myCell = (EvenOddCell *)cell; myCell->setEven(j%2 == 0); // The cell is editable @@ -80,7 +80,7 @@ void EditableCellTableViewController::willDisplayCellAtLocation(TableViewCell * return; } } - Float(dataAtLocation(i, j)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + Float(dataAtLocation(i, j)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, displayMode); myEditableValueCell->setText(buffer); return; } diff --git a/apps/editable_cell_table_view_controller.h b/apps/editable_cell_table_view_controller.h index e687396e3..ebd6e7e49 100644 --- a/apps/editable_cell_table_view_controller.h +++ b/apps/editable_cell_table_view_controller.h @@ -2,6 +2,7 @@ #define APPS_EDITABLE_CELL_TABLE_VIEW_CONTROLLER_H #include +#include class EditableCellTableViewController : public ViewController, public TableViewDataSource, public SelectableTableViewDelegate, public TextFieldDelegate { public: @@ -14,7 +15,7 @@ public: void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY) override; int numberOfRows() override; - void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override; + void willDisplayCellAtLocationWithDisplayMode(TableViewCell * cell, int i, int j, Expression::DisplayMode displayMode); KDCoordinate rowHeight(int j) override; KDCoordinate cumulatedHeightFromIndex(int j) override; int indexFromCumulatedHeight(KDCoordinate offsetY) override; diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 7f0a8c817..bf2465200 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -122,7 +122,8 @@ int ValuesController::numberOfColumns() { } void ValuesController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { - EditableCellTableViewController::willDisplayCellAtLocation(cell, i, j); + App * graphApp = (Graph::App *)app(); + willDisplayCellAtLocationWithDisplayMode(cell, i, j, graphApp->preferences()->displayMode()); if (cellAtLocationIsEditable(i, j)) { return; } @@ -165,11 +166,10 @@ void ValuesController::willDisplayCellAtLocation(TableViewCell * cell, int i, in EvenOddBufferTextCell * myValueCell = (EvenOddBufferTextCell *)cell; Function * function = functionAtColumn(i); float x = m_interval.element(j-1); - App * graphApp = (Graph::App *)app(); if (isDerivativeColumn(i)) { - Float(function->approximateDerivative(x, graphApp->localContext())).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + Float(function->approximateDerivative(x, graphApp->localContext())).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, graphApp->preferences()->displayMode()); } else { - Float(function->evaluateAtAbscissa(x, graphApp->localContext())).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + Float(function->evaluateAtAbscissa(x, graphApp->localContext())).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, graphApp->preferences()->displayMode()); } myValueCell->setText(buffer); } diff --git a/apps/regression/store_controller.cpp b/apps/regression/store_controller.cpp index 600bca8de..ef1fc419d 100644 --- a/apps/regression/store_controller.cpp +++ b/apps/regression/store_controller.cpp @@ -17,7 +17,7 @@ StoreController::StoreController(Responder * parentResponder, Store * store, Hea } void StoreController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { - EditableCellTableViewController::willDisplayCellAtLocation(cell, i, j); + ::StoreController::willDisplayCellAtLocation(cell, i, j); if (cellAtLocationIsEditable(i, j)) { return; } diff --git a/apps/statistics/store_controller.cpp b/apps/statistics/store_controller.cpp index 05887a8d3..f073a3725 100644 --- a/apps/statistics/store_controller.cpp +++ b/apps/statistics/store_controller.cpp @@ -13,7 +13,7 @@ StoreController::StoreController(Responder * parentResponder, Store * store, Hea } void StoreController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { - EditableCellTableViewController::willDisplayCellAtLocation(cell, i, j); + ::StoreController::willDisplayCellAtLocation(cell, i, j); if (cellAtLocationIsEditable(i, j)) { return; } diff --git a/apps/store_controller.cpp b/apps/store_controller.cpp index aca559175..5a75baf14 100644 --- a/apps/store_controller.cpp +++ b/apps/store_controller.cpp @@ -62,6 +62,10 @@ int StoreController::typeAtLocation(int i, int j) { return j!=0; } +void StoreController::willDisplayCellAtLocation(TableViewCell * cell, int i, int j) { + willDisplayCellAtLocationWithDisplayMode(cell, i, j, Expression::DisplayMode::Auto); +} + bool StoreController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::Up) { m_selectableTableView.deselectTable(); diff --git a/apps/store_controller.h b/apps/store_controller.h index f0ac9d781..80c99f6d5 100644 --- a/apps/store_controller.h +++ b/apps/store_controller.h @@ -17,6 +17,7 @@ public: TableViewCell * reusableCell(int index, int type) override; int reusableCellCount(int type) override; int typeAtLocation(int i, int j) override; + void willDisplayCellAtLocation(TableViewCell * cell, int i, int j) override; bool handleEvent(Ion::Events::Event event) override; protected: static constexpr KDCoordinate k_cellWidth = Ion::Display::Width/2 - Metric::RightMargin/2 - Metric::LeftMargin/2; From f3e9e290459646e8616a68a5c7d3edc07aa4d8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 14:50:56 +0100 Subject: [PATCH 14/17] [apps] Force the display mode to auto in all float parameter controller Change-Id: I5bc978240e72677bc92762363cf29b56a036a365 --- apps/float_parameter_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/float_parameter_controller.cpp b/apps/float_parameter_controller.cpp index 80ea1e631..f0fb42765 100644 --- a/apps/float_parameter_controller.cpp +++ b/apps/float_parameter_controller.cpp @@ -27,7 +27,7 @@ int FloatParameterController::activeCell() { void FloatParameterController::willDisplayCellForIndex(TableViewCell * cell, int index) { EditableTextMenuListCell * myCell = (EditableTextMenuListCell *) cell; char buffer[Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Float(parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + Float(parameterAtIndex(index)).convertFloatToText(buffer, Float::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::DisplayMode::Auto); myCell->setAccessoryText(buffer); } From 29678a23dbab52a3c587336509a9174dbfadfcaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 15:53:24 +0100 Subject: [PATCH 15/17] [escher] Reorder actions to first do all frame layouts and then all "become first responder" (Thereby, enable to select a cell in becomefirstresponder without any weird scrolling due to wrong framing) Change-Id: Ie5ca7555fce3575dcf0488e124adf0677155c383 --- apps/node_navigation_controller.cpp | 3 ++- apps/variable_box_controller.cpp | 1 + escher/src/app.cpp | 6 ++---- escher/src/modal_view_controller.cpp | 2 +- escher/src/stack_view_controller.cpp | 8 ++++---- escher/src/tab_view_controller.cpp | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/node_navigation_controller.cpp b/apps/node_navigation_controller.cpp index 086f09729..71a766165 100644 --- a/apps/node_navigation_controller.cpp +++ b/apps/node_navigation_controller.cpp @@ -122,8 +122,9 @@ bool NodeNavigationController::selectSubMenu(Node * selectedNode) { } void NodeNavigationController::didBecomeFirstResponder() { - m_stack.resetStack(); m_listViewController.setNodeModel(nodeModel()); + StackViewController::didBecomeFirstResponder(); + m_stack.resetStack(); m_listViewController.setFirstSelectedRow(0); app()->setFirstResponder(&m_listViewController); } diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index b2cdb84e4..5deab988a 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -224,6 +224,7 @@ VariableBoxController::VariableBoxController(Context * context) : } void VariableBoxController::didBecomeFirstResponder() { + StackViewController::didBecomeFirstResponder(); app()->setFirstResponder(&m_contentViewController); } diff --git a/escher/src/app.cpp b/escher/src/app.cpp index b88789ed4..efb08d14f 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -19,13 +19,11 @@ App::App(Container * container, ViewController * rootViewController, const char void App::setWindow(Window * window) { View * view = m_modalViewController.view(); + assert(m_modalViewController.app() == this); + window->setContentView(view); if (m_firstResponder == nullptr) { setFirstResponder(&m_modalViewController); } - assert(m_modalViewController.app() == this); - - window->setContentView(view); - window->redraw(); } diff --git a/escher/src/modal_view_controller.cpp b/escher/src/modal_view_controller.cpp index 2948cd1be..17f216c1f 100644 --- a/escher/src/modal_view_controller.cpp +++ b/escher/src/modal_view_controller.cpp @@ -115,8 +115,8 @@ void ModalViewController::displayModalViewController(ViewController * vc, float m_currentModalViewController = vc; vc->setParentResponder(this); m_previousResponder = app()->firstResponder(); - app()->setFirstResponder(vc); m_contentView.presentModalView(vc->view(), verticalAlignment, horizontalAlignment, topMargin, leftMargin, bottomMargin, rightMargin); + app()->setFirstResponder(vc); } void ModalViewController::dismissModalViewController() { diff --git a/escher/src/stack_view_controller.cpp b/escher/src/stack_view_controller.cpp index 799f4dabf..9de6b76c0 100644 --- a/escher/src/stack_view_controller.cpp +++ b/escher/src/stack_view_controller.cpp @@ -110,6 +110,10 @@ void StackViewController::setupActiveViewController() { } void StackViewController::didBecomeFirstResponder() { + if (m_rootViewController != nullptr) { + push(m_rootViewController, m_textColor, m_backgroundColor, m_separatorColor); + m_rootViewController = nullptr; + } ViewController * vc = m_children[m_numberOfChildren-1]; app()->setFirstResponder(vc); } @@ -123,9 +127,5 @@ bool StackViewController::handleEvent(Ion::Events::Event event) { } View * StackViewController::view() { - if (m_rootViewController != nullptr) { - push(m_rootViewController, m_textColor, m_backgroundColor, m_separatorColor); - m_rootViewController = nullptr; - } return &m_view; } diff --git a/escher/src/tab_view_controller.cpp b/escher/src/tab_view_controller.cpp index cac2c7e9f..076fa6125 100644 --- a/escher/src/tab_view_controller.cpp +++ b/escher/src/tab_view_controller.cpp @@ -113,6 +113,9 @@ void TabViewController::setSelectedTab(int8_t i) { void TabViewController::didBecomeFirstResponder() { setSelectedTab(m_activeChildIndex); + if (m_activeChildIndex < 0) { + setActiveTab(0); + } } void TabViewController::didResignFirstResponder() { @@ -128,9 +131,6 @@ View * TabViewController::view() { m_view.m_tabView.addTabNamed(m_children[i]->title()); } } - if (m_activeChildIndex < 0) { - setActiveTab(0); - } return &m_view; } From 5746672bb99a6c37a8c23ee5d6cb241a9aad0dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 15:56:50 +0100 Subject: [PATCH 16/17] [apps] Select the first editable cell at initiation in store controllers and values controller Change-Id: I4eda3763b78f7b7de3c58e1ae6efda63d3854061 --- apps/editable_cell_table_view_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/editable_cell_table_view_controller.cpp b/apps/editable_cell_table_view_controller.cpp index 74c680616..23f7fc6ed 100644 --- a/apps/editable_cell_table_view_controller.cpp +++ b/apps/editable_cell_table_view_controller.cpp @@ -88,7 +88,7 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(T void EditableCellTableViewController::didBecomeFirstResponder() { if (m_selectableTableView.selectedRow() == -1) { - m_selectableTableView.selectCellAtLocation(0, 0); + m_selectableTableView.selectCellAtLocation(0, 1); } else { int selectedRow = m_selectableTableView.selectedRow(); selectedRow = selectedRow >= numberOfRows() ? numberOfRows()-1 : selectedRow; From ab65e832eaa4ee0c4d4f8d9e0407d02d6b867fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 31 Jan 2017 16:02:45 +0100 Subject: [PATCH 17/17] [apps/regression][apps/graph/graph] Jump to the graph view once setting a new abscissa/ ordinate in the go to page Change-Id: I1e27e39c04950d902158a6e89024931f2fc78e1e --- apps/graph/graph/goto_parameter_controller.cpp | 8 ++++++++ apps/graph/graph/goto_parameter_controller.h | 1 + apps/regression/go_to_parameter_controller.cpp | 7 +++++++ apps/regression/go_to_parameter_controller.h | 1 + 4 files changed, 17 insertions(+) diff --git a/apps/graph/graph/goto_parameter_controller.cpp b/apps/graph/graph/goto_parameter_controller.cpp index 92f6a2f6d..5aa927420 100644 --- a/apps/graph/graph/goto_parameter_controller.cpp +++ b/apps/graph/graph/goto_parameter_controller.cpp @@ -48,4 +48,12 @@ void GoToParameterController::setFunction(Function * function) { m_function = function; } +bool GoToParameterController::textFieldDidFinishEditing(TextField * textField, const char * text) { + FloatParameterController::textFieldDidFinishEditing(textField, text); + StackViewController * stack = (StackViewController *)parentResponder(); + stack->pop(); + stack->pop(); + return true; +} + } diff --git a/apps/graph/graph/goto_parameter_controller.h b/apps/graph/graph/goto_parameter_controller.h index 8a2b75a72..546155282 100644 --- a/apps/graph/graph/goto_parameter_controller.h +++ b/apps/graph/graph/goto_parameter_controller.h @@ -16,6 +16,7 @@ public: TableViewCell * reusableCell(int index) override; int reusableCellCount() override; void setFunction(Function * function); + bool textFieldDidFinishEditing(TextField * textField, const char * text) override; private: float parameterAtIndex(int index) override; void setParameterAtIndex(int parameterIndex, float f) override; diff --git a/apps/regression/go_to_parameter_controller.cpp b/apps/regression/go_to_parameter_controller.cpp index a4b367d75..87c2e8afd 100644 --- a/apps/regression/go_to_parameter_controller.cpp +++ b/apps/regression/go_to_parameter_controller.cpp @@ -69,5 +69,12 @@ void GoToParameterController::willDisplayCellForIndex(TableViewCell * cell, int FloatParameterController::willDisplayCellForIndex(cell, index); } +bool GoToParameterController::textFieldDidFinishEditing(TextField * textField, const char * text) { + FloatParameterController::textFieldDidFinishEditing(textField, text); + StackViewController * stack = (StackViewController *)parentResponder(); + stack->pop(); + stack->pop(); + return true; +} } diff --git a/apps/regression/go_to_parameter_controller.h b/apps/regression/go_to_parameter_controller.h index 8a34f9622..fbb3f7cb5 100644 --- a/apps/regression/go_to_parameter_controller.h +++ b/apps/regression/go_to_parameter_controller.h @@ -17,6 +17,7 @@ public: TableViewCell * reusableCell(int index) override; int reusableCellCount() override; void willDisplayCellForIndex(TableViewCell * cell, int index) override; + bool textFieldDidFinishEditing(TextField * textField, const char * text) override; private: float parameterAtIndex(int index) override; void setParameterAtIndex(int parameterIndex, float f) override;