diff options
Diffstat (limited to 'editor/plugins/asset_library_editor_plugin.h')
-rw-r--r-- | editor/plugins/asset_library_editor_plugin.h | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h new file mode 100644 index 0000000000..fa768ec96a --- /dev/null +++ b/editor/plugins/asset_library_editor_plugin.h @@ -0,0 +1,328 @@ +/*************************************************************************/ +/* asset_library_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef ASSET_LIBRARY_EDITOR_PLUGIN_H +#define ASSET_LIBRARY_EDITOR_PLUGIN_H + +#include "editor_plugin.h" +#include "scene/gui/box_container.h" +#include "scene/gui/check_box.h" +#include "scene/gui/line_edit.h" +#include "scene/gui/link_button.h" +#include "scene/gui/option_button.h" +#include "scene/gui/panel_container.h" +#include "scene/gui/progress_bar.h" +#include "scene/gui/separator.h" +#include "scene/gui/tab_container.h" + +#include "editor_plugin_settings.h" +#include "scene/gui/grid_container.h" +#include "scene/gui/rich_text_label.h" +#include "scene/gui/scroll_container.h" +#include "scene/gui/texture_button.h" + +#include "editor_asset_installer.h" +#include "scene/main/http_request.h" + +class EditorAssetLibraryItem : public PanelContainer { + + GDCLASS(EditorAssetLibraryItem, PanelContainer); + + TextureButton *icon; + LinkButton *title; + LinkButton *category; + LinkButton *author; + TextureRect *stars[5]; + Label *price; + + int asset_id; + int category_id; + int author_id; + + void _asset_clicked(); + void _category_clicked(); + void _author_clicked(); + + void set_image(int p_type, int p_index, const Ref<Texture> &p_image); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + void configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, int p_rating, const String &p_cost); + + EditorAssetLibraryItem(); +}; + +class EditorAssetLibraryItemDescription : public ConfirmationDialog { + + GDCLASS(EditorAssetLibraryItemDescription, ConfirmationDialog); + + EditorAssetLibraryItem *item; + RichTextLabel *description; + ScrollContainer *previews; + HBoxContainer *preview_hb; + PanelContainer *previews_bg; + PanelContainer *desc_bg; + + struct Preview { + int id; + bool is_video; + String video_link; + Button *button; + Ref<Texture> image; + }; + + Vector<Preview> preview_images; + TextureRect *preview; + + void set_image(int p_type, int p_index, const Ref<Texture> &p_image); + + int asset_id; + String download_url; + String title; + String sha256; + Ref<Texture> icon; + + void _link_click(const String &p_url); + void _preview_click(int p_id); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + void configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, int p_rating, const String &p_cost, int p_version, const String &p_version_string, const String &p_description, const String &p_download_url, const String &p_browse_url, const String &p_sha256_hash); + void add_preview(int p_id, bool p_video, const String &p_url); + + String get_title() { return title; } + Ref<Texture> get_preview_icon() { return icon; } + String get_download_url() { return download_url; } + int get_asset_id() { return asset_id; } + String get_sha256() { return sha256; } + EditorAssetLibraryItemDescription(); +}; + +class EditorAssetLibraryItemDownload : public PanelContainer { + + GDCLASS(EditorAssetLibraryItemDownload, PanelContainer); + + TextureRect *icon; + Label *title; + ProgressBar *progress; + Button *install; + Button *retry; + TextureButton *dismiss; + + AcceptDialog *download_error; + HTTPRequest *download; + String host; + String sha256; + Label *status; + + int prev_status; + + int asset_id; + + bool external_install; + + EditorAssetInstaller *asset_installer; + + void _close(); + void _install(); + void _make_request(); + void _http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + void set_external_install(bool p_enable) { external_install = p_enable; } + int get_asset_id() { return asset_id; } + void configure(const String &p_title, int p_asset_id, const Ref<Texture> &p_preview, const String &p_download_url, const String &p_sha256_hash); + EditorAssetLibraryItemDownload(); +}; + +class EditorAssetLibrary : public PanelContainer { + GDCLASS(EditorAssetLibrary, PanelContainer); + + String host; + + EditorFileDialog *asset_open; + EditorAssetInstaller *asset_installer; + + void _asset_open(); + void _asset_file_selected(const String &p_file); + + PanelContainer *library_scroll_bg; + ScrollContainer *library_scroll; + VBoxContainer *library_vb; + LineEdit *filter; + OptionButton *categories; + OptionButton *repository; + OptionButton *sort; + ToolButton *reverse; + Button *search; + ProgressBar *load_status; + HBoxContainer *error_hb; + Label *error_label; + MenuButton *support; + + HBoxContainer *contents; + + HBoxContainer *asset_top_page; + GridContainer *asset_items; + HBoxContainer *asset_bottom_page; + + HTTPRequest *request; + + bool templates_only; + + enum Support { + SUPPORT_OFFICIAL, + SUPPORT_COMMUNITY, + SUPPORT_TESTING, + SUPPORT_MAX + }; + + enum SortOrder { + SORT_RATING, + SORT_DOWNLOADS, + SORT_NAME, + SORT_COST, + SORT_UPDATED, + SORT_MAX + }; + + static const char *sort_key[SORT_MAX]; + static const char *sort_text[SORT_MAX]; + static const char *support_key[SUPPORT_MAX]; + + ///MainListing + + enum ImageType { + IMAGE_QUEUE_ICON, + IMAGE_QUEUE_THUMBNAIL, + IMAGE_QUEUE_SCREENSHOT, + + }; + + struct ImageQueue { + + bool active; + int queue_id; + int asset_id; + ImageType image_type; + int image_index; + String image_url; + HTTPRequest *request; + ObjectID target; + }; + + int last_queue_id; + Map<int, ImageQueue> image_queue; + + void _image_update(bool use_cache, bool final, const PoolByteArray &p_data, int p_queue_id); + void _image_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data, int p_queue_id); + void _request_image(ObjectID p_for, String p_image_url, ImageType p_type, int p_image_index); + void _update_image_queue(); + + HBoxContainer *_make_pages(int p_page, int p_page_count, int p_page_len, int p_total_items, int p_current_items); + + // + EditorAssetLibraryItemDescription *description; + // + + enum RequestType { + REQUESTING_NONE, + REQUESTING_CONFIG, + REQUESTING_SEARCH, + REQUESTING_ASSET, + }; + + RequestType requesting; + Dictionary category_map; + + ScrollContainer *downloads_scroll; + HBoxContainer *downloads_hb; + + void _install_asset(); + + void _select_author(int p_id); + void _select_category(int p_id); + void _select_asset(int p_id); + + void _manage_plugins(); + + void _search(int p_page = 0); + void _rerun_search(int p_ignore); + void _api_request(const String &p_request, RequestType p_request_type, const String &p_arguments = ""); + void _http_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data); + void _http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data); + + void _repository_changed(int p_repository_id); + void _support_toggled(int p_support); + + void _install_external_asset(String p_zip_path, String p_title); + + friend class EditorAssetLibraryItemDescription; + friend class EditorAssetLibraryItem; + +protected: + static void _bind_methods(); + void _notification(int p_what); + +public: + EditorAssetLibrary(bool p_templates_only = false); +}; + +class AssetLibraryEditorPlugin : public EditorPlugin { + + GDCLASS(AssetLibraryEditorPlugin, EditorPlugin); + + EditorAssetLibrary *addon_library; + EditorNode *editor; + +public: + virtual String get_name() const { return "AssetLib"; } + bool has_main_screen() const { return true; } + virtual void edit(Object *p_object) {} + virtual bool handles(Object *p_object) const { return false; } + virtual void make_visible(bool p_visible); + //virtual bool get_remove_list(List<Node*> *p_list) { return canvas_item_editor->get_remove_list(p_list); } + //virtual Dictionary get_state() const; + //virtual void set_state(const Dictionary& p_state); + + AssetLibraryEditorPlugin(EditorNode *p_node); + ~AssetLibraryEditorPlugin(); +}; + +#endif // EDITORASSETLIBRARY_H |