diff --git a/apps/graph/base.fr.i18n b/apps/graph/base.fr.i18n index 5014969aa..2d4af4a84 100644 --- a/apps/graph/base.fr.i18n +++ b/apps/graph/base.fr.i18n @@ -12,14 +12,14 @@ Zeros = "Zéros" Tangent = "Tangente" Intersection = "Intersection" Preimage = "Antécédent" -SelectLowerBound = "Selectionner la borne inférieure" -SelectUpperBound = "Selectionner la borne supérieure" +SelectLowerBound = "Sélectionner la borne inférieure" +SelectUpperBound = "Sélectionner la borne supérieure" NoMaximumFound = "Aucun maximum trouvé" NoMinimumFound = "Aucun minimum trouvé" NoZeroFound = "Aucun zéro trouvé" NoIntersectionFound = "Aucune intersection trouvée" NoPreimageFound = "Aucun antécédent trouvé" -DerivativeFunctionColumn = "Colonne de la fonction derivée" -HideDerivativeColumn = "Masquer la fonction derivée" +DerivativeFunctionColumn = "Colonne de la fonction dérivée" +HideDerivativeColumn = "Masquer la fonction dérivée" AllowedCharactersAZaz09 = "Caractères autorisés : A-Z, a-z, 0-9, _" ReservedName = "Nom réservé" diff --git a/apps/settings/base.fr.i18n b/apps/settings/base.fr.i18n index c76912acc..9a6cc3547 100644 --- a/apps/settings/base.fr.i18n +++ b/apps/settings/base.fr.i18n @@ -20,6 +20,6 @@ Cartesian = "Algébrique " Polar = "Exponentielle " Brightness = "Luminosité" SoftwareVersion = "Version du logiciel" -SerialNumber = "Numéro serie" +SerialNumber = "Numéro série" UpdatePopUp = "Rappel mise à jour" BetaPopUp = "Rappel version bêta" diff --git a/apps/solver/solutions_controller.cpp b/apps/solver/solutions_controller.cpp index 77e2138e4..dcb422691 100644 --- a/apps/solver/solutions_controller.cpp +++ b/apps/solver/solutions_controller.cpp @@ -79,7 +79,7 @@ SolutionsController::SolutionsController(Responder * parentResponder, EquationSt { m_delta2Layout = HorizontalLayout::Builder(VerticalOffsetLayout::Builder(CodePointLayout::Builder('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Position::Superscript), LayoutHelper::String("-4ac", 4, KDFont::SmallFont)); const char * deltaB = "Δ=b"; - static_cast(m_delta2Layout).addOrMergeChildAtIndex(LayoutHelper::String(deltaB, 3, KDFont::SmallFont), 0, false); + static_cast(m_delta2Layout).addOrMergeChildAtIndex(LayoutHelper::String(deltaB, strlen(deltaB), KDFont::SmallFont), 0, false); for (int i = 0; i < EquationStore::k_maxNumberOfExactSolutions; i++) { m_exactValueCells[i].setParentResponder(m_contentView.selectableTableView()); } diff --git a/apps/statistics/histogram_controller.cpp b/apps/statistics/histogram_controller.cpp index 70d02ac1d..fcd94ed73 100644 --- a/apps/statistics/histogram_controller.cpp +++ b/apps/statistics/histogram_controller.cpp @@ -90,6 +90,20 @@ Responder * HistogramController::tabController() const { return (parentResponder()->parentResponder()->parentResponder()->parentResponder()); } +void pad(char * buffer, int bufferSize, int * currentNumberOfChar, int maxGlyphLengthWithPadding) { + assert(*currentNumberOfChar <= bufferSize); + size_t currentGlyphLength = UTF8Helper::StringGlyphLength(buffer, *currentNumberOfChar); + bool addedPadding = false; + while (currentGlyphLength < maxGlyphLengthWithPadding && *currentNumberOfChar < bufferSize) { + *currentNumberOfChar = *currentNumberOfChar + UTF8Decoder::CodePointToChars(' ', buffer + *currentNumberOfChar, bufferSize - *currentNumberOfChar); + addedPadding = true; + currentGlyphLength++; + } + if (addedPadding) { + buffer[*currentNumberOfChar-1] = 0; + } +} + void HistogramController::reloadBannerView() { if (selectedSeriesIndex() < 0) { return; @@ -107,7 +121,7 @@ void HistogramController::reloadBannerView() { // Add lower bound if (selectedSeriesIndex() >= 0) { double lowerBound = m_store->startOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex); - numberOfChar += PoincareHelpers::ConvertFloatToText(lowerBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PoincareHelpers::ConvertFloatToText(lowerBound, buffer+numberOfChar, bufferSize-numberOfChar, Constant::LargeNumberOfSignificantDigits); } numberOfChar+= UTF8Decoder::CodePointToChars(';', buffer + numberOfChar, bufferSize - numberOfChar); @@ -115,15 +129,12 @@ void HistogramController::reloadBannerView() { // Add upper bound if (selectedSeriesIndex() >= 0) { double upperBound = m_store->endOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex); - numberOfChar += PoincareHelpers::ConvertFloatToText(upperBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PoincareHelpers::ConvertFloatToText(upperBound, buffer+numberOfChar, bufferSize-numberOfChar, Constant::LargeNumberOfSignificantDigits); } numberOfChar+= UTF8Decoder::CodePointToChars('[', buffer + numberOfChar, bufferSize - numberOfChar); // Padding - for (int i = numberOfChar; i < k_maxIntervalLegendLength; i++) { - numberOfChar+= UTF8Decoder::CodePointToChars(' ', buffer + numberOfChar, bufferSize - numberOfChar); - } - buffer[k_maxIntervalLegendLength] = 0; + pad(buffer, bufferSize, &numberOfChar, k_maxIntervalLegendLength); m_view.bannerView()->intervalView()->setText(buffer); // Add Size Data @@ -135,13 +146,10 @@ void HistogramController::reloadBannerView() { double size = 0; if (selectedSeriesIndex() >= 0) { size = m_store->heightOfBarAtIndex(selectedSeriesIndex(), *m_selectedBarIndex); - numberOfChar += PoincareHelpers::ConvertFloatToText(size, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PoincareHelpers::ConvertFloatToText(size, buffer+numberOfChar, bufferSize-numberOfChar, Constant::LargeNumberOfSignificantDigits); } // Padding - for (int i = numberOfChar; i < k_maxLegendLength; i++) { - numberOfChar+= UTF8Decoder::CodePointToChars(' ', buffer + numberOfChar, bufferSize - numberOfChar); - } - buffer[k_maxLegendLength] = 0; + pad(buffer, bufferSize, &numberOfChar, k_maxLegendLength); m_view.bannerView()->sizeView()->setText(buffer); // Add Frequency Data @@ -152,13 +160,10 @@ void HistogramController::reloadBannerView() { numberOfChar += legendLength; if (selectedSeriesIndex() >= 0) { double frequency = size/m_store->sumOfOccurrences(selectedSeriesIndex()); - numberOfChar += PoincareHelpers::ConvertFloatToText(frequency, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PoincareHelpers::ConvertFloatToText(frequency, buffer+numberOfChar, bufferSize - numberOfChar, Constant::LargeNumberOfSignificantDigits); } // Padding - for (int i = numberOfChar; i < k_maxLegendLength; i++) { - numberOfChar+= UTF8Decoder::CodePointToChars(' ', buffer + numberOfChar, bufferSize - numberOfChar); - } - buffer[k_maxLegendLength] = 0; + pad(buffer, bufferSize, &numberOfChar, k_maxLegendLength); m_view.bannerView()->frequencyView()->setText(buffer); m_view.bannerView()->reload(); diff --git a/escher/include/escher/text_input_helpers.h b/escher/include/escher/text_input_helpers.h index 04718b4b5..2fa8e2671 100644 --- a/escher/include/escher/text_input_helpers.h +++ b/escher/include/escher/text_input_helpers.h @@ -6,7 +6,7 @@ namespace TextInputHelpers { -const char * CursorPositionInCommand(const char * text); +const char * CursorPositionInCommand(const char * text, const char * stoppingPosition = nullptr); /* Returns the pointer to the char that should be right of the cursor, which is * the first char between : * - The first EmptyChar (which is the position of the first argument) diff --git a/escher/src/text_area.cpp b/escher/src/text_area.cpp index 86bb1d560..e1c73ea97 100644 --- a/escher/src/text_area.cpp +++ b/escher/src/text_area.cpp @@ -34,47 +34,62 @@ static inline void InsertSpacesAtLocation(int spacesCount, char * buffer, int bu } bool TextArea::handleEventWithText(const char * text, bool indentation, bool forceCursorRightOfText) { - constexpr int bufferSize = TextField::maxBufferSize(); - char buffer[bufferSize]; - - size_t textLength = strlcpy(buffer, text, bufferSize); - - // Add indentation spaces + if (*text == 0) { + return false; + } + /* Compute the indentation. If the text cannot be inserted with the + * indentation, stop here. */ + int spacesCount = 0; + int totalIndentationSize = 0; + int textLen = strlen(text); + char * insertionPosition = const_cast(cursorLocation()); if (indentation) { // Compute the indentation - int spacesCount = indentationBeforeCursor(); - const char * teaxtAreaBuffer = contentView()->text(); - if (cursorLocation() > teaxtAreaBuffer && UTF8Helper::PreviousCodePointIs(teaxtAreaBuffer, cursorLocation(), ':')) { + spacesCount = indentationBeforeCursor(); + const char * textAreaBuffer = contentView()->text(); + if (insertionPosition > textAreaBuffer && UTF8Helper::PreviousCodePointIs(textAreaBuffer, insertionPosition, ':')) { spacesCount += k_indentationSpaces; } - // Check the text will not overflow the buffer - int totalIndentationSize = UTF8Helper::CountOccurrences(text, '\n') * spacesCount; - if (contentView()->getText()->textLength() + textLength + totalIndentationSize >= contentView()->getText()->bufferSize() || textLength == 0) { + totalIndentationSize = UTF8Helper::CountOccurrences(text, '\n') * spacesCount; + if (contentView()->getText()->textLength() + textLen + totalIndentationSize >= contentView()->getText()->bufferSize()) { return false; } - - UTF8Helper::PerformAtCodePoints( - buffer, '\n', - [](int codePointOffset, void * text, int indentation) { - int offset = codePointOffset + UTF8Decoder::CharSizeOfCodePoint('\n'); - InsertSpacesAtLocation(indentation, (char *)text + offset, TextField::maxBufferSize() - offset); //TODO - }, - [](int c1, void * c2, int c3) {}, - (void *)buffer, - spacesCount); } - const char * cursorPositionInCommand = TextInputHelpers::CursorPositionInCommand(buffer); - - // Remove the Empty code points - UTF8Helper::RemoveCodePoint(buffer, UCodePointEmpty, &cursorPositionInCommand); // Insert the text - if (insertTextAtLocation(buffer, cursorLocation())) { - // Set the cursor location - const char * nextCursorLocation = cursorLocation() + (forceCursorRightOfText ? strlen(buffer) : cursorPositionInCommand - buffer); - setCursorLocation(nextCursorLocation); + if (!insertTextAtLocation(text, insertionPosition)) { + return true; } + + // Insert the indentation + if (indentation) { + UTF8Helper::PerformAtCodePoints( + insertionPosition, + '\n', + [](int codePointOffset, void * text, int indentation, int bufferLength) { + int offset = codePointOffset + UTF8Decoder::CharSizeOfCodePoint('\n'); + InsertSpacesAtLocation(indentation, (char *)text + offset, bufferLength); + }, + [](int c1, void * c2, int c3, int c4) {}, + (void *)insertionPosition, + spacesCount, + contentView()->getText()->bufferSize() - (insertionPosition - contentView()->getText()->text()), + UCodePointNull, + true, + nullptr, + insertionPosition + textLen); + } + const char * endOfInsertedText = insertionPosition + textLen + totalIndentationSize; + const char * cursorPositionInCommand = TextInputHelpers::CursorPositionInCommand(insertionPosition, endOfInsertedText); + + // Remove the Empty code points + UTF8Helper::RemoveCodePoint(insertionPosition, UCodePointEmpty, &cursorPositionInCommand, endOfInsertedText); + + // Set the cursor location + const char * nextCursorLocation = forceCursorRightOfText ? endOfInsertedText : cursorPositionInCommand; + setCursorLocation(nextCursorLocation); + return true; } @@ -136,14 +151,14 @@ int TextArea::indentationBeforeCursor() const { * indentation size when encountering spaces, reset it to 0 when encountering * another code point, until reaching the beginning of the line. */ UTF8Helper::PerformAtCodePoints(const_cast