diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 160770b77..3448afe59 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -134,6 +134,10 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre // Get input height Layout inputLayout = createInputLayout(); KDCoordinate inputHeight = inputLayout.layoutSize().height(); + KDCoordinate inputWidth = inputLayout.layoutSize().width(); + float singleMargin = 2 * Metric::CommonSmallMargin; + float doubleMargin = 4 * Metric::CommonSmallMargin; + bool singleLine = false; KDCoordinate inputBaseline = inputLayout.baseline(); // Get exact output height if needed @@ -155,11 +159,18 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre if (displayOutput(context) == DisplayOutput::ExactOnly) { KDCoordinate exactOutputHeight = exactLayout.layoutSize().height(); - if (allExpressionsInline) { + KDCoordinate exactOutputWidth = exactLayout.layoutSize().width(); + singleLine = exactOutputWidth + inputWidth < maxWidth - 2; + if (singleLine && !allExpressionsInline) { KDCoordinate exactOutputBaseline = exactLayout.baseline(); - result = std::max(inputBaseline, exactOutputBaseline) + std::max(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline); + result = std::max(inputBaseline, exactOutputBaseline) + std::max(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline) + singleMargin; } else { - result = inputHeight+exactOutputHeight; + if (allExpressionsInline) { + KDCoordinate exactOutputBaseline = exactLayout.baseline(); + result = std::max(inputBaseline, exactOutputBaseline) + std::max(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline); + } else { + result = inputHeight + exactOutputHeight + doubleMargin; + } } } else { bool couldNotCreateApproximateLayout = false; @@ -181,23 +192,37 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre } KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height(); + KDCoordinate approximateOutputWidth = approximateLayout.layoutSize().width(); + singleLine = approximateOutputWidth + inputWidth < maxWidth; if (displayOutput(context) == DisplayOutput::ApproximateOnly || (!expanded && displayOutput(context) == DisplayOutput::ExactAndApproximateToggle)) { - if (allExpressionsInline) { + if (singleLine && !allExpressionsInline) { KDCoordinate approximateOutputBaseline = approximateLayout.baseline(); - result = std::max(inputBaseline, approximateOutputBaseline) + std::max(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline); + result = std::max(inputBaseline, approximateOutputBaseline) + std::max(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline) + singleMargin; } else { - result = inputHeight+approximateOutputHeight; + if (allExpressionsInline) { + KDCoordinate approximateOutputBaseline = approximateLayout.baseline(); + result = std::max(inputBaseline, approximateOutputBaseline) + std::max(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline); + } else { + result = inputHeight + approximateOutputHeight + doubleMargin; + } } } else { assert(displayOutput(context) == DisplayOutput::ExactAndApproximate || (displayOutput(context) == DisplayOutput::ExactAndApproximateToggle && expanded)); KDCoordinate exactOutputHeight = exactLayout.layoutSize().height(); KDCoordinate exactOutputBaseline = exactLayout.baseline(); + KDCoordinate exactOutputWidth = exactLayout.layoutSize().width(); + KDCoordinate approximateOutputWidth = approximateLayout.layoutSize().width(); + singleLine = exactOutputWidth + approximateOutputWidth + inputWidth < maxWidth - 30; // the 30 represents the = sign (example: sin(30)) KDCoordinate approximateOutputBaseline = approximateLayout.baseline(); - if (allExpressionsInline) { - result = std::max(inputBaseline, std::max(exactOutputBaseline, approximateOutputBaseline)) + std::max(inputHeight - inputBaseline, std::max(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline)); + if (singleLine && !allExpressionsInline) { + result = std::max(inputBaseline, std::max(exactOutputBaseline, approximateOutputBaseline)) + std::max(inputHeight - inputBaseline, std::max(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline)) + singleMargin; } else { - KDCoordinate outputHeight = std::max(exactOutputBaseline, approximateOutputBaseline) + std::max(exactOutputHeight-exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline); - result = inputHeight + outputHeight; + if (allExpressionsInline) { + result = std::max(inputBaseline, std::max(exactOutputBaseline, approximateOutputBaseline)) + std::max(inputHeight - inputBaseline, std::max(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline)); + } else { + KDCoordinate outputHeight = std::max(exactOutputBaseline, approximateOutputBaseline) + std::max(exactOutputHeight-exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline); + result = inputHeight + outputHeight + doubleMargin; + } } } } diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index 4dbe4fc08..203d56568 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -95,6 +95,7 @@ public: // Additional Information AdditionalInformationType additionalInformationType(Poincare::Context * context); private: + static constexpr int maxWidth = Ion::Display::Width - (Metric::CommonSmallMargin * 2) - Metric::EllipsisCellWidth - 48; // 48 is the difference history_view_cell's width and calculation's static constexpr int k_numberOfExpressions = 4; static constexpr KDCoordinate k_heightComputationFailureHeight = 50; static constexpr const char * k_maximalIntegerWithAdditionalInformation = "10000000000000000"; diff --git a/apps/calculation/history_controller.cpp b/apps/calculation/history_controller.cpp index 74b548e1a..292a6199e 100644 --- a/apps/calculation/history_controller.cpp +++ b/apps/calculation/history_controller.cpp @@ -208,7 +208,7 @@ KDCoordinate HistoryController::rowHeight(int j) { return 0; } Shared::ExpiringPointer calculation = calculationAtIndex(j); - return calculation->height(App::app()->localContext(), j == selectedRow() && selectedSubviewType() == SubviewType::Output) + 4 * Metric::CommonSmallMargin; + return calculation->height(App::app()->localContext(), j == selectedRow() && selectedSubviewType() == SubviewType::Output); } int HistoryController::typeAtLocation(int i, int j) { diff --git a/apps/calculation/history_controller.h b/apps/calculation/history_controller.h index c208d8451..407e52805 100644 --- a/apps/calculation/history_controller.h +++ b/apps/calculation/history_controller.h @@ -38,7 +38,7 @@ private: CalculationSelectableTableView * selectableTableView(); bool calculationAtIndexToggles(int index); void historyViewCellDidChangeSelection(HistoryViewCell ** cell, HistoryViewCell ** previousCell, int previousSelectedCellX, int previousSelectedCellY, SubviewType type, SubviewType previousType) override; - constexpr static int k_maxNumberOfDisplayedRows = 5; + constexpr static int k_maxNumberOfDisplayedRows = 8; CalculationSelectableTableView m_selectableTableView; HistoryViewCell m_calculationHistory[k_maxNumberOfDisplayedRows]; CalculationStore * m_calculationStore; diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index 0c35fb688..0d3c84da3 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -178,18 +178,22 @@ void HistoryViewCell::layoutSubviews(bool force) { m_ellipsis.setFrame(KDRectZero, force); // Required to mark previous rect as dirty } KDSize inputSize = m_inputView.minimalSizeForOptimalDisplay(); + KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay(); + int singleLine = outputSize.width() + inputSize.width() < Ion::Display::Width - (Metric::CommonSmallMargin * 2) - Metric::EllipsisCellWidth; + int inputHeight = (singleLine && inputSize.height() < outputSize.height()) ? (outputSize.height() - inputSize.height()) : 0; m_inputView.setFrame(KDRect( - 0, 0, + 0, + inputHeight, std::min(maxFrameWidth, inputSize.width()), inputSize.height()), force); - KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay(); + int outputHeight = singleLine ? std::max(0, inputSize.height() - outputSize.height()) / 2 + std::max(0, (inputSize.height() - outputSize.height()) / 2) + 1 : inputSize.height(); m_scrollableOutputView.setFrame(KDRect( - std::max(0, maxFrameWidth - outputSize.width()), - inputSize.height(), - std::min(maxFrameWidth, outputSize.width()), - outputSize.height()), - force); + std::max(0, maxFrameWidth - outputSize.width()), + outputHeight, + std::min(maxFrameWidth, outputSize.width()), + outputSize.height()), + force); } void HistoryViewCell::resetMemoization() { diff --git a/escher/include/escher/metric.h b/escher/include/escher/metric.h index f514cb68c..0ac573c96 100644 --- a/escher/include/escher/metric.h +++ b/escher/include/escher/metric.h @@ -10,8 +10,8 @@ public: constexpr static KDCoordinate CommonRightMargin = 20; constexpr static KDCoordinate CommonTopMargin = 15; constexpr static KDCoordinate CommonBottomMargin = 15; - constexpr static KDCoordinate CommonLargeMargin = 10; - constexpr static KDCoordinate CommonSmallMargin = 5; + constexpr static KDCoordinate CommonLargeMargin = 12; + constexpr static KDCoordinate CommonSmallMargin = 12; constexpr static KDCoordinate TitleBarExternHorizontalMargin = 5; constexpr static KDCoordinate TitleBarHeight = 18; constexpr static KDCoordinate ParameterCellHeight = 35;