From 77ed51898157d99112be7550471ec06e32344c9e Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 11 Oct 2020 21:35:37 +0200 Subject: Refactor plugin into seperate pages TODO: Readd 4chan login page, manganelo creators page, autocomplete --- plugins/Page.hpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 plugins/Page.hpp (limited to 'plugins/Page.hpp') diff --git a/plugins/Page.hpp b/plugins/Page.hpp new file mode 100644 index 0000000..947f045 --- /dev/null +++ b/plugins/Page.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include "Plugin.hpp" + +#include "../include/Tab.hpp" +#include "../include/SearchBar.hpp" +#include "../include/Body.hpp" + +namespace QuickMedia { + constexpr int SEARCH_DELAY_FILTER = 50; + + class Page { + public: + Page(Program *program) : program(program) {} + virtual ~Page() = default; + + virtual const char* get_title() const = 0; + virtual bool search_is_filter() { return true; } + // This show be overriden if search_is_filter is overriden to return false + virtual SearchResult search(const std::string &str, BodyItems &result_items) { (void)str; (void)result_items; return SearchResult::ERR; } + + // Return empty |result_tabs| and PluginResult::OK to do nothing; which is useful for implementing custom actions on item submit + virtual PluginResult submit(const std::string &title, const std::string &url, std::vector &result_tabs) = 0; + virtual PluginResult get_page(const std::string &str, int page, BodyItems &result_items) { (void)str; (void)page; (void)result_items; return PluginResult::OK; } + + virtual BodyItems get_related_media(const std::string &url); + + DownloadResult download_json(Json::Value &result, const std::string &url, std::vector additional_args, bool use_browser_useragent = false, std::string *err_msg = nullptr); + + virtual bool is_manga_images_page() const { return false; } + virtual bool is_image_board_thread_page() const { return false; } + virtual bool is_video_page() const { return false; } + // Mutually exclusive with |is_manga_images_page|, |is_image_board_thread_page| and |is_video_page| + virtual bool is_single_page() const { return false; } + virtual bool is_trackable() const { return false; } + + bool is_tor_enabled(); + std::unique_ptr create_body(); + std::unique_ptr create_search_bar(const std::string &placeholder_text, int search_delay); + + bool load_manga_content_storage(const char *service_name, const std::string &manga_title, const std::string &manga_id); + + Program *program; + }; + + enum class TrackResult { + OK, + ERR + }; + + class TrackablePage : public Page { + public: + TrackablePage(Program *program, std::string content_title, std::string content_url) : Page(program), content_title(std::move(content_title)), content_url(std::move(content_url)) {} + const char* get_title() const override { return content_title.c_str(); } + bool is_trackable() const override { return true; } + virtual TrackResult track(const std::string &str) = 0; + + const std::string content_title; + const std::string content_url; + }; +} \ No newline at end of file -- cgit v1.2.3