diff options
author | TheKodeToad <TheKodeToad@proton.me> | 2023-06-14 20:05:02 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-14 20:05:02 +0100 |
commit | 3526d00a2330aad7d01f345816505c4d1cd5b096 (patch) | |
tree | 31b34c829f21ef6f49bc3dda6bd1fc6b55ac7029 /launcher/StringUtils.cpp | |
parent | 79ce7eb1fc9351e689e7106e3dc3a641d9614c9a (diff) | |
parent | a4502f44c291fad2174e84bf883cdb754aa08e28 (diff) | |
download | PrismLauncher-3526d00a2330aad7d01f345816505c4d1cd5b096.tar.gz PrismLauncher-3526d00a2330aad7d01f345816505c4d1cd5b096.tar.bz2 PrismLauncher-3526d00a2330aad7d01f345816505c4d1cd5b096.zip |
Merge branch 'develop' into feat/dont-hide-settings
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
Diffstat (limited to 'launcher/StringUtils.cpp')
-rw-r--r-- | launcher/StringUtils.cpp | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/launcher/StringUtils.cpp b/launcher/StringUtils.cpp index d109d63d..e08e6fdc 100644 --- a/launcher/StringUtils.cpp +++ b/launcher/StringUtils.cpp @@ -33,10 +33,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + #include "StringUtils.h" +#include <QRegularExpression> #include <QUuid> +#include <cmath> /// If you're wondering where these came from exactly, then know you're not the only one =D @@ -113,6 +115,69 @@ int StringUtils::naturalCompare(const QString& s1, const QString& s2, Qt::CaseSe return QString::compare(s1, s2, cs); } +QString StringUtils::truncateUrlHumanFriendly(QUrl& url, int max_len, bool hard_limit) +{ + auto display_options = QUrl::RemoveUserInfo | QUrl::RemoveFragment | QUrl::NormalizePathSegments; + auto str_url = url.toDisplayString(display_options); + + if (str_url.length() <= max_len) + return str_url; + + auto url_path_parts = url.path().split('/'); + QString last_path_segment = url_path_parts.takeLast(); + + if (url_path_parts.size() >= 1 && url_path_parts.first().isEmpty()) + url_path_parts.removeFirst(); // drop empty first segment (from leading / ) + + if (url_path_parts.size() >= 1) + url_path_parts.removeLast(); // drop the next to last path segment + + auto url_template = QStringLiteral("%1://%2/%3%4"); + + auto url_compact = url_path_parts.isEmpty() + ? url_template.arg(url.scheme(), url.host(), QStringList({ "...", last_path_segment }).join('/'), url.query()) + : url_template.arg(url.scheme(), url.host(), + QStringList({ url_path_parts.join('/'), "...", last_path_segment }).join('/'), url.query()); + + // remove url parts one by one if it's still too long + while (url_compact.length() > max_len && url_path_parts.size() >= 1) { + url_path_parts.removeLast(); // drop the next to last path segment + url_compact = url_path_parts.isEmpty() + ? url_template.arg(url.scheme(), url.host(), QStringList({ "...", last_path_segment }).join('/'), url.query()) + : url_template.arg(url.scheme(), url.host(), + QStringList({ url_path_parts.join('/'), "...", last_path_segment }).join('/'), url.query()); + } + + if ((url_compact.length() >= max_len) && hard_limit) { + // still too long, truncate normaly + url_compact = QString(str_url); + auto to_remove = url_compact.length() - max_len + 3; + url_compact.remove(url_compact.length() - to_remove - 1, to_remove); + url_compact.append("..."); + } + + return url_compact; +} + +static const QStringList s_units_si{ "KB", "MB", "GB", "TB" }; +static const QStringList s_units_kibi{ "KiB", "MiB", "GiB", "TiB" }; + +QString StringUtils::humanReadableFileSize(double bytes, bool use_si, int decimal_points) +{ + const QStringList units = use_si ? s_units_si : s_units_kibi; + const int scale = use_si ? 1000 : 1024; + + int u = -1; + double r = pow(10, decimal_points); + + do { + bytes /= scale; + u++; + } while (round(abs(bytes) * r) / r >= scale && u < units.length() - 1); + + return QString::number(bytes, 'f', 2) + " " + units[u]; +} + QString StringUtils::getRandomAlphaNumeric() { return QUuid::createUuid().toString(QUuid::Id128); |