瀏覽代碼

-fixed bug in Button now exporting font property
-made GUI Theme editor usable
-editor does not allow to export or create .pck in the same path as a project
-changed .pck format (lacked support for versioning so couldn't change it), previous was causing crashes and is now incompatible, just re-export.
-will not look for .pck files recursively, was causing unexpected behaviors
-fixed execution of Godot in paths with non unicode characters in Windows, OSX and Linux.

Juan Linietsky 11 年之前
父節點
當前提交
9afdb3e0ad
共有 30 個文件被更改,包括 1739 次插入576 次删除
  1. 4 1
      core/globals.cpp
  2. 8 3
      core/io/file_access_pack.cpp
  3. 2 1
      core/math/math_funcs.cpp
  4. 472 149
      doc/base/classes.xml
  5. 2 1
      drivers/unix/os_unix.cpp
  6. 15 2
      platform/windows/os_windows.cpp
  7. 1 0
      platform/windows/os_windows.h
  8. 2 0
      scene/gui/control.cpp
  9. 1 1
      scene/resources/default_theme/default_theme.cpp
  10. 47 4
      scene/resources/theme.cpp
  11. 5 2
      scene/resources/theme.h
  12. 234 357
      tools/editor/doc_data_compressed.h
  13. 3 2
      tools/editor/editor_import_export.cpp
  14. 1 1
      tools/editor/editor_node.cpp
  15. 178 41
      tools/editor/plugins/theme_editor_plugin.cpp
  16. 6 11
      tools/editor/plugins/theme_editor_plugin.h
  17. 18 0
      tools/editor/project_export.cpp
  18. 0 0
      tools/ios_xcode_template/data.pck
  19. 469 0
      tools/ios_xcode_template/godot_ios.xcodeproj/project.pbxproj
  20. 7 0
      tools/ios_xcode_template/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  21. 二進制
      tools/ios_xcode_template/godot_ios.xcodeproj/project.xcworkspace/xcuserdata/punto.xcuserdatad/UserInterfaceState.xcuserstate
  22. 96 0
      tools/ios_xcode_template/godot_ios.xcodeproj/xcuserdata/punto.xcuserdatad/xcschemes/godot_ios.xcscheme
  23. 27 0
      tools/ios_xcode_template/godot_ios.xcodeproj/xcuserdata/punto.xcuserdatad/xcschemes/xcschememanagement.plist
  24. 2 0
      tools/ios_xcode_template/godot_ios/en.lproj/InfoPlist.strings
  25. 47 0
      tools/ios_xcode_template/godot_ios/godot_ios-Info.plist
  26. 16 0
      tools/ios_xcode_template/godot_ios/godot_ios-Prefix.pch
  27. 18 0
      tools/ios_xcode_template/godot_ios/main.m
  28. 2 0
      tools/ios_xcode_template/godot_iosTests/en.lproj/InfoPlist.strings
  29. 22 0
      tools/ios_xcode_template/godot_iosTests/godot_iosTests-Info.plist
  30. 34 0
      tools/ios_xcode_template/godot_iosTests/godot_iosTests.m

+ 4 - 1
core/globals.cpp

@@ -319,11 +319,13 @@ Error Globals::setup(const String& p_path) {
 		String candidate = d->get_current_dir();
 		String current_dir = d->get_current_dir();
 		bool found = false;
+		bool first_time=true;
 
 		while(true) {
 			//try to load settings in ascending through dirs shape!
 
-			if (_load_resource_pack(current_dir+"/data.pck") || _load_resource_pack(current_dir+"/data.pcz")) {
+			//tries to open pack, but only first time
+			if (first_time && _load_resource_pack(current_dir+"/data.pck")) {
 				if (_load_settings("res://engine.cfg")==OK || _load_settings_binary("res://engine.cfb")==OK) {
 
 					_load_settings("res://override.cfg");
@@ -344,6 +346,7 @@ Error Globals::setup(const String& p_path) {
 			if (d->get_current_dir()==current_dir)
 				break; //not doing anything useful
 			current_dir=d->get_current_dir();
+			first_time=false;
 		}
 
 

+ 8 - 3
core/io/file_access_pack.cpp

@@ -31,6 +31,8 @@
 
 #include <stdio.h>
 
+#define PACK_VERSION 0
+
 Error PackedData::add_pack(const String& p_path) {
 
 	for (int i=0; i<sources.size(); i++) {
@@ -113,12 +115,12 @@ bool PackedSourcePCK::try_open_pack(const String& p_path) {
 
 	uint32_t magic= f->get_32();
 
-	if (magic != 0x4b435047) {
+	if (magic != 0x43504447) {
 		//maybe at he end.... self contained exe
 		f->seek_end();
 		f->seek( f->get_pos() -4 );
 		magic = f->get_32();
-		if (magic != 0x4b435047) {
+		if (magic != 0x43504447) {
 
 			memdelete(f);
 			return false;
@@ -130,7 +132,7 @@ bool PackedSourcePCK::try_open_pack(const String& p_path) {
 		f->seek( f->get_pos() -ds-8 );
 
 		magic = f->get_32();
-		if (magic != 0x4b435047) {
+		if (magic != 0x43504447) {
 
 			memdelete(f);
 			return false;
@@ -138,10 +140,13 @@ bool PackedSourcePCK::try_open_pack(const String& p_path) {
 
 	}
 
+	uint32_t version = f->get_32();
 	uint32_t ver_major = f->get_32();
 	uint32_t ver_minor = f->get_32();
 	uint32_t ver_rev = f->get_32();
 
+	ERR_EXPLAIN("Pack version newer than supported by engine: "+itos(version));
+	ERR_FAIL_COND_V( version > PACK_VERSION, ERR_INVALID_DATA);
 	ERR_EXPLAIN("Pack created with a newer version of the engine: "+itos(ver_major)+"."+itos(ver_minor)+"."+itos(ver_rev));
 	ERR_FAIL_COND_V( ver_major > VERSION_MAJOR || (ver_major == VERSION_MAJOR && ver_minor > VERSION_MINOR), ERR_INVALID_DATA);
 

+ 2 - 1
core/math/math_funcs.cpp

@@ -75,7 +75,8 @@ void Math::seed(uint32_t x) {
 
 void Math::randomize() {
 
-	seed(OS::get_singleton()->get_ticks_usec()); /* *OS::get_singleton()->get_time().sec); // windows doesn't have get_time(), returns always 0 */
+	OS::Time time = OS::get_singleton()->get_time();
+	seed(OS::get_singleton()->get_ticks_usec()*time.hour*time.min*time.sec*rand()); /* *OS::get_singleton()->get_time().sec); // windows doesn't have get_time(), returns always 0 */
 }
 
 uint32_t Math::rand() {

文件差異過大導致無法顯示
+ 472 - 149
doc/base/classes.xml


+ 2 - 1
drivers/unix/os_unix.cpp

@@ -394,7 +394,8 @@ String OS_Unix::get_executable_path() const {
 	memset(buf,0,256);
 	readlink("/proc/self/exe", buf, sizeof(buf));
 	//print_line("Exec path is:"+String(buf));
-	String b = buf;
+	String b;
+	b.parse_utf8(buf);
 	if (b=="") {
 		WARN_PRINT("Couldn't get executable path from /proc/self/exe, using argv[0]");
 		return OS::get_executable_path();

+ 15 - 2
platform/windows/os_windows.cpp

@@ -1475,10 +1475,14 @@ Error OS_Windows::execute(const String& p_path, const List<String>& p_arguments,
 	ZeroMemory( &pi.si, sizeof(pi.si) );
 	pi.si.cb = sizeof(pi.si);
 	ZeroMemory( &pi.pi, sizeof(pi.pi) );
+	LPSTARTUPINFOW si_w = (LPSTARTUPINFOW) &pi.si;
 
 	print_line("running cmdline: "+cmdline);
-
-	int ret = CreateProcess(NULL, (LPSTR)cmdline.utf8().get_data(), NULL, NULL, 0, NORMAL_PRIORITY_CLASS, NULL, NULL, &pi.si, &pi.pi);
+	Vector<CharType> modstr; //windows wants to change this no idea why
+	modstr.resize(cmdline.size());
+	for(int i=0;i<cmdline.size();i++)
+		modstr[i]=cmdline[i];
+	int ret = CreateProcessW(NULL, modstr.ptr(), NULL, NULL, 0, NORMAL_PRIORITY_CLASS, NULL, NULL, si_w, &pi.pi);
 	ERR_FAIL_COND_V(ret == 0, ERR_CANT_FORK);
 
 	if (p_blocking) {
@@ -1523,6 +1527,15 @@ Error OS_Windows::set_cwd(const String& p_cwd) {
 	return OK;
 }
 
+String OS_Windows::get_executable_path() const {
+
+	wchar_t bufname[4096];
+	GetModuleFileNameW(NULL,bufname,4096);
+	String s= bufname;
+	print_line("EXEC PATHPó: "+s);
+	return s;
+}
+
 void OS_Windows::set_icon(const Image& p_icon) {
 
 

+ 1 - 0
platform/windows/os_windows.h

@@ -235,6 +235,7 @@ public:
 	void set_cursor_shape(CursorShape p_shape);
 	void set_icon(const Image& p_icon);
 
+	virtual String get_executable_path() const;
 
 	virtual String get_locale() const;
 

+ 2 - 0
scene/gui/control.cpp

@@ -1407,6 +1407,8 @@ Ref<Font> Control::get_font(const StringName& p_name,const StringName& p_type) c
 
 		if (theme_owner->data.theme->has_font(p_name, type ) )
 			return data.theme_owner->data.theme->get_font(p_name, type );
+		if (theme_owner->data.theme->get_default_theme_font().is_valid())
+			return theme_owner->data.theme->get_default_theme_font();
 		Control *parent = theme_owner->get_parent()?theme_owner->get_parent()->cast_to<Control>():NULL;
 
 		if (parent)

+ 1 - 1
scene/resources/default_theme/default_theme.cpp

@@ -196,7 +196,7 @@ void make_default_theme() {
 		focus->set_expand_margin_size(Margin(i),2);
 	}
 	t->set_stylebox("focus","Button", focus );
-	t->set_font("font","Button", focus );
+	t->set_font("font","Button", default_font );
 	t->set_color("font_color","Button", control_font_color );
 	t->set_color("font_color_pressed","Button", control_font_color_pressed );
 	t->set_color("font_color_hover","Button", control_font_color_hover );

+ 47 - 4
scene/resources/theme.cpp

@@ -130,6 +130,7 @@ void Theme::_get_property_list( List<PropertyInfo> *p_list) const {
 	}
 	
 	key=NULL;
+
 	
 	while((key=font_map.next(key))) {
 	
@@ -172,6 +173,17 @@ Ref<Theme> Theme::get_default() {
 	return default_theme;	
 }
 
+
+void Theme::set_default_theme_font( const Ref<Font>& p_default_font ) {
+
+	default_theme_font=p_default_font;
+}
+
+Ref<Font> Theme::get_default_theme_font() const {
+
+	return default_theme_font;
+}
+
 void Theme::set_default(const Ref<Theme>& p_default) {
 	
 	default_theme=p_default;
@@ -203,8 +215,10 @@ void Theme::set_icon(const StringName& p_name,const StringName& p_type,const Ref
 
 	icon_map[p_type][p_name]=p_icon;	
 
-	if (new_value)
+	if (new_value) {
 		_change_notify();
+		emit_changed();;
+	}
 }
 Ref<Texture> Theme::get_icon(const StringName& p_name,const StringName& p_type) const {
 	
@@ -229,6 +243,8 @@ void Theme::clear_icon(const StringName& p_name,const StringName& p_type) {
 
 	icon_map[p_type].erase(p_name);
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_icon_list(StringName p_type, List<StringName> *p_list) const {
@@ -256,6 +272,8 @@ void Theme::set_stylebox(const StringName& p_name,const StringName& p_type,const
 
 	if (new_value)
 		_change_notify();
+	emit_changed();;
+
 }
 
 
@@ -281,6 +299,8 @@ void Theme::clear_stylebox(const StringName& p_name,const StringName& p_type) {
 
 	style_map[p_type].erase(p_name);
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_stylebox_list(StringName p_type, List<StringName> *p_list) const {
@@ -304,13 +324,18 @@ void Theme::set_font(const StringName& p_name,const StringName& p_type,const Ref
 	bool new_value=!font_map.has(p_type) || !font_map[p_type].has(p_name);
 	font_map[p_type][p_name]=p_font;
 
-	if (new_value)
+	if (new_value) {
 		_change_notify();
+		emit_changed();;
+
+	}
 }
 Ref<Font> Theme::get_font(const StringName& p_name,const StringName& p_type) const {
 	
 	if (font_map.has(p_type) && font_map[p_type].has(p_name) && font_map[p_type][p_name].is_valid())
 		return font_map[p_type][p_name];	
+	else if (default_theme_font.is_valid())
+		return default_theme_font;
 	else
 		return default_font;
 	
@@ -328,6 +353,8 @@ void Theme::clear_font(const StringName& p_name,const StringName& p_type) {
 
 	font_map[p_type].erase(p_name);
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_font_list(StringName p_type, List<StringName> *p_list) const {
@@ -350,8 +377,11 @@ void Theme::set_color(const StringName& p_name,const StringName& p_type,const Co
 
 	color_map[p_type][p_name]=p_color;
 
-	if (new_value)
+	if (new_value) {
 		_change_notify();
+		emit_changed();;
+
+	}
 }
 
 
@@ -377,6 +407,8 @@ void Theme::clear_color(const StringName& p_name,const StringName& p_type) {
 
 	color_map[p_type].erase(p_name);
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_color_list(StringName p_type, List<StringName> *p_list) const {
@@ -398,8 +430,10 @@ void Theme::set_constant(const StringName& p_name,const StringName& p_type,int p
 	bool new_value=!constant_map.has(p_type) || !constant_map[p_type].has(p_name);
 	constant_map[p_type][p_name]=p_constant;
 
-	if (new_value)
+	if (new_value) {
 		_change_notify();
+		emit_changed();;
+	}
 }
 
 int Theme::get_constant(const StringName& p_name,const StringName& p_type) const {
@@ -424,6 +458,8 @@ void Theme::clear_constant(const StringName& p_name,const StringName& p_type) {
 
 	constant_map[p_type].erase(p_name);
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_constant_list(StringName p_type, List<StringName> *p_list) const {
@@ -451,6 +487,8 @@ void Theme::copy_default_theme() {
 	color_map=default_theme->color_map;
 	constant_map=default_theme->constant_map;
 	_change_notify();
+	emit_changed();;
+
 }
 
 void Theme::get_type_list(List<StringName> *p_list) const {
@@ -532,10 +570,15 @@ void Theme::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("clear_constant","name","type"),&Theme::clear_constant);
 	ObjectTypeDB::bind_method(_MD("get_constant_list"),&Theme::_get_constant_list);
 
+	ObjectTypeDB::bind_method(_MD("set_default_font","font"),&Theme::set_default_theme_font);
+	ObjectTypeDB::bind_method(_MD("get_default_font"),&Theme::get_default_theme_font);
+
 	ObjectTypeDB::bind_method(_MD("get_type_list"),&Theme::_get_type_list);
 
 	ObjectTypeDB::bind_method("copy_default_theme",&Theme::copy_default_theme);
 
+	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"default_font",PROPERTY_HINT_RESOURCE_TYPE,"Font"),_SCS("set_default_font"),_SCS("get_default_font"));
+
 }
 
 Theme::Theme() {

+ 5 - 2
scene/resources/theme.h

@@ -59,6 +59,7 @@ protected:
 	static Ref<StyleBox> default_style;
 	static Ref<Font> default_font;
 
+	Ref<Font> default_theme_font;
 
 	DVector<String> _get_icon_list(const String& p_type) const { DVector<String> ilret; List<StringName> il; get_icon_list(p_type,&il); for(List<StringName>::Element *E=il.front();E;E=E->next()) { ilret.push_back(E->get()); } return ilret; }
 	DVector<String> _get_stylebox_list(const String& p_type) const { DVector<String> ilret; List<StringName> il; get_stylebox_list(p_type,&il); for(List<StringName>::Element *E=il.front();E;E=E->next()) { ilret.push_back(E->get()); } return ilret; }
@@ -76,8 +77,10 @@ public:
 	static void set_default_icon( const Ref<Texture>& p_icon );
 	static void set_default_style( const Ref<StyleBox>& p_default_style);
 	static void set_default_font( const Ref<Font>& p_default_font );
-	
-	
+
+	void set_default_theme_font( const Ref<Font>& p_default_font );
+	Ref<Font> get_default_theme_font() const;
+
 	void set_icon(const StringName& p_name,const StringName& p_type,const Ref<Texture>& p_icon);
 	Ref<Texture> get_icon(const StringName& p_name,const StringName& p_type) const;
 	bool has_icon(const StringName& p_name,const StringName& p_type) const;

文件差異過大導致無法顯示
+ 234 - 357
tools/editor/doc_data_compressed.h


+ 3 - 2
tools/editor/editor_import_export.cpp

@@ -848,7 +848,8 @@ Error EditorExportPlatform::save_pack(FileAccess *dst,bool p_make_bundles) {
 	FileAccess *tmp = FileAccess::open(tmppath,FileAccess::WRITE);
 	uint64_t ofs_begin = dst->get_pos();
 
-	dst->store_32(0x4b435047); //GPCK
+	dst->store_32(0x43504447); //GDPK
+	dst->store_32(0); //pack version
 	dst->store_32(VERSION_MAJOR);
 	dst->store_32(VERSION_MINOR);
 	dst->store_32(VERSION_REVISION);
@@ -891,7 +892,7 @@ Error EditorExportPlatform::save_pack(FileAccess *dst,bool p_make_bundles) {
 	memdelete(tmp);
 
 	dst->store_64(dst->get_pos()-ofs_begin);
-	dst->store_32(0x4b435047); //GPCK
+	dst->store_32(0x43504447); //GDPK
 
 	//fix offsets
 

+ 1 - 1
tools/editor/editor_node.cpp

@@ -3961,7 +3961,7 @@ EditorNode::EditorNode() {
 	//add_editor_plugin( memnew( AnimationEditorPlugin(this) ) ); - not useful anymore
 	add_editor_plugin( memnew( ShaderEditorPlugin(this) ) );
 	add_editor_plugin( memnew( CameraEditorPlugin(this) ) );
-	add_editor_plugin( memnew( FontEditorPlugin(this) ) );
+	//add_editor_plugin( memnew( FontEditorPlugin(this) ) ); obsolete
 	add_editor_plugin( memnew( SampleEditorPlugin(this) ) );
 	add_editor_plugin( memnew( SampleLibraryEditorPlugin(this) ) );
 	add_editor_plugin( memnew( ThemeEditorPlugin(this) ) );

+ 178 - 41
tools/editor/plugins/theme_editor_plugin.cpp

@@ -33,13 +33,28 @@
 void ThemeEditor::edit(const Ref<Theme>& p_theme) {
 
 	theme=p_theme;
-	panel->set_theme(p_theme);
+	main_vb->set_theme(p_theme);
 
 }
 
-void ThemeEditor::_open_file_dialog() {
 
-	test_file_dialog->popup_centered_ratio();
+void ThemeEditor::_propagate_redraw(Control *p_at) {
+
+	p_at->notification(NOTIFICATION_THEME_CHANGED);
+	p_at->minimum_size_changed();
+	p_at->update();
+	for(int i=0;i<p_at->get_child_count();i++) {
+		Control *a = p_at->get_child(i)->cast_to<Control>();
+		if (a)
+			_propagate_redraw(a);
+
+	}
+}
+
+void ThemeEditor::_refresh_interval() {
+
+	_propagate_redraw(main_vb);
+
 }
 
 void ThemeEditor::_type_menu_cbk(int p_option) {
@@ -477,6 +492,18 @@ void ThemeEditor::_theme_menu_cbk(int p_option) {
 
 }
 
+void ThemeEditor::_notification(int p_what) {
+
+	if (p_what==NOTIFICATION_PROCESS) {
+
+		time_left-=get_process_delta_time();
+		if (time_left<0) {
+			time_left=1.5;
+			_refresh_interval();
+		}
+	}
+}
+
 void ThemeEditor::_bind_methods() {
 
 	ObjectTypeDB::bind_method("_type_menu_cbk",&ThemeEditor::_type_menu_cbk);
@@ -489,44 +516,159 @@ void ThemeEditor::_bind_methods() {
 
 ThemeEditor::ThemeEditor() {
 
-	Panel *main_panel = memnew( Panel );
-	add_child(main_panel);
-	main_panel->set_area_as_parent_rect();
-	panel = memnew( Panel );
+	time_left=0;
+
+	Panel * panel = memnew( Panel );
+	add_child(panel);
+	panel->set_area_as_parent_rect(0);
+	panel->set_margin(MARGIN_TOP,25);
+
+	main_vb= memnew( VBoxContainer );
+	panel->add_child(main_vb);
+	main_vb->set_area_as_parent_rect(4);
+
+
+	HBoxContainer *hb_menu = memnew(HBoxContainer);
+	main_vb->add_child(hb_menu);
+
 
-	main_panel->add_child(panel);
-	panel->set_area_as_parent_rect();
-	panel->set_margin( MARGIN_TOP,20 );
 
-	test_button = memnew( Button );
-	test_button->set_pos(Point2(25,25));
-	test_button->set_text("Button");
-	panel->add_child(test_button);
+	theme_menu = memnew( MenuButton );
+	theme_menu->set_text("Theme");
+	theme_menu->get_popup()->add_item("Add Item",POPUP_ADD);
+	theme_menu->get_popup()->add_item("Add Class Items",POPUP_CLASS_ADD);
+	theme_menu->get_popup()->add_item("Remove Item",POPUP_REMOVE);
+	theme_menu->get_popup()->add_separator();
+	theme_menu->get_popup()->add_item("Create Template",POPUP_CREATE_TEMPLATE);
+	hb_menu->add_child(theme_menu);
+	theme_menu->get_popup()->connect("item_pressed", this,"_theme_menu_cbk");
+
+
+	HBoxContainer *main_hb = memnew( HBoxContainer );
+	main_vb->add_child(main_hb);
 
-	test_label = memnew( Label );
-	test_label->set_pos(Point2(25,75));
-	test_label->set_text("Label");
-	panel->add_child(test_label);
 
-	test_menu_button = memnew( MenuButton );
-	test_menu_button->set_pos(Point2(25,125));
-	test_menu_button->set_text("Menu Button");
+
+	VBoxContainer *first_vb = memnew( VBoxContainer);
+	first_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+	main_hb->add_child(first_vb);
+
+
+
+//	main_panel->add_child(panel);
+//	panel->set_area_as_parent_rect();
+//	panel->set_margin( MARGIN_TOP,20 );
+
+	first_vb->add_child(memnew( Label("Label") ));
+
+	first_vb->add_child(memnew( Button("Button")) );
+	ToolButton *tb = memnew( ToolButton );
+	tb->set_text("ToolButton");
+	first_vb->add_child(tb );
+	CheckButton *cb = memnew( CheckButton );
+	cb->set_text("CheckButton");
+	first_vb->add_child(cb );
+
+	MenuButton* test_menu_button = memnew( MenuButton );
+	test_menu_button->set_text("MenuButton");
 	test_menu_button->get_popup()->add_item("Item");
 	test_menu_button->get_popup()->add_separator();
 	test_menu_button->get_popup()->add_check_item("Check Item");
 	test_menu_button->get_popup()->add_check_item("Checked Item");
 	test_menu_button->get_popup()->set_item_checked(2,true);
-	panel->add_child(test_menu_button);
+	first_vb->add_child(test_menu_button);
 
-	test_option_button = memnew( OptionButton );
-	test_option_button->set_pos(Point2(25,175));
+	OptionButton *test_option_button = memnew( OptionButton );
 	test_option_button->add_item("OptionButton");
 	test_option_button->add_separator();
 	test_option_button->add_item("Has");
 	test_option_button->add_item("Many");
 	test_option_button->add_item("Options");
-	panel->add_child(test_option_button);
+	first_vb->add_child(test_option_button);
+
+	ColorPickerButton *cpb = memnew( ColorPickerButton );
+	first_vb->add_child(cpb );
+
+	first_vb->add_child( memnew( HSeparator ));
+	first_vb->add_child( memnew( HSlider ));
+	first_vb->add_child( memnew( HScrollBar ));
+	first_vb->add_child( memnew( SpinBox ));
+	ProgressBar *pb=memnew( ProgressBar );
+	pb->set_val(50);
+	first_vb->add_child( pb);
+	Panel *pn=memnew( Panel );
+	pn->set_custom_minimum_size(Size2(40,40));
+	first_vb->add_child( pn);
+	first_vb->add_constant_override("separation",10);
+
+	VBoxContainer *second_vb = memnew( VBoxContainer );
+	second_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+	main_hb->add_child(second_vb);
+	second_vb->add_constant_override("separation",10);
+	LineEdit *le =  memnew( LineEdit );
+	le->set_text("LineEdit");
+	second_vb->add_child(le);
+	TextEdit *te =  memnew( TextEdit );
+	te->set_text("TextEdit");
+	//te->set_v_size_flags(SIZE_EXPAND_FILL);
+	te->set_custom_minimum_size(Size2(0,160));
+	second_vb->add_child(te);
+
+	Tree *test_tree = memnew(Tree);
+	second_vb->add_child(test_tree);
+	test_tree->set_custom_minimum_size(Size2(0,160));
+
+
+	TreeItem *item = test_tree->create_item();
+	item->set_editable(0,true);
+	item->set_text(0,"Tree");
+	item = test_tree->create_item( test_tree->get_root() );
+	item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
+	item->set_editable(0,true);
+	item->set_text(0,"check");
+	item = test_tree->create_item( test_tree->get_root() );
+	item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+	item->set_editable(0,true);
+	item->set_range_config(0,0,20,0.1);
+	item->set_range(0,2);
+	item = test_tree->create_item( test_tree->get_root() );
+	item->set_cell_mode(0, TreeItem::CELL_MODE_RANGE);
+	item->set_editable(0,true);
+	item->set_text(0,"Have,Many,Several,Options!");
+	item->set_range(0,2);
+
+	VBoxContainer *third_vb = memnew( VBoxContainer );
+	third_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+	third_vb->add_constant_override("separation",10);
+
+	main_hb->add_child(third_vb);
 
+	HBoxContainer *vhb = memnew( HBoxContainer );
+	vhb->set_custom_minimum_size(Size2(0,160));
+	vhb->add_child(memnew(VSeparator));
+	vhb->add_child(memnew(VSlider));
+	vhb->add_child(memnew(VScrollBar));
+	third_vb->add_child(vhb);
+
+	TabContainer *tc = memnew( TabContainer );
+	third_vb->add_child(tc);
+	tc->set_custom_minimum_size(Size2(0,160));
+	Control *tcc = memnew( Control );
+	tcc->set_name("Tab 1");
+	tc->add_child(tcc);
+	tcc = memnew( Control );
+	tcc->set_name("Tab 2");
+	tc->add_child(tcc);
+	tcc = memnew( Control );
+	tcc->set_name("Tab 3");
+	tc->add_child(tcc);
+
+	main_hb->add_constant_override("separation",20);
+
+
+
+
+/*
 	test_h_scroll = memnew( HScrollBar );
 	test_h_scroll->set_pos( Point2( 25, 225 ) );
 	test_h_scroll->set_size( Point2( 150, 5 ) );
@@ -576,21 +718,11 @@ ThemeEditor::ThemeEditor() {
 	panel->add_child(test_file_dialog);
 
 	fd_button->connect("pressed", this,"_open_file_dialog");
-
-	theme_menu = memnew( MenuButton );
-	theme_menu->set_text("Theme..");
-	theme_menu->get_popup()->add_item("Add Item",POPUP_ADD);
-	theme_menu->get_popup()->add_item("Add Class Items",POPUP_CLASS_ADD);
-	theme_menu->get_popup()->add_item("Remove Item",POPUP_REMOVE);
-	theme_menu->get_popup()->add_separator();
-	theme_menu->get_popup()->add_item("Create Template",POPUP_CREATE_TEMPLATE);
-	main_panel->add_child(theme_menu);
-	theme_menu->set_pos(Point2(5,5));
-	theme_menu->get_popup()->connect("item_pressed", this,"_theme_menu_cbk");
+*/
 
 	add_del_dialog = memnew(ConfirmationDialog);
 	add_del_dialog->hide();
-	main_panel->add_child(add_del_dialog);
+	add_child(add_del_dialog);
 
 
 	Label *l = memnew( Label );
@@ -665,10 +797,12 @@ ThemeEditor::ThemeEditor() {
 void ThemeEditorPlugin::edit(Object *p_node) {
 
 	if (p_node && p_node->cast_to<Theme>()) {
-		theme_editor->edit( p_node->cast_to<Theme>() );
 		theme_editor->show();
-	} else
+		theme_editor->edit( p_node->cast_to<Theme>() );
+	} else {
+		theme_editor->edit( Ref<Theme>() );
 		theme_editor->hide();
+	}
 }
 
 bool ThemeEditorPlugin::handles(Object *p_node) const{
@@ -678,10 +812,13 @@ bool ThemeEditorPlugin::handles(Object *p_node) const{
 
 void ThemeEditorPlugin::make_visible(bool p_visible){
 
-	if (p_visible)
+	if (p_visible) {
 		theme_editor->show();
-	else
+		theme_editor->set_process(true);
+	} else {
 		theme_editor->hide();
+		theme_editor->set_process(false);
+	}
 }
 
 ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) {

+ 6 - 11
tools/editor/plugins/theme_editor_plugin.h

@@ -42,21 +42,13 @@ class ThemeEditor : public Control {
 
 	OBJ_TYPE( ThemeEditor, Control );
 
-	Panel *panel;
 
+	VBoxContainer *main_vb;
 	Ref<Theme> theme;
 
 	FileDialog *file_dialog;
 
-	Button *test_button;
-	Label *test_label;
-	MenuButton *test_menu_button;
-	OptionButton *test_option_button;
-	HScrollBar *test_h_scroll;
-	VScrollBar *test_v_scroll;
-	LineEdit *line_edit;
-	FileDialog *test_file_dialog;
-
+	double time_left;
 
 	MenuButton *theme_menu;
 	ConfirmationDialog *add_del_dialog;
@@ -86,9 +78,12 @@ class ThemeEditor : public Control {
 	void _name_menu_about_to_show();
 	void _name_menu_cbk(int p_option);
 	void _theme_menu_cbk(int p_option);
-	void _open_file_dialog();
+	void _propagate_redraw(Control *p_at);
+	void _refresh_interval();
+
 
 protected:
+	void _notification(int p_what);
 	static void _bind_methods();
 public:
 

+ 18 - 0
tools/editor/project_export.cpp

@@ -374,6 +374,24 @@ void ProjectExportDialog::_export_mode_changed(int p_idx) {
 
 void ProjectExportDialog::_export_action(const String& p_file) {
 
+	String location = Globals::get_singleton()->globalize_path(p_file).get_base_dir().replace("\\","/");
+
+	while(true) {
+
+		print_line("TESTING: "+location.plus_file("engine.cfg"));
+		if (FileAccess::exists(location.plus_file("engine.cfg"))) {
+
+			error->set_text("Please export outside the project folder!");
+			error->popup_centered(Size2(300,70));;
+			return;
+		}
+		String nl = (location+"/..").simplify_path();
+		if (nl.find("/")==location.find_last("/"))
+			break;
+		location=nl;
+	}
+
+
 	TreeItem *selected = platforms->get_selected();
 	if (!selected)
 		return;

+ 0 - 0
tools/ios_xcode_template/data.pck


+ 469 - 0
tools/ios_xcode_template/godot_ios.xcodeproj/project.pbxproj

@@ -0,0 +1,469 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		D0BCFE3818AEBDA2004A7AAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */; };
+		D0BCFE3A18AEBDA2004A7AAE /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */; };
+		D0BCFE3C18AEBDA2004A7AAE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */; };
+		D0BCFE3E18AEBDA2004A7AAE /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3D18AEBDA2004A7AAE /* GLKit.framework */; };
+		D0BCFE4018AEBDA2004A7AAE /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3F18AEBDA2004A7AAE /* OpenGLES.framework */; };
+		D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */; };
+		D0BCFE6218AEBDA3004A7AAE /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE6118AEBDA3004A7AAE /* XCTest.framework */; };
+		D0BCFE6318AEBDA3004A7AAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */; };
+		D0BCFE6418AEBDA3004A7AAE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */; };
+		D0BCFE6C18AEBDA3004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE6A18AEBDA3004A7AAE /* InfoPlist.strings */; };
+		D0BCFE6E18AEBDA3004A7AAE /* godot_iosTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D0BCFE6D18AEBDA3004A7AAE /* godot_iosTests.m */; };
+		D0BCFE7818AEBFEB004A7AAE /* data.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* data.pck */; };
+		D0BCFE7A18AEC06A004A7AAE /* godot_opt.iphone in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		D0BCFE6518AEBDA3004A7AAE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = D0BCFE2C18AEBDA2004A7AAE /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = D0BCFE3318AEBDA2004A7AAE;
+			remoteInfo = godot_ios;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = godot_ios.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		D0BCFE3D18AEBDA2004A7AAE /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
+		D0BCFE3F18AEBDA2004A7AAE /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+		D0BCFE4318AEBDA2004A7AAE /* godot_ios-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "godot_ios-Info.plist"; sourceTree = "<group>"; };
+		D0BCFE4518AEBDA2004A7AAE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		D0BCFE4918AEBDA2004A7AAE /* godot_ios-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "godot_ios-Prefix.pch"; sourceTree = "<group>"; };
+		D0BCFE6018AEBDA3004A7AAE /* godot_iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = godot_iosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		D0BCFE6118AEBDA3004A7AAE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+		D0BCFE6918AEBDA3004A7AAE /* godot_iosTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "godot_iosTests-Info.plist"; sourceTree = "<group>"; };
+		D0BCFE6B18AEBDA3004A7AAE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		D0BCFE6D18AEBDA3004A7AAE /* godot_iosTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = godot_iosTests.m; sourceTree = "<group>"; };
+		D0BCFE7718AEBFEB004A7AAE /* data.pck */ = {isa = PBXFileReference; lastKnownFileType = file; path = data.pck; sourceTree = "<group>"; };
+		D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = godot_opt.iphone; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		D0BCFE3118AEBDA2004A7AAE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D0BCFE4018AEBDA2004A7AAE /* OpenGLES.framework in Frameworks */,
+				D0BCFE3A18AEBDA2004A7AAE /* CoreGraphics.framework in Frameworks */,
+				D0BCFE3C18AEBDA2004A7AAE /* UIKit.framework in Frameworks */,
+				D0BCFE3E18AEBDA2004A7AAE /* GLKit.framework in Frameworks */,
+				D0BCFE3818AEBDA2004A7AAE /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D0BCFE5D18AEBDA3004A7AAE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D0BCFE6218AEBDA3004A7AAE /* XCTest.framework in Frameworks */,
+				D0BCFE6418AEBDA3004A7AAE /* UIKit.framework in Frameworks */,
+				D0BCFE6318AEBDA3004A7AAE /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		D0BCFE2B18AEBDA2004A7AAE = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */,
+				D0BCFE7718AEBFEB004A7AAE /* data.pck */,
+				D0BCFE4118AEBDA2004A7AAE /* godot_ios */,
+				D0BCFE6718AEBDA3004A7AAE /* godot_iosTests */,
+				D0BCFE3618AEBDA2004A7AAE /* Frameworks */,
+				D0BCFE3518AEBDA2004A7AAE /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		D0BCFE3518AEBDA2004A7AAE /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */,
+				D0BCFE6018AEBDA3004A7AAE /* godot_iosTests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		D0BCFE3618AEBDA2004A7AAE /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */,
+				D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */,
+				D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */,
+				D0BCFE3D18AEBDA2004A7AAE /* GLKit.framework */,
+				D0BCFE3F18AEBDA2004A7AAE /* OpenGLES.framework */,
+				D0BCFE6118AEBDA3004A7AAE /* XCTest.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		D0BCFE4118AEBDA2004A7AAE /* godot_ios */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE4218AEBDA2004A7AAE /* Supporting Files */,
+			);
+			path = godot_ios;
+			sourceTree = "<group>";
+		};
+		D0BCFE4218AEBDA2004A7AAE /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE4318AEBDA2004A7AAE /* godot_ios-Info.plist */,
+				D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */,
+				D0BCFE4918AEBDA2004A7AAE /* godot_ios-Prefix.pch */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		D0BCFE6718AEBDA3004A7AAE /* godot_iosTests */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE6D18AEBDA3004A7AAE /* godot_iosTests.m */,
+				D0BCFE6818AEBDA3004A7AAE /* Supporting Files */,
+			);
+			path = godot_iosTests;
+			sourceTree = "<group>";
+		};
+		D0BCFE6818AEBDA3004A7AAE /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				D0BCFE6918AEBDA3004A7AAE /* godot_iosTests-Info.plist */,
+				D0BCFE6A18AEBDA3004A7AAE /* InfoPlist.strings */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		D0BCFE3318AEBDA2004A7AAE /* godot_ios */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_ios" */;
+			buildPhases = (
+				D0BCFE3018AEBDA2004A7AAE /* Sources */,
+				D0BCFE3118AEBDA2004A7AAE /* Frameworks */,
+				D0BCFE3218AEBDA2004A7AAE /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = godot_ios;
+			productName = godot_ios;
+			productReference = D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */;
+			productType = "com.apple.product-type.application";
+		};
+		D0BCFE5F18AEBDA3004A7AAE /* godot_iosTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D0BCFE7418AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_iosTests" */;
+			buildPhases = (
+				D0BCFE5C18AEBDA3004A7AAE /* Sources */,
+				D0BCFE5D18AEBDA3004A7AAE /* Frameworks */,
+				D0BCFE5E18AEBDA3004A7AAE /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				D0BCFE6618AEBDA3004A7AAE /* PBXTargetDependency */,
+			);
+			name = godot_iosTests;
+			productName = godot_iosTests;
+			productReference = D0BCFE6018AEBDA3004A7AAE /* godot_iosTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		D0BCFE2C18AEBDA2004A7AAE /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0500;
+				ORGANIZATIONNAME = Okam;
+				TargetAttributes = {
+					D0BCFE5F18AEBDA3004A7AAE = {
+						TestTargetID = D0BCFE3318AEBDA2004A7AAE;
+					};
+				};
+			};
+			buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "godot_ios" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = D0BCFE2B18AEBDA2004A7AAE;
+			productRefGroup = D0BCFE3518AEBDA2004A7AAE /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				D0BCFE3318AEBDA2004A7AAE /* godot_ios */,
+				D0BCFE5F18AEBDA3004A7AAE /* godot_iosTests */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		D0BCFE3218AEBDA2004A7AAE /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D0BCFE7818AEBFEB004A7AAE /* data.pck in Resources */,
+				D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */,
+				D0BCFE7A18AEC06A004A7AAE /* godot_opt.iphone in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D0BCFE5E18AEBDA3004A7AAE /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D0BCFE6C18AEBDA3004A7AAE /* InfoPlist.strings in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		D0BCFE3018AEBDA2004A7AAE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D0BCFE5C18AEBDA3004A7AAE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D0BCFE6E18AEBDA3004A7AAE /* godot_iosTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		D0BCFE6618AEBDA3004A7AAE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = D0BCFE3318AEBDA2004A7AAE /* godot_ios */;
+			targetProxy = D0BCFE6518AEBDA3004A7AAE /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				D0BCFE4518AEBDA2004A7AAE /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+		D0BCFE6A18AEBDA3004A7AAE /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				D0BCFE6B18AEBDA3004A7AAE /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		D0BCFE6F18AEBDA3004A7AAE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		D0BCFE7018AEBDA3004A7AAE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				ENABLE_NS_ASSERTIONS = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		D0BCFE7218AEBDA3004A7AAE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch";
+				INFOPLIST_FILE = "godot_ios/godot_ios-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALID_ARCHS = "armv7 armv7s";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		D0BCFE7318AEBDA3004A7AAE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD)";
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch";
+				INFOPLIST_FILE = "godot_ios/godot_ios-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALID_ARCHS = "armv7 armv7s";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+		D0BCFE7518AEBDA3004A7AAE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/godot_ios.app/godot_ios";
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)/Developer/Library/Frameworks",
+					"$(inherited)",
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
+				);
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				INFOPLIST_FILE = "godot_iosTests/godot_iosTests-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUNDLE_LOADER)";
+				WRAPPER_EXTENSION = xctest;
+			};
+			name = Debug;
+		};
+		D0BCFE7618AEBDA3004A7AAE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/godot_ios.app/godot_ios";
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)/Developer/Library/Frameworks",
+					"$(inherited)",
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
+				);
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch";
+				INFOPLIST_FILE = "godot_iosTests/godot_iosTests-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TEST_HOST = "$(BUNDLE_LOADER)";
+				WRAPPER_EXTENSION = xctest;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "godot_ios" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D0BCFE6F18AEBDA3004A7AAE /* Debug */,
+				D0BCFE7018AEBDA3004A7AAE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_ios" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D0BCFE7218AEBDA3004A7AAE /* Debug */,
+				D0BCFE7318AEBDA3004A7AAE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+		};
+		D0BCFE7418AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_iosTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D0BCFE7518AEBDA3004A7AAE /* Debug */,
+				D0BCFE7618AEBDA3004A7AAE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = D0BCFE2C18AEBDA2004A7AAE /* Project object */;
+}

+ 7 - 0
tools/ios_xcode_template/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:godot_ios.xcodeproj">
+   </FileRef>
+</Workspace>

二進制
tools/ios_xcode_template/godot_ios.xcodeproj/project.xcworkspace/xcuserdata/punto.xcuserdatad/UserInterfaceState.xcuserstate


+ 96 - 0
tools/ios_xcode_template/godot_ios.xcodeproj/xcuserdata/punto.xcuserdatad/xcschemes/godot_ios.xcscheme

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0500"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "D0BCFE3318AEBDA2004A7AAE"
+               BuildableName = "godot_ios.app"
+               BlueprintName = "godot_ios"
+               ReferencedContainer = "container:godot_ios.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "D0BCFE5F18AEBDA3004A7AAE"
+               BuildableName = "godot_iosTests.xctest"
+               BlueprintName = "godot_iosTests"
+               ReferencedContainer = "container:godot_ios.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "D0BCFE3318AEBDA2004A7AAE"
+            BuildableName = "godot_ios.app"
+            BlueprintName = "godot_ios"
+            ReferencedContainer = "container:godot_ios.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "D0BCFE3318AEBDA2004A7AAE"
+            BuildableName = "godot_ios.app"
+            BlueprintName = "godot_ios"
+            ReferencedContainer = "container:godot_ios.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "D0BCFE3318AEBDA2004A7AAE"
+            BuildableName = "godot_ios.app"
+            BlueprintName = "godot_ios"
+            ReferencedContainer = "container:godot_ios.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 27 - 0
tools/ios_xcode_template/godot_ios.xcodeproj/xcuserdata/punto.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>godot_ios.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>D0BCFE3318AEBDA2004A7AAE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+		<key>D0BCFE5F18AEBDA3004A7AAE</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 2 - 0
tools/ios_xcode_template/godot_ios/en.lproj/InfoPlist.strings

@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+

+ 47 - 0
tools/ios_xcode_template/godot_ios/godot_ios-Info.plist

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>godot_opt.iphone</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.okamstudios.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UIStatusBarHidden</key>
+	<true/>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>

+ 16 - 0
tools/ios_xcode_template/godot_ios/godot_ios-Prefix.pch

@@ -0,0 +1,16 @@
+//
+//  Prefix header
+//
+//  The contents of this file are implicitly included at the beginning of every source file.
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+    #import <UIKit/UIKit.h>
+    #import <Foundation/Foundation.h>
+#endif

+ 18 - 0
tools/ios_xcode_template/godot_ios/main.m

@@ -0,0 +1,18 @@
+//
+//  main.m
+//  godot_ios
+//
+//  Created by Ariel m on 2/14/14.
+//  Copyright (c) 2014 Okam. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[])
+{
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}

+ 2 - 0
tools/ios_xcode_template/godot_iosTests/en.lproj/InfoPlist.strings

@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+

+ 22 - 0
tools/ios_xcode_template/godot_iosTests/godot_iosTests-Info.plist

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.okamstudios.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>

+ 34 - 0
tools/ios_xcode_template/godot_iosTests/godot_iosTests.m

@@ -0,0 +1,34 @@
+//
+//  godot_iosTests.m
+//  godot_iosTests
+//
+//  Created by Ariel m on 2/14/14.
+//  Copyright (c) 2014 Okam. All rights reserved.
+//
+
+#import <XCTest/XCTest.h>
+
+@interface godot_iosTests : XCTestCase
+
+@end
+
+@implementation godot_iosTests
+
+- (void)setUp
+{
+    [super setUp];
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+}
+
+- (void)tearDown
+{
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (void)testExample
+{
+    XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
+}
+
+@end

部分文件因文件數量過多而無法顯示