소스 검색

Editor Export Settings Dialog is completed!! Now on to make some exporters..

Juan Linietsky 8 년 전
부모
커밋
f6950956bd

+ 5 - 3
platform/android/export/export.cpp

@@ -29,7 +29,7 @@
 #include "version.h"
 #include "export.h"
 #include "tools/editor/editor_settings.h"
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "tools/editor/editor_node.h"
 #include "io/zip_io.h"
 #include "io/marshalls.h"
@@ -1892,9 +1892,11 @@ EditorExportPlatformAndroid::~EditorExportPlatformAndroid() {
 	memdelete(device_thread);
 }
 
+#endif
 
 void register_android_exporter() {
 
+#if 0
 	String exe_ext=OS::get_singleton()->get_name()=="Windows"?"exe":"";
 	EDITOR_DEF("export/android/adb","");
 	EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"android/adb",PROPERTY_HINT_GLOBAL_FILE,exe_ext));
@@ -1913,6 +1915,6 @@ void register_android_exporter() {
 
 	Ref<EditorExportPlatformAndroid> exporter = Ref<EditorExportPlatformAndroid>( memnew(EditorExportPlatformAndroid) );
 	EditorImportExport::get_singleton()->add_export_platform(exporter);
-
-}
 #endif
+}
+

+ 5 - 5
platform/bb10/export/export.cpp

@@ -29,7 +29,7 @@
 #include "version.h"
 #include "export.h"
 #include "tools/editor/editor_settings.h"
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "tools/editor/editor_node.h"
 #include "io/zip_io.h"
 #include "io/marshalls.h"
@@ -803,9 +803,9 @@ EditorExportPlatformBB10::~EditorExportPlatformBB10() {
 	memdelete(device_thread);
 }
 
-
+#endif
 void register_bb10_exporter() {
-
+#if 0
 	EDITOR_DEF("export/blackberry/host_tools","");
 	EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"export/blackberry/host_tools",PROPERTY_HINT_GLOBAL_DIR));
 	EDITOR_DEF("export/blackberry/debug_token","");
@@ -824,7 +824,7 @@ void register_bb10_exporter() {
 	Ref<EditorExportPlatformBB10> exporter = Ref<EditorExportPlatformBB10>( memnew(EditorExportPlatformBB10) );
 	EditorImportExport::get_singleton()->add_export_platform(exporter);
 
-
+#endif
 }
 
-#endif
+

+ 5 - 5
platform/javascript/export/export.cpp

@@ -29,7 +29,7 @@
 #include "version.h"
 #include "export.h"
 #include "tools/editor/editor_settings.h"
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "tools/editor/editor_node.h"
 #include "io/zip_io.h"
 #include "io/marshalls.h"
@@ -417,14 +417,14 @@ EditorExportPlatformJavaScript::~EditorExportPlatformJavaScript() {
 
 }
 
-
+#endif
 void register_javascript_exporter() {
 
 
-	Ref<EditorExportPlatformJavaScript> exporter = Ref<EditorExportPlatformJavaScript>( memnew(EditorExportPlatformJavaScript) );
-	EditorImportExport::get_singleton()->add_export_platform(exporter);
+	//Ref<EditorExportPlatformJavaScript> exporter = Ref<EditorExportPlatformJavaScript>( memnew(EditorExportPlatformJavaScript) );
+	//EditorImportExport::get_singleton()->add_export_platform(exporter);
 
 
 }
 
-#endif
+

+ 5 - 5
platform/osx/export/export.cpp

@@ -29,7 +29,7 @@
 #include "version.h"
 #include "export.h"
 #include "tools/editor/editor_settings.h"
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "tools/editor/editor_node.h"
 #include "io/zip_io.h"
 #include "io/marshalls.h"
@@ -536,14 +536,14 @@ EditorExportPlatformOSX::~EditorExportPlatformOSX() {
 
 }
 
-
+#endif
 void register_osx_exporter() {
 
-
+#if 0
 	Ref<EditorExportPlatformOSX> exporter = Ref<EditorExportPlatformOSX>( memnew(EditorExportPlatformOSX) );
 	EditorImportExport::get_singleton()->add_export_platform(exporter);
-
+#endif
 
 }
 
-#endif
+

+ 4 - 3
platform/uwp/export/export.cpp

@@ -2384,10 +2384,11 @@ EditorExportPlatformUWP::EditorExportPlatformUWP() {
 
 EditorExportPlatformUWP::~EditorExportPlatformUWP() {}
 
-
+#endif
 void register_uwp_exporter() {
-
+#if 0
 	Ref<EditorExportPlatformUWP> exporter = Ref<EditorExportPlatformUWP>(memnew(EditorExportPlatformUWP));
 	EditorImportExport::get_singleton()->add_export_platform(exporter);
-}
 #endif
+}
+

+ 5 - 4
platform/windows/export/export.cpp

@@ -28,10 +28,11 @@
 /*************************************************************************/
 #include "export.h"
 #include "platform/windows/logo.h"
-#include "tools/editor/editor_import_export.h"
-#if 0
+#include "tools/editor/editor_export.h"
+
 void register_windows_exporter() {
 
+#if 0
 	Image img(_windows_logo);
 	Ref<ImageTexture> logo = memnew( ImageTexture );
 	logo->create_from_image(img);
@@ -48,6 +49,6 @@ void register_windows_exporter() {
 		EditorImportExport::get_singleton()->add_export_platform(exporter);
 	}
 
-
-}
 #endif
+}
+

+ 20 - 3
platform/x11/export/export.cpp

@@ -28,11 +28,27 @@
 /*************************************************************************/
 #include "export.h"
 #include "platform/x11/logo.h"
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "scene/resources/texture.h"
-#if 0
+
+
+
 void register_x11_exporter() {
 
+	Ref<EditorExportPlatformPC> platform;
+	platform.instance();
+
+	Image img(_x11_logo);
+	Ref<ImageTexture> logo;
+	logo.instance();
+	logo->create_from_image(img);
+	platform->set_logo(logo);
+	platform->set_name("Linux/X11");
+	platform->set_extension("");
+
+	EditorExport::get_singleton()->add_export_platform(platform);
+
+	#if 0
 	Image img(_x11_logo);
 	Ref<ImageTexture> logo = memnew( ImageTexture );
 	logo->create_from_image(img);
@@ -49,5 +65,6 @@ void register_x11_exporter() {
 		EditorImportExport::get_singleton()->add_export_platform(exporter);
 	}
 
+	#endif
 }
-#endif
+

+ 2 - 2
scene/gui/dialogs.cpp

@@ -272,7 +272,7 @@ void AcceptDialog::_update_child_rects() {
 		if (!c)
 			continue;
 
-		if (c==hbc || c==label || c==get_close_button())
+		if (c==hbc || c==label || c==get_close_button() || c->is_set_as_toplevel())
 			continue;
 
 		c->set_pos(cpos);
@@ -299,7 +299,7 @@ Size2 AcceptDialog::get_minimum_size() const {
 		if (!c)
 			continue;
 
-		if (c==hbc || c==label || c==const_cast<AcceptDialog*>(this)->get_close_button())
+		if (c==hbc || c==label || c==const_cast<AcceptDialog*>(this)->get_close_button() || c->is_set_as_toplevel())
 			continue;
 
 		Size2 cminsize = c->get_combined_minimum_size();

+ 16 - 0
scene/gui/item_list.cpp

@@ -1204,6 +1204,22 @@ int ItemList::get_item_at_pos(const Point2& p_pos, bool p_exact) const {
 	return closest;
 }
 
+bool ItemList::is_pos_at_end_of_items(const Point2& p_pos) const {
+
+	if (items.empty())
+		return true;
+
+	Vector2 pos=p_pos;
+	Ref<StyleBox> bg = get_stylebox("bg");
+	pos-=bg->get_offset();
+	pos.y+=scroll_bar->get_value();
+
+	Rect2 endrect = items[items.size()-1].rect_cache;
+	return (pos.y > endrect.pos.y + endrect.size.y);
+
+}
+
+
 String ItemList::get_tooltip(const Point2& p_pos) const {
 
 	int closest = get_item_at_pos(p_pos);

+ 1 - 0
scene/gui/item_list.h

@@ -191,6 +191,7 @@ public:
 
 	virtual String get_tooltip(const Point2& p_pos) const;
 	int get_item_at_pos(const Point2& p_pos,bool p_exact=false) const;
+	bool is_pos_at_end_of_items(const Point2& p_pos) const;
 
 	void set_icon_scale(real_t p_scale);
 	real_t get_icon_scale() const;

+ 1 - 1
tools/editor/SCsub

@@ -137,7 +137,7 @@ if (env["tools"] == "yes"):
     reg_exporters = 'void register_exporters() {\n'
     for e in env.platform_exporters:
         env.editor_sources.append("#platform/" + e + "/export/export.cpp")
-        reg_exporters += '\t//register_' + e + '_exporter();\n'
+	reg_exporters += '\tregister_' + e + '_exporter();\n'
         reg_exporters_inc += '#include "platform/' + e + '/export/export.h"\n'
     reg_exporters += '}\n'
     f = open("register_exporters.cpp", "wb")

+ 369 - 7
tools/editor/editor_import_export.cpp → tools/editor/editor_export.cpp

@@ -26,7 +26,7 @@
 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
-#include "editor_import_export.h"
+#include "editor_export.h"
 #include "version.h"
 #include "script_language.h"
 #include "globals.h"
@@ -49,6 +49,7 @@ bool EditorExportPreset::_set(const StringName& p_name, const Variant& p_value)
 
 	if (values.has(p_name))	 {
 		values[p_name]=p_value;
+		EditorExport::singleton->save_presets();
 		return true;
 	}
 
@@ -72,15 +73,125 @@ void EditorExportPreset::_get_property_list( List<PropertyInfo> *p_list) const{
 	}
 }
 
-Vector<StringName> EditorExportPreset::get_files_to_export() const {
+Ref<EditorExportPlatform> EditorExportPreset::get_platform() {
 
-	return Vector<StringName>();
+	return platform;
 }
 
+Vector<String> EditorExportPreset::get_files_to_export() const {
 
-EditorExportPreset::EditorExportPreset() {
+	Vector<String> files;
+	for(Set<String>::Element *E=selected_files.front();E;E=E->next()) {
+		files.push_back(E->get());
+	}
+	return files;
+}
+
+void EditorExportPreset::set_name(const String& p_name) {
+	name=p_name;
+	EditorExport::singleton->save_presets();
+
+}
+
+String EditorExportPreset::get_name() const {
+	return name;
+
+}
+
+void EditorExportPreset::set_runnable(bool p_enable) {
+
+	runnable=p_enable;
+	EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::is_runnable() const {
+
+	return runnable;
+}
+
+void EditorExportPreset::set_export_filter(ExportFilter p_filter) {
+
+	export_filter=p_filter;
+	EditorExport::singleton->save_presets();
+
+}
+
+EditorExportPreset::ExportFilter EditorExportPreset::get_export_filter() const {
+	return export_filter;
+}
+
+void EditorExportPreset::set_include_filter(const String& p_include) {
+
+	include_filter=p_include;
+	EditorExport::singleton->save_presets();
+
+}
+
+String EditorExportPreset::get_include_filter() const {
+
+	return include_filter;
+}
+
+void EditorExportPreset::set_exclude_filter(const String& p_exclude) {
+
+	exclude_filter=p_exclude;
+	EditorExport::singleton->save_presets();
+}
+
+String EditorExportPreset::get_exclude_filter() const {
+
+	return exclude_filter;
+}
+
+void EditorExportPreset::add_export_file(const String& p_path) {
+
+	selected_files.insert(p_path);
+	EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::remove_export_file(const String& p_path) {
+	selected_files.erase(p_path);
+	EditorExport::singleton->save_presets();
+}
+
+bool EditorExportPreset::has_export_file(const String& p_path) {
+
+	return selected_files.has(p_path);
+}
+
+void EditorExportPreset::add_patch(const String& p_path,int p_at_pos) {
 
+	if (p_at_pos<0)
+		patches.push_back(p_path);
+	else
+		patches.insert(p_at_pos,p_path);
+	EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::remove_patch(int p_idx) {
+	patches.remove(p_idx);
+	EditorExport::singleton->save_presets();
+}
+
+void EditorExportPreset::set_patch(int p_index,const String& p_path) {
+	ERR_FAIL_INDEX(p_index,patches.size());
+	patches[p_index]=p_path;
+	EditorExport::singleton->save_presets();
+}
+String EditorExportPreset::get_patch(int p_index) {
+
+	ERR_FAIL_INDEX_V(p_index,patches.size(),String());
+	return patches[p_index];
+}
+
+Vector<String> EditorExportPreset::get_patches() const {
+	return patches;
+}
 
+EditorExportPreset::EditorExportPreset() {
+
+	export_filter=EXPORT_ALL_RESOURCES;
+	runnable=false;
 }
 
 
@@ -143,7 +254,7 @@ void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags)
 
 Error EditorExportPlatform::_save_pack_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
 
-
+	return OK;
 }
 
 Error EditorExportPlatform::_save_zip_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) {
@@ -205,6 +316,24 @@ String EditorExportPlatform::find_export_template(String template_file_name, Str
 	return "";
 }
 
+Ref<EditorExportPreset> EditorExportPlatform::create_preset() {
+
+	Ref<EditorExportPreset> preset;
+	preset.instance();
+	preset->platform=Ref<EditorExportPlatform>(this);
+
+	List<ExportOption> options;
+	get_export_options(&options);
+
+	for (List<ExportOption>::Element *E=options.front();E;E=E->next()) {
+
+		preset->properties.push_back(E->get().option);
+		preset->values[E->get().option.name]=E->get().default_value;
+	}
+
+	return preset;
+
+}
 
 Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset>& p_preset,EditorExportSaveFunction p_func, void* p_udata) {
 
@@ -229,6 +358,76 @@ EditorExportPlatform::EditorExportPlatform() {
 
 ////
 
+EditorExport *EditorExport::singleton=NULL;
+
+
+void EditorExport::_save() {
+
+
+	Ref<ConfigFile> config;
+	config.instance();
+	for(int i=0;i<export_presets.size();i++) {
+
+		Ref<EditorExportPreset> preset = export_presets[i];
+		String section="preset."+itos(i);
+
+		config->set_value(section,"name",preset->get_name());
+		config->set_value(section,"platform",preset->get_platform()->get_name());
+		config->set_value(section,"runnable",preset->is_runnable());
+		bool save_files=false;
+		switch(preset->get_export_filter()) {
+			case EditorExportPreset::EXPORT_ALL_RESOURCES: {
+				config->set_value(section,"export_filter","all_resources");
+			} break;
+			case EditorExportPreset::EXPORT_SELECTED_SCENES: {
+				config->set_value(section,"export_filter","scenes");
+				save_files=true;
+			} break;
+			case EditorExportPreset::EXPORT_SELECTED_RESOURCES: {
+				config->set_value(section,"export_filter","resources");
+				save_files=true;
+			} break;
+			case EditorExportPreset::EXPORT_ALL_FILES: {
+				config->set_value(section,"export_filter","all_files");
+			} break;
+
+		}
+
+		if (save_files) {
+			Vector<String> export_files = preset->get_files_to_export();
+			config->set_value(section,"export_files",export_files);
+		}
+		config->set_value(section,"include_filter",preset->get_include_filter());
+		config->set_value(section,"exclude_filter",preset->get_exclude_filter());
+		config->set_value(section,"patch_list",preset->get_patches());
+
+		String option_section="preset."+itos(i)+".options";
+
+		for (const List<PropertyInfo>::Element *E=preset->get_properties().front();E;E=E->next()) {
+			config->set_value(option_section,E->get().name,preset->get(E->get().name));
+		}
+	}
+
+	config->save("res://export_presets.cfg");
+
+	print_line("saved ok");
+
+}
+
+
+void EditorExport::save_presets() {
+
+	print_line("save presets");
+	if (block_save)
+		return;
+	save_timer->start();
+}
+
+void EditorExport::_bind_methods() {
+
+	ClassDB::bind_method("_save",&EditorExport::_save);
+}
+
 void EditorExport::add_export_platform(const Ref<EditorExportPlatform>& p_platform) {
 
 	export_platforms.push_back(p_platform);
@@ -273,23 +472,186 @@ void EditorExport::remove_export_preset(int p_idx) {
 	export_presets.remove(p_idx);
 }
 
+void EditorExport::_notification(int p_what) {
+
+	if (p_what==NOTIFICATION_ENTER_TREE) {
+		load_config();
+	}
+}
+
 void EditorExport::load_config() {
 
+	Ref<ConfigFile> config;
+	config.instance();
+	Error err = config->load("res://export_presets.cfg");
+	if (err!=OK)
+		return;
+
+	block_save=true;
 
-}
+	int index=0;
+	while(true) {
+
+		String section = "preset."+itos(index);
+		if (!config->has_section(section))
+			break;
+
+		String platform=config->get_value(section,"platform");
+
+		Ref<EditorExportPreset> preset;
+
+		for(int i=0;i<export_platforms.size();i++) {
+			if (export_platforms[i]->get_name()==platform) {
+				preset = export_platforms[i]->create_preset();
+				break;
+			}
+		}
 
-void EditorExport::save_config() {
+		if (!preset.is_valid()) {
+			index++;
+			ERR_CONTINUE(!preset.is_valid());
+		}
+
+		preset->set_name( config->get_value(section,"name") );
+		preset->set_runnable( config->get_value(section,"runnable") );
+
+		String export_filter = config->get_value(section,"export_filter");
+
+		bool get_files=false;
+
+		if (export_filter=="all_resources") {
+			preset->set_export_filter(EditorExportPreset::EXPORT_ALL_RESOURCES);
+		} else if (export_filter=="scenes") {
+			preset->set_export_filter(EditorExportPreset::EXPORT_SELECTED_SCENES);
+			get_files=true;
+		} else if (export_filter=="resources") {
+			preset->set_export_filter(EditorExportPreset::EXPORT_SELECTED_RESOURCES);
+			get_files=true;
+		} else if (export_filter=="all_files") {
+			preset->set_export_filter(EditorExportPreset::EXPORT_ALL_FILES);
+		}
+
+		if (get_files) {
+
+			Vector<String> files = config->get_value(section,"export_files");
+
+			for(int i=0;i<files.size();i++) {
+				preset->add_export_file(files[i]);
+			}
+		}
+
+		preset->set_include_filter( config->get_value(section,"include_filter") );
+		preset->set_exclude_filter( config->get_value(section,"exclude_filter") );
+
+
+		Vector<String> patch_list = config->get_value(section,"patch_list");
+
+		for(int i=0;i<patch_list.size();i++) {
+			preset->add_patch(patch_list[i]);
+		}
+
+		String option_section="preset."+itos(index)+".options";
+
+		List<String> options;
+
+		config->get_section_keys(option_section,&options);
+
+		for (List<String>::Element *E=options.front();E;E=E->next()) {
+
+			Variant value = config->get_value(option_section,E->get());
+
+			preset->set(E->get(),value);
+		}
+
+		add_export_preset(preset);
+		index++;
+	}
+
+	block_save=false;
 
 }
 
+
+
 EditorExport::EditorExport() {
 
+	save_timer  = memnew( Timer );
+	add_child(save_timer);
+	save_timer->set_wait_time(0.8);
+	save_timer->set_one_shot(true);
+	save_timer->connect("timeout",this,"_save");
+	block_save=false;
 
+	singleton=this;
 }
 
 EditorExport::~EditorExport() {
 
 
+}
+
+
+//////////
+
+void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String>* r_features) {
+
+	if (p_preset->get("texture_format/s3tc")) {
+		r_features->push_back("s3tc");
+	}
+	if (p_preset->get("texture_format/etc")) {
+		r_features->push_back("etc");
+	}
+	if (p_preset->get("texture_format/etc2")) {
+		r_features->push_back("etc2");
+	}
+}
+
+void EditorExportPlatformPC::get_export_options(List<ExportOption> *r_options) {
+
+	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/s3tc"),true));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/etc"),false));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"texture_format/etc2"),false));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL,"binary_format/64_bits"),true));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING,"custom_template/release",PROPERTY_HINT_GLOBAL_FILE),""));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::STRING,"custom_template/debug",PROPERTY_HINT_GLOBAL_FILE),""));
+}
+
+String EditorExportPlatformPC::get_name() const {
+
+	return name;
+}
+Ref<Texture> EditorExportPlatformPC::get_logo() const  {
+
+	return logo;
+}
+
+bool EditorExportPlatformPC::can_export(String *r_error) const {
+	return true;
+}
+
+String EditorExportPlatformPC::get_binary_extension() const {
+	return extension;
+}
+
+Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset>& p_preset,const String& p_path,int p_flags) {
+
+	return OK;
+}
+
+void EditorExportPlatformPC::set_extension(const String& p_extension) {
+	extension=p_extension;
+}
+
+void EditorExportPlatformPC::set_name(const String& p_name) {
+	name=p_name;
+}
+
+void EditorExportPlatformPC::set_logo(const Ref<Texture>& p_logo) {
+	logo=p_logo;
+}
+
+EditorExportPlatformPC::EditorExportPlatformPC() {
+
 }
 
 ////////

