Sfoglia il codice sorgente

Replace meta properties with regular properties in `Control`

Yuri Sizov 3 anni fa
parent
commit
e08feee8a6
2 ha cambiato i file con 58 aggiunte e 30 eliminazioni
  1. 51 30
      scene/gui/control.cpp
  2. 7 0
      scene/gui/control.h

+ 51 - 30
scene/gui/control.cpp

@@ -565,6 +565,26 @@ void Control::_validate_property(PropertyInfo &property) const {
 	}
 	}
 }
 }
 
 
+bool Control::_property_can_revert(const StringName &p_name) const {
+	if (p_name == "layout_mode" || p_name == "anchors_preset") {
+		return true;
+	}
+
+	return false;
+}
+
+bool Control::_property_get_revert(const StringName &p_name, Variant &r_property) const {
+	if (p_name == "layout_mode") {
+		r_property = _get_default_layout_mode();
+		return true;
+	} else if (p_name == "anchors_preset") {
+		r_property = LayoutPreset::PRESET_TOP_LEFT;
+		return true;
+	}
+
+	return false;
+}
+
 // Global relations.
 // Global relations.
 
 
 bool Control::is_top_level_control() const {
 bool Control::is_top_level_control() const {
@@ -794,24 +814,15 @@ void Control::_compute_offsets(Rect2 p_rect, const real_t p_anchors[4], real_t (
 void Control::_set_layout_mode(LayoutMode p_mode) {
 void Control::_set_layout_mode(LayoutMode p_mode) {
 	bool list_changed = false;
 	bool list_changed = false;
 
 
-	if (p_mode == LayoutMode::LAYOUT_MODE_POSITION || p_mode == LayoutMode::LAYOUT_MODE_ANCHORS) {
-		if ((int)get_meta("_edit_layout_mode", p_mode) != (int)p_mode) {
-			list_changed = true;
-		}
-
-		set_meta("_edit_layout_mode", (int)p_mode);
+	if (data.stored_layout_mode != p_mode) {
+		list_changed = true;
+		data.stored_layout_mode = p_mode;
+	}
 
 
-		if (p_mode == LayoutMode::LAYOUT_MODE_POSITION) {
-			remove_meta("_edit_layout_mode");
-			remove_meta("_edit_use_custom_anchors");
-			set_anchors_and_offsets_preset(LayoutPreset::PRESET_TOP_LEFT, LayoutPresetMode::PRESET_MODE_KEEP_SIZE);
-			set_grow_direction_preset(LayoutPreset::PRESET_TOP_LEFT);
-		}
-	} else {
-		if (has_meta("_edit_layout_mode")) {
-			remove_meta("_edit_layout_mode");
-			list_changed = true;
-		}
+	if (data.stored_layout_mode == LayoutMode::LAYOUT_MODE_POSITION) {
+		data.stored_use_custom_anchors = false;
+		set_anchors_and_offsets_preset(LayoutPreset::PRESET_TOP_LEFT, LayoutPresetMode::PRESET_MODE_KEEP_SIZE);
+		set_grow_direction_preset(LayoutPreset::PRESET_TOP_LEFT);
 	}
 	}
 
 
 	if (list_changed) {
 	if (list_changed) {
@@ -832,33 +843,43 @@ Control::LayoutMode Control::_get_layout_mode() const {
 	if (_get_anchors_layout_preset() != (int)LayoutPreset::PRESET_TOP_LEFT) {
 	if (_get_anchors_layout_preset() != (int)LayoutPreset::PRESET_TOP_LEFT) {
 		return LayoutMode::LAYOUT_MODE_ANCHORS;
 		return LayoutMode::LAYOUT_MODE_ANCHORS;
 	}
 	}
-	// Otherwise check what was saved.
-	if (has_meta("_edit_layout_mode")) {
-		return (LayoutMode)(int)get_meta("_edit_layout_mode");
+
+	// Otherwise fallback on what's stored.
+	return data.stored_layout_mode;
+}
+
+Control::LayoutMode Control::_get_default_layout_mode() const {
+	Node *parent_node = get_parent_control();
+	// In these modes the property is read-only.
+	if (!parent_node) {
+		return LayoutMode::LAYOUT_MODE_UNCONTROLLED;
+	} else if (Object::cast_to<Container>(parent_node)) {
+		return LayoutMode::LAYOUT_MODE_CONTAINER;
 	}
 	}
-	// Or fallback on default.
+
+	// Otherwise fallback on the position mode.
 	return LayoutMode::LAYOUT_MODE_POSITION;
 	return LayoutMode::LAYOUT_MODE_POSITION;
 }
 }
 
 
 void Control::_set_anchors_layout_preset(int p_preset) {
 void Control::_set_anchors_layout_preset(int p_preset) {
 	bool list_changed = false;
 	bool list_changed = false;
 
 
-	if (get_meta("_edit_layout_mode", LayoutMode::LAYOUT_MODE_ANCHORS).operator int() != LayoutMode::LAYOUT_MODE_ANCHORS) {
+	if (data.stored_layout_mode != LayoutMode::LAYOUT_MODE_ANCHORS) {
 		list_changed = true;
 		list_changed = true;
-		set_meta("_edit_layout_mode", LayoutMode::LAYOUT_MODE_ANCHORS);
+		data.stored_layout_mode = LayoutMode::LAYOUT_MODE_ANCHORS;
 	}
 	}
 
 
 	if (p_preset == -1) {
 	if (p_preset == -1) {
-		if (!get_meta("_edit_use_custom_anchors", false)) {
-			set_meta("_edit_use_custom_anchors", true);
+		if (!data.stored_use_custom_anchors) {
+			data.stored_use_custom_anchors = true;
 			notify_property_list_changed();
 			notify_property_list_changed();
 		}
 		}
 		return; // Keep settings as is.
 		return; // Keep settings as is.
 	}
 	}
 
 
-	if (get_meta("_edit_use_custom_anchors", true)) {
+	if (data.stored_use_custom_anchors) {
 		list_changed = true;
 		list_changed = true;
-		remove_meta("_edit_use_custom_anchors");
+		data.stored_use_custom_anchors = false;
 	}
 	}
 
 
 	LayoutPreset preset = (LayoutPreset)p_preset;
 	LayoutPreset preset = (LayoutPreset)p_preset;
@@ -899,7 +920,7 @@ void Control::_set_anchors_layout_preset(int p_preset) {
 
 
 int Control::_get_anchors_layout_preset() const {
 int Control::_get_anchors_layout_preset() const {
 	// If the custom preset was selected by user, use it.
 	// If the custom preset was selected by user, use it.
-	if ((bool)get_meta("_edit_use_custom_anchors", false)) {
+	if (data.stored_use_custom_anchors) {
 		return -1;
 		return -1;
 	}
 	}
 
 
@@ -3391,7 +3412,7 @@ void Control::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction");
-	ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_mode", PROPERTY_HINT_ENUM, "Position,Anchors,Container,Uncontrolled", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_layout_mode", "_get_layout_mode");
+	ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_mode", PROPERTY_HINT_ENUM, "Position,Anchors,Container,Uncontrolled", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_layout_mode", "_get_layout_mode");
 	ADD_PROPERTY_DEFAULT("layout_mode", LayoutMode::LAYOUT_MODE_POSITION);
 	ADD_PROPERTY_DEFAULT("layout_mode", LayoutMode::LAYOUT_MODE_POSITION);
 
 
 	const String anchors_presets_options = "Custom:-1,PresetFullRect:15,"
 	const String anchors_presets_options = "Custom:-1,PresetFullRect:15,"
@@ -3399,7 +3420,7 @@ void Control::_bind_methods() {
 										   "PresetCenterLeft:4,PresetCenterTop:5,PresetCenterRight:6,PresetCenterBottom:7,PresetCenter:8,"
 										   "PresetCenterLeft:4,PresetCenterTop:5,PresetCenterRight:6,PresetCenterBottom:7,PresetCenter:8,"
 										   "PresetLeftWide:9,PresetTopWide:10,PresetRightWide:11,PresetBottomWide:12,PresetVCenterWide:13,PresetHCenterWide:14";
 										   "PresetLeftWide:9,PresetTopWide:10,PresetRightWide:11,PresetBottomWide:12,PresetVCenterWide:13,PresetHCenterWide:14";
 
 
-	ADD_PROPERTY(PropertyInfo(Variant::INT, "anchors_preset", PROPERTY_HINT_ENUM, anchors_presets_options, PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_anchors_layout_preset", "_get_anchors_layout_preset");
+	ADD_PROPERTY(PropertyInfo(Variant::INT, "anchors_preset", PROPERTY_HINT_ENUM, anchors_presets_options, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_anchors_layout_preset", "_get_anchors_layout_preset");
 	ADD_PROPERTY_DEFAULT("anchors_preset", -1);
 	ADD_PROPERTY_DEFAULT("anchors_preset", -1);
 
 
 	ADD_SUBGROUP_INDENT("Anchor Points", "anchor_", 1);
 	ADD_SUBGROUP_INDENT("Anchor Points", "anchor_", 1);

+ 7 - 0
scene/gui/control.h

@@ -170,6 +170,9 @@ private:
 
 
 		// Positioning and sizing.
 		// Positioning and sizing.
 
 
+		LayoutMode stored_layout_mode = LayoutMode::LAYOUT_MODE_POSITION;
+		bool stored_use_custom_anchors = false;
+
 		real_t offset[4] = { 0.0, 0.0, 0.0, 0.0 };
 		real_t offset[4] = { 0.0, 0.0, 0.0, 0.0 };
 		real_t anchor[4] = { ANCHOR_BEGIN, ANCHOR_BEGIN, ANCHOR_BEGIN, ANCHOR_BEGIN };
 		real_t anchor[4] = { ANCHOR_BEGIN, ANCHOR_BEGIN, ANCHOR_BEGIN, ANCHOR_BEGIN };
 		FocusMode focus_mode = FOCUS_NONE;
 		FocusMode focus_mode = FOCUS_NONE;
@@ -275,6 +278,7 @@ private:
 
 
 	void _set_layout_mode(LayoutMode p_mode);
 	void _set_layout_mode(LayoutMode p_mode);
 	LayoutMode _get_layout_mode() const;
 	LayoutMode _get_layout_mode() const;
+	LayoutMode _get_default_layout_mode() const;
 	void _set_anchors_layout_preset(int p_preset);
 	void _set_anchors_layout_preset(int p_preset);
 	int _get_anchors_layout_preset() const;
 	int _get_anchors_layout_preset() const;
 
 
@@ -319,6 +323,9 @@ protected:
 	void _get_property_list(List<PropertyInfo> *p_list) const;
 	void _get_property_list(List<PropertyInfo> *p_list) const;
 	virtual void _validate_property(PropertyInfo &property) const override;
 	virtual void _validate_property(PropertyInfo &property) const override;
 
 
+	bool _property_can_revert(const StringName &p_name) const;
+	bool _property_get_revert(const StringName &p_name, Variant &r_property) const;
+
 	// Internationalization.
 	// Internationalization.
 
 
 	virtual Array structured_text_parser(TextServer::StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const;
 	virtual Array structured_text_parser(TextServer::StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const;