From a8e0846a7c111a8d5b5cf8592ecb9b9bbd15ce26 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 22 Sep 2020 22:46:29 +0200 Subject: Initial file manager implementation, with thumbnail caching --- src/plugins/FileManager.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++ src/plugins/Matrix.cpp | 7 +++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/plugins/FileManager.cpp (limited to 'src/plugins') diff --git a/src/plugins/FileManager.cpp b/src/plugins/FileManager.cpp new file mode 100644 index 0000000..fc6205c --- /dev/null +++ b/src/plugins/FileManager.cpp @@ -0,0 +1,59 @@ +#include "../../plugins/FileManager.hpp" +#include "../../include/ImageUtils.hpp" +#include + +namespace QuickMedia { + FileManager::FileManager() : Plugin("file-manager"), current_dir("/") { + + } + + // Returns empty string if no extension + static const char* get_ext(const std::filesystem::path &path) { + const char *path_c = path.c_str(); + int len = strlen(path_c); + for(int i = len - 1; i >= 0; --i) { + if(path_c[i] == '.') + return path_c + i; + } + return ""; + } + + PluginResult FileManager::get_files_in_directory(BodyItems &result_items) { + try { + for(auto &p : std::filesystem::directory_iterator(current_dir)) { + auto body_item = std::make_unique(p.path().filename().string()); + if(p.is_regular_file()) { + if(is_image_ext(get_ext(p.path()))) { + body_item->thumbnail_is_local = true; + body_item->thumbnail_url = p.path().string(); + } + } + result_items.push_back(std::move(body_item)); + } + return PluginResult::OK; + } catch(const std::filesystem::filesystem_error &err) { + fprintf(stderr, "Failed to list files in directory %s, error: %s\n", current_dir.c_str(), err.what()); + return PluginResult::ERR; + } + } + + bool FileManager::set_current_directory(const std::string &path) { + if(!std::filesystem::is_directory(path)) + return false; + current_dir = path; + return true; + } + + bool FileManager::set_child_directory(const std::string &filename) { + std::filesystem::path new_path = current_dir / filename; + if(std::filesystem::is_directory(new_path)) { + current_dir = std::move(new_path); + return true; + } + return false; + } + + const std::filesystem::path& FileManager::get_current_dir() const { + return current_dir; + } +} \ No newline at end of file diff --git a/src/plugins/Matrix.cpp b/src/plugins/Matrix.cpp index 8c6d07d..ff854c5 100644 --- a/src/plugins/Matrix.cpp +++ b/src/plugins/Matrix.cpp @@ -191,7 +191,12 @@ namespace QuickMedia { auto body_item = std::make_unique(""); body_item->author = user_info.display_name; body_item->set_description(it->body); - body_item->thumbnail_url = user_info.avatar_url; + if(!it->thumbnail_url.empty()) + body_item->thumbnail_url = it->thumbnail_url; + else if(!it->url.empty()) + body_item->thumbnail_url = it->url; + else + body_item->thumbnail_url = user_info.avatar_url; // TODO: Show image thumbnail inline instead of url to image body_item->url = it->url; result_items.push_back(std::move(body_item)); -- cgit v1.2.3