1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#pragma once
#include "Body.hpp"
#include "SearchBar.hpp"
#include "Page.hpp"
#include "Storage.hpp"
#include <vector>
#include <memory>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <json/value.h>
#include <unordered_set>
#include <future>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <stack>
#include <deque>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
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<sf::Font> font;
std::unique_ptr<sf::Font> bold_font;
std::unique_ptr<sf::Font> cjk_font;
Body *body;
Plugin *current_plugin;
sf::Texture plugin_logo;
std::unique_ptr<SearchBar> search_bar;
Page current_page;
std::stack<Page> 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<std::string> watched_videos;
std::future<BodyItems> search_suggestion_future;
std::future<std::string> autocomplete_future;
std::future<void> image_download_future;
std::thread image_upscale_thead;
std::mutex image_upscale_mutex;
std::deque<CopyOp> 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<std::string> selected_files;
FileManager *file_manager = nullptr;
};
}
|