From 4463adc0ffa49bc1450cf3b1a5c87fc76d60db63 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 15 Sep 2019 17:49:43 +0200 Subject: [PATCH] FileManager: Show human-readable file size info in the status bar Fixes #553. --- Applications/FileManager/DirectoryView.cpp | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index e37ae0acee1..dd1f724348c 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -4,6 +4,24 @@ #include #include +// FIXME: Remove this hackery once printf() supports floats. +static String number_string_with_one_decimal(float number, const char* suffix) +{ + float decimals = number - (int)number; + return String::format("%d.%d %s", (int)number, (int)(decimals * 10), suffix); +} + +static String human_readable_size(size_t size) +{ + if (size < 1 * KB) + return String::format("%zu bytes", size); + if (size < 1 * MB) + return number_string_with_one_decimal((float)size / (float)KB, "KB"); + if (size < 1 * GB) + return number_string_with_one_decimal((float)size / (float)MB, "MB"); + return number_string_with_one_decimal((float)size / (float)GB, "GB"); +} + void DirectoryView::handle_activation(const GModelIndex& index) { if (!index.is_valid()) @@ -191,11 +209,10 @@ void DirectoryView::open_next_directory() void DirectoryView::update_statusbar() { if (current_view().selection().is_empty()) { - set_status_message(String::format("%d item%s (%u byte%s)", + set_status_message(String::format("%d item%s (%s)", model().row_count(), model().row_count() != 1 ? "s" : "", - model().bytes_in_files(), - model().bytes_in_files() != 1 ? "s" : "")); + human_readable_size(model().bytes_in_files()).characters())); return; } @@ -208,9 +225,8 @@ void DirectoryView::update_statusbar() selected_byte_count += file_size; }); - set_status_message(String::format("%d item%s selected (%u byte%s)", + set_status_message(String::format("%d item%s selected (%s)", selected_item_count, selected_item_count != 1 ? "s" : "", - selected_byte_count, - selected_byte_count != 1 ? "s" : "")); + human_readable_size(selected_byte_count).characters())); }