#pragma once #include "Body.hpp" #include "SearchBar.hpp" #include "Page.hpp" #include "Storage.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace QuickMedia { class Plugin; class FileManager; class Manga; enum class ImageViewMode { SINGLE, SCROLL }; struct CopyOp { Path source; Path destination; }; class Program { public: Program(); ~Program(); int run(int argc, char **argv); Plugin* get_current_plugin() { return current_plugin; } private: void base_event_handler(sf::Event &event, Page previous_page, bool handle_key_press = true, bool clear_on_escape = true, bool handle_searchbar = true); void search_suggestion_page(); void search_result_page(); void video_content_page(); void episode_list_page(); void image_page(); void image_continuous_page(); void content_list_page(); void content_details_page(); void image_board_thread_list_page(); void image_board_thread_page(); void chat_login_page(); void chat_page(); void file_manager_page(); bool on_search_suggestion_submit_text(Body *input_body, Body *output_body); enum class LoadImageResult { OK, FAILED, DOWNLOAD_IN_PROGRESS }; LoadImageResult load_image_by_index(int image_index, sf::Texture &image_texture, sf::String &error_message); void download_chapter_images_if_needed(Manga *image_plugin); void select_episode(BodyItem *item, bool start_from_beginning); // Returns Page::EXIT if empty Page pop_page_stack(); void plugin_get_watch_history(Plugin *plugin, BodyItems &history_items); Json::Value load_video_history_json(Plugin *plugin); Json::Value load_recommended_json(Plugin *plugin); void save_recommendations_from_related_videos(); private: Display *disp; sf::RenderWindow window; int monitor_hz; sf::Vector2f window_size; std::unique_ptr font; std::unique_ptr bold_font; std::unique_ptr cjk_font; Body *body; Plugin *current_plugin; sf::Texture plugin_logo; std::unique_ptr search_bar; Page current_page; std::stack page_stack; // TODO: Combine these std::string images_url; std::string content_title; std::string content_episode; std::string content_url; std::string content_list_url; std::string image_board_thread_list_url; std::string chapter_title; int image_index; Path content_storage_file; Path content_cache_dir; std::string manga_id_base64; Json::Value content_storage_json; std::unordered_set watched_videos; std::future search_suggestion_future; std::future autocomplete_future; std::future image_download_future; std::thread image_upscale_thead; std::mutex image_upscale_mutex; std::deque images_to_upscale; std::condition_variable image_upscale_cv; std::string downloading_chapter_url; bool image_download_cancel = false; int exit_code = 0; std::string resources_root; bool use_tor = false; bool use_system_mpv_config = false; bool upscale_images = false; bool running = false; // TODO: Save this to config file when switching modes ImageViewMode image_view_mode = ImageViewMode::SINGLE; Body *related_media_body; std::vector selected_files; FileManager *file_manager = nullptr; }; }