+ 93 - 11
tools/editor/editor_import_export.h → tools/editor/editor_export.h

@@ -26,40 +26,51 @@
 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
-#ifndef EDITOR_IMPORT_EXPORT_H
-#define EDITOR_IMPORT_EXPORT_H
+#ifndef EDITOR_EXPORT_H
+#define EDITOR_EXPORT_H
 
 
 
 #include "resource.h"
 #include "scene/main/node.h"
 #include "scene/resources/texture.h"
+#include "scene/main/timer.h"
 
 class EditorProgress;
 class FileAccess;
+class EditorExportPlatform;
 
 class EditorExportPreset : public Reference {
 
 	GDCLASS( EditorExportPreset,Reference )
 public:
 	enum ExportFilter {
-		EXPORT_RESOURCES,
-		EXPORT_SELECTED,
-		EXPORT_ALL,
+		EXPORT_ALL_RESOURCES,
+		EXPORT_SELECTED_SCENES,
+		EXPORT_SELECTED_RESOURCES,
+		EXPORT_ALL_FILES,
 	};
 
 private:
 
+	Ref<EditorExportPlatform> platform;
 	ExportFilter export_filter;
+	String include_filter;
+	String exclude_filter;
+
 	String exporter;
 	Set<String> selected_files;
-	bool debug;
+	bool runnable;
+
+	Vector<String> patches;
 
 friend class EditorExport;
+friend class EditorExportPlatform;
 
 	List<PropertyInfo> properties;
 	Map<StringName,Variant> values;
 
+	String name;
 protected:
 	bool _set(const StringName& p_name, const Variant& p_value);
 	bool _get(const StringName& p_name,Variant &r_ret) const;
@@ -67,8 +78,37 @@ protected:
 
 public:
 
-	Vector<StringName> get_files_to_export() const;
+	Ref<EditorExportPlatform> get_platform();
+	bool has(const StringName& p_property) const { return values.has(p_property); }
+
+	Vector<String> get_files_to_export() const;
+
+	void add_export_file(const String& p_path);
+	void remove_export_file(const String& p_path);
+	bool has_export_file(const String& p_path);
+
+	void set_name(const String& p_name);
+	String get_name() const;
+
+	void set_runnable(bool p_enable);
+	bool is_runnable() const;
+
+	void set_export_filter(ExportFilter p_filter);
+	ExportFilter get_export_filter() const;
+
+	void set_include_filter(const String& p_include);
+	String get_include_filter() const;
 
+	void set_exclude_filter(const String& p_exclude);
+	String get_exclude_filter() const;
+
+	void add_patch(const String& p_path,int p_at_pos=-1);
+	void set_patch(int p_index,const String& p_path);
+	String get_patch(int p_index);
+	void remove_patch(int p_idx);
+	Vector<String> get_patches() const;
+
+	const List<PropertyInfo>& get_properties() const { return properties; }
 
 	EditorExportPreset();
 };
@@ -113,7 +153,7 @@ private:
 
 protected:
 
-	virtual void get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String*> r_features)=0;
+	virtual void get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String> *r_features)=0;
 	String find_export_template(String template_file_name, String *err=NULL) const;
 
 public:
@@ -127,8 +167,9 @@ public:
 		ExportOption() {}
 	};
 
-	virtual void get_export_options(ExportOption *r_options)=0;
-	virtual Ref<EditorExportPreset> create_preset()=0;
+	virtual Ref<EditorExportPreset> create_preset();
+
+	virtual void get_export_options(List<ExportOption> *r_options)=0;
 	virtual String get_name() const =0;
 	virtual Ref<Texture> get_logo() const =0;
 
