From d61ececdb8a53c88885e11f5f6f993fcb98f3dab Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 23 Feb 2021 12:01:32 +0100 Subject: Expose formattedDataSize() in QML Locale type This was added to qtbase in 9d23aeb. Qt Quick Dialogs needs it to display file sizes in FileDialog. [ChangeLog][QML][Locale] Added formattedDataSize() for formatting quantities of bytes as kB, MB, GB etc. Fixes: QTBUG-91283 Change-Id: I8ea64f961c04d4900d18fa45398670df89882c56 Reviewed-by: Ulf Hermann --- src/qml/qml/qqmllocale.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++ src/qml/qml/qqmllocale_p.h | 11 ++++++++++ 2 files changed, 61 insertions(+) (limited to 'src/qml') diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp index 8046a76b92..0d3b5d9883 100644 --- a/src/qml/qml/qqmllocale.cpp +++ b/src/qml/qml/qqmllocale.cpp @@ -495,6 +495,41 @@ ReturnedValue QQmlLocaleData::method_set_numberOptions(const QV4::FunctionObject return Encode::undefined(); } +ReturnedValue QQmlLocaleData::method_get_formattedDataSize(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc) +{ + QV4::Scope scope(b); + const QLocale *locale = getThisLocale(scope, thisObject); + if (!locale) + return Encode::undefined(); + + if (argc < 1 || argc > 3) { + THROW_ERROR(QString::fromLatin1( + "Locale: formattedDataSize(): Expected 1-3 arguments, but received %1").arg(argc).toLatin1()); + } + + const qint64 bytes = static_cast(argv[0].toInteger()); + if (argc == 1) + RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes))); + + int precision = 0; + if (argc >= 2) { + if (!argv[1].isInteger()) + THROW_ERROR("Locale: formattedDataSize(): Invalid argument ('precision' must be an int)"); + + precision = argv[1].toInt32(); + if (argc == 2) + RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes, precision))); + } + + // argc >= 3 + if (!argv[2].isNumber()) + THROW_ERROR("Locale: formattedDataSize(): Invalid argument ('format' must be DataSizeFormat)"); + + const quint32 intFormat = argv[2].toUInt32(); + const auto format = QLocale::DataSizeFormats(intFormat); + RETURN_RESULT(scope.engine->newString(locale->formattedDataSize(bytes, precision, format))); +} + ReturnedValue QQmlLocaleData::method_get_measurementSystem(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int) { QV4::Scope scope(b); @@ -701,6 +736,7 @@ QV4LocaleDataDeletable::QV4LocaleDataDeletable(QV4::ExecutionEngine *engine) o->defineDefaultProperty(QStringLiteral("monthName"), QQmlLocaleData::method_monthName, 0); o->defineDefaultProperty(QStringLiteral("currencySymbol"), QQmlLocaleData::method_currencySymbol, 0); o->defineDefaultProperty(QStringLiteral("dateTimeFormat"), QQmlLocaleData::method_dateTimeFormat, 0); + o->defineDefaultProperty(QStringLiteral("formattedDataSize"), QQmlLocaleData::method_get_formattedDataSize, 0); o->defineAccessorProperty(QStringLiteral("name"), QQmlLocaleData::method_get_name, nullptr); o->defineAccessorProperty(QStringLiteral("positiveSign"), QQmlLocaleData::method_get_positiveSign, nullptr); o->defineAccessorProperty(QStringLiteral("uiLanguages"), QQmlLocaleData::method_get_uiLanguages, nullptr); @@ -950,6 +986,20 @@ ReturnedValue QQmlLocale::method_localeCompare(const QV4::FunctionObject *b, con \sa Date */ +/*! + \qmlmethod string QtQml::Locale::formattedDataSize(int bytes, int precision, DataSizeFormat format) + \since 6.2 + + Converts a size in \a bytes to a human-readable localized string, comprising a + number and a quantified unit. + + The \a precision and \a format arguments are optional. + + For more information, see \l QLocale::formattedDataSize(). + + \sa QLocale::DataSizeFormats +*/ + /*! \qmlmethod string QtQml::Locale::monthName(month, type) diff --git a/src/qml/qml/qqmllocale_p.h b/src/qml/qml/qqmllocale_p.h index 73eae259fb..475bc639cf 100644 --- a/src/qml/qml/qqmllocale_p.h +++ b/src/qml/qml/qqmllocale_p.h @@ -139,6 +139,15 @@ namespace QQmlLocale }; Q_ENUM_NS(NumberOptions) + enum DataSizeFormat { + DataSizeBase1000 = QLocale::DataSizeBase1000, + DataSizeSIQuantifiers = QLocale::DataSizeSIQuantifiers, + DataSizeIecFormat = QLocale::DataSizeIecFormat, + DataSizeTraditionalFormat = QLocale::DataSizeTraditionalFormat, + DataSizeSIFormat = QLocale::DataSizeSIFormat + }; + Q_ENUM_NS(DataSizeFormat) + Q_QML_PRIVATE_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName); Q_QML_PRIVATE_EXPORT QV4::ReturnedValue wrap(QV4::ExecutionEngine *engine, const QLocale &locale); Q_QML_PRIVATE_EXPORT void registerStringLocaleCompare(QV4::ExecutionEngine *engine); @@ -205,6 +214,8 @@ struct QQmlLocaleData : public QV4::Object static QV4::ReturnedValue method_get_numberOptions(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc); static QV4::ReturnedValue method_set_numberOptions(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc); + + static QV4::ReturnedValue method_get_formattedDataSize(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc); }; } -- cgit v1.2.3