diff options
Diffstat (limited to 'editor')
-rw-r--r-- | editor/editor_node.cpp | 16 | ||||
-rw-r--r-- | editor/editor_node.h | 4 | ||||
-rw-r--r-- | editor/export_template_manager.cpp | 12 | ||||
-rw-r--r-- | editor/export_template_manager.h | 2 | ||||
-rw-r--r-- | editor/plugin_config_dialog.cpp | 102 | ||||
-rw-r--r-- | editor/plugin_config_dialog.h | 5 |
6 files changed, 129 insertions, 12 deletions
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index f09a6f678a..128908c132 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -2329,6 +2329,9 @@ void EditorNode::_run_native(const Ref<EditorExportPreset> &p_preset) { } } +void EditorNode::_android_build_source_selected(const String &p_file) { + export_template_manager->install_android_template_from_file(p_file); +} void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { if (!p_confirmed) { //this may be a hack.. current_option = (MenuOptions)p_option; @@ -2753,6 +2756,10 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { export_template_manager->popup_manager(); } break; + case SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE: { + custom_build_manage_templates->hide(); + file_android_build_source->popup_centered_ratio(); + } break; case SETTINGS_MANAGE_FEATURE_PROFILES: { feature_profile_manager->popup_centered_clamped(Size2(900, 800) * EDSCALE, 0.8); } break; @@ -6678,9 +6685,18 @@ EditorNode::EditorNode() { custom_build_manage_templates = memnew(ConfirmationDialog); custom_build_manage_templates->set_text(TTR("Android build template is missing, please install relevant templates.")); custom_build_manage_templates->get_ok_button()->set_text(TTR("Manage Templates")); + custom_build_manage_templates->add_button(TTR("Install from file"))->connect("pressed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE)); custom_build_manage_templates->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_MANAGE_EXPORT_TEMPLATES)); gui_base->add_child(custom_build_manage_templates); + file_android_build_source = memnew(EditorFileDialog); + file_android_build_source->set_title(TTR("Select android sources file")); + file_android_build_source->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + file_android_build_source->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); + file_android_build_source->add_filter("*.zip"); + file_android_build_source->connect("file_selected", callable_mp(this, &EditorNode::_android_build_source_selected)); + gui_base->add_child(file_android_build_source); + install_android_build_template = memnew(ConfirmationDialog); install_android_build_template->set_text(TTR("This will set up your project for custom Android builds by installing the source template to \"res://android/build\".\nYou can then apply modifications and build your own custom APK on export (adding modules, changing the AndroidManifest.xml, etc.).\nNote that in order to make custom builds instead of using pre-built APKs, the \"Use Custom Build\" option should be enabled in the Android export preset.")); install_android_build_template->get_ok_button()->set_text(TTR("Install")); diff --git a/editor/editor_node.h b/editor/editor_node.h index 07bed6999b..6b91856a59 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -181,6 +181,7 @@ private: SETTINGS_EDITOR_CONFIG_FOLDER, SETTINGS_MANAGE_EXPORT_TEMPLATES, SETTINGS_MANAGE_FEATURE_PROFILES, + SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE, SETTINGS_PICK_MAIN_SCENE, SETTINGS_TOGGLE_CONSOLE, SETTINGS_TOGGLE_FULLSCREEN, @@ -327,6 +328,7 @@ private: EditorFileDialog *file_templates; EditorFileDialog *file_export_lib; EditorFileDialog *file_script; + EditorFileDialog *file_android_build_source; CheckBox *file_export_lib_merge; String current_path; MenuButton *update_spinner; @@ -455,6 +457,8 @@ private: void _menu_confirm_current(); void _menu_option_confirm(int p_option, bool p_confirmed); + void _android_build_source_selected(const String &p_file); + void _request_screenshot(); void _screenshot(bool p_use_utc = false); void _save_screenshot(NodePath p_path); diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 112a9e92a8..e24f6a11ed 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -630,6 +630,12 @@ bool ExportTemplateManager::can_install_android_template() { } Error ExportTemplateManager::install_android_template() { + const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); + const String &source_zip = templates_path.plus_file("android_source.zip"); + ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN); + return install_android_template_from_file(source_zip); +} +Error ExportTemplateManager::install_android_template_from_file(const String &p_file) { // To support custom Android builds, we install the Java source code and buildsystem // from android_source.zip to the project's res://android folder. @@ -662,14 +668,10 @@ Error ExportTemplateManager::install_android_template() { // Uncompress source template. - const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); - const String &source_zip = templates_path.plus_file("android_source.zip"); - ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN); - FileAccess *src_f = nullptr; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - unzFile pkg = unzOpen2(source_zip.utf8().get_data(), &io); + unzFile pkg = unzOpen2(p_file.utf8().get_data(), &io); ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android sources not in ZIP format."); int ret = unzGoToFirstFile(pkg); diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h index f145c6c0f5..ebadb88c36 100644 --- a/editor/export_template_manager.h +++ b/editor/export_template_manager.h @@ -124,6 +124,8 @@ public: bool can_install_android_template(); Error install_android_template(); + Error install_android_template_from_file(const String &p_file); + void popup_manager(); ExportTemplateManager(); diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index cbcc3c9880..e2938c8156 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -127,7 +127,51 @@ void PluginConfigDialog::_on_cancelled() { void PluginConfigDialog::_on_required_text_changed(const String &) { int lang_idx = script_option_edit->get_selected(); String ext = ScriptServer::get_language(lang_idx)->get_extension(); - get_ok_button()->set_disabled(script_edit->get_text().get_basename().is_empty() || script_edit->get_text().get_extension() != ext || name_edit->get_text().is_empty()); + + Ref<Texture2D> valid_icon = get_theme_icon("StatusSuccess", "EditorIcons"); + Ref<Texture2D> invalid_icon = get_theme_icon("StatusWarning", "EditorIcons"); + + // Set variables to assume all is valid + bool is_valid = true; + name_validation->set_texture(valid_icon); + subfolder_validation->set_texture(valid_icon); + script_validation->set_texture(valid_icon); + name_validation->set_tooltip(""); + subfolder_validation->set_tooltip(""); + script_validation->set_tooltip(""); + + // Change valid status to invalid depending on conditions. + Vector<String> errors; + if (name_edit->get_text().is_empty()) { + is_valid = false; + name_validation->set_texture(invalid_icon); + name_validation->set_tooltip(TTR("Plugin name cannot not be blank.")); + } + if (script_edit->get_text().get_extension() != ext) { + is_valid = false; + script_validation->set_texture(invalid_icon); + script_validation->set_tooltip(vformat(TTR("Script extension must match chosen langauge extension (.%s)."), ext)); + } + if (script_edit->get_text().get_basename().is_empty()) { + is_valid = false; + script_validation->set_texture(invalid_icon); + script_validation->set_tooltip(TTR("Script name cannot not be blank.")); + } + if (subfolder_edit->get_text().is_empty()) { + is_valid = false; + subfolder_validation->set_texture(invalid_icon); + subfolder_validation->set_tooltip(TTR("Subfolder cannot be blank.")); + } else { + DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_RESOURCES); + String path = "res://addons/" + subfolder_edit->get_text(); + if (dir->dir_exists(path) && !_edit_mode) { // Only show this error if in "create" mode. + is_valid = false; + subfolder_validation->set_texture(invalid_icon); + subfolder_validation->set_tooltip(TTR("Subfolder cannot be one which already exists.")); + } + } + + get_ok_button()->set_disabled(!is_valid); } String PluginConfigDialog::_to_absolute_plugin_path(const String &p_plugin_name) { @@ -163,19 +207,22 @@ void PluginConfigDialog::config(const String &p_config_path) { _edit_mode = true; active_edit->hide(); - Object::cast_to<Label>(active_edit->get_parent()->get_child(active_edit->get_index() - 1))->hide(); + Object::cast_to<Label>(active_edit->get_parent()->get_child(active_edit->get_index() - 2))->hide(); subfolder_edit->hide(); - Object::cast_to<Label>(subfolder_edit->get_parent()->get_child(subfolder_edit->get_index() - 1))->hide(); + Object::cast_to<Label>(subfolder_edit->get_parent()->get_child(subfolder_edit->get_index() - 2))->hide(); set_title(TTR("Edit a Plugin")); } else { _clear_fields(); _edit_mode = false; active_edit->show(); - Object::cast_to<Label>(active_edit->get_parent()->get_child(active_edit->get_index() - 1))->show(); + Object::cast_to<Label>(active_edit->get_parent()->get_child(active_edit->get_index() - 2))->show(); subfolder_edit->show(); - Object::cast_to<Label>(subfolder_edit->get_parent()->get_child(subfolder_edit->get_index() - 1))->show(); + Object::cast_to<Label>(subfolder_edit->get_parent()->get_child(subfolder_edit->get_index() - 2))->show(); set_title(TTR("Create a Plugin")); } + // Simulate text changing so the errors populate. + _on_required_text_changed(""); + get_ok_button()->set_disabled(!_edit_mode); get_ok_button()->set_text(_edit_mode ? TTR("Update") : TTR("Create")); } @@ -188,56 +235,88 @@ PluginConfigDialog::PluginConfigDialog() { get_ok_button()->set_disabled(true); set_hide_on_ok(true); + VBoxContainer *vbox = memnew(VBoxContainer); + vbox->set_h_size_flags(Control::SIZE_EXPAND_FILL); + vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL); + add_child(vbox); + GridContainer *grid = memnew(GridContainer); - grid->set_columns(2); - add_child(grid); + grid->set_columns(3); + vbox->add_child(grid); + // Plugin Name Label *name_lb = memnew(Label); name_lb->set_text(TTR("Plugin Name:")); grid->add_child(name_lb); + name_validation = memnew(TextureRect); + name_validation->set_v_size_flags(Control::SIZE_SHRINK_CENTER); + grid->add_child(name_validation); + name_edit = memnew(LineEdit); name_edit->connect("text_changed", callable_mp(this, &PluginConfigDialog::_on_required_text_changed)); name_edit->set_placeholder("MyPlugin"); grid->add_child(name_edit); + // Subfolder Label *subfolder_lb = memnew(Label); subfolder_lb->set_text(TTR("Subfolder:")); grid->add_child(subfolder_lb); + subfolder_validation = memnew(TextureRect); + subfolder_validation->set_v_size_flags(Control::SIZE_SHRINK_CENTER); + grid->add_child(subfolder_validation); + subfolder_edit = memnew(LineEdit); subfolder_edit->set_placeholder("\"my_plugin\" -> res://addons/my_plugin"); + subfolder_edit->connect("text_changed", callable_mp(this, &PluginConfigDialog::_on_required_text_changed)); grid->add_child(subfolder_edit); + // Description Label *desc_lb = memnew(Label); desc_lb->set_text(TTR("Description:")); grid->add_child(desc_lb); + Control *desc_spacer = memnew(Control); + grid->add_child(desc_spacer); + desc_edit = memnew(TextEdit); desc_edit->set_custom_minimum_size(Size2(400, 80) * EDSCALE); desc_edit->set_wrap_enabled(true); grid->add_child(desc_edit); + // Author Label *author_lb = memnew(Label); author_lb->set_text(TTR("Author:")); grid->add_child(author_lb); + Control *author_spacer = memnew(Control); + grid->add_child(author_spacer); + author_edit = memnew(LineEdit); author_edit->set_placeholder("Godette"); grid->add_child(author_edit); + // Version Label *version_lb = memnew(Label); version_lb->set_text(TTR("Version:")); grid->add_child(version_lb); + Control *version_spacer = memnew(Control); + grid->add_child(version_spacer); + version_edit = memnew(LineEdit); version_edit->set_placeholder("1.0"); grid->add_child(version_edit); + // Language dropdown Label *script_option_lb = memnew(Label); script_option_lb->set_text(TTR("Language:")); grid->add_child(script_option_lb); + Control *script_opt_spacer = memnew(Control); + grid->add_child(script_opt_spacer); + script_option_edit = memnew(OptionButton); int default_lang = 0; for (int i = 0; i < ScriptServer::get_language_count(); i++) { @@ -252,20 +331,29 @@ PluginConfigDialog::PluginConfigDialog() { script_option_edit->select(default_lang); grid->add_child(script_option_edit); + // Plugin Script Name Label *script_lb = memnew(Label); script_lb->set_text(TTR("Script Name:")); grid->add_child(script_lb); + script_validation = memnew(TextureRect); + script_validation->set_v_size_flags(Control::SIZE_SHRINK_CENTER); + grid->add_child(script_validation); + script_edit = memnew(LineEdit); script_edit->connect("text_changed", callable_mp(this, &PluginConfigDialog::_on_required_text_changed)); script_edit->set_placeholder("\"plugin.gd\" -> res://addons/my_plugin/plugin.gd"); grid->add_child(script_edit); + // Activate now checkbox // TODO Make this option work better with languages like C#. Right now, it does not work because the C# project must be compiled first. Label *active_lb = memnew(Label); active_lb->set_text(TTR("Activate now?")); grid->add_child(active_lb); + Control *active_spacer = memnew(Control); + grid->add_child(active_spacer); + active_edit = memnew(CheckBox); active_edit->set_pressed(true); grid->add_child(active_edit); diff --git a/editor/plugin_config_dialog.h b/editor/plugin_config_dialog.h index f49f14c881..ad5b96735f 100644 --- a/editor/plugin_config_dialog.h +++ b/editor/plugin_config_dialog.h @@ -36,6 +36,7 @@ #include "scene/gui/line_edit.h" #include "scene/gui/option_button.h" #include "scene/gui/text_edit.h" +#include "scene/gui/texture_rect.h" class PluginConfigDialog : public ConfirmationDialog { GDCLASS(PluginConfigDialog, ConfirmationDialog); @@ -49,6 +50,10 @@ class PluginConfigDialog : public ConfirmationDialog { LineEdit *script_edit; CheckBox *active_edit; + TextureRect *name_validation; + TextureRect *subfolder_validation; + TextureRect *script_validation; + bool _edit_mode; void _clear_fields(); |