@@ -169,14 +210,23 @@ class EditorExport : public Node {
 	Vector<Ref<EditorExportPlatform> > export_platforms;
 	Vector<Ref<EditorExportPreset> > export_presets;
 
+	Timer *save_timer;
+	bool block_save;
+
 	static EditorExport *singleton;
 
+	void _save();
 protected:
 
+friend class EditorExportPreset;
+	void save_presets();
 
+	void _notification(int p_what);
 	static void _bind_methods();
 public:
 
+	static EditorExport * get_singleton() { return singleton; }
+
 	void add_export_platform(const Ref<EditorExportPlatform>& p_platform);
 	int get_export_platform_count();
 	Ref<EditorExportPlatform> get_export_platform(int p_idx);
@@ -188,7 +238,6 @@ public:
 	void remove_export_preset(int p_idx);
 
 	void load_config();
-	void save_config();
 
 	EditorExport();
 	~EditorExport();
@@ -196,4 +245,37 @@ public:
 
 
 
+
+class EditorExportPlatformPC : public EditorExportPlatform {
+
+	GDCLASS( EditorExportPlatformPC,EditorExportPlatform )
+
+	Ref<ImageTexture> logo;
+	String name;
+	String extension;
+
+
+
+public:
+
+	virtual void get_preset_features(const Ref<EditorExportPreset>& p_preset,List<String>* r_features);
+
+	virtual void get_export_options(List<ExportOption> *r_options);
+
+	virtual String get_name() const;
+	virtual Ref<Texture> get_logo() const;
+
+	virtual bool can_export(String *r_error=NULL) const;
+	virtual String get_binary_extension() const;
+	virtual Error export_project(const Ref<EditorExportPreset>& p_preset,const String& p_path,int p_flags=0);
+
+	void set_extension(const String& p_extension);
+	void set_name(const String& p_name);
+
+	void set_logo(const Ref<Texture>& p_loco);
+
+	EditorExportPlatformPC();
+};
+
+
 #endif // EDITOR_IMPORT_EXPORT_H

+ 7 - 21
tools/editor/editor_node.cpp

@@ -2209,25 +2209,7 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
 
 		case FILE_EXPORT_PROJECT: {
 
-			//project_export_settings->popup_export();
-			/*
-			String target = export_db->get_current_platform();
-			Ref<EditorExporter> exporter = export_db->get_exporter(target);
-			if (exporter.is_null()) {
-				accept->set_text("No exporter for platform '"+target+"' yet.");
-				accept->popup_centered(Size2(300,70));
-				return;
-			}
-
-			String extension = exporter->get_binary_extension();
-			print_line("for target: "+target+" extension: "+extension);
-			file_export_password->set_editable( exporter->requieres_password(file_export_check->is_pressed()));
-
-			file_export->clear_filters();
-			if (extension!="") {
-				file_export->add_filter("*."+extension);
-			}
-			file_export->popup_centered_ratio();*/
+			project_export->popup_export();
 		} break;
 
 		case FILE_EXPORT_MESH_LIBRARY: {
@@ -5236,6 +5218,9 @@ EditorNode::EditorNode() {
 	EditorFileDialog::register_func=_editor_file_dialog_register;
 	EditorFileDialog::unregister_func=_editor_file_dialog_unregister;
 
+	editor_export = memnew( EditorExport );
+	add_child(editor_export);
+
 
 	register_exporters();
 
@@ -6156,8 +6141,8 @@ EditorNode::EditorNode() {
 	//gui_base->add_child(optimized_save);
 	//optimized_save->connect("confirmed",this,"_save_optimized");
 
-	//project_export = memnew( ProjectExport(&editor_data) );
-	//gui_base->add_child(project_export);
+	project_export = memnew( ProjectExportDialog );
+	gui_base->add_child(project_export);
 
 	//project_export_settings = memnew( ProjectExportDialog(this) );
 	//gui_base->add_child(project_export_settings);
@@ -6302,6 +6287,7 @@ EditorNode::EditorNode() {
 
 
 
+
 	add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) );
 	add_editor_plugin( memnew( CanvasItemEditorPlugin(this) ) );
 	add_editor_plugin( memnew( SpatialEditorPlugin(this) ) );

+ 3 - 3
tools/editor/editor_node.h

@@ -73,7 +73,7 @@
 #include "tools/editor/quick_open.h"
 #include "tools/editor/project_export.h"
 #include "tools/editor/editor_sub_scene.h"
-#include "editor_import_export.h"
+#include "editor_export.h"
 #include "editor_reimport_dialog.h"
 #include "tools/editor/editor_plugin.h"
 #include "tools/editor/editor_name_dialog.h"
@@ -365,7 +365,7 @@ private:
 
 	String _tmp_import_path;
 
-	EditorImportExport *editor_import_export;
+	EditorExport *editor_export;
 
 	Object *current;
 
@@ -395,7 +395,7 @@ private:
 	EditorRun editor_run;
 	EditorSelection *editor_selection;
 //	ProjectExport *project_export;
-//	ProjectExportDialog *project_export_settings;
+	ProjectExportDialog *project_export;
 	EditorResourcePreview *resource_preview;
 
 	EditorFileServer *file_server;

+ 1 - 1
tools/editor/editor_plugin.h

@@ -43,7 +43,7 @@ class EditorNode;
 class Spatial;
 class Camera;
 class EditorSelection;
-class EditorImportExport;
+class EditorExport;
 class EditorSettings;
 class SpatialEditorGizmo;
 class EditorImportPlugin;

+ 1 - 1
tools/editor/editor_run_native.cpp

@@ -28,7 +28,7 @@
 /*************************************************************************/
 #include "editor_run_native.h"
 
-#include "editor_import_export.h"
+#include "editor_export.h"
 
 void EditorRunNative::_notification(int p_what) {
 

+ 1 - 1
tools/editor/io_plugins/editor_export_scene.h

@@ -29,7 +29,7 @@
 #ifndef EDITOR_EXPORT_SCENE_H
 #define EDITOR_EXPORT_SCENE_H
 
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 
 #if 0
 class EditorSceneExportPlugin : public EditorExportPlugin {

+ 1 - 1
tools/editor/io_plugins/editor_font_import_plugin.h

@@ -29,7 +29,7 @@
 #ifndef EDITOR_FONT_IMPORT_PLUGIN_H
 #define EDITOR_FONT_IMPORT_PLUGIN_H
 
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "scene/resources/font.h"
 #if 0
 class EditorNode;

+ 1 - 1
tools/editor/io_plugins/editor_translation_import_plugin.h

@@ -29,7 +29,7 @@
 #ifndef EDITOR_TRANSLATION_IMPORT_PLUGIN_H
 #define EDITOR_TRANSLATION_IMPORT_PLUGIN_H
 
-#include "tools/editor/editor_import_export.h"
+#include "tools/editor/editor_export.h"
 #include "scene/resources/font.h"
 #if 0
 class EditorNode;

+ 506 - 1855
tools/editor/project_export.cpp

@@ -27,7 +27,6 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 #include "project_export.h"
-#if 0
 #include "os/dir_access.h"
 #include "os/file_access.h"
 #include "globals.h"
@@ -37,6 +36,7 @@
 #include "scene/gui/box_container.h"
 #include "scene/gui/tab_container.h"
 #include "scene/gui/scroll_container.h"
+#include "scene/gui/margin_container.h"
 #include "editor_data.h"
 #include "io/image_loader.h"
 #include "compressed_translation.h"
@@ -44,2087 +44,738 @@
 #include "io_plugins/editor_texture_import_plugin.h"
 #include "editor_settings.h"
 
-const char *ProjectExportDialog::da_string[ProjectExportDialog::ACTION_MAX]={
-	"",
-	"Copy",
-	"Bundle"
-};
-
-bool ProjectExportDialog::_create_tree(TreeItem *p_parent,EditorFileSystemDirectory *p_dir) {
-
-	TreeItem *item = tree->create_item(p_parent);
-	item->set_text(0,p_dir->get_name()+"/");
-	item->set_icon(0,get_icon("Folder","EditorIcons"));
-
-
-	bool has_items=false;
-
-	for(int i=0;i<p_dir->get_subdir_count();i++) {
-
-		if (_create_tree(item,p_dir->get_subdir(i)))
-			has_items=true;
-	}
-
-	//int cc = p_options.get_slice_count(",");
-
-	for (int i=0;i<p_dir->get_file_count();i++) {
-
-		TreeItem *fitem = tree->create_item(item);
-		//fitem->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
-		//fitem->set_editable(0,true);
-		//fitem->set_checked(0,isfave);
-		fitem->set_text(0,p_dir->get_file(i));
-		String path = p_dir->get_file_path(i);
-		fitem->set_tooltip(0,path);
-		fitem->set_metadata(0,path);
-		Ref<Texture> icon = get_icon( (has_icon(p_dir->get_file_type(i),ei)?p_dir->get_file_type(i):ot),ei);
-		fitem->set_icon(0,icon);
-
-		fitem->set_cell_mode(1,TreeItem::CELL_MODE_RANGE);
-		fitem->set_range_config(1,0,2,1);
-		fitem->set_text(1,expopt);
-		fitem->set_editable(1,true);
-
-		EditorImportExport::FileAction fa = EditorImportExport::get_singleton()->get_export_file_action(path);
-		fitem->set_range(1,fa);
-
-		has_items=true;
-
-	}
-
-	if (!has_items) {
-
-		memdelete(item);
-		return false;
+void ProjectExportDialog::_notification(int p_what) {
 
+	if (p_what==NOTIFICATION_READY) {
+		delete_preset->set_icon(get_icon("Del","EditorIcons"));
 	}
-
-	return true;
 }
 
 
-void ProjectExportDialog::_tree_changed() {
-
-	TreeItem *t=tree->get_selected();
-	if (!t)
-		return;
-
-	String selected = t->get_metadata(0);
-
-	EditorImportExport::get_singleton()->set_export_file_action(selected,EditorImportExport::FileAction(int(t->get_range(1))));
-	_save_export_cfg();
-
-	//editor->save_import_export(true);
-	//EditorImportDB::get_singleton()->save_settings();
-
-}
-
 void ProjectExportDialog::popup_export() {
-	popup_centered_ratio();
-	if (pending_update_tree) {
-		_update_tree();
-		_update_group_tree();
-		pending_update_tree=false;
-	}
-}
 
-void ProjectExportDialog::_update_tree() {
+	add_preset->get_popup()->clear();
+	for(int i=0;i<EditorExport::get_singleton()->get_export_platform_count();i++) {
 
+		Ref<EditorExportPlatform> plat = EditorExport::get_singleton()->get_export_platform(i);
 
+		add_preset->get_popup()->add_icon_item(plat->get_logo(),plat->get_name());
 
-	updating_tree=true;
-	tree->clear();
-	EditorFileSystemDirectory *efsd = EditorFileSystem::get_singleton()->get_filesystem();
-
-	if (efsd) {
-		_create_tree(NULL,efsd);
 	}
 
-	updating_tree=false;
+	_update_presets();
+	popup_centered_ratio();
 }
 
+void ProjectExportDialog::_add_preset(int p_platform) {
 
+	Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_platform(p_platform)->create_preset();
+	ERR_FAIL_COND(!preset.is_valid());
 
+	String name = EditorExport::get_singleton()->get_export_platform(p_platform)->get_name();
+	bool make_runnable=true;
+	int attempt=1;
+	while(true) {
 
-void ProjectExportDialog::_update_platform() {
-
-	_validate_platform();
-	TreeItem *selected = platforms->get_selected();
-	if (!selected)
-		return;
-
-	String platform = selected->get_metadata(0);
-	Ref<EditorExportPlatform> exporter = EditorImportExport::get_singleton()->get_export_platform(platform);
-	platform_options->edit( exporter.ptr() );
-}
-
-void ProjectExportDialog::_platform_selected() {
+		bool valid=true;
 
-	String p =platforms->get_selected()->get_metadata(0);
-	_update_platform();
-	//editor->save_import_export();
-	//EditorFileSystem::get_singleton()->scan();
+		for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+			Ref<EditorExportPreset> p = EditorExport::get_singleton()->get_export_preset(i);
+			if (p->get_platform()==preset->get_platform() && p->is_runnable()) {
+				make_runnable=false;
+			}
+			if (p->get_name()==name) {
+				valid=false;
+				break;
+			}
 
-}
+		}
 
-void ProjectExportDialog::_scan_finished() {
+		if (valid)
+			break;
 
-/*	print_line("**********SCAN DONEEE********");
-	print_line("**********SCAN DONEEE********");
-	print_line("**********SCAN DONEEE********");
-	print_line("**********SCAN DONEEE********");*/
+		attempt++;
+		name = EditorExport::get_singleton()->get_export_platform(p_platform)->get_name()+" "+itos(attempt);
 
-	if (!is_visible_in_tree()) {
-		pending_update_tree=true;
-		return;
 	}
 
-	_update_tree();
-	_update_group_tree();
+	preset->set_name(name);
+	if (make_runnable)
+		preset->set_runnable(make_runnable);
+	EditorExport::get_singleton()->add_export_preset(preset);
+	_update_presets();
+	_edit_preset(EditorExport::get_singleton()->get_export_preset_count()-1);
+
 }
 
-void ProjectExportDialog::_rescan() {
 
-	EditorFileSystem::get_singleton()->scan();
+void ProjectExportDialog::_update_presets() {
 
-}
+	updating=true;
 
-void ProjectExportDialog::_update_exporter() {
+	Ref<EditorExportPreset> current;
+	if (presets->get_current()>=0 && presets->get_current()<presets->get_item_count())
+		current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
 
+	int current_idx=-1;
+	presets->clear();
+	for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+		Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(i);
+		if (preset==current) {
+			current_idx=i;
+		}
 
-}
+		String name = preset->get_name();
+		if (preset->is_runnable())
+			name+=" ("+TTR("Runnable")+")";
+		presets->add_item(name,preset->get_platform()->get_logo());
+	}
 
+	if (current_idx!=-1) {
+		presets->select(current_idx);
+		//_edit_preset(current_idx);
+	}
 
-void ProjectExportDialog::_save_export_cfg() {
+	updating=false;
 
-	EditorImportExport::get_singleton()->save_config();
 }
 
-void ProjectExportDialog::_prop_edited(String what) {
+void ProjectExportDialog::_edit_preset(int p_index) {
 
-	_save_export_cfg();
+	if (p_index<0 || p_index>=presets->get_item_count()) {
+		name->set_text("");
+		name->set_editable(false);
+		runnable->set_disabled(true);
+		parameters->edit(NULL);
+		delete_preset->set_disabled(true);
+		sections->hide();
+		patches->clear();
+		return;
+	}
 
-	_validate_platform();
 
-}
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(p_index);
+	ERR_FAIL_COND(current.is_null());
 
-void ProjectExportDialog::_filters_edited(String what) {
 
-	EditorImportExport::get_singleton()->set_export_custom_filter(what);
-	_save_export_cfg();
-}
+	updating=true;
 
-void ProjectExportDialog::_filters_exclude_edited(String what) {
-	EditorImportExport::get_singleton()->set_export_custom_filter_exclude(what);
-	_save_export_cfg();
-}
+	presets->select(p_index);
+	sections->show();
+
+	name->set_editable(true);
+	delete_preset->set_disabled(false);
+	name->set_text(current->get_name());
+	runnable->set_disabled(false);
+	runnable->set_pressed(current->is_runnable());
+	parameters->edit(current.ptr());
+
+	export_filter->select(current->get_export_filter());
+	include_filters->set_text(current->get_include_filter());
+	exclude_filters->set_text(current->get_exclude_filter());
+
+
+	patches->clear();
+	TreeItem *patch_root = patches->create_item();
+	Vector<String> patchlist = current->get_patches();
+	for(int i=0;i<patchlist.size();i++) {
+		TreeItem *patch = patches->create_item(patch_root);
+		patch->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+		String file = patchlist[i].get_file();
+		patch->set_editable(0,true);
+		patch->set_text(0,file.get_file().replace("*",""));
+		if (file.ends_with("*"))
+			patch->set_checked(0,true);
+		patch->set_tooltip(0,patchlist[i]);
+		patch->set_metadata(0,i);
+		patch->add_button(0,get_icon("Del","EditorIcons"),0);
+		patch->add_button(0,get_icon("folder","FileDialog"),1);
+	}
+
+	TreeItem *patch_add = patches->create_item(patch_root);
+	patch_add->set_metadata(0,patchlist.size());
+	if (patchlist.size()==0)
+		patch_add->set_text(0,"Add initial export..");
+	else
+		patch_add->set_text(0,"Add previous patches..");
 
-void ProjectExportDialog::_quality_edited(float what) {
+	patch_add->add_button(0,get_icon("folder","FileDialog"),1);
 
-	EditorImportExport::get_singleton()->set_export_image_quality(what);
-	_save_export_cfg();
-}
+	_fill_resource_tree();
 
-void ProjectExportDialog::_shrink_edited(float what) {
+	updating=false;
 
-	EditorImportExport::get_singleton()->set_export_image_shrink(what);
-	_save_export_cfg();
 }
 
-void ProjectExportDialog::_image_export_edited(int what) {
+void ProjectExportDialog::_patch_button_pressed(Object* p_item,int p_column,int p_id) {
 
-	EditorImportExport::get_singleton()->set_export_image_action(EditorImportExport::ImageAction(what));
-	_save_export_cfg();
-}
 
-void ProjectExportDialog::_format_toggled() {
+	TreeItem *ti = (TreeItem*)p_item;
 
-	EditorImportExport::get_singleton()->get_image_formats().clear();
+	patch_index=ti->get_metadata(0);
 
-	for(int i=0;i<formats.size();i++) {
-		if (formats[i]->is_checked(0))
-			EditorImportExport::get_singleton()->get_image_formats().insert( formats[i]->get_text(0));
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
+	if (p_id==0) {
+		Vector<String> patches = current->get_patches();
+		ERR_FAIL_INDEX(patch_index,patches.size());
+		patch_erase->set_text(vformat(TTR("Delete patch '"+patches[patch_index].get_file()+"' from list?")));
+		patch_erase->popup_centered_minsize();
+	} else {
+		patch_dialog->popup_centered_ratio();
 	}
-	_save_export_cfg();
 }
 
+void ProjectExportDialog::_patch_edited() {
 
-void ProjectExportDialog::_script_edited(Variant v) {
-
-	if (updating_script)
+	TreeItem *item = patches->get_edited();
+	if (!item)
 		return;
-	updating_script=true;
-	EditorNode::get_undo_redo()->create_action(TTR("Edit Script Options"));
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"script_set_action",script_mode->get_selected());
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"script_set_action",EditorImportExport::get_singleton()->script_get_action());
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"script_set_encryption_key",script_key->get_text());
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"script_set_encryption_key",EditorImportExport::get_singleton()->script_get_encryption_key());
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_script");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_script");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->commit_action();
-	updating_script=false;
-
-
-}
-
-void ProjectExportDialog::_sample_convert_edited(int what) {
-	EditorImportExport::get_singleton()->sample_set_action( EditorImportExport::SampleAction(sample_mode->get_selected()));
-	EditorImportExport::get_singleton()->sample_set_max_hz(  sample_max_hz->get_value() );
-	EditorImportExport::get_singleton()->sample_set_trim(  sample_trim->is_pressed() );
-	_save_export_cfg();
-
-}
-
-void ProjectExportDialog::_notification(int p_what) {
-
-	switch(p_what) {
-
-		case NOTIFICATION_ENTER_TREE: {
+	int index = item->get_metadata(0);
 
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
-			CenterContainer *cc = memnew( CenterContainer );
-			TextureRect *tf = memnew( TextureRect);
-			tf->set_texture(get_icon("ErrorSign","EditorIcons"));
-			cc->add_child(tf);
-			plat_errors->add_child(cc);
-			platform_error_string->raise();
+	Vector<String> patches = current->get_patches();
 
-			TreeItem *root = platforms->create_item(NULL);
-			List<StringName> ep;
-			EditorImportExport::get_singleton()->get_export_platforms(&ep);
-			ep.sort_custom<StringName::AlphCompare>();
+	ERR_FAIL_INDEX(index,patches.size());
 
-			for(List<StringName>::Element *E=ep.front();E;E=E->next()) {
+	String patch = patches[index].replace("*","");
 
-
-				Ref<EditorExportPlatform> eep = EditorImportExport::get_singleton()->get_export_platform(E->get());
-				TreeItem *p = platforms->create_item(root);
-				p->set_text(0,eep->get_name());
-				p->set_icon(0,eep->get_logo());
-				p->set_metadata(0,eep->get_name());
-				if (eep->get_name()==OS::get_singleton()->get_name())
-					p->select(0);
-
-			}
-
-			EditorFileSystem::get_singleton()->connect("filesystem_changed",this,"_scan_finished");
-			//_rescan();
-			_update_platform();
-			export_mode->select( EditorImportExport::get_singleton()->get_export_filter() );
-			convert_text_scenes->set_pressed( EditorImportExport::get_singleton()->get_convert_text_scenes() );
-			filters->set_text( EditorImportExport::get_singleton()->get_export_custom_filter() );
-			filters_exclude->set_text( EditorImportExport::get_singleton()->get_export_custom_filter_exclude() );
-			if (EditorImportExport::get_singleton()->get_export_filter()!=EditorImportExport::EXPORT_SELECTED)
-				tree_vb->hide();
-			else
-				tree_vb->show();
-
-			image_action->select(EditorImportExport::get_singleton()->get_export_image_action());
-			image_quality->set_value(EditorImportExport::get_singleton()->get_export_image_quality());
-			image_shrink->set_value(EditorImportExport::get_singleton()->get_export_image_shrink());
-			_update_script();
-
-
-			image_quality->connect("value_changed",this,"_quality_edited");
-			image_shrink->connect("value_changed",this,"_shrink_edited");
-			image_action->connect("item_selected",this,"_image_export_edited");
-
-			script_mode->connect("item_selected",this,"_script_edited");
-			script_key->connect("text_changed",this,"_script_edited");
-
-			for(int i=0;i<formats.size();i++) {
-				if (EditorImportExport::get_singleton()->get_image_formats().has(formats[i]->get_text(0)))
-					formats[i]->set_checked(0,true);
-			}
-			image_formats->connect("item_edited",this,"_format_toggled");
-			group_add->set_icon(get_icon("Add","EditorIcons"));
-			//group_del->set_icon(get_icon("Del","EditorIcons"));
-
-			_update_group_list();
-			_update_group();
-			_update_group_tree();
-
-			sample_mode->select( EditorImportExport::get_singleton()->sample_get_action() );
-			sample_max_hz->set_value( EditorImportExport::get_singleton()->sample_get_max_hz() );
-			sample_trim->set_pressed( EditorImportExport::get_singleton()->sample_get_trim() );
-
-			sample_mode->connect("item_selected",this,"_sample_convert_edited");
-			sample_max_hz->connect("value_changed",this,"_sample_convert_edited");
-			sample_trim->connect("toggled",this,"_sample_convert_edited");
-
-
-		} break;
-		case NOTIFICATION_EXIT_TREE: {
-
-		} break;
-		case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
-			//something may have changed
-			_validate_platform();
-
-		} break;
-		case NOTIFICATION_VISIBILITY_CHANGED: {
-			if (is_visible_in_tree())
-				_validate_platform();
-
-		} break;
-		case NOTIFICATION_PROCESS: {
-
-		} break;
+	if (item->is_checked(0)) {
+		patch+="*";
 	}
 
-}
+	current->set_patch(index,patch);
 
 
-void ProjectExportDialog::_validate_platform() {
 
-	get_ok()->set_disabled(true);
-	button_export->set_disabled(true);
-	TreeItem *selected = platforms->get_selected();
-	plat_errors->hide();
-	if (!selected) {
-		return;
-	}
+}
 
-	String platform = selected->get_metadata(0);
-	Ref<EditorExportPlatform> exporter = EditorImportExport::get_singleton()->get_export_platform(platform);
-	if (!exporter.is_valid()) {
-		return;
-	}
+void ProjectExportDialog::_patch_selected(const String& p_path) {
 
-	String err;
-	if (!exporter->can_export(&err)) {
-		Vector<String> items = err.strip_edges().split("\n");
-		err="";
-		for(int i=0;i<items.size();i++) {
-			if (i!=0)
-				err+="\n";
-			err+="  -"+items[i];
-		}
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
-		platform_error_string->set_text(err);
-		plat_errors->show();
-		return;
-	}
+	Vector<String> patches = current->get_patches();
 
-	List<String> pl;
-	EditorFileSystem::get_singleton()->get_changed_sources(&pl);
+	if (patch_index >=patches.size()) {
 
-	if (false && pl.size()) {
-		if (pl.size()==1)
-			platform_error_string->set_text(" -One Resource is pending re-import.");
-		else
-			platform_error_string->set_text("  "+itos(pl.size())+" Resources are pending re-import.");
+		current->add_patch(GlobalConfig::get_singleton()->get_resource_path().path_to(p_path)+"*");
+	} else {
+		String enabled = patches[patch_index].ends_with("*") ? String("*") : String();
+		current->set_patch(patch_index,GlobalConfig::get_singleton()->get_resource_path().path_to(p_path)+enabled);
 
-		plat_errors->show();
-		return;
 	}
 
-	get_ok()->set_disabled(false);
-	button_export->set_disabled(false);
+	_edit_preset(presets->get_current());
 
 }
 
-void ProjectExportDialog::_export_mode_changed(int p_idx) {
-
-	if (EditorImportExport::get_singleton()->get_export_filter()==p_idx)
-		return;
-	EditorImportExport::get_singleton()->set_export_filter(EditorImportExport::ExportFilter(p_idx));
+void ProjectExportDialog::_patch_deleted() {
 
-	if (p_idx!=EditorImportExport::EXPORT_SELECTED)
-		tree_vb->hide();
-	else
-		tree_vb->show();
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
-	EditorImportExport::get_singleton()->set_convert_text_scenes( convert_text_scenes->is_pressed() );
+	Vector<String> patches = current->get_patches();
+	if (patch_index <patches.size()) {
 
-	_save_export_cfg();
+		current->remove_patch(patch_index);
+		_edit_preset(presets->get_current());
+	}
 
 }
 
-void ProjectExportDialog::_export_action(const String& p_file) {
+void ProjectExportDialog::_runnable_pressed() {
 
-	String location = GlobalConfig::get_singleton()->globalize_path(p_file).get_base_dir().replace("\\","/");
+	if (updating)
+		return;
 
-	while(true) {
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
-		print_line("TESTING: "+location.plus_file("godot.cfg"));
-		if (FileAccess::exists(location.plus_file("godot.cfg"))) {
+	if (runnable->is_pressed()) {
 
-			error->set_text(TTR("Please export outside the project folder!"));
-			error->popup_centered_minsize();
-			return;
+		for(int i=0;i<EditorExport::get_singleton()->get_export_preset_count();i++) {
+			Ref<EditorExportPreset> p = EditorExport::get_singleton()->get_export_preset(i);
+			if (p->get_platform()==current->get_platform()) {
+				p->set_runnable(current==p);
+			}
 		}
-		String nl = (location+"/..").simplify_path();
-		if (nl.find("/")==location.find_last("/"))
-			break;
-		location=nl;
-	}
-
-	/* Checked if the export location is outside the project directory,
-	 * now will check if a file name has been entered */
-	if (p_file.ends_with("/")) {
-
-		error->set_text("Please enter a file name!");
-		error->popup_centered_minsize();
-		return;
-	}
-
-	TreeItem *selected = platforms->get_selected();
-	if (!selected)
-		return;
+	} else {
 
-	String platform = selected->get_metadata(0);
-	bool debugging_enabled = EditorImportExport::get_singleton()->get_export_platform(platform)->is_debugging_enabled();
-	Error err = export_platform(platform,p_file,debugging_enabled,file_export_password->get_text(),false);
-	if (err!=OK) {
-		error->set_text(TTR("Error exporting project!"));
-		error->popup_centered_minsize();
+		current->set_runnable(false);
 	}
 
+	_update_presets();
 }
 
-void ProjectExportDialog::_export_action_pck(const String& p_file) {
+void ProjectExportDialog::_name_changed(const String& p_string) {
 
-	TreeItem *selected = platforms->get_selected();
-	if (!selected)
-		return;
-
-	Ref<EditorExportPlatform> exporter = EditorImportExport::get_singleton()->get_export_platform(selected->get_metadata(0));
-	if (exporter.is_null()) {
-		ERR_PRINT("Invalid platform for export of PCK");
+	if (updating)
 		return;
-	}
 
-	if (p_file.ends_with(".pck")) {
-		FileAccess *f = FileAccess::open(p_file,FileAccess::WRITE);
-		if (!f) {
-			error->set_text(TTR("Error writing the project PCK!"));
-			error->popup_centered_minsize();
-		}
-		ERR_FAIL_COND(!f);
-
-		Error err = exporter->save_pack(f,false);
-		memdelete(f);
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	ERR_FAIL_COND(current.is_null());
 
-		if (err!=OK) {
-			error->set_text(TTR("Error exporting project!"));
-			error->popup_centered_minsize();
-			return;
-		}
-	} else if (p_file.ends_with(".zip")) {
+	current->set_name(p_string);
+	_update_presets();
 
-		Error err = exporter->save_zip(p_file,false);
 
-		if (err!=OK) {
-			error->set_text(TTR("Error exporting project!"));
-			error->popup_centered_minsize();
-			return;
-		}
-	}
 }
 
+void ProjectExportDialog::_delete_preset() {
 
-Error ProjectExportDialog::export_platform(const String& p_platform, const String& p_path, bool p_debug,const String& p_password, bool p_quit_after) {
-
-	Ref<EditorExportPlatform> exporter = EditorImportExport::get_singleton()->get_export_platform(p_platform);
-	if (exporter.is_null()) {
-		ERR_PRINT("Invalid platform for export");
-
-		List<StringName> platforms;
-		EditorImportExport::get_singleton()->get_export_platforms(&platforms);
-		print_line("Valid export plaftorms are:");
-		for (List<StringName>::Element *E=platforms.front();E;E=E->next())
-			print_line("    \""+E->get()+"\"");
-
-		if (p_quit_after) {
-			OS::get_singleton()->set_exit_code(255);
-			get_tree()->quit();
-		}
-
-		return ERR_INVALID_PARAMETER;
-	}
-	Error err = exporter->export_project(p_path,p_debug);
-	if (err!=OK) {
-		error->set_text(TTR("Error exporting project!"));
-		error->popup_centered_minsize();
-		ERR_PRINT("Exporting failed!");
-		if (p_quit_after) {
-			OS::get_singleton()->set_exit_code(255);
-			get_tree()->quit();
-		}
-		return ERR_CANT_CREATE;
-	} else {
-		if (p_quit_after) {
-			get_tree()->quit();
-		}
-	}
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	if (current.is_null())
+		return;
 
-	return OK;
+	delete_confirm->set_text(vformat(TTR("Delete preset '%s'?"),current->get_name()));
+	delete_confirm->popup_centered_minsize();
 
 }
 
-void ProjectExportDialog::ok_pressed() {
-	//export pck
-	pck_export->popup_centered_ratio();
+void ProjectExportDialog::_delete_preset_confirm() {
 
+	int idx = presets->get_current();
+	parameters->edit(NULL);//to avoid crash
+	EditorExport::get_singleton()->remove_export_preset(idx);
+	_update_presets();
+	_edit_preset(-1);
 }
-void ProjectExportDialog::custom_action(const String&) {
-	//real export
-
-	TreeItem *selected = platforms->get_selected();
-	if (!selected)
-		return;
 
-	String platform = selected->get_metadata(0);
-	Ref<EditorExportPlatform> exporter = EditorImportExport::get_singleton()->get_export_platform(platform);
 
-	if (exporter.is_null()) {
-		error->set_text(vformat(TTR("No exporter for platform '%s' yet."),platform));
-		error->popup_centered_minsize();
-		return;
-	}
+Variant ProjectExportDialog::get_drag_data_fw(const Point2& p_point,Control* p_from) {
 
-	if (platform.to_lower()=="android" && _check_android_setting(exporter)==false){
-		// not filled all field for Android release
-		return;
-	}
+	if (p_from==presets) {
+		int pos = presets->get_item_at_pos(p_point,true);
 
-	String extension = exporter->get_binary_extension();
+		if (pos>=0) {
+			Dictionary d;
+			d["type"]="export_preset";
+			d["preset"]=pos;
 
-	file_export_password->set_editable( exporter->requires_password(exporter->is_debugging_enabled()) );
+			HBoxContainer *drag = memnew( HBoxContainer);
+			TextureRect *tr = memnew(TextureRect);
+			tr->set_texture(presets->get_item_icon(pos));
+			drag->add_child(tr);
+			Label *label = memnew( Label );
+			label->set_text(presets->get_item_text(pos));
+			drag->add_child(label);
 
-	file_export->clear_filters();
-	if (extension!="") {
-		file_export->add_filter("*."+extension);
-	}
-	file_export->popup_centered_ratio();
+			set_drag_preview(drag);
 
+			return d;
 
-}
+		}
+	} else if (p_from==patches) {
 
-LineEdit* ProjectExportDialog::_create_keystore_input(Control* container, const String& p_label, const String& name) {
+		TreeItem *item = patches->get_item_at_pos(p_point);
 
-	HBoxContainer* hb=memnew(HBoxContainer);
-	Label* lb=memnew(Label);
-	LineEdit* input=memnew(LineEdit);
+		if (item && item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK) {
 
-	lb->set_text(p_label);
-	lb->set_custom_minimum_size(Size2(140*EDSCALE,0));
-	lb->set_align(Label::ALIGN_RIGHT);
+			int metadata = item->get_metadata(0);
+			Dictionary d;
+			d["type"]="export_patch";
+			d["patch"]=metadata;
 
-	input->set_custom_minimum_size(Size2(170*EDSCALE,0));
-	input->set_name(name);
+			Label *label = memnew( Label );
+			label->set_text(item->get_text(0));
+			set_drag_preview(label);
 
-	hb->add_constant_override("separation", 10*EDSCALE);
-	hb->add_child(lb);
-	hb->add_child(input);
-	container->add_child(hb);
+			return d;
+		}
 
-	return input;
+	}
 
+	return Variant();
 }
 
-void ProjectExportDialog::_create_android_keystore_window() {
-
-	keystore_file_dialog = memnew( EditorFileDialog );
-	add_child(keystore_file_dialog);
-	keystore_file_dialog->set_mode(EditorFileDialog::MODE_OPEN_DIR);
-	keystore_file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
-	keystore_file_dialog->set_current_dir( "res://" );
-
-	keystore_file_dialog->set_title(TTR("Target Path:"));
-	keystore_file_dialog->connect("dir_selected", this,"_keystore_dir_selected");
-
-	keystore_create_dialog=memnew(ConfirmationDialog);
-	VBoxContainer* vb=memnew(VBoxContainer);
-	vb->set_size(Size2(340*EDSCALE,0));
-	keystore_create_dialog->set_title(TTR("Create Android keystore"));
-
-	_create_keystore_input(vb, TTR("Full name"), "name");
-	_create_keystore_input(vb, TTR("Organizational unit"), "unit");
-	_create_keystore_input(vb, TTR("Organization"), "org");
-	_create_keystore_input(vb, TTR("City"), "city");
-	_create_keystore_input(vb, TTR("State"), "state");
-	_create_keystore_input(vb, TTR("2 letter country code"), "code");
-	_create_keystore_input(vb, TTR("User alias"), "alias");
-	LineEdit* pass=_create_keystore_input(vb, TTR("Password"), "pass");
-	pass->set_placeholder(TTR("at least 6 characters"));
-	_create_keystore_input(vb, TTR("File name"), "file");
-
-	Label* lb_path=memnew(Label);
-	LineEdit* path=memnew(LineEdit);
-	Button* btn=memnew(Button);
-	HBoxContainer* hb=memnew(HBoxContainer);
-
-	lb_path->set_text(TTR("Path : (better to save outside of project)"));
-	path->set_h_size_flags(SIZE_EXPAND_FILL);
-	path->set_name("path");
-	btn->set_text(" .. ");
-	btn->connect("pressed", keystore_file_dialog, "popup_centered_ratio");
-
-	vb->add_spacer();
-	vb->add_child(lb_path);
-	hb->add_child(path);
-	hb->add_child(btn);
-	vb->add_child(hb);
-
-	keystore_create_dialog->add_child(vb);
-	//keystore_create_dialog->set_child_rect(vb);
-	add_child(keystore_create_dialog);
-
-	keystore_create_dialog->connect("confirmed", this, "_create_android_keystore");
-	path->connect("text_changed", this, "_check_keystore_path");
-
-	confirm_keystore = memnew(ConfirmationDialog);
-	confirm_keystore->connect("confirmed", keystore_create_dialog, "popup_centered_minsize");
-	add_child(confirm_keystore);
+bool ProjectExportDialog::can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const{
 
-}
+	if (p_from==presets) {
+		Dictionary d = p_data;
+		if (!d.has("type") || String(d["type"])!="export_preset")
+			return false;
 
-void ProjectExportDialog::_keystore_dir_selected(const String& path) {
 
-	LineEdit* edit=keystore_create_dialog->find_node("path", true, false)->cast_to<LineEdit>();
-	edit->set_text(path.simplify_path());
+		if (presets->get_item_at_pos(p_point,true)<0 && !presets->is_pos_at_end_of_items(p_point))
+			return false;
+	} else if (p_from==patches) {
 
-}
+		Dictionary d = p_data;
+		if (!d.has("type") || String(d["type"])!="export_patch")
+			return false;
 
-void ProjectExportDialog::_keystore_created() {
+		patches->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
 
-	if (error->is_connected("popup_hide", this, "_keystore_created")){
-		error->disconnect("popup_hide", this, "_keystore_created");
-	}
-	custom_action("export_pck");
+		TreeItem *item = patches->get_item_at_pos(p_point);
 
-}
+		if (!item) {
 
-void ProjectExportDialog::_check_keystore_path(const String& path) {
+			return false;
+		}
 
-	LineEdit* edit=keystore_create_dialog->find_node("path", true, false)->cast_to<LineEdit>();
-	bool exists = DirAccess::exists(path);
-	if (!exists) {
-		edit->add_color_override("font_color", Color(1,0,0,1));
-	} else {
-		edit->add_color_override("font_color", Color(0,1,0,1));
 	}
 
+	return true;
 }
 
-void ProjectExportDialog::_create_android_keystore() {
-
-	Vector<String> names=String("name,unit,org,city,state,code,alias,pass").split(",");
-	String path=keystore_create_dialog->find_node("path", true, false)->cast_to<LineEdit>()->get_text();
-	String file=keystore_create_dialog->find_node("file", true, false)->cast_to<LineEdit>()->get_text();
-
-	if (file.ends_with(".keystore")==false) {
-		file+=".keystore";
-	}
-	String fullpath=path.plus_file(file);
-	String info="CN=$name, OU=$unit, O=$org, L=$city, S=$state, C=$code";
-	Dictionary dic;
-
-	for (int i=0;i<names.size();i++){
-		LineEdit* edit = keystore_create_dialog->find_node(names[i], true, false)->cast_to<LineEdit>();
-		dic[names[i]]=edit->get_text();
-		info=info.replace("$"+names[i], edit->get_text());
-	}
-
-	String jarsigner=EditorSettings::get_singleton()->get("export/android/jarsigner");
-	String keytool=jarsigner.get_base_dir().plus_file("keytool");
-	String os_name=OS::get_singleton()->get_name();
-	if (os_name.to_lower()=="windows") {
-		keytool+=".exe";
-	}
-
-	bool exist=FileAccess::exists(keytool);
-	if (!exist) {
-		error->set_text("Can't find 'keytool'");
-		error->popup_centered_minsize();
-		return;
-	}
-
-	List<String> args;
-	args.push_back("-genkey");
-	args.push_back("-v");
-	args.push_back("-keystore");
-	args.push_back(fullpath);
-	args.push_back("-alias");
-	args.push_back(dic["alias"]);
-	args.push_back("-storepass");
-	args.push_back(dic["pass"]);
-	args.push_back("-keypass");
-	args.push_back(dic["pass"]);
-	args.push_back("-keyalg");
-	args.push_back("RSA");
-	args.push_back("-keysize");
-	args.push_back("2048");
-	args.push_back("-validity");
-	args.push_back("10000");
-	args.push_back("-dname");
-	args.push_back(info);
-	int retval;
-	OS::get_singleton()->execute(keytool,args,true,NULL,NULL,&retval);
-
-	if (retval==0) { // success
-		platform_options->_edit_set("keystore/release", fullpath);
-		platform_options->_edit_set("keystore/release_user", dic["alias"]);
-		platform_options->_edit_set("keystore/release_password", dic["pass"]);
-
-		error->set_text("Android keystore created at \n"+fullpath);
-		error->connect("popup_hide", this, "_keystore_created");
-		error->popup_centered_minsize();
-	} else { // fail
-		error->set_text("Fail to create android keystore at \n"+fullpath);
-		error->popup_centered_minsize();
-	}
-
-}
+void ProjectExportDialog::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){
 
-bool ProjectExportDialog::_check_android_setting(const Ref<EditorExportPlatform>& exporter) {
+	if (p_from==presets) {
+		Dictionary d=p_data;
+		int from_pos = d["preset"];
 
-	bool is_debugging = exporter->get("debug/debugging_enabled");
-	String release = exporter->get("keystore/release");
-	String user = exporter->get("keystore/release_user");
-	String password = exporter->get("keystore/release_password");
+		int to_pos=-1;
 
-	if (!is_debugging && (release=="" || user=="" || password=="")){
-		if (release==""){
-			confirm_keystore->set_text(TTR("Release keystore is not set.\nDo you want to create one?"));
-			confirm_keystore->popup_centered_minsize();
-		} else {
-			error->set_text(TTR("Fill Keystore/Release User and Release Password"));
-			error->popup_centered_minsize();
+		if (presets->get_item_at_pos(p_point,true)>=0) {
+			to_pos = presets->get_item_at_pos(p_point,true);
 		}
-		return false;
-	}
-
-	return true;
-
-}
-
-void ProjectExportDialog::_group_selected() {
 
+		if (to_pos==-1 && !presets->is_pos_at_end_of_items(p_point))
+			return;
 
-	_update_group(); //?
+		if (to_pos==from_pos)
+			return;
+		else if (to_pos>from_pos) {
+			to_pos--;
+		}
 
-	_update_group_tree();
-}
 
-String ProjectExportDialog::_get_selected_group() {
+		Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(from_pos);
+		EditorExport::get_singleton()->remove_export_preset(from_pos);
+		EditorExport::get_singleton()->add_export_preset(preset,to_pos);
 
-	TreeItem *sel = groups->get_selected();
-	if (!sel)
-		return String();
+		_update_presets();
+		if (to_pos>=0)
+			_edit_preset(to_pos);
+		else
+			_edit_preset(presets->get_item_count()-1);
+	} else if (p_from==patches) {
 
-	return sel->get_text(0);
+		Dictionary d = p_data;
+		if (!d.has("type") || String(d["type"])!="export_patch")
+			return;
 
+		int from_pos = d["patch"];
 
-}
+		TreeItem *item = patches->get_item_at_pos(p_point);
+		if (!item)
+			return;
 
-void ProjectExportDialog::_update_group_list() {
+		int to_pos = item->get_cell_mode(0)==TreeItem::CELL_MODE_CHECK ? int(item->get_metadata(0)) : -1;
 
-	String current = _get_selected_group();
+		if (to_pos==from_pos)
+			return;
+		else if (to_pos>from_pos) {
+			to_pos--;
+		}
 
-	groups->clear();
-	List<StringName> grouplist;
-	EditorImportExport::get_singleton()->image_export_get_groups(&grouplist);
-	grouplist.sort_custom<StringName::AlphCompare>();
+		Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+		String patch = preset->get_patch(from_pos);
+		preset->remove_patch(from_pos);
+		preset->add_patch(patch,to_pos);
 
-	TreeItem *r = groups->create_item();
-	for (List<StringName>::Element *E=grouplist.front();E;E=E->next()) {
+		_edit_preset(presets->get_current());
 
-		TreeItem *ti = groups->create_item(r);
-		ti->set_text(0,E->get());
-		ti->add_button(0,get_icon("Remove","EditorIcons"));
-		if (E->get()==current) {
-			ti->select(0);
-		}
 	}
 
-	_update_group();
 }
 
-void ProjectExportDialog::_select_group(const String& p_by_name) {
+void ProjectExportDialog::_export_type_changed(int p_which) {
 
-	TreeItem *c = groups->get_root();
-	if (!c)
+	if (updating)
 		return;
-	c=c->get_children();
 
-	if (!c)
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	if (current.is_null())
 		return;
 
-	while(c) {
+	current->set_export_filter(EditorExportPreset::ExportFilter(p_which));
+	updating=true;
+	_fill_resource_tree();
+	updating=false;
 
-		if (c->get_text(0)==p_by_name) {
-			c->select(0);
-			_update_group();
-			return;
-		}
-		c=c->get_next();
-	}
 }
 
-void ProjectExportDialog::_update_group() {
+void ProjectExportDialog::_filter_changed(const String& p_filter) {
 
 	if (updating)
 		return;
-	updating=true;
 
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	if (current.is_null())
+		return;
 
-	if (_get_selected_group()=="") {
-		group_options->hide();
-		//group_del->set_disabled(true);
-
-	} else {
-		group_options->show();
-		//group_del->set_disabled(false);
-		StringName name = _get_selected_group();
-		group_image_action->select(EditorImportExport::get_singleton()->image_export_group_get_image_action(name));
-		group_atlas->set_pressed(EditorImportExport::get_singleton()->image_export_group_get_make_atlas(name));
-		group_shrink->set_value(EditorImportExport::get_singleton()->image_export_group_get_shrink(name));
-		group_lossy_quality->set_value(EditorImportExport::get_singleton()->image_export_group_get_lossy_quality(name));
-		if (group_atlas->is_pressed())
-			atlas_preview->show();
-		else
-			atlas_preview->hide();
+	current->set_include_filter(include_filters->get_text());
+	current->set_exclude_filter(exclude_filters->get_text());
 
-	}
 
-	_update_group_tree();
 
-	updating=false;
+}
 
+void ProjectExportDialog::_fill_resource_tree() {
 
-}
+	include_files->clear();
+	include_label->hide();
+	include_margin->hide();
 
-bool ProjectExportDialog::_update_group_treef(TreeItem *p_parent,EditorFileSystemDirectory *p_dir,const Set<String>& p_extensions,const String& p_groups,const Map<StringName,int>& p_group_index) {
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	if (current.is_null())
+		return;
 
-	TreeItem *ti = group_images->create_item(p_parent);
-	ti->set_text(0,p_dir->get_name()+"/");
-	bool has_child=false;
-	for(int i=0;i<p_dir->get_subdir_count();i++) {
+	EditorExportPreset::ExportFilter f = current->get_export_filter();
 
-		if (_update_group_treef(ti,p_dir->get_subdir(i),p_extensions,p_groups,p_group_index)) {
-			has_child=true;
-		}
+	if (f==EditorExportPreset::EXPORT_ALL_RESOURCES || f==EditorExportPreset::EXPORT_ALL_FILES) {
+		return;
 	}
 
-	String filter=group_images_filter->get_text();
-	StringName current_group = _get_selected_group();
-	String check_text=TTR("Include");
+	include_label->show();
+	include_margin->show();
 
-	for(int i=0;i<p_dir->get_file_count();i++) {
+	TreeItem *root = include_files->create_item();
 
-		String fname = p_dir->get_file(i);
-		if (p_extensions.has(fname.to_lower().get_extension())) {
-			String path = p_dir->get_file_path(i);
 
-			if (filter!=String() && path.find(filter)==-1)
-				continue;
+	_fill_tree(EditorFileSystem::get_singleton()->get_filesystem(),root,current,f==EditorExportPreset::EXPORT_SELECTED_SCENES);
 
-			has_child=true;
-			TreeItem *file = group_images->create_item(ti);
-			file->set_text(0,fname);
+}
 
-			StringName g = EditorImportExport::get_singleton()->image_get_export_group(path);
 
-			if (current_group==g || g==StringName()) {
+bool ProjectExportDialog::_fill_tree(EditorFileSystemDirectory *p_dir,TreeItem *p_item,Ref<EditorExportPreset> &current,bool p_only_scenes) {
 
-				file->set_cell_mode(1,TreeItem::CELL_MODE_CHECK);
-				file->set_text(1,check_text);
-				file->set_editable(1,true);
-				file->set_checked(1,current_group==g);
-			} else {
+	p_item->set_icon(0,get_icon("folder","FileDialog"));
+	p_item->set_text(0,p_dir->get_name()+"/");
 
-				file->set_text(1,g);
-				file->set_editable(1,false);
-				file->set_selectable(1,false);
-			}
+	bool used=false;
+	for(int i=0;i<p_dir->get_subdir_count();i++) {
 
-			file->set_metadata(0,path);
+		TreeItem *subdir = include_files->create_item(p_item);
+		if (_fill_tree(p_dir->get_subdir(i),subdir,current,p_only_scenes)==false) {
+			memdelete(subdir);
+		} else {
+			used=true;
 		}
 	}
 
-	if (!has_child) {
-		memdelete(ti);
-		return false;
-	}
-
-	return true;
-
-}
-void ProjectExportDialog::_update_group_tree() {
 
-	if (updating)
-		return;
 
-	group_images->clear();
+	for(int i=0;i<p_dir->get_file_count();i++) {
 
-	if (_get_selected_group()=="")
-		return;
+		String type = p_dir->get_file_type(i);
+		if (p_only_scenes && type!="PackedScene")
+			continue;
 
-	updating=true;
-	print_line("****UGT");
-	List<String> img_extensions;
-	ImageLoader::get_recognized_extensions(&img_extensions);
-	Set<String> extensions;
-	for(List<String>::Element *E=img_extensions.front();E;E=E->next()) {
+		TreeItem *file = include_files->create_item(p_item);
+		file->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
+		file->set_text(0,p_dir->get_file(i));
 
-		extensions.insert(E->get());
-	}
+		Ref<Texture> tex;
+		if (has_icon(type,editor_icons)) {
+			tex = get_icon(type,editor_icons);
+		} else {
+			tex = get_icon("Object",editor_icons);
+		}
 
-	List<StringName> grouplist;
-	EditorImportExport::get_singleton()->image_export_get_groups(&grouplist);
-	grouplist.sort_custom<StringName::AlphCompare>();
-	Map<StringName,int> group_index;
-	group_index[StringName()]=0;
-	int idx=1;
-	String groupenum="--";
-	for(List<StringName>::Element *E=grouplist.front();E;E=E->next()) {
-
-		group_index[E->get()]=idx++;
-		groupenum+=","+String(E->get());
-	}
+		String path = p_dir->get_file_path(i);
 
-	updating=false;
+		file->set_icon(0,tex);
+		file->set_editable(0,true);
+		file->set_checked(0,current->has_export_file(path));
+		file->set_metadata(0,path);
 
+		used=true;
 
-	_update_group_treef(NULL,EditorFileSystem::get_singleton()->get_filesystem(),extensions,groupenum,group_index);
+	}
 
+	return used;
 }
 
-void ProjectExportDialog::_group_changed(Variant v) {
+void ProjectExportDialog::_tree_changed() {
 
 	if (updating)
 		return;
-	if (_get_selected_group()=="")
-		return;
-	updating=true;
-	StringName name = _get_selected_group();
-	EditorNode::get_undo_redo()->create_action(TTR("Change Image Group"));
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_set_image_action",name,group_image_action->get_selected());
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_set_make_atlas",name,group_atlas->is_pressed());
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_set_shrink",name,group_shrink->get_value());
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_set_lossy_quality",name,group_lossy_quality->get_value());
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_image_action",name,EditorImportExport::get_singleton()->image_export_group_get_image_action(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_make_atlas",name,EditorImportExport::get_singleton()->image_export_group_get_make_atlas(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_shrink",name,EditorImportExport::get_singleton()->image_export_group_get_shrink(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_lossy_quality",name,EditorImportExport::get_singleton()->image_export_group_get_lossy_quality(name));
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->commit_action();
-	updating=false;
-	// update atlas preview button
-	_update_group();
-}
 
-void ProjectExportDialog::_group_item_edited() {
+	Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+	if (current.is_null())
+		return;
 
-	TreeItem *item = group_images->get_edited();
+	TreeItem *item = include_files->get_edited();
 	if (!item)
 		return;
-	if (_get_selected_group()==String())
-		return;
 
-	StringName path = item->get_metadata(0);
-	String group;
-	if (item->is_checked(1)) {
-		group=_get_selected_group();
-	} else {
-		group=String();
-	}
+	String path = item->get_metadata(0);
+	bool added = item->is_checked(0);
 
-	print_line("changed "+path+" to group: "+group);
-	EditorNode::get_undo_redo()->create_action(TTR("Change Image Group"));
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_add_to_export_group",path,group);
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_add_to_export_group",path,EditorImportExport::get_singleton()->image_get_export_group(path));
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->commit_action();
+	if (added) {
+		current->add_export_file(path);
+	} else {
+		current->remove_export_file(path);
 
+	}
 }
 
-void ProjectExportDialog::_group_add() {
+void ProjectExportDialog::_bind_methods() {
 
-	String name = group_new_name->get_text();
+	ClassDB::bind_method("_add_preset",&ProjectExportDialog::_add_preset);
+	ClassDB::bind_method("_edit_preset",&ProjectExportDialog::_edit_preset);
+	ClassDB::bind_method("_runnable_pressed",&ProjectExportDialog::_runnable_pressed);
+	ClassDB::bind_method("_name_changed",&ProjectExportDialog::_name_changed);
+	ClassDB::bind_method("_delete_preset",&ProjectExportDialog::_delete_preset);
+	ClassDB::bind_method("_delete_preset_confirm",&ProjectExportDialog::_delete_preset_confirm);
+	ClassDB::bind_method("get_drag_data_fw",&ProjectExportDialog::get_drag_data_fw);
+	ClassDB::bind_method("can_drop_data_fw",&ProjectExportDialog::can_drop_data_fw);
+	ClassDB::bind_method("drop_data_fw",&ProjectExportDialog::drop_data_fw);
+	ClassDB::bind_method("_export_type_changed",&ProjectExportDialog::_export_type_changed);
+	ClassDB::bind_method("_filter_changed",&ProjectExportDialog::_filter_changed);
+	ClassDB::bind_method("_tree_changed",&ProjectExportDialog::_tree_changed);
+	ClassDB::bind_method("_patch_button_pressed",&ProjectExportDialog::_patch_button_pressed);
+	ClassDB::bind_method("_patch_selected",&ProjectExportDialog::_patch_selected);
+	ClassDB::bind_method("_patch_deleted",&ProjectExportDialog::_patch_deleted);
+	ClassDB::bind_method("_patch_edited",&ProjectExportDialog::_patch_edited);
+
+
+
+
+}
+ProjectExportDialog::ProjectExportDialog() {
+
+	HBoxContainer *hbox = memnew( HBoxContainer );
+	add_child(hbox);
+
+	VBoxContainer *preset_vb = memnew( VBoxContainer );
+	preset_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	hbox->add_child(preset_vb);
+
+	HBoxContainer *preset_hb = memnew( HBoxContainer );
+	preset_hb->add_child(memnew(Label(TTR("Presets"))));
+	preset_hb->add_spacer();
+	preset_vb->add_child(preset_hb);
+
+	add_preset = memnew( MenuButton );
+	add_preset->set_text(TTR("Add.."));
+	add_preset->get_popup()->connect("index_pressed",this,"_add_preset");
+	preset_hb->add_child(add_preset);
+	MarginContainer *mc = memnew( MarginContainer );
+	preset_vb->add_child(mc);
+	mc->set_v_size_flags(SIZE_EXPAND_FILL);
+	presets = memnew( ItemList );
+	presets->set_drag_forwarding(this);
+	mc->add_child(presets);
+	presets->connect("item_selected",this,"_edit_preset");
+	delete_preset = memnew( ToolButton );
+	preset_hb->add_child(delete_preset);
+	delete_preset->connect("pressed",this,"_delete_preset");
+
+	VBoxContainer *settings_vb = memnew( VBoxContainer );
+	settings_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+	hbox->add_child(settings_vb);
+
+	name = memnew(LineEdit);
+	settings_vb->add_margin_child(TTR("Name:"),name);
+	name->connect("text_changed",this,"_name_changed");
+	runnable = memnew(CheckButton);
+	runnable->set_text(TTR("Runnable"));
+	runnable->connect("pressed",this,"_runnable_pressed");
+	settings_vb->add_child(runnable);
+
+	sections = memnew (TabContainer );
+	settings_vb->add_child(sections);
+	sections->set_v_size_flags(SIZE_EXPAND_FILL);
+
+	parameters = memnew (PropertyEditor );
+	sections->add_child(parameters);
+	parameters->set_name(TTR("Options"));
+	parameters->hide_top_label();
+	parameters->set_v_size_flags(SIZE_EXPAND_FILL);
+	parameters->set_hide_script(true);
+
+	VBoxContainer *resources_vb = memnew( VBoxContainer );
+	sections->add_child(resources_vb);
+	resources_vb->set_name(TTR("Resources"));
+
+	export_filter = memnew( OptionButton );
+	export_filter->add_item(TTR("Export all resources in the project"));
+	export_filter->add_item(TTR("Export selected scenes (and dependencies)"));
+	export_filter->add_item(TTR("Export selected resources (and dependencies)"));
+	export_filter->add_item(TTR("Export all files in the project directory"));
+	resources_vb->add_margin_child(TTR("Export Mode:"),export_filter);
+	export_filter->connect("item_selected",this,"_export_type_changed");
+
+	include_label = memnew( Label );
+	include_label->set_text(TTR("Resources to export:"));
+	resources_vb->add_child(include_label);
+	include_margin = memnew( MarginContainer );
+	include_margin->set_v_size_flags(SIZE_EXPAND_FILL);
+	resources_vb->add_child(include_margin);
+
+	include_files = memnew(Tree);
+	include_margin->add_child(include_files);
+	include_files->connect("item_edited",this,"_tree_changed");
+
+	include_filters = memnew( LineEdit );
+	resources_vb->add_margin_child(TTR("Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"),include_filters);
+	include_filters->connect("text_changed",this,"_filter_changed");
+
+	exclude_filters = memnew( LineEdit );
+	resources_vb->add_margin_child(TTR("Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"),exclude_filters);
+	exclude_filters->connect("text_changed",this,"_filter_changed");
+
+	VBoxContainer *patch_vb = memnew( VBoxContainer );
+	sections->add_child(patch_vb);
+	patch_vb->set_name(TTR("Patches"));
+
+	patches = memnew( Tree );
+	patch_vb->add_child(patches);
+	patches->set_v_size_flags(SIZE_EXPAND_FILL);
+	patches->set_hide_root(true);
+	patches->connect("button_pressed",this,"_patch_button_pressed");
+	patches->connect("item_edited",this,"_patch_edited");
+	patches->set_drag_forwarding(this);
+	patches->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
+
+	HBoxContainer *patches_hb = memnew( HBoxContainer );
+	patch_vb->add_child(patches_hb);
+	patches_hb->add_spacer();
+	patch_export = memnew( Button );
+	patch_export->set_text(TTR("Make Patch"));
+	patches_hb->add_child(patch_export);
+	patches_hb->add_spacer();
+
+	patch_dialog = memnew( FileDialog );
+	patch_dialog->add_filter("*.pck ; Pack File");
+	patch_dialog->set_mode(FileDialog::MODE_OPEN_FILE);
+	patch_dialog->connect("file_selected",this,"_patch_selected");
+	add_child(patch_dialog);
+
+	patch_erase = memnew( ConfirmationDialog );
+	patch_erase->get_ok()->set_text(TTR("Delete"));
+	patch_erase->connect("confirmed",this,"_patch_deleted");
+	add_child(patch_erase);
+
+
+	//disable by default
+	name->set_editable(false);
+	runnable->set_disabled(true);
+	delete_preset->set_disabled(true);
+	sections->hide();
+	parameters->edit(NULL);
+
+	delete_confirm = memnew( ConfirmationDialog );
+	add_child(delete_confirm);
+	delete_confirm->get_ok()->set_text(TTR("Delete"));
+	delete_confirm->connect("confirmed",this,"_delete_preset_confirm");
 
-	if (name=="") {
-		group_new_name_error->show();
-		group_new_name_error->set_text(TTR("Group name can't be empty!"));
-		return;
-	}
-	if (name.find("/")!=-1 || name.find(":")!=-1 || name.find(",")!=-1 || name.find("-")!=-1) {
-		group_new_name_error->set_text(TTR("Invalid character in group name!"));
-		group_new_name_error->show();
-		return;
-	}
+	updating=false;
 
-	if (EditorImportExport::get_singleton()->image_export_has_group(name)) {
-		group_new_name_error->set_text(TTR("Group name already exists!"));
-		group_new_name_error->show();
-		return;
-	}
-	group_new_name_error->hide();
+	get_ok()->set_text("Export PCK/Zip");
+	add_button("Export Project",!OS::get_singleton()->get_swap_ok_cancel(),"export");
 
-	String current=_get_selected_group();
-
-
-	EditorNode::get_undo_redo()->create_action(TTR("Add Image Group"));
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_create",name);
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_remove",name);
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_list");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_list");
-	EditorNode::get_undo_redo()->add_do_method(this,"_select_group",name);
-	if (current!="")
-		EditorNode::get_undo_redo()->add_undo_method(this,"_select_group",current);
-
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-
-	EditorNode::get_undo_redo()->commit_action();
-
-}
-
-
-void ProjectExportDialog::_group_del(Object *p_item, int p_column, int p_button){
-
-	TreeItem *item = p_item->cast_to<TreeItem>();
-	if (!item)
-		return;
-	String name = item->get_text(0);
-
-	EditorNode::get_undo_redo()->create_action(TTR("Delete Image Group"));
-	List<StringName> images_used;
-	EditorImportExport::get_singleton()->image_export_get_images_in_group(name,&images_used);
-	for (List<StringName>::Element*E=images_used.front();E;E=E->next()) {
-
-		EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),StringName());
-
-	}
-	EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_export_group_remove",name);
-
-
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_create",name);
-	for (List<StringName>::Element*E=images_used.front();E;E=E->next()) {
-
-		EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),name);
-
-	}
-
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_image_action",name,EditorImportExport::get_singleton()->image_export_group_get_image_action(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_make_atlas",name,EditorImportExport::get_singleton()->image_export_group_get_make_atlas(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_shrink",name,EditorImportExport::get_singleton()->image_export_group_get_shrink(name));
-	EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_export_group_set_lossy_quality",name,EditorImportExport::get_singleton()->image_export_group_get_lossy_quality(name));
-
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_list");
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_list");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_select_group",name);
-
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->commit_action();
-
-}
-
-void ProjectExportDialog::_group_select_all() {
-
-
-	String group = _get_selected_group();
-	if (group=="")
-		return;
-
-	TreeItem *item = group_images->get_root();
-	if (!item)
-		return;
-
-	List<StringName> items;
-	while(item) {
-
-		if (item->get_cell_mode(1)==TreeItem::CELL_MODE_CHECK && !item->is_checked(1))
-			items.push_back(item->get_metadata(0));
-		item=item->get_next_visible();
-	}
-
-
-	if (items.size()==0)
-		return;
-
-	EditorNode::get_undo_redo()->create_action(TTR("Select All"));
-
-	for (List<StringName>::Element *E=items.front();E;E=E->next()) {
-
-		EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),group);
-		EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),String());
-
-	}
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-
-	EditorNode::get_undo_redo()->commit_action();
-
-}
-
-void ProjectExportDialog::_group_select_none(){
-
-	String group = _get_selected_group();
-	if (group=="")
-		return;
-
-	TreeItem *item = group_images->get_root();
-	if (!item)
-		return;
-
-	List<StringName> items;
-	while(item) {
-
-		if (item->get_cell_mode(1)==TreeItem::CELL_MODE_CHECK && item->is_checked(1))
-			items.push_back(item->get_metadata(0));
-		item=item->get_next_visible();
-	}
-
-
-	if (items.size()==0)
-		return;
-
-	EditorNode::get_undo_redo()->create_action(TTR("Select All"));
-
-	for (List<StringName>::Element *E=items.front();E;E=E->next()) {
-
-		EditorNode::get_undo_redo()->add_do_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),String());
-		EditorNode::get_undo_redo()->add_undo_method(EditorImportExport::get_singleton(),"image_add_to_export_group",E->get(),group);
-
-	}
-	EditorNode::get_undo_redo()->add_do_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_update_group_tree");
-	EditorNode::get_undo_redo()->add_do_method(this,"_save_export_cfg");
-	EditorNode::get_undo_redo()->add_undo_method(this,"_save_export_cfg");
-
-	EditorNode::get_undo_redo()->commit_action();
-
-}
-
-void ProjectExportDialog::_group_atlas_preview() {
-
-	StringName group = _get_selected_group();
-	if (!group)
-		return;
-
-	atlas_preview_frame->set_texture(Ref<Texture>()); //clear previous
-
-	List<StringName> images;
-	EditorImportExport::get_singleton()->image_export_get_images_in_group(group,&images);
-	images.sort_custom<StringName::AlphCompare>();
-
-	String dst_file = EditorSettings::get_singleton()->get_settings_path()+"/tmp/atlas-preview.tex";
-	Ref<ResourceImportMetadata> imd = memnew( ResourceImportMetadata );
-	//imd->set_editor();
-
-	for (List<StringName>::Element *F=images.front();F;F=F->next()) {
-
-		imd->add_source(EditorImportPlugin::validate_source_path(F->get()));
-	}
-
-
-	int flags=0;
-
-	if (GlobalConfig::get_singleton()->get("image_loader/filter"))
-		flags|=EditorTextureImportPlugin::IMAGE_FLAG_FILTER;
-	if (!GlobalConfig::get_singleton()->get("image_loader/gen_mipmaps"))
-		flags|=EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS;
-	if (!GlobalConfig::get_singleton()->get("image_loader/repeat"))
-		flags|=EditorTextureImportPlugin::IMAGE_FLAG_REPEAT;
-
-	flags|=EditorTextureImportPlugin::IMAGE_FLAG_FIX_BORDER_ALPHA;
-
-	imd->set_option("format",EditorTextureImportPlugin::IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS);
-	imd->set_option("flags",flags);
-	imd->set_option("quality",0.7);
-	imd->set_option("atlas",true);
-	imd->set_option("crop",true);
-
-	Ref<EditorTextureImportPlugin> plugin = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture");
-	Error err = plugin->import2(dst_file,imd,EditorExportPlatform::IMAGE_COMPRESSION_NONE,true);
-	if (err) {
-
-		EditorNode::add_io_error(TTR("Error saving atlas:")+" "+dst_file.get_file());
-		return;
-	}
-
-	Ref<Texture> tex = ResourceLoader::load(dst_file);
-	atlas_preview_frame->set_texture(tex); //clear previous
-	atlas_preview_dialog->set_title(TTR("Atlas Preview")+" ("+itos(tex->get_width())+"x"+itos(tex->get_height())+")");
-	atlas_preview_dialog->popup_centered_ratio(0.9);
-
-}
-
-void ProjectExportDialog::_update_script() {
-
-	if (updating_script)
-		return;
-	updating_script=true;
-	script_mode->select(EditorImportExport::get_singleton()->script_get_action());
-	script_key->set_text(EditorImportExport::get_singleton()->script_get_encryption_key());
-	updating_script=false;
-
-}
-
-void ProjectExportDialog::_image_filter_changed(String) {
-
-	_update_group_tree();
-}
-
-void ProjectExportDialog::_bind_methods() {
-
-
-	ClassDB::bind_method(D_METHOD("_rescan"),&ProjectExportDialog::_rescan);
-	ClassDB::bind_method(D_METHOD("_tree_changed"),&ProjectExportDialog::_tree_changed);
-	ClassDB::bind_method(D_METHOD("_scan_finished"),&ProjectExportDialog::_scan_finished);
-	ClassDB::bind_method(D_METHOD("_platform_selected"),&ProjectExportDialog::_platform_selected);
-	ClassDB::bind_method(D_METHOD("_prop_edited"),&ProjectExportDialog::_prop_edited);
-	ClassDB::bind_method(D_METHOD("_export_mode_changed"),&ProjectExportDialog::_export_mode_changed);
-	ClassDB::bind_method(D_METHOD("_filters_edited"),&ProjectExportDialog::_filters_edited);
-	ClassDB::bind_method(D_METHOD("_filters_exclude_edited"),&ProjectExportDialog::_filters_exclude_edited);
-	ClassDB::bind_method(D_METHOD("_export_action"),&ProjectExportDialog::_export_action);
-	ClassDB::bind_method(D_METHOD("_export_action_pck"),&ProjectExportDialog::_export_action_pck);
-	ClassDB::bind_method(D_METHOD("_quality_edited"),&ProjectExportDialog::_quality_edited);
-	ClassDB::bind_method(D_METHOD("_shrink_edited"),&ProjectExportDialog::_shrink_edited);
-	ClassDB::bind_method(D_METHOD("_image_export_edited"),&ProjectExportDialog::_image_export_edited);
-	ClassDB::bind_method(D_METHOD("_format_toggled"),&ProjectExportDialog::_format_toggled);
-	ClassDB::bind_method(D_METHOD("_group_changed"),&ProjectExportDialog::_group_changed);
-	ClassDB::bind_method(D_METHOD("_group_add"),&ProjectExportDialog::_group_add);
-	ClassDB::bind_method(D_METHOD("_group_del"),&ProjectExportDialog::_group_del);
-	ClassDB::bind_method(D_METHOD("_group_selected"),&ProjectExportDialog::_group_selected);
-	ClassDB::bind_method(D_METHOD("_update_group"),&ProjectExportDialog::_update_group);
-	ClassDB::bind_method(D_METHOD("_update_group_list"),&ProjectExportDialog::_update_group_list);
-	ClassDB::bind_method(D_METHOD("_select_group"),&ProjectExportDialog::_select_group);
-	ClassDB::bind_method(D_METHOD("_update_group_tree"),&ProjectExportDialog::_update_group_tree);
-	ClassDB::bind_method(D_METHOD("_group_item_edited"),&ProjectExportDialog::_group_item_edited);
-	ClassDB::bind_method(D_METHOD("_save_export_cfg"),&ProjectExportDialog::_save_export_cfg);
-	ClassDB::bind_method(D_METHOD("_image_filter_changed"),&ProjectExportDialog::_image_filter_changed);
-	ClassDB::bind_method(D_METHOD("_group_atlas_preview"),&ProjectExportDialog::_group_atlas_preview);
-	ClassDB::bind_method(D_METHOD("_group_select_all"),&ProjectExportDialog::_group_select_all);
-	ClassDB::bind_method(D_METHOD("_group_select_none"),&ProjectExportDialog::_group_select_none);
-	ClassDB::bind_method(D_METHOD("_script_edited"),&ProjectExportDialog::_script_edited);
-	ClassDB::bind_method(D_METHOD("_update_script"),&ProjectExportDialog::_update_script);
-	ClassDB::bind_method(D_METHOD("_sample_convert_edited"),&ProjectExportDialog::_sample_convert_edited);
-
-
-	ClassDB::bind_method(D_METHOD("export_platform"),&ProjectExportDialog::export_platform);
-	ClassDB::bind_method(D_METHOD("_create_android_keystore"),&ProjectExportDialog::_create_android_keystore);
-	ClassDB::bind_method(D_METHOD("_check_keystore_path"),&ProjectExportDialog::_check_keystore_path);
-	ClassDB::bind_method(D_METHOD("_keystore_dir_selected"),&ProjectExportDialog::_keystore_dir_selected);
-	ClassDB::bind_method(D_METHOD("_keystore_created"),&ProjectExportDialog::_keystore_created);
-
-
-	//ADD_SIGNAL(MethodInfo("instance"));
-	//ADD_SIGNAL(MethodInfo("open"));
-
-}
-
-
-ProjectExportDialog::ProjectExportDialog(EditorNode *p_editor) {
-
-	editor=p_editor;
-	set_title(TTR("Project Export Settings"));
-
-	sections = memnew( TabContainer );
-	add_child(sections);
-	//set_child_rect(sections);
-
-	VBoxContainer *pvbox = memnew( VBoxContainer );
-	sections->add_child(pvbox);
-	pvbox->set_name(TTR("Target"));
-
-	HBoxContainer *phbox = memnew( HBoxContainer );
-	pvbox->add_child(phbox);
-	phbox->set_v_size_flags(SIZE_EXPAND_FILL);
-
-	plat_errors = memnew( HBoxContainer );
-	pvbox->add_child(plat_errors);
-	platform_error_string = memnew( Label );
-	platform_error_string->set_h_size_flags(SIZE_EXPAND_FILL);
-	plat_errors->add_child(platform_error_string);
-
-	VBoxContainer *vb = memnew( VBoxContainer );
-	vb->set_h_size_flags(SIZE_EXPAND_FILL);
-	vb->set_v_size_flags(SIZE_EXPAND_FILL);
-	phbox->add_child(vb);
-	platforms = memnew( Tree );
-	platforms->set_hide_root(true);
-	vb->add_margin_child(TTR("Export to Platform"),platforms,true);
-
-	platforms->connect("cell_selected",this,"_platform_selected");
-
-
-	vb = memnew(VBoxContainer );
-	phbox->add_child(vb);
-	vb->set_h_size_flags(SIZE_EXPAND_FILL);
-	vb->set_v_size_flags(SIZE_EXPAND_FILL);
-	platform_options = memnew( PropertyEditor() );
-	platform_options->hide_top_label();
-	vb->add_margin_child(TTR("Options"),platform_options,true);
-	platform_options->connect("property_edited",this,"_prop_edited");
-
-
-
-	//////////////////
-
-	vb = memnew( VBoxContainer );
-	vb->set_name(TTR("Resources"));
-	sections->add_child(vb);
-
-	export_mode = memnew( OptionButton );
-	export_mode->add_item(TTR("Export selected resources (including dependencies)."));
-	export_mode->add_item(TTR("Export all resources in the project."));
-	export_mode->add_item(TTR("Export all files in the project directory."));
-	export_mode->connect("item_selected",this,"_export_mode_changed");
-
-	vb->add_margin_child(TTR("Export Mode:"),export_mode);
-
-
-
-	tree_vb = memnew( VBoxContainer );
-	vb->add_child(tree_vb);
-	tree_vb->set_v_size_flags(SIZE_EXPAND_FILL);
-
-	tree = memnew( Tree );
-	tree_vb->add_margin_child(TTR("Resources to Export:"),tree,true);
-
-	tree->set_v_size_flags(SIZE_EXPAND_FILL);
-	tree->connect("item_edited",this,"_tree_changed");
-	tree->set_columns(2);
-	tree->set_column_titles_visible(true);
-	tree->set_column_title(0,TTR("File"));
-	tree->set_column_title(1,TTR("Action"));
-	tree->set_column_expand(1,false);
-	tree->set_column_min_width(1,90);
-
-	filters = memnew( LineEdit );
-	vb->add_margin_child(TTR("Filters to export non-resource files (comma-separated, e.g.: *.json, *.txt):"),filters);
-	filters->connect("text_changed",this,"_filters_edited");
-	filters_exclude = memnew( LineEdit );
-	vb->add_margin_child(TTR("Filters to exclude from export (comma-separated, e.g.: *.json, *.txt):"),filters_exclude);
-	filters_exclude->connect("text_changed",this,"_filters_exclude_edited");
-
-	convert_text_scenes = memnew( CheckButton );
-	convert_text_scenes->set_text(TTR("Convert text scenes to binary on export."));
-	vb->add_child(convert_text_scenes);
-	convert_text_scenes->connect("toggled",this,"_export_mode_changed");
-
-	image_vb = memnew( VBoxContainer );
-	image_vb->set_name(TTR("Images"));
-	image_action = memnew( OptionButton );
-	image_action->add_item(TTR("Keep Original"));
-	image_action->add_item(TTR("Compress for Disk (Lossy, WebP)"));
-	image_action->add_item(TTR("Compress for RAM (BC/PVRTC/ETC)"));
-	image_vb->add_margin_child(TTR("Convert Images (*.png):"),image_action);
-	HBoxContainer *qhb = memnew( HBoxContainer );
-	image_quality = memnew( HSlider );
-	qhb->add_child(image_quality);
-	image_quality->set_h_size_flags(SIZE_EXPAND_FILL);
-	SpinBox *qspin = memnew( SpinBox );
-	image_quality->share(qspin);
-	qhb->add_child(qspin);
-	image_quality->set_min(0);
-	image_quality->set_max(1);
-	image_quality->set_step(0.01);
-	image_vb->add_margin_child(TTR("Compress for Disk (Lossy) Quality:"),qhb);
-	image_shrink = memnew( SpinBox );
-	image_shrink->set_min(1);
-	image_shrink->set_max(8);
-	image_shrink->set_step(0.1);
-	image_vb->add_margin_child(TTR("Shrink All Images:"),image_shrink);
-	sections->add_child(image_vb);
-
-	image_formats=memnew(Tree);
-	image_formats->set_hide_root(true);
-	TreeItem *root = image_formats->create_item(NULL);
-	List<String> fmts;
-	ImageLoader::get_recognized_extensions(&fmts);
-	for(List<String>::Element *E=fmts.front();E;E=E->next()) {
-
-		TreeItem *fmt = image_formats->create_item(root);
-		fmt->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
-		fmt->set_text(0,E->get());
-		fmt->set_editable(0,true);
-		formats.push_back(fmt);
-	}
-	image_vb->add_margin_child(TTR("Compress Formats:")+" ",image_formats,true);
-
-	/// groups
-	HBoxContainer *group_hb = memnew( HBoxContainer );
-	group_hb->set_name(TTR("Image Groups"));
-	sections->add_child(group_hb);
-	VBoxContainer *group_vb_left = memnew( VBoxContainer);
-	group_hb->add_child(group_vb_left);
-
-	VBoxContainer *gvb = memnew(VBoxContainer);
-	HBoxContainer *ghb = memnew(HBoxContainer);
-	gvb->add_child(ghb);
-
-	group_new_name = memnew( LineEdit );
-	group_new_name->set_h_size_flags(SIZE_EXPAND_FILL);
-	ghb->add_child(group_new_name);
-
-	group_add = memnew(ToolButton);
-	group_add->connect("pressed",this,"_group_add");
-	ghb->add_child(group_add);
-
-	group_new_name_error = memnew( Label );
-	group_new_name_error->add_color_override("font_color",Color(1,0.4,0.4));
-	gvb->add_child(group_new_name_error);
-	group_new_name_error->hide();
-
-	groups=memnew(Tree);
-	groups->set_v_size_flags(SIZE_EXPAND_FILL);
-	groups->connect("cell_selected",this,"_group_selected",varray(),CONNECT_DEFERRED);
-	groups->connect("button_pressed",this,"_group_del",varray(),CONNECT_DEFERRED);
-	groups->set_hide_root(true);
-	gvb->add_child(groups);
-
-	group_vb_left->add_margin_child(TTR("Groups:"),gvb,true);
-	//group_vb_left->add_child( memnew( HSeparator));
-	group_options = memnew(VBoxContainer);
-	group_vb_left->add_child(group_options);
-
-
-	group_image_action = memnew(OptionButton);
-	group_image_action->add_item(TTR("Default"));
-	group_image_action->add_item(TTR("Compress Disk"));
-	group_image_action->add_item(TTR("Compress RAM"));
-	group_image_action->add_item(TTR("Keep Original"));
-	group_options->add_margin_child(TTR("Compress Mode:"),group_image_action);
-	group_image_action->connect("item_selected",this,"_group_changed");
-
-	group_lossy_quality = memnew( HSlider );
-	group_lossy_quality->set_min(0.1);
-	group_lossy_quality->set_max(1.0);
-	group_lossy_quality->set_step(0.01);
-	group_lossy_quality->set_value(0.7);
-	group_lossy_quality->connect("value_changed",this,"_quality_edited");
-
-	HBoxContainer *gqhb = memnew( HBoxContainer );
-	SpinBox *gqspin = memnew( SpinBox );
-	group_lossy_quality->share(gqspin);
-	group_lossy_quality->set_h_size_flags(SIZE_EXPAND_FILL);
-	gqhb->add_child(group_lossy_quality);
-	gqhb->add_child(gqspin);
-	group_options->add_margin_child(TTR("Lossy Quality:"),gqhb);
-
-	group_atlas = memnew(CheckButton);
-	group_atlas->set_pressed(true);
-	group_options->add_margin_child(TTR("Atlas:"),group_atlas);
-	group_atlas->connect("toggled",this,"_group_changed");
-
-	group_shrink = memnew(SpinBox);
-	group_shrink->set_min(1);
-	group_shrink->set_max(8);
-	group_shrink->set_value(1);
-	group_shrink->set_step(0.001);
-	group_options->add_margin_child(TTR("Shrink By:"),group_shrink);
-	group_shrink->connect("value_changed",this,"_group_changed");
-
-	atlas_preview = memnew( Button );
-	atlas_preview->set_text(TTR("Preview Atlas"));
-	group_options->add_child(atlas_preview);
-	atlas_preview->show();
-	atlas_preview->connect("pressed",this,"_group_atlas_preview");
-	Control *ec = memnew(Control );
-	ec->set_custom_minimum_size(Size2(150,1));
-	gvb->add_child(ec);
-
-	VBoxContainer *group_vb_right = memnew( VBoxContainer );
-	group_hb->add_child(group_vb_right);
-	group_vb_right->set_h_size_flags(SIZE_EXPAND_FILL);
-
-	HBoxContainer *filter_hb = memnew (HBoxContainer);
-
-	group_images_filter = memnew( LineEdit );
-	group_vb_right->add_margin_child(TTR("Image Filter:"),filter_hb);
-	filter_hb->add_child(group_images_filter);
-	group_images_filter->set_h_size_flags(SIZE_EXPAND_FILL);
-	group_images_filter->connect("text_changed",this,"_image_filter_changed");
-	group_images = memnew( Tree );
-	group_images->set_v_size_flags(SIZE_EXPAND_FILL);
-	group_vb_right->add_margin_child(TTR("Images:"),group_images,true);
-
-	Button *filt_select_all = memnew( Button );
-	filt_select_all->set_text(TTR("Select All"));
-	filter_hb->add_child(filt_select_all);
-	filt_select_all->connect("pressed",this,"_group_select_all");
-
-	Button *filt_select_none = memnew( Button );
-	filt_select_none->set_text(TTR("Select None"));
-	filter_hb->add_child(filt_select_none);
-	filt_select_none->connect("pressed",this,"_group_select_none");
-
-	atlas_preview_dialog = memnew( AcceptDialog );
-	ScrollContainer *scroll = memnew( ScrollContainer );
-	atlas_preview_dialog->add_child(scroll);
-	//atlas_preview_dialog->set_child_rect(scroll);
-	atlas_preview_frame = memnew( TextureRect );
-	scroll->add_child(atlas_preview_frame);
-	add_child(atlas_preview_dialog);
-
-
-	group_images->set_hide_root(true);
-	group_images->set_columns(2);
-	group_images->set_column_expand(0,true);
-	group_images->set_column_expand(1,false);
-	group_images->set_column_min_width(1,100);
-	group_images->set_column_titles_visible(true);
-	group_images->set_column_title(0,TTR("Images"));
-	group_images->set_column_title(1,TTR("Group"));
-	group_images->connect("item_edited",this,"_group_item_edited",varray(),CONNECT_DEFERRED);
-
-/*	SpinBox *group_shrink;
-	CheckButton *group_atlas;
-	OptionButton *group_image_action;*/
-
-
-/*	progress = memnew( Label );
-	add_child(progress);
-	progress->set_area_as_parent_rect();
-	progress->set_anchor_and_margin(MARGIN_TOP,Control::ANCHOR_BEGIN,25);
-	progress->hide();
-	progress->set_align(Label::ALIGN_CENTER);*/
-
-/*
-	button_reload = memnew( Button );
-	button_reload->set_pos(Point2(3,2));
-	button_reload->set_size(Point2(20,5));
-	button_reload->set_flat(true);
-	//add_child(button_reload);
-	button_reload->connect("pressed",this,"_rescan");
-	hbc->add_child(button_reload);
-*/
-
-
-	sample_vbox = memnew( VBoxContainer );
-	sample_vbox->set_name(TTR("Samples"));
-	sections->add_child(sample_vbox);
-	sample_mode = memnew( OptionButton );
-	sample_vbox->add_margin_child(TTR("Sample Conversion Mode: (.wav files):"),sample_mode);
-	sample_mode->add_item(TTR("Keep"));
-	sample_mode->add_item(TTR("Compress (RAM - IMA-ADPCM)"));
-	sample_max_hz = memnew( SpinBox );
-	sample_max_hz->set_max(192000);
-	sample_max_hz->set_min(8000);
-	sample_vbox->add_margin_child(TTR("Sampling Rate Limit (Hz):"),sample_max_hz);
-	sample_trim = memnew( CheckButton );
-	sample_trim->set_text(TTR("Trim"));
-	sample_vbox->add_margin_child(TTR("Trailing Silence:"),sample_trim);
-
-	script_vbox = memnew( VBoxContainer );
-	script_vbox->set_name(TTR("Script"));
-	sections->add_child(script_vbox);
-	script_mode = memnew( OptionButton );
-	script_vbox->add_margin_child(TTR("Script Export Mode:"),script_mode);
-	script_mode->add_item(TTR("Text"));
-	script_mode->add_item(TTR("Compiled"));
-	script_mode->add_item(TTR("Encrypted (Provide Key Below)"));
-	script_key = memnew( LineEdit );
-	script_vbox->add_margin_child(TTR("Script Encryption Key (256-bits as hex):"),script_key);
-
-
-
-	updating=false;
-
-	error = memnew( AcceptDialog );
-	add_child(error);
-
-	confirm = memnew( ConfirmationDialog );
-	add_child(confirm);
-	confirm->connect("confirmed",this,"_confirmed");
-
-	get_ok()->set_text(TTR("Export PCK/Zip"));
-
-
-	expopt="--,Export,Bundle";
-
-	file_export = memnew( EditorFileDialog );
-	add_child(file_export);
-	file_export->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
-	file_export->set_current_dir( EditorSettings::get_singleton()->get("filesystem/directories/default_project_export_path") );
-
-	file_export->set_title(TTR("Export Project"));
-	file_export->connect("file_selected", this,"_export_action");
-
-	file_export_password = memnew( LineEdit );
-	file_export_password->set_secret(true);
-	file_export_password->set_editable(false);
-	file_export->get_vbox()->add_margin_child(TTR("Password:"),file_export_password);
-
-	pck_export = memnew( EditorFileDialog );
-	pck_export->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
-	pck_export->set_current_dir( EditorSettings::get_singleton()->get("filesystem/directories/default_project_export_path") );
-	pck_export->set_title(TTR("Export Project PCK"));
-	pck_export->connect("file_selected", this,"_export_action_pck");
-	pck_export->add_filter("*.pck ; Data Pack");
-	pck_export->add_filter("*.zip ; Zip");
-	add_child(pck_export);
-
-	button_export = add_button(TTR("Export.."),!OS::get_singleton()->get_swap_ok_cancel(),"export_pck");
-	updating_script=false;
-
-	ei="EditorIcons";
-	ot="Object";
-	pending_update_tree=true;
-
-	_create_android_keystore_window();
+	editor_icons = "EditorIcons";
 }
 
-
 ProjectExportDialog::~ProjectExportDialog() {
 
 
 }
-
-void ProjectExport::popup_export() {
-
-	Set<String> presets;
-	presets.insert("default");
-
-	List<PropertyInfo> pi;
-	GlobalConfig::get_singleton()->get_property_list(&pi);
-	export_preset->clear();
-
-	for (List<PropertyInfo>::Element *E=pi.front();E;E=E->next()) {
-
-		if (!E->get().name.begins_with("export_presets/"))
-			continue;
-		presets.insert(E->get().name.get_slice("/",1));
-	}
-
-	for(Set<String>::Element *E=presets.front();E;E=E->next()) {
-
-		export_preset->add_item(E->get());
-	}
-
-
-
-	popup_centered(Size2(300,100));
-
-
-
-}
-Error ProjectExport::export_project(const String& p_preset) {
-
-	return OK;
-
-#if 0
-
-	String selected=p_preset;
-
-	PoolVector<String> preset_settings = GlobalConfig::get_singleton()->get("export_presets/"+selected);
-	String preset_path=GlobalConfig::get_singleton()->get("export_presets_path/"+selected);
-	if (preset_path=="") {
-
-		error->set_text("Export path empty, see export options");
-		error->popup_centered_minsize(Size2(300,100));
-		ERR_FAIL_V(ERR_INVALID_DATA);
-	}
-
-	int pc=preset_settings.size();
-
-	DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
-	if (d->change_dir(preset_path)!=OK) {
-
-		memdelete(d);
-		error->set_text("Can't access to export path:\n "+preset_path);
-		error->popup_centered_minsize(Size2(300,100));
-		ERR_FAIL_V(ERR_INVALID_DATA);
-	}
-
-	if (pc==0) {
-		memdelete(d);
-		return OK;
-	}
-	if (pc%3 != 0 ) {
-		memdelete(d);
-		error->set_text("Corrupted export data..");
-		error->popup_centered_minsize(Size2(300,100));
-		ERR_EXPLAIN("Corrupted export data...");
-		ERR_FAIL_V(ERR_INVALID_DATA);
-	}
-
-	Map<String,ProjectExportSettings::ItemData> export_action;
-
-
-	Map<String,Map<String,String> > remapped_paths;
-
-	Set<String> scene_extensions;
-	Set<String> resource_extensions;
-
-	{
-
-		List<String> l;
-		/*
-		SceneLoader::get_recognized_extensions(&l);
-		for(List<String>::Element *E=l.front();E;E=E->next()) {
-
-			scene_extensions.insert(E->get());
-		}
-		*/
-		ResourceLoader::get_recognized_extensions_for_type("",&l);
-		for(List<String>::Element *E=l.front();E;E=E->next()) {
-
-			resource_extensions.insert(E->get());
-		}
-	}
-
-	Vector<String> names = GlobalConfig::get_singleton()->get_optimizer_presets();
-
-	//prepare base paths
-
-	for(int i=0;i<pc;i+=3) {
-
-
-		String name = preset_settings[i+0];
-		String pname=preset_settings[i+1];
-		String deps=preset_settings[i+2];
-		int idx=1;
-		if (pname=="") {
-			pname="copy";
-		} else {
-
-			for(int j=0;j<names.size();j++) {
-				if (pname==names[j]) {
-					idx=j+2;
-					break;
-				}
-			}
-		}
-
-		int dep_idx=0;
-
-		for(int j=0;j<ProjectExportSettings::DA_MAX;j++) {
-			if (ProjectExportSettings::da_string[j]==deps) {
-				dep_idx=j;
-				break;
-			}
-		}
-
-		if (idx>=0) {
-			export_action[name].action=idx;
-			export_action[name].depaction=dep_idx;
-		}
-
-	}
-
-
-	Set<String> bundle_exceptions;
-	for (Map<String,ProjectExportSettings::ItemData>::Element *E=export_action.front();E;E=E->next()) {
-		bundle_exceptions.insert(E->key());
-	}
-
-
-	{
-
-		// find dependencies and add them to export
-
-		Map<String,ProjectExportSettings::ItemData> dependencies;
-
-		for (Map<String,ProjectExportSettings::ItemData>::Element *E=export_action.front();E;E=E->next()) {
-
-			ProjectExportSettings::ItemData &id=E->get();
-
-			if (id.depaction!=ProjectExportSettings::DA_COPY && id.depaction!=ProjectExportSettings::DA_OPTIMIZE)
-				continue; //no copy or optimize, go on
-			List<String> deplist;
-			ResourceLoader::get_dependencies(E->key(),&deplist);
-
-			while (deplist.size()) {
-
-				String dependency = deplist.front()->get();
-				deplist.pop_front();
-				if (export_action.has(dependency))
-					continue; //taged to export, will not override
-				if (dependencies.has(dependency)) {
-
-					if (id.action <= dependencies[dependency].action )
-						continue;
-				}
-
-				ProjectExportSettings::ItemData depid;
-				if (id.depaction==ProjectExportSettings::DA_COPY || id.action==ProjectExportSettings::DA_COPY)
-					depid.action=ProjectExportSettings::DA_COPY;
-				else if (id.depaction==ProjectExportSettings::DA_OPTIMIZE)
-					depid.action=id.action;
-				depid.depaction=0;
-
-				dependencies[dependency]=depid;
-
-				ResourceLoader::get_dependencies(dependency,&deplist);
-			}
-
-
-		}
-
-		for (Map<String,ProjectExportSettings::ItemData>::Element *E=dependencies.front();E;E=E->next()) {
-			export_action[E->key()]=E->get();
-		}
-	}
-
-
-
-	int idx=0;
-	for (Map<String,ProjectExportSettings::ItemData>::Element *E=export_action.front();E;E=E->next(),idx++) {
-
-
-		String path=E->key();
-		if (E->get().action==0)
-			continue; //nothing to do here
-		String preset;
-		if (E->get().action==1)
-			preset="";
-		else
-			preset=names[E->get().action-2];
-
-		print_line("Exporting "+itos(idx)+"/"+itos(export_action.size())+": "+path);
-
-		String base_dir = GlobalConfig::get_singleton()->localize_path(path.get_base_dir()).replace("\\","/").replace("res://","");
-		DirAccess *da=DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
-		String cwd = d->get_current_dir();
-		da->change_dir(cwd);
-		print_line("base dir: "+base_dir);
-		String remap_platform="all";
-
-		for(int j=0;j<base_dir.get_slice_count("/");j++) {
-
-			String p = base_dir.get_slice("/",j);
-			if (da->change_dir(p)!=OK) {
-
-				Error err = da->make_dir(p);
-				if (err!=OK) {
-					memdelete(da);
-					memdelete(d);
-					ERR_EXPLAIN("Cannot make dir: "+cwd+"/"+p);
-					ERR_FAIL_V(ERR_CANT_CREATE);
-				}
-
-				if (da->change_dir(p)!=OK) {
-
-					memdelete(da);
-					memdelete(d);
-					ERR_EXPLAIN("Cannot change to dir: "+cwd+"/"+p);
-					ERR_FAIL_V(ERR_CANT_CREATE);
-				}
-
-			}
-
-			cwd=da->get_current_dir();
-		}
-
-		memdelete(da);
-		//cwd is the target dir
-
-		String source_file;
-
-		print_line("Exporting: "+source_file);
-		bool delete_source=false;
-		if (preset=="") {
-			//just copy!
-
-			source_file=path;
-			delete_source=false;
-		} else {
-
-			delete_source=true;
-			//create an optimized source file
-
-			if (!GlobalConfig::get_singleton()->has("optimizer_presets/"+preset)) {
-				memdelete(d);
-				ERR_EXPLAIN("Unknown optimizer preset: "+preset);
-				ERR_FAIL_V(ERR_INVALID_DATA);
-			}
-
-
-			Dictionary dc = GlobalConfig::get_singleton()->get("optimizer_presets/"+preset);
-
-			ERR_FAIL_COND_V(!dc.has("__type__"),ERR_INVALID_DATA);
-			String type=dc["__type__"];
-
-			Ref<EditorOptimizedSaver> saver;
-
-			for(int i=0;i<editor_data->get_optimized_saver_count();i++) {
-
-				if (editor_data->get_optimized_saver(i)->get_target_name()==type) {
-					saver=editor_data->get_optimized_saver(i);
-				}
-			}
-
-			if (saver.is_null()) {
-				memdelete(d);
-				ERR_EXPLAIN("Preset '"+preset+"' references nonexistent saver: "+type);
-				ERR_FAIL_COND_V(saver.is_null(),ERR_INVALID_DATA);
-			}
-
-			List<Variant> keys;
-			dc.get_key_list(&keys);
-
-			saver->clear();
-
-			for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
-
-				saver->set(E->get(),dc[E->get()]);
-			}
-
-
-			remap_platform=saver->get_target_platform();
-			if (remap_platform=="")
-				remap_platform="all";
-
-
-			if (resource_extensions.has(path.extension().to_lower())) {
-
-				uint32_t flags=0;
-
-				/*
-				if (saver->is_bundle_scenes_enabled())
-					flags|=Reso::FLAG_BUNDLE_INSTANCED_SCENES;
-				*/
-				saver->set_bundle_exceptions(NULL);
-				if (E->get().depaction>=ProjectExportSettings::DA_BUNDLE) {
-					flags|=ResourceSaver::FLAG_BUNDLE_RESOURCES;
-					if (E->get().depaction==ProjectExportSettings::DA_BUNDLE)
-						saver->set_bundle_exceptions(&bundle_exceptions);
-
-				}
-
-				if (saver->is_remove_editor_data_enabled())
-					flags|=ResourceSaver::FLAG_OMIT_EDITOR_PROPERTIES;
-				if (saver->is_big_endian_data_enabled())
-					flags|=ResourceSaver::FLAG_SAVE_BIG_ENDIAN;
-
-				RES res = ResourceLoader::load(path);
-
-				if (res.is_null()) {
-
-					memdelete(d);
-					ERR_EXPLAIN("Error loading resource to optimize: "+path);
-					ERR_FAIL_V(ERR_INVALID_DATA);
-				}
-
-				if (saver->is_compress_translations_enabled() && res->get_type()=="Translation") {
-
-					Ref<PHashTranslation> ct = Ref<PHashTranslation>( memnew( PHashTranslation ) );
-					ct->generate(res);
-					res=ct;
-				}
-
-
-				//dst_file=path.get_file();
-				//dst_file = cwd+"/"+dst_file.substr(0,dst_file.length()-dst_file.extension().length())+"opt.scn";
-
-				//String write_file = path.substr(0,path.length()-path.extension().length())+"optimized.res";
-				String write_file = path+".opt.res";
-
-
-				print_line("DST RES FILE: "+write_file);
-				Error err = ResourceSaver::save(write_file,res,flags,saver);
-				if (err) {
-					memdelete(d);
-					ERR_EXPLAIN("Error saving optimized resource: "+write_file);
-					ERR_FAIL_COND_V(err,ERR_CANT_OPEN);
-				}
-				source_file=write_file;
-				//project_settings->add_remapped_path(src_scene,path,platform);
-
-			}
-
-
-		}
-
-		String dst_file;
-		dst_file=cwd+"/"+source_file.get_file();
-		print_line("copying from: "+source_file);
-		print_line("copying to: "+dst_file);
-		Error err = d->copy(source_file,dst_file);
-
-		if (delete_source)
-			d->remove(source_file);
-
-		if (err) {
-
-
-			ERR_EXPLAIN("Error copying from: "+source_file+" to "+dst_file+".");
-			ERR_FAIL_COND_V(err,err);
-		}
-
-		String src_remap=path;
-		String dst_remap=source_file;
-		print_line("remap from: "+src_remap);
-		print_line("remap to: "+dst_remap);
-		if (src_remap!=dst_remap) {
-
-
-			remapped_paths[remap_platform][src_remap]=dst_remap;
-		}
-
-		//do the copy man...
-
-	}
-
-	Map<String,Variant> added_settings;
-
-
-	for (Map<String,Map<String,String> >::Element *E=remapped_paths.front();E;E=E->next()) {
-
-		String platform=E->key();
-		PoolVector<String> remaps;
-		for(Map<String,String>::Element *F=E->get().front();F;F=F->next() ) {
-
-			remaps.push_back(F->key());
-			remaps.push_back(F->get());
-		}
-
-
-
-		//added_settings["remap/"+platform]=remaps;`
-		added_settings["remap/"+platform]=Variant(remaps).operator Array();
-	}
-
-	String engine_cfg_path=d->get_current_dir()+"/godot.cfg";
-	print_line("enginecfg: "+engine_cfg_path);
-	GlobalConfig::get_singleton()->save_custom(engine_cfg_path,added_settings);
-
-	memdelete(d);
-	return OK;
-#endif
-}
-
-ProjectExport::ProjectExport(EditorData* p_data) {
-
-	editor_data=p_data;
-	VBoxContainer *vbc = memnew( VBoxContainer );
-	add_child(vbc);
-	//set_child_rect(vbc);
-	set_title(TTR("Project Export"));
-	label = memnew( Label );
-	label->set_text(TTR("Export Preset:"));
-	vbc->add_child(label);
-	export_preset = memnew (OptionButton);
-	vbc->add_child(export_preset);
-	get_ok()->set_text(TTR("Export"));
-	set_hide_on_ok(false);
-	error = memnew( AcceptDialog );
-	add_child(error);
-
-
-}
-#endif

+ 44 - 154
tools/editor/project_export.h

@@ -35,6 +35,7 @@
 #include "scene/gui/label.h"
 #include "tools/editor/editor_file_dialog.h"
 #include "scene/gui/button.h"
+#include "scene/gui/file_dialog.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/tab_container.h"
 #include "os/dir_access.h"
@@ -44,167 +45,77 @@
 #include "scene/gui/slider.h"
 #include "tools/editor/editor_file_system.h"
 #include "property_editor.h"
-#include "editor_import_export.h"
+#include "editor_export.h"
+
 
-#if 0
 class EditorNode;
 
 class ProjectExportDialog : public ConfirmationDialog {
 	GDCLASS( ProjectExportDialog, ConfirmationDialog );
 
-public:
-	enum ExportAction {
-		ACTION_NONE,
-		ACTION_COPY,
-		ACTION_BUNDLE,
-		ACTION_MAX
-
-	};
-
-	static const char *da_string[ACTION_MAX];
-
 private:
 
 
-	EditorNode *editor;
-	String expopt;
-
 	TabContainer *sections;
-	bool updating_tree;
-	bool pending_update_tree;
-	AcceptDialog *error;
-	ConfirmationDialog *confirm;
-	ConfirmationDialog *confirm_keystore;
 
-	Button *button_reload;
-	LineEdit *filters, *filters_exclude;
-	HBoxContainer *plat_errors;
-	Label *platform_error_string;
+	MenuButton *add_preset;
+	Button *delete_preset;
+	ItemList *presets;
 
-	StringName ei;
-	StringName ot;
+	LineEdit *name;
+	PropertyEditor *parameters;
+	CheckButton *runnable;
 
-	Tree * tree;
 
 	EditorFileDialog *pck_export;
 	EditorFileDialog *file_export;
-	LineEdit *file_export_password;
 
 	Button *button_export;
-	String _delete_attempt;
-
 	bool updating;
 
-	void _tree_changed();
-	void _update_tree();
-
-	bool _create_tree(TreeItem *p_parent,EditorFileSystemDirectory *p_dir);
-	void _rescan();
-	//void _confirmed();
-	void _scan_finished();
-
-	void _validate_platform();
-	///////////////////
-
-	Tree * platforms;
-	PropertyEditor *platform_options;
-
-	OptionButton *export_mode;
-	CheckButton *convert_text_scenes;
-	VBoxContainer *tree_vb;
-
-	VBoxContainer *image_vb;
-	OptionButton *image_action;
-	HSlider *image_quality;
-	SpinBox *image_shrink;
-	Tree *image_formats;
-	Vector<TreeItem*> formats;
-
-	LineEdit *group_new_name;
-	HSlider *group_lossy_quality;
-	Label *group_new_name_error;
-	VBoxContainer *group_options;
-	Tree *groups;
-	SpinBox *group_shrink;
-	CheckButton *group_atlas;
-	OptionButton *group_image_action;
-	Button *group_add;
-	Tree *group_images;
-	LineEdit *group_images_filter;
-	Button *atlas_preview;
-
-
-	AcceptDialog *atlas_preview_dialog;
-	TextureRect *atlas_preview_frame;
-
-
-	VBoxContainer *script_vbox;
-	OptionButton *script_mode;
-	LineEdit *script_key;
-
-	VBoxContainer *sample_vbox;
-	OptionButton *sample_mode;
-	SpinBox *sample_max_hz;
-	CheckButton *sample_trim;
+	ConfirmationDialog *delete_confirm;
 
-	ConfirmationDialog* keystore_create_dialog;
-	EditorFileDialog* keystore_file_dialog;
+	OptionButton *export_filter;
+	LineEdit *include_filters;
+	LineEdit *exclude_filters;
+	Tree *include_files;
 
+	Label* include_label;
+	MarginContainer *include_margin;
 
-	void _export_mode_changed(int p_idx);
-	void _prop_edited(String what);
+	StringName editor_icons;
 
-	void _update_platform();
-	void _update_exporter();
-	void _platform_selected();
+	Tree *patches;
+	Button *patch_export;
+	int patch_index;
+	FileDialog *patch_dialog;
+	ConfirmationDialog *patch_erase;
 
-	void _filters_edited(String what);
-	void _filters_exclude_edited(String what);
-	void _update_group_tree();
+	void _patch_selected(const String& p_path);
+	void _patch_deleted();
 
-	void _image_filter_changed(String);
-	bool _update_group_treef(TreeItem *p_parent,EditorFileSystemDirectory *p_dir,const Set<String>& p_extensions,const String& p_groups,const Map<StringName,int>& p_group_index);
-	void _group_item_edited();
-	void _group_atlas_preview();
+	void _runnable_pressed();
+	void _name_changed(const String& p_string);
+	void _add_preset(int p_platform);
+	void _edit_preset(int p_index);
+	void _delete_preset();
+	void _delete_preset_confirm();
 
+	void _update_presets();
 
+	void _export_type_changed(int p_which);
+	void _filter_changed(const String& p_filter);
+	void _fill_resource_tree();
+	bool _fill_tree(EditorFileSystemDirectory *p_dir,TreeItem *p_item,Ref<EditorExportPreset> &current,bool p_only_scenes);
+	void _tree_changed();
 
-	void _quality_edited(float what);
-	void _image_export_edited(int what);
-	void _shrink_edited(float what);
-
-	void _sample_convert_edited(int what);
-
-	void _update_group_list();
-	void _select_group(const String& p_by_name);
-
-
-	String _get_selected_group();
-	void _update_group();
-	void _group_changed(Variant v);
-	void _group_selected();
-	void _group_add();
-	void _group_select_all();
-	void _group_select_none();
-	void _group_del(Object *item,int p_column, int p_button);
+	void _patch_button_pressed(Object* p_item,int p_column,int p_id);
+	void _patch_edited();
 
-	bool updating_script;
-	void _update_script();
-	void _script_edited(Variant v);
-	void _export_action(const String& p_file);
-	void _export_action_pck(const String& p_file);
-	void ok_pressed();
-	void custom_action(const String&);
-	LineEdit* _create_keystore_input(Control* container, const String& p_label, const String& name);
-	void _create_android_keystore_window();
-	void _create_android_keystore();
-	bool _check_android_setting(const Ref<EditorExportPlatform>& exporter);
-	void _check_keystore_path(const String& path);
-	void _keystore_dir_selected(const String& path);
-	void _keystore_created();
 
-	void _save_export_cfg();
-	void _format_toggled();
+	Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
+	bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
+	void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
 
 
 protected:
@@ -212,35 +123,14 @@ protected:
 	static void _bind_methods();
 public:
 
-	String get_selected_path() const;
-
-	Error export_platform(const String& p_platform, const String& p_path, bool p_debug,const String& p_password,bool p_quit_after=false);
-
 	void popup_export();
-	ProjectExportDialog(EditorNode *p_editor);
+
+	ProjectExportDialog();
 	~ProjectExportDialog();
 };
 
-class EditorData;
-
-class ProjectExport : public ConfirmationDialog {
-	GDCLASS( ProjectExport, ConfirmationDialog );
 
-	EditorData *editor_data;
-
-	AcceptDialog *error;
-	Label *label;
-	OptionButton *export_preset;
-public:
-
-	Error export_project(const String& p_preset);
-	void popup_export();
-
-
-	ProjectExport(EditorData* p_data);
-
-};
 
 
 #endif // PROJECT_EXPORT_SETTINGS_H
-#endif
+

+ 1 - 1
tools/editor/property_editor.cpp

@@ -38,7 +38,7 @@
 #include "pair.h"
 #include "scene/scene_string_names.h"
 #include "editor_settings.h"
-#include "editor_import_export.h"
+#include "editor_export.h"
 #include "editor_node.h"
 #include "multi_node_edit.h"
 #include "array_property_edit.h"