diff --git a/apps/graph/list/list_parameter_controller.cpp b/apps/graph/list/list_parameter_controller.cpp index 65362b86b..f49df8484 100644 --- a/apps/graph/list/list_parameter_controller.cpp +++ b/apps/graph/list/list_parameter_controller.cpp @@ -53,6 +53,23 @@ char intervalBracket(double value, bool opening) { return std::isinf(value) == opening ? ']' : '['; } +void writeInterval(char * buffer, int bufferSize, double min, double max, int numberOfSignificantDigits, Preferences::PrintFloatMode mode) { + int numberOfChar = 0; + assert(bufferSize-1 > numberOfChar); + buffer[numberOfChar++] = intervalBracket(min, true); + int sizeRequiredForFloat = PrintFloat::bufferSizeForFloatsWithPrecision(numberOfSignificantDigits); + assert(sizeRequiredForFloat < bufferSize - numberOfChar); + numberOfChar += PrintFloat::ConvertFloatToText(min, buffer+numberOfChar, sizeRequiredForFloat, numberOfSignificantDigits, mode); + assert(bufferSize > numberOfChar); + numberOfChar += strlcpy(buffer+numberOfChar, ",", bufferSize-numberOfChar); + assert(sizeRequiredForFloat < bufferSize - numberOfChar); + numberOfChar += PrintFloat::ConvertFloatToText(max, buffer+numberOfChar, sizeRequiredForFloat, numberOfSignificantDigits, mode); + assert(bufferSize-1 > numberOfChar); + buffer[numberOfChar++] = intervalBracket(max, false); + assert(bufferSize > numberOfChar); + strlcpy(buffer+numberOfChar, " ", bufferSize-numberOfChar); +} + void ListParameterController::willDisplayCellForIndex(HighlightCell * cell, int index) { Shared::ListParameterController::willDisplayCellForIndex(cell, index); if ((cell == &m_typeCell || cell == &m_functionDomain) && !m_record.isNull()) { @@ -70,17 +87,11 @@ void ListParameterController::willDisplayCellForIndex(HighlightCell * cell, int double max = function->tMax(); constexpr int bufferSize = BufferTextView::k_maxNumberOfChar; char buffer[bufferSize]; - int numberOfChar = 0; - assert(bufferSize-1 > numberOfChar); - buffer[numberOfChar++] = intervalBracket(min, true); - numberOfChar += PoincareHelpers::ConvertFloatToText(min, buffer+numberOfChar, bufferSize-numberOfChar, Preferences::VeryShortNumberOfSignificantDigits); - assert(bufferSize > numberOfChar); - numberOfChar += strlcpy(buffer+numberOfChar, ",", bufferSize-numberOfChar); - numberOfChar += PoincareHelpers::ConvertFloatToText(max, buffer+numberOfChar, bufferSize-numberOfChar, Preferences::VeryShortNumberOfSignificantDigits); - assert(bufferSize-1 > numberOfChar); - buffer[numberOfChar++] = intervalBracket(max, false); - assert(bufferSize > numberOfChar); - numberOfChar += strlcpy(buffer+numberOfChar, " ", bufferSize-numberOfChar); + writeInterval(buffer, bufferSize, min, max, Preferences::VeryShortNumberOfSignificantDigits, Preferences::sharedPreferences()->displayMode()); + int numberOfAvailableChar = (m_functionDomain.bounds().width() - m_functionDomain.labelView()->bounds().width() - m_functionDomain.accessoryView()->bounds().width() - TableCell::k_labelMargin - TableCell::k_accessoryMargin)/KDFont::SmallFont->glyphSize().width(); + if (UTF8Helper::StringGlyphLength(buffer) > numberOfAvailableChar) { + writeInterval(buffer, bufferSize, min, max, Preferences::VeryShortNumberOfSignificantDigits-1, Preferences::PrintFloatMode::Scientific); + } m_functionDomain.setAccessoryText(buffer); } } diff --git a/escher/include/escher/table_cell.h b/escher/include/escher/table_cell.h index 0beec7046..8058a090d 100644 --- a/escher/include/escher/table_cell.h +++ b/escher/include/escher/table_cell.h @@ -15,13 +15,13 @@ public: virtual View * accessoryView() const; virtual View * subAccessoryView() const; void drawRect(KDContext * ctx, KDRect rect) const override; + constexpr static KDCoordinate k_labelMargin = 10; + constexpr static KDCoordinate k_accessoryMargin = 10; protected: int numberOfSubviews() const override; View * subviewAtIndex(int index) override; void layoutSubviews() override; constexpr static KDCoordinate k_separatorThickness = Metric::CellSeparatorThickness; - constexpr static KDCoordinate k_labelMargin = 10; - constexpr static KDCoordinate k_accessoryMargin = 10; private: constexpr static KDCoordinate k_accessoryBottomMargin = 3; Layout m_layout;