#pragma once #include #include #include #include #include #include namespace QuickMedia { enum class LoadingState { NOT_LOADED, LOADING, FINISHED_LOADING, APPLIED_TO_TEXTURE }; struct ThumbnailData { bool referenced = false; LoadingState loading_state = LoadingState::NOT_LOADED; sf::Texture texture; std::unique_ptr image; // Set in another thread. This should be .reset after loading it into |texture|, to save memory sf::Clock texture_applied_time; }; class AsyncImageLoader { public: // Returns false if the image loader is already loading an image. In that case, this function should be called again later. // set |resize_target_size| to {0, 0} to disable resizing. // |thumbnail_data.loading_state| has to be LoadingState::NOT_LOADED when calling this! // Note: this method is not thread-safe bool load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr thumbnail_data); private: bool loading_image = false; std::thread load_image_thread; }; }