diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index d4c5a9e6c..8eba2ffaf 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -53,11 +53,15 @@ KDCoordinate Calculation::height(Context * context) { Layout inputLayout = createInputLayout(); KDCoordinate inputHeight = inputLayout.layoutSize().height(); Layout approximateLayout = createApproximateOutputLayout(context); - KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height(); + Layout exactLayout = createExactOutputLayout(); if (shouldOnlyDisplayApproximateOutput(context)) { + KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height(); m_height = inputHeight+approximateOutputHeight; + } else if (shouldOnlyDisplayExactOutput()) { + KDCoordinate exactOutputHeight = exactLayout.layoutSize().height(); + m_height = inputHeight+exactOutputHeight; } else { - Layout exactLayout = createExactOutputLayout(); + KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height(); KDCoordinate exactOutputHeight = exactLayout.layoutSize().height(); KDCoordinate outputHeight = max(exactLayout.baseline(), approximateLayout.baseline()) + max(exactOutputHeight-exactLayout.baseline(), approximateOutputHeight-approximateLayout.baseline()); m_height = inputHeight + outputHeight; @@ -143,6 +147,10 @@ bool Calculation::shouldOnlyDisplayApproximateOutput(Context * context) { return input().isApproximate(*context) || exactOutput().isApproximate(*context); } +bool Calculation::shouldOnlyDisplayExactOutput() { + return strchr(m_inputText, Ion::Charset::Sto) != nullptr; +} + Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) { if (m_equalSign != EqualSign::Unknown) { return m_equalSign; diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index 1cd0a5225..a47e7868b 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -34,6 +34,7 @@ public: bool isEmpty(); void tidy(); bool shouldOnlyDisplayApproximateOutput(Poincare::Context * context); + bool shouldOnlyDisplayExactOutput(); EqualSign exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context); constexpr static int k_printedExpressionSize = 2*::TextField::maxBufferSize(); private: diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index 545cd7d30..d95a3535a 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -105,13 +105,21 @@ void HistoryViewCell::setCalculation(Calculation * calculation) { /* Both output expressions have to be updated at the same time. Otherwise, * when updating one layout, if the second one still points to a deleted * layout, calling to layoutSubviews() would fail. */ + assert(!calculation->shouldOnlyDisplayApproximateOutput(calculationApp->localContext()) || !calculation->shouldOnlyDisplayExactOutput()); if (!m_exactOutputLayout.isUninitialized()) { m_exactOutputLayout = Poincare::Layout(); } - if (!calculation->shouldOnlyDisplayApproximateOutput(calculationApp->localContext())) { - m_exactOutputLayout = calculation->createExactOutputLayout(); + if (!m_approximateOutputLayout.isUninitialized()) { + m_approximateOutputLayout = Poincare::Layout(); + } + if (calculation->shouldOnlyDisplayExactOutput()) { + m_approximateOutputLayout = calculation->createExactOutputLayout(); + } else { + m_approximateOutputLayout = calculation->createApproximateOutputLayout(calculationApp->localContext()); + if (!calculation->shouldOnlyDisplayApproximateOutput(calculationApp->localContext())) { + m_exactOutputLayout = calculation->createExactOutputLayout(); + } } - m_approximateOutputLayout = calculation->createApproximateOutputLayout(calculationApp->localContext()); m_scrollableOutputView.setLayouts(m_approximateOutputLayout, m_exactOutputLayout); I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual; m_scrollableOutputView.setEqualMessage(equalMessage);