浏览代码

-split view of property editor and editor settings

Juan Linietsky 9 年之前
父节点
当前提交
a1142225bf

+ 18 - 2
core/globals.cpp

@@ -132,8 +132,12 @@ bool Globals::_set(const StringName& p_name, const Variant& p_value) {
 		if (props.has(p_name)) {
 		if (props.has(p_name)) {
 			if (!props[p_name].overrided)
 			if (!props[p_name].overrided)
 				props[p_name].variant=p_value;
 				props[p_name].variant=p_value;
+
+			if (props[p_name].order>=NO_ORDER_BASE && registering_order) {
+				props[p_name].order=last_order++;
+			}
 		} else {
 		} else {
-			props[p_name]=VariantContainer(p_value,last_order++);
+			props[p_name]=VariantContainer(p_value,last_order++ + registering_order?0:NO_ORDER_BASE);
 		}
 		}
 	}
 	}
 
 
@@ -741,6 +745,10 @@ static Variant _decode_variant(const String& p_string) {
 	return Variant();
 	return Variant();
 }
 }
 
 
+void Globals::set_registering_order(bool p_enable) {
+
+	registering_order=p_enable;
+}
 
 
 Error Globals::_load_settings_binary(const String p_path) {
 Error Globals::_load_settings_binary(const String p_path) {
 
 
@@ -760,6 +768,8 @@ Error Globals::_load_settings_binary(const String p_path) {
 		ERR_FAIL_V(ERR_FILE_CORRUPT;)
 		ERR_FAIL_V(ERR_FILE_CORRUPT;)
 	}
 	}
 
 
+	set_registering_order(false);
+
 	uint32_t count=f->get_32();
 	uint32_t count=f->get_32();
 
 
 	for(int i=0;i<count;i++) {
 	for(int i=0;i<count;i++) {
@@ -784,6 +794,9 @@ Error Globals::_load_settings_binary(const String p_path) {
 		set_persisting(key,true);
 		set_persisting(key,true);
 	}
 	}
 
 
+	set_registering_order(true);
+
+
 	return OK;
 	return OK;
 }
 }
 Error Globals::_load_settings(const String p_path) {
 Error Globals::_load_settings(const String p_path) {
@@ -802,6 +815,8 @@ Error Globals::_load_settings(const String p_path) {
 	String section;
 	String section;
 	String subpath;
 	String subpath;
 
 
+	set_registering_order(false);
+
 	int line_count = 0;
 	int line_count = 0;
 
 
 	while(!f->eof_reached()) {
 	while(!f->eof_reached()) {
@@ -877,6 +892,7 @@ Error Globals::_load_settings(const String p_path) {
 
 
 	memdelete(f);
 	memdelete(f);
 
 
+	set_registering_order(true);
 
 
 	return OK;
 	return OK;
 }
 }
@@ -1388,7 +1404,7 @@ Globals::Globals() {
 	singleton=this;
 	singleton=this;
 	last_order=0;
 	last_order=0;
 	disable_platform_override=false;
 	disable_platform_override=false;
-
+	registering_order=true;
 
 
 
 
 	Array va;
 	Array va;

+ 7 - 0
core/globals.h

@@ -54,6 +54,10 @@ public:
 
 
 protected:
 protected:
 
 
+	enum {
+		NO_ORDER_BASE=1<<18
+	};
+
 	struct VariantContainer {
 	struct VariantContainer {
 		int order;
 		int order;
 		bool persist;
 		bool persist;
@@ -64,6 +68,7 @@ protected:
 		VariantContainer(const Variant& p_variant, int p_order, bool p_persist=false) { variant=p_variant; order=p_order; hide_from_editor=false; persist=p_persist; overrided=false; }
 		VariantContainer(const Variant& p_variant, int p_order, bool p_persist=false) { variant=p_variant; order=p_order; hide_from_editor=false; persist=p_persist; overrided=false; }
 	};
 	};
 
 
+	bool registering_order;
 	int last_order;
 	int last_order;
 	Map<StringName,VariantContainer> props;
 	Map<StringName,VariantContainer> props;
 	String resource_path;
 	String resource_path;
@@ -134,6 +139,8 @@ public:
 
 
 	bool is_using_datapack() const;
 	bool is_using_datapack() const;
 
 
+	void set_registering_order(bool p_registering);
+
 	Globals();	
 	Globals();	
 	~Globals();
 	~Globals();
 
 

+ 6 - 2
drivers/theora/video_stream_theora.cpp

@@ -476,11 +476,13 @@ Ref<Texture> VideoStreamPlaybackTheora::get_texture() {
 
 
 void VideoStreamPlaybackTheora::update(float p_delta) {
 void VideoStreamPlaybackTheora::update(float p_delta) {
 
 
-	if (!playing) {
+	if (!playing || paused) {
 		//printf("not playing\n");
 		//printf("not playing\n");
 		return;
 		return;
 	};
 	};
 
 
+
+
 #ifdef THEORA_USE_THREAD_STREAMING
 #ifdef THEORA_USE_THREAD_STREAMING
 	thread_sem->post();
 	thread_sem->post();
 #endif
 #endif
@@ -730,12 +732,13 @@ bool VideoStreamPlaybackTheora::is_playing() const {
 
 
 void VideoStreamPlaybackTheora::set_paused(bool p_paused) {
 void VideoStreamPlaybackTheora::set_paused(bool p_paused) {
 
 
+	paused=p_paused;
 	//pau = !p_paused;
 	//pau = !p_paused;
 };
 };
 
 
 bool VideoStreamPlaybackTheora::is_paused(bool p_paused) const {
 bool VideoStreamPlaybackTheora::is_paused(bool p_paused) const {
 
 
-	return playing;
+	return paused;
 };
 };
 
 
 void VideoStreamPlaybackTheora::set_loop(bool p_enable) {
 void VideoStreamPlaybackTheora::set_loop(bool p_enable) {
@@ -830,6 +833,7 @@ VideoStreamPlaybackTheora::VideoStreamPlaybackTheora() {
 	playing = false;
 	playing = false;
 	frames_pending = 0;
 	frames_pending = 0;
 	videobuf_time = 0;
 	videobuf_time = 0;
+	paused=false;
 
 
 	buffering=false;
 	buffering=false;
 	texture = Ref<ImageTexture>( memnew(ImageTexture ));
 	texture = Ref<ImageTexture>( memnew(ImageTexture ));

+ 1 - 0
drivers/theora/video_stream_theora.h

@@ -69,6 +69,7 @@ class VideoStreamPlaybackTheora : public VideoStreamPlayback {
 
 
 	AudioMixCallback mix_callback;
 	AudioMixCallback mix_callback;
 	void* mix_udata;
 	void* mix_udata;
+	bool paused;
 
 
 #ifdef THEORA_USE_THREAD_STREAMING
 #ifdef THEORA_USE_THREAD_STREAMING
 
 

+ 1 - 0
scene/gui/split_container.cpp

@@ -451,6 +451,7 @@ SplitContainer::SplitContainer(bool p_vertical) {
 	dragging=false;
 	dragging=false;
 	collapsed=false;
 	collapsed=false;
 	dragger_visible=true;
 	dragger_visible=true;
+
 }
 }
 
 
 
 

+ 14 - 14
tools/editor/project_settings.cpp

@@ -518,7 +518,7 @@ void ProjectSettings::popup_project_settings() {
 void ProjectSettings::_item_selected() {
 void ProjectSettings::_item_selected() {
 
 
 
 
-	TreeItem *ti = globals_editor->get_scene_tree()->get_selected();
+	TreeItem *ti = globals_editor->get_property_editor()->get_scene_tree()->get_selected();
 	if (!ti)
 	if (!ti)
 		return;
 		return;
 	if (!ti->get_parent())
 	if (!ti->get_parent())
@@ -562,7 +562,7 @@ void ProjectSettings::_item_add() {
 
 
 	String name = catname+"/"+propname;
 	String name = catname+"/"+propname;
 	Globals::get_singleton()->set(name,value);
 	Globals::get_singleton()->set(name,value);
-	globals_editor->update_tree();
+	globals_editor->get_property_editor()->update_tree();
 }
 }
 
 
 void ProjectSettings::_item_del() {
 void ProjectSettings::_item_del() {
@@ -574,7 +574,7 @@ void ProjectSettings::_item_del() {
 
 
 	String name = catname+"/"+propname;
 	String name = catname+"/"+propname;
 	Globals::get_singleton()->set(name,Variant());
 	Globals::get_singleton()->set(name,Variant());
-	globals_editor->update_tree();
+	globals_editor->get_property_editor()->update_tree();
 
 
 }
 }
 
 
@@ -694,7 +694,7 @@ void ProjectSettings::_settings_prop_edited(const String& p_name) {
 
 
 		Globals::get_singleton()->set_persisting(p_name,true);
 		Globals::get_singleton()->set_persisting(p_name,true);
 //		globals_editor->update_property(p_name);
 //		globals_editor->update_property(p_name);
-		globals_editor->update_tree();
+		globals_editor->get_property_editor()->update_tree();
 	}
 	}
 	_settings_changed();
 	_settings_changed();
 }
 }
@@ -729,7 +729,7 @@ void ProjectSettings::_copy_to_platform(int p_which) {
 	name = catname+"/"+propname;
 	name = catname+"/"+propname;
 
 
 	Globals::get_singleton()->set(name,value);
 	Globals::get_singleton()->set(name,value);
-	globals_editor->update_tree();
+	globals_editor->get_property_editor()->update_tree();
 
 
 }
 }
 
 
@@ -1233,7 +1233,7 @@ void ProjectSettings::_update_autoload() {
 
 
 void ProjectSettings::_toggle_search_bar(bool p_pressed) {
 void ProjectSettings::_toggle_search_bar(bool p_pressed) {
 
 
-	globals_editor->set_use_filter(p_pressed);
+	globals_editor->get_property_editor()->set_use_filter(p_pressed);
 
 
 	if (p_pressed) {
 	if (p_pressed) {
 
 
@@ -1254,7 +1254,7 @@ void ProjectSettings::_clear_search_box() {
 		return;
 		return;
 
 
 	search_box->clear();
 	search_box->clear();
-	globals_editor->update_tree();
+	globals_editor->get_property_editor()->update_tree();
 }
 }
 
 
 void ProjectSettings::_bind_methods() {
 void ProjectSettings::_bind_methods() {
@@ -1397,15 +1397,15 @@ ProjectSettings::ProjectSettings(EditorData *p_data) {
 	search_bar->add_child(clear_button);
 	search_bar->add_child(clear_button);
 	clear_button->connect("pressed",this,"_clear_search_box");
 	clear_button->connect("pressed",this,"_clear_search_box");
 
 
-	globals_editor = memnew( PropertyEditor );
+	globals_editor = memnew( SectionedPropertyEditor );
 	props_base->add_child(globals_editor);
 	props_base->add_child(globals_editor);
-	globals_editor->hide_top_label();
+	//globals_editor->hide_top_label();
 	globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
-	globals_editor->register_text_enter(search_box);
-	globals_editor->set_capitalize_paths(false);
-	globals_editor->get_scene_tree()->connect("cell_selected",this,"_item_selected");
-	globals_editor->connect("property_toggled",this,"_item_checked");
-	globals_editor->connect("property_edited",this,"_settings_prop_edited");
+	globals_editor->get_property_editor()->register_text_enter(search_box);
+	globals_editor->get_property_editor()->set_capitalize_paths(false);
+	globals_editor->get_property_editor()->get_scene_tree()->connect("cell_selected",this,"_item_selected");
+	globals_editor->get_property_editor()->connect("property_toggled",this,"_item_checked");
+	globals_editor->get_property_editor()->connect("property_edited",this,"_settings_prop_edited");
 
 
 /*
 /*
 	Button *save = memnew( Button );
 	Button *save = memnew( Button );

+ 1 - 1
tools/editor/project_settings.h

@@ -46,7 +46,7 @@ class ProjectSettings : public AcceptDialog {
 
 
 	EditorData *data;
 	EditorData *data;
 	UndoRedo *undo_redo;
 	UndoRedo *undo_redo;
-	PropertyEditor *globals_editor;
+	SectionedPropertyEditor *globals_editor;
 
 
 	HBoxContainer *search_bar;
 	HBoxContainer *search_bar;
 	ToolButton *search_button;
 	ToolButton *search_button;

+ 171 - 0
tools/editor/property_editor.cpp

@@ -3638,3 +3638,174 @@ PropertyEditor::~PropertyEditor()
 }
 }
 
 
 
 
+/////////////////////////////
+
+
+
+
+
+class SectionedPropertyEditorFilter : public Object {
+
+	OBJ_TYPE( SectionedPropertyEditorFilter, Object );
+
+	Object *edited;
+	String section;
+
+	bool _set(const StringName& p_name, const Variant& p_value) {
+
+		if (!edited)
+			return false;
+
+		String name=p_name;
+		if (section!="") {
+			name=section+"/"+name;
+		}
+
+		bool valid;
+		edited->set(name,p_value,&valid);
+		return valid;
+	}
+
+	bool _get(const StringName& p_name,Variant &r_ret) const{
+
+		if (!edited)
+			return false;
+
+		String name=p_name;
+		if (section!="") {
+			name=section+"/"+name;
+		}
+
+		bool valid=false;
+
+		r_ret=edited->get(name,&valid);
+		return valid;
+
+
+	}
+	void _get_property_list(List<PropertyInfo> *p_list) const{
+
+		if (!edited)
+			return;
+
+		List<PropertyInfo> pinfo;
+		edited->get_property_list(&pinfo);
+		for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+			PropertyInfo pi=E->get();
+			int sp = pi.name.find("/");
+			if (sp!=-1) {
+				String ss = pi.name.substr(0,sp);
+
+				if (ss==section) {
+					pi.name=pi.name.substr(sp+1,pi.name.length());
+					p_list->push_back(pi);
+				}
+			} else {
+				if (section=="")
+					p_list->push_back(pi);
+			}
+		}
+
+	}
+public:
+
+	void set_section(const String& p_section) {
+
+		section=p_section;
+		_change_notify();
+	}
+
+	void set_edited(Object* p_edited) {
+		edited=p_edited;
+		_change_notify();
+	}
+
+	SectionedPropertyEditorFilter() {
+		edited=NULL;
+	}
+
+};
+
+
+void SectionedPropertyEditor::_bind_methods() {
+
+	ObjectTypeDB::bind_method("_section_selected",&SectionedPropertyEditor::_section_selected);
+}
+
+void SectionedPropertyEditor::_section_selected(int p_which) {
+
+	filter->set_section( sections->get_item_metadata(p_which) );
+}
+
+void SectionedPropertyEditor::edit(Object* p_object) {
+
+	List<PropertyInfo> pinfo;
+	if (p_object)
+		p_object->get_property_list(&pinfo);
+	sections->clear();
+
+	Set<String> existing_sections;
+	for (List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
+
+		PropertyInfo pi=E->get();
+		if (pi.usage&PROPERTY_USAGE_CATEGORY)
+			continue;
+		if (pi.name.find(":")!=-1 || pi.name=="script/script")
+			continue;
+		int sp = pi.name.find("/");
+		if (sp!=-1) {
+			String sname=pi.name.substr(0,sp);
+			if (!existing_sections.has(sname)) {
+				existing_sections.insert(sname);
+				sections->add_item(sname.capitalize());
+				sections->set_item_metadata(sections->get_item_count()-1,sname);
+			}
+
+		} else {
+			if (!existing_sections.has("")) {
+				existing_sections.insert("");
+				sections->add_item("Global");
+				sections->set_item_metadata(sections->get_item_count()-1,"");
+			}
+		}
+
+
+	}
+
+	//sections->sort_items_by_text();
+
+
+	filter->set_edited(p_object);
+	editor->edit(filter);
+
+	sections->select(0);
+	_section_selected(0);
+
+}
+
+PropertyEditor *SectionedPropertyEditor::get_property_editor() {
+
+	return editor;
+}
+
+SectionedPropertyEditor::SectionedPropertyEditor() {
+
+	sections = memnew( ItemList );
+	add_child(sections);
+	sections->set_custom_minimum_size(Size2(160,0));
+	filter = memnew( SectionedPropertyEditorFilter );
+	editor = memnew( PropertyEditor );
+	editor->get_scene_tree()->set_column_titles_visible(false);
+	add_child(editor);
+	editor->set_h_size_flags(SIZE_EXPAND_FILL);
+	editor->hide_top_label();
+
+	sections->connect("item_selected",this,"_section_selected");
+
+}
+
+SectionedPropertyEditor::~SectionedPropertyEditor() {
+
+	memdelete(filter);
+}

+ 25 - 0
tools/editor/property_editor.h

@@ -39,6 +39,7 @@
 #include "scene/gui/texture_frame.h"
 #include "scene/gui/texture_frame.h"
 #include "scene/gui/text_edit.h"
 #include "scene/gui/text_edit.h"
 #include "scene/gui/check_button.h"
 #include "scene/gui/check_button.h"
+#include "scene/gui/split_container.h"
 #include "scene_tree_editor.h"
 #include "scene_tree_editor.h"
 
 
 /**
 /**
@@ -247,4 +248,28 @@ public:
 
 
 };
 };
 
 
+
+class SectionedPropertyEditorFilter;
+
+class SectionedPropertyEditor : public HBoxContainer {
+
+
+	OBJ_TYPE(SectionedPropertyEditor,HBoxContainer);
+	ItemList *sections;
+	SectionedPropertyEditorFilter *filter;
+	PropertyEditor *editor;
+
+
+	static void _bind_methods();
+	void _section_selected(int p_which);
+
+public:
+
+	PropertyEditor *get_property_editor();
+	void edit(Object* p_object);
+
+	SectionedPropertyEditor();
+	~SectionedPropertyEditor();
+};
+
 #endif
 #endif

+ 6 - 6
tools/editor/settings_config_dialog.cpp

@@ -71,7 +71,7 @@ void EditorSettingsDialog::popup_edit_settings() {
 		return;
 		return;
 
 
 	property_editor->edit(EditorSettings::get_singleton());
 	property_editor->edit(EditorSettings::get_singleton());
-	property_editor->update_tree();
+	property_editor->get_property_editor()->update_tree();
 
 
 	search_box->select_all();
 	search_box->select_all();
 	search_box->grab_focus();
 	search_box->grab_focus();
@@ -254,7 +254,7 @@ void EditorSettingsDialog::_clear_search_box() {
 		return;
 		return;
 
 
 	search_box->clear();
 	search_box->clear();
-	property_editor->update_tree();
+	property_editor->get_property_editor()->update_tree();
 }
 }
 
 
 void EditorSettingsDialog::_notification(int p_what) {
 void EditorSettingsDialog::_notification(int p_what) {
@@ -306,10 +306,10 @@ EditorSettingsDialog::EditorSettingsDialog() {
 	hbc->add_child(clear_button);
 	hbc->add_child(clear_button);
 	clear_button->connect("pressed",this,"_clear_search_box");
 	clear_button->connect("pressed",this,"_clear_search_box");
 
 
-	property_editor = memnew( PropertyEditor );
-	property_editor->hide_top_label();
-	property_editor->set_use_filter(true);
-	property_editor->register_text_enter(search_box);
+	property_editor = memnew( SectionedPropertyEditor );
+	//property_editor->hide_top_label();
+	property_editor->get_property_editor()->set_use_filter(true);
+	property_editor->get_property_editor()->register_text_enter(search_box);
 	property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	vbc->add_child(property_editor);
 	vbc->add_child(property_editor);
 
 

+ 1 - 1
tools/editor/settings_config_dialog.h

@@ -53,7 +53,7 @@ class EditorSettingsDialog : public AcceptDialog {
 	Tree *plugins;
 	Tree *plugins;
 	LineEdit *search_box;
 	LineEdit *search_box;
 	ToolButton *clear_button;
 	ToolButton *clear_button;
-	PropertyEditor *property_editor;
+	SectionedPropertyEditor *property_editor;
 
 
 	Timer *timer;
 	Timer *timer;