summaryrefslogtreecommitdiff
path: root/Userland/Applications
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Applications')
-rw-r--r--Userland/Applications/FileManager/FileOperationProgress.gml19
-rw-r--r--Userland/Applications/FileManager/FileOperationProgressWidget.cpp55
-rw-r--r--Userland/Applications/FileManager/FileOperationProgressWidget.h4
3 files changed, 58 insertions, 20 deletions
diff --git a/Userland/Applications/FileManager/FileOperationProgress.gml b/Userland/Applications/FileManager/FileOperationProgress.gml
index ab7012deff..c1aaada483 100644
--- a/Userland/Applications/FileManager/FileOperationProgress.gml
+++ b/Userland/Applications/FileManager/FileOperationProgress.gml
@@ -29,6 +29,7 @@
text_alignment: "CenterLeft"
font_weight: "Bold"
fixed_height: 32
+ name: "files_copied_label"
}
@GUI::HorizontalSeparator {
@@ -36,7 +37,7 @@
}
@GUI::Widget {
- fixed_height: 32
+ fixed_height: 22
layout: @GUI::HorizontalBoxLayout {
}
@@ -55,28 +56,22 @@
}
}
- @GUI::Progressbar {
- fixed_height: 22
- name: "current_file_progressbar"
- min: 0
- }
-
@GUI::Widget {
- fixed_height: 32
+ fixed_height: 22
layout: @GUI::HorizontalBoxLayout {
}
@GUI::Label {
- text: "Overall progress: "
+ text: "Time left: "
font_weight: "Bold"
text_alignment: "CenterLeft"
- fixed_width: 120
+ fixed_width: 80
}
@GUI::Label {
- name: "overall_progress_label"
- text: "Placeholder"
+ name: "estimated_time_label"
+ text: "Estimating..."
text_alignment: "CenterLeft"
}
}
diff --git a/Userland/Applications/FileManager/FileOperationProgressWidget.cpp b/Userland/Applications/FileManager/FileOperationProgressWidget.cpp
index 5adbc0711f..e79f56c0e1 100644
--- a/Userland/Applications/FileManager/FileOperationProgressWidget.cpp
+++ b/Userland/Applications/FileManager/FileOperationProgressWidget.cpp
@@ -86,6 +86,8 @@ FileOperationProgressWidget::FileOperationProgressWidget(NonnullRefPtr<Core::Fil
parts[7]);
}
};
+
+ m_elapsed_timer.start();
}
FileOperationProgressWidget::~FileOperationProgressWidget()
@@ -107,20 +109,57 @@ void FileOperationProgressWidget::did_error()
window()->close();
}
-void FileOperationProgressWidget::did_progress([[maybe_unused]] off_t bytes_done, [[maybe_unused]] off_t total_byte_count, size_t files_done, size_t total_file_count, off_t current_file_done, off_t current_file_size, const StringView& current_file_name)
+String FileOperationProgressWidget::estimate_time(off_t bytes_done, off_t total_byte_count)
+{
+ int elapsed = m_elapsed_timer.elapsed() / 1000;
+
+ if (bytes_done == 0 || elapsed < 3)
+ return "Estimating...";
+
+ off_t bytes_left = total_byte_count - bytes_done;
+ int seconds_remaining = (bytes_left * elapsed) / bytes_done;
+
+ if (seconds_remaining < 30)
+ return String::formatted("{} seconds", 5 + seconds_remaining - seconds_remaining % 5);
+ if (seconds_remaining < 60)
+ return "About a minute";
+ if (seconds_remaining < 90)
+ return "Over a minute";
+ if (seconds_remaining < 120)
+ return "Less than two minutes";
+
+ time_t minutes_remaining = seconds_remaining / 60;
+ seconds_remaining %= 60;
+
+ if (minutes_remaining < 60) {
+ if (seconds_remaining < 30)
+ return String::formatted("About {} minutes", minutes_remaining);
+ return String::formatted("Over {} minutes", minutes_remaining);
+ }
+
+ time_t hours_remaining = minutes_remaining / 60;
+ minutes_remaining %= 60;
+
+ return String::formatted("{} hours and {} minutes", hours_remaining, minutes_remaining);
+}
+
+void FileOperationProgressWidget::did_progress(off_t bytes_done, off_t total_byte_count, size_t files_done, size_t total_file_count, [[maybe_unused]] off_t current_file_done, [[maybe_unused]] off_t current_file_size, const StringView& current_file_name)
{
+ auto& files_copied_label = *find_descendant_of_type_named<GUI::Label>("files_copied_label");
auto& current_file_label = *find_descendant_of_type_named<GUI::Label>("current_file_label");
- auto& current_file_progressbar = *find_descendant_of_type_named<GUI::Progressbar>("current_file_progressbar");
- auto& overall_progress_label = *find_descendant_of_type_named<GUI::Label>("overall_progress_label");
auto& overall_progressbar = *find_descendant_of_type_named<GUI::Progressbar>("overall_progressbar");
+ auto& estimated_time_label = *find_descendant_of_type_named<GUI::Label>("estimated_time_label");
current_file_label.set_text(current_file_name);
- current_file_progressbar.set_max(current_file_size);
- current_file_progressbar.set_value(current_file_done);
- overall_progress_label.set_text(String::formatted("{} of {}", files_done, total_file_count));
- overall_progressbar.set_max(total_file_count);
- overall_progressbar.set_value(files_done);
+ files_copied_label.set_text(String::formatted("Copying file {} of {}", files_done, total_file_count));
+ estimated_time_label.set_text(estimate_time(bytes_done, total_byte_count));
+
+ if (total_byte_count) {
+ window()->set_progress(100.0f * bytes_done / total_byte_count);
+ overall_progressbar.set_max(total_byte_count);
+ overall_progressbar.set_value(bytes_done);
+ }
}
void FileOperationProgressWidget::close_pipe()
diff --git a/Userland/Applications/FileManager/FileOperationProgressWidget.h b/Userland/Applications/FileManager/FileOperationProgressWidget.h
index 8c47b67bfd..fcebebb02e 100644
--- a/Userland/Applications/FileManager/FileOperationProgressWidget.h
+++ b/Userland/Applications/FileManager/FileOperationProgressWidget.h
@@ -26,6 +26,7 @@
#pragma once
+#include <LibCore/ElapsedTimer.h>
#include <LibGUI/Widget.h>
namespace FileManager {
@@ -45,6 +46,9 @@ private:
void close_pipe();
+ String estimate_time(off_t bytes_done, off_t total_byte_count);
+ Core::ElapsedTimer m_elapsed_timer;
+
RefPtr<Core::Notifier> m_notifier;
RefPtr<Core::File> m_helper_pipe;
};