aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/FileManager.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-04-30 21:04:47 +0200
committerdec05eba <dec05eba@protonmail.com>2021-04-30 21:18:06 +0200
commit50afa93c577bed3eb9911d141d46f2e0d3ba2572 (patch)
treef910aa9617bca27435325fb72eec36d8e9aea808 /src/plugins/FileManager.cpp
parent47bb22a4aee886deb54ca432bdb14747bf2e9160 (diff)
Add 4chan file upload
Diffstat (limited to 'src/plugins/FileManager.cpp')
-rw-r--r--src/plugins/FileManager.cpp72
1 files changed, 64 insertions, 8 deletions
diff --git a/src/plugins/FileManager.cpp b/src/plugins/FileManager.cpp
index f15deae..814ee70 100644
--- a/src/plugins/FileManager.cpp
+++ b/src/plugins/FileManager.cpp
@@ -14,12 +14,31 @@ namespace QuickMedia {
return "";
}
- static std::filesystem::file_time_type file_get_filetime_or(const std::filesystem::directory_entry &path, std::filesystem::file_time_type default_value) {
- try {
- return path.last_write_time();
- } catch(const std::filesystem::filesystem_error &err) {
+ static std::filesystem::file_time_type file_get_last_modified_time(const std::filesystem::directory_entry &path, std::filesystem::file_time_type default_value) {
+ std::error_code err;
+ auto last_write_time = path.last_write_time(err);
+ if(err)
return default_value;
- }
+ else
+ return last_write_time;
+ }
+
+ static std::string file_size_to_human_readable_string(size_t bytes) {
+ double kb = (double)bytes / 1024.0;
+ double mb = (double)bytes / 1024.0 / 1024.0;
+ double gb = (double)bytes / 1024.0 / 1024.0 / 1024.0;
+ char result[32];
+
+ if(gb >= 1.0)
+ snprintf(result, sizeof(result), "%.2f GiB", gb);
+ else if(mb >= 1.0)
+ snprintf(result, sizeof(result), "%.2f MiB", mb);
+ else if(kb >= 1.0)
+ snprintf(result, sizeof(result), "%.2f KiB", kb);
+ else
+ snprintf(result, sizeof(result), "%zu bytes", bytes);
+
+ return result;
}
PluginResult FileManagerPage::submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) {
@@ -71,7 +90,7 @@ namespace QuickMedia {
}
std::sort(paths.begin(), paths.end(), [](const std::filesystem::directory_entry &path1, std::filesystem::directory_entry &path2) {
- return file_get_filetime_or(path1, std::filesystem::file_time_type::min()) > file_get_filetime_or(path2, std::filesystem::file_time_type::min());
+ return file_get_last_modified_time(path1, std::filesystem::file_time_type::min()) > file_get_last_modified_time(path2, std::filesystem::file_time_type::min());
});
if(current_dir != "/") {
@@ -79,14 +98,51 @@ namespace QuickMedia {
result_items.push_back(std::move(parent_item));
}
+ char time_str[128] = {0};
for(auto &p : paths) {
- auto body_item = BodyItem::create(p.path().filename().string());
+ std::error_code regular_file_err;
+ bool is_regular_file = p.is_regular_file(regular_file_err);
+ if(regular_file_err)
+ is_regular_file = true;
+
// TODO: Check file magic number instead of extension?
const char *ext = get_ext(p.path());
- if(p.is_regular_file() && (is_image_ext(ext) || is_video_ext(ext))) {
+ FileManagerMimeType file_mime_type = FILE_MANAGER_MIME_TYPE_OTHER;
+ if(is_regular_file) {
+ if(is_image_ext(ext))
+ file_mime_type = FILE_MANAGER_MIME_TYPE_IMAGE;
+ else if(is_video_ext(ext))
+ file_mime_type = FILE_MANAGER_MIME_TYPE_VIDEO;
+ }
+
+ if(is_regular_file && !(mime_type & file_mime_type))
+ continue;
+
+ auto body_item = BodyItem::create(p.path().filename().string());
+ if(file_mime_type == FILE_MANAGER_MIME_TYPE_IMAGE || file_mime_type == FILE_MANAGER_MIME_TYPE_VIDEO) {
body_item->thumbnail_is_local = true;
body_item->thumbnail_url = p.path().string();
}
+
+ time_t last_modified_time = std::chrono::duration_cast<std::chrono::seconds>(file_get_last_modified_time(p, std::filesystem::file_time_type::min()).time_since_epoch()).count();
+ struct tm last_modified_tm;
+ localtime_r(&last_modified_time, &last_modified_tm);
+ strftime(time_str, sizeof(time_str) - 1, "%a %b %d %H:%M", &last_modified_tm);
+
+ std::error_code file_size_err;
+ size_t file_size = p.file_size(file_size_err);
+ if(file_size_err)
+ file_size = 0;
+
+ std::string description = "Modified: ";
+ description += time_str;
+ if(is_regular_file) {
+ description += "\n";
+ description += "Size: " + file_size_to_human_readable_string(file_size);
+ }
+ body_item->set_description(std::move(description));
+ body_item->set_description_color(sf::Color(179, 179, 179));
+
result_items.push_back(std::move(body_item));
}