[apps/calculation] Display the exact layout only when the exp is Store

This commit is contained in:
Léa Saviot
2018-10-23 16:32:52 +02:00
committed by Émilie Feral
parent a063b00fb7
commit d083d05609
3 changed files with 22 additions and 5 deletions

View File

@@ -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;

View File

@@ -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:

View File

@@ -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);