diff options
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | include/Scale.hpp | 17 | ||||
-rw-r--r-- | plugins/Manga.hpp | 1 | ||||
-rw-r--r-- | plugins/MangaGeneric.hpp | 1 | ||||
-rw-r--r-- | plugins/Mangadex.hpp | 1 | ||||
-rw-r--r-- | plugins/Manganelo.hpp | 1 | ||||
-rw-r--r-- | plugins/Page.hpp | 2 | ||||
-rw-r--r-- | src/QuickMedia.cpp | 8 | ||||
-rw-r--r-- | src/Storage.cpp | 1 | ||||
-rw-r--r-- | src/plugins/Manga.cpp | 6 |
10 files changed, 32 insertions, 8 deletions
@@ -72,7 +72,7 @@ Type text and then wait and QuickMedia will automatically search.\ `F5`: Reload the video/music. ### Youtube channel controls `Ctrl+T`: Subscribe/Unsubscribe from the channel. -### Manga search/history page controls +### Manga search/history/chapters page controls `Ctrl+B`: Bookmark the selected manga. If the manga is already bookmarked then its removed from bookmarks. ### Manga page view controls `Up`/`Ctrl+K`: Go to the next page (or chapter if the current page is the last one).\ diff --git a/include/Scale.hpp b/include/Scale.hpp index e458894..eb902cd 100644 --- a/include/Scale.hpp +++ b/include/Scale.hpp @@ -2,12 +2,15 @@ #include <SFML/System/Vector2.hpp> -// TODO: Check if size is 0 before dividing to prevent division by 0? - namespace QuickMedia { template<typename T> static T wrap_to_size_x(const T &size, const T &clamp_size) { T new_size; + if(size.x == 0) { + new_size.x = 0; + new_size.y = 0; + return new_size; + } float size_ratio = (float)size.y / (float)size.x; new_size.x = clamp_size.x; new_size.y = new_size.x * size_ratio; @@ -17,6 +20,11 @@ namespace QuickMedia { template<typename T> static T wrap_to_size_y(const T &size, const T &clamp_size) { T new_size; + if(size.y == 0) { + new_size.x = 0; + new_size.y = 0; + return new_size; + } float size_ratio = (float)size.x / (float)size.y; new_size.y = clamp_size.y; new_size.x = new_size.y * size_ratio; @@ -50,6 +58,9 @@ namespace QuickMedia { template<typename T> static sf::Vector2f get_ratio(const T &original_size, const T &new_size) { - return sf::Vector2f((float)new_size.x / (float)original_size.x, (float)new_size.y / (float)original_size.y); + if(original_size.x == 0 || original_size.y == 0) + return sf::Vector2f(0.0f, 0.0f); + else + return sf::Vector2f((float)new_size.x / (float)original_size.x, (float)new_size.y / (float)original_size.y); } }
\ No newline at end of file diff --git a/plugins/Manga.hpp b/plugins/Manga.hpp index ee7638b..020099e 100644 --- a/plugins/Manga.hpp +++ b/plugins/Manga.hpp @@ -54,6 +54,7 @@ namespace QuickMedia { TrackResult track(const std::string &str) override; void on_navigate_to_page(Body *body) override; bool is_trackable() const override { return true; } + std::shared_ptr<BodyItem> get_bookmark_body_item() override; protected: virtual bool extract_id_from_url(const std::string &url, std::string &manga_id) const = 0; virtual const char* get_service_name() const = 0; diff --git a/plugins/MangaGeneric.hpp b/plugins/MangaGeneric.hpp index 4b4f55c..183fbb4 100644 --- a/plugins/MangaGeneric.hpp +++ b/plugins/MangaGeneric.hpp @@ -158,6 +158,7 @@ namespace QuickMedia { MangaGenericChaptersPage(Program *program, std::string manga_name, std::string manga_url, const MangaIdExtractor &manga_id_extractor, const char *service_name, const std::string &website_url, const ListPageQuery *list_page_query, bool fail_on_http_error) : MangaChaptersPage(program, std::move(manga_name), std::move(manga_url)), manga_id_extractor(manga_id_extractor), service_name(service_name), website_url(website_url), list_page_query(list_page_query), fail_on_http_error(fail_on_http_error) {} PluginResult submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) override; + const char* get_bookmark_name() const override { return service_name; } protected: bool extract_id_from_url(const std::string &url, std::string &manga_id) const override; const char* get_service_name() const override { return service_name; } diff --git a/plugins/Mangadex.hpp b/plugins/Mangadex.hpp index cb412da..beceddb 100644 --- a/plugins/Mangadex.hpp +++ b/plugins/Mangadex.hpp @@ -32,6 +32,7 @@ namespace QuickMedia { MangadexChaptersPage(Program *program, MangadexSearchPage *search_page, std::string manga_name, std::string manga_url) : MangaChaptersPage(program, std::move(manga_name), std::move(manga_url)), search_page(search_page) {} PluginResult submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) override; PluginResult get_page(const std::string &str, int page, BodyItems &result_items) override; + const char* get_bookmark_name() const override { return "mangadex"; } protected: bool extract_id_from_url(const std::string &url, std::string &manga_id) const override; const char* get_service_name() const override { return "mangadex"; } diff --git a/plugins/Manganelo.hpp b/plugins/Manganelo.hpp index 70526ff..5012fa3 100644 --- a/plugins/Manganelo.hpp +++ b/plugins/Manganelo.hpp @@ -17,6 +17,7 @@ namespace QuickMedia { public: ManganeloChaptersPage(Program *program, std::string manga_name, std::string manga_url) : MangaChaptersPage(program, std::move(manga_name), std::move(manga_url)) {} PluginResult submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) override; + const char* get_bookmark_name() const override { return "manganelo"; } protected: bool extract_id_from_url(const std::string &url, std::string &manga_id) const override; const char* get_service_name() const override { return "manganelo"; } diff --git a/plugins/Page.hpp b/plugins/Page.hpp index 39d76d6..3ecb016 100644 --- a/plugins/Page.hpp +++ b/plugins/Page.hpp @@ -61,6 +61,8 @@ namespace QuickMedia { virtual bool is_trackable() const { return false; } // Return nullptr if bookmark is not supported by this page virtual const char* get_bookmark_name() const { return nullptr; } + // If this returns nullptr then the currently selected body item is used instead + virtual std::shared_ptr<BodyItem> get_bookmark_body_item() { return nullptr; } virtual bool is_bookmark_page() const { return false; } virtual bool is_lazy_fetch_page() const { return false; } // Note: If submit is done without any selection, then the search term is sent as the |title| and |url|. Submit will only be sent if the input text is not empty or if an item is selected diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 9dd8c25..174d779 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -2179,11 +2179,13 @@ namespace QuickMedia { }); } } else if(event.key.code == sf::Keyboard::B && event.key.control) { - BodyItem *selected_item = tabs[selected_tab].body->get_selected(); - if(selected_item) { + auto bookmark_item = tabs[selected_tab].page->get_bookmark_body_item(); + if(!bookmark_item) + bookmark_item = tabs[selected_tab].body->get_selected_shared(); + if(bookmark_item) { const char *bookmark_name = tabs[selected_tab].page->get_bookmark_name(); if(bookmark_name) { - if(toggle_bookmark(selected_item, bookmark_name)) { + if(toggle_bookmark(bookmark_item.get(), bookmark_name)) { for(Tab &tab : tabs) { if(tab.page && tab.page->is_bookmark_page()) tab.page->needs_refresh = true; diff --git a/src/Storage.cpp b/src/Storage.cpp index 1b5435f..35cf5f8 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -331,7 +331,6 @@ namespace QuickMedia { } bool is_program_executable_by_name(const char *name) { - // TODO: Implement for Windows. Windows also uses semicolon instead of colon as a separator char *env = getenv("PATH"); if(!env) return false; diff --git a/src/plugins/Manga.cpp b/src/plugins/Manga.cpp index 2c7bae0..3fa5d47 100644 --- a/src/plugins/Manga.cpp +++ b/src/plugins/Manga.cpp @@ -20,4 +20,10 @@ namespace QuickMedia { if(extract_id_from_url(content_url, manga_id)) load_manga_content_storage(get_service_name(), content_title, manga_id); } + + std::shared_ptr<BodyItem> MangaChaptersPage::get_bookmark_body_item() { + auto body_item = std::make_shared<BodyItem>(content_title); + body_item->url = content_url; + return body_item; + } }
\ No newline at end of file |