Merge pull request #104614 from kleonc/control_layout_mode_fallback_to_valid_value
Fallback `Control.layout_mode` to valid mode when child of non-container control
This commit is contained in:
@ -473,9 +473,9 @@ void Control::_validate_property(PropertyInfo &p_property) const {
|
||||
}
|
||||
|
||||
// Validate which positioning properties should be displayed depending on the parent and the layout mode.
|
||||
Node *parent_node = get_parent_control();
|
||||
if (!parent_node) {
|
||||
// If there is no parent, display both anchor and container options.
|
||||
Control *parent_control = get_parent_control();
|
||||
if (!parent_control) {
|
||||
// If there is no parent control, display both anchor and container options.
|
||||
|
||||
// Set the layout mode to be disabled with the proper value.
|
||||
if (p_property.name == "layout_mode") {
|
||||
@ -488,7 +488,7 @@ void Control::_validate_property(PropertyInfo &p_property) const {
|
||||
if (!use_custom_anchors && (p_property.name.begins_with("anchor_") || p_property.name.begins_with("offset_") || p_property.name.begins_with("grow_"))) {
|
||||
p_property.usage ^= PROPERTY_USAGE_EDITOR;
|
||||
}
|
||||
} else if (Object::cast_to<Container>(parent_node)) {
|
||||
} else if (Object::cast_to<Container>(parent_control)) {
|
||||
// If the parent is a container, display only container-related properties.
|
||||
if (p_property.name.begins_with("anchor_") || p_property.name.begins_with("offset_") || p_property.name.begins_with("grow_") || p_property.name == "anchors_preset") {
|
||||
p_property.usage ^= PROPERTY_USAGE_DEFAULT;
|
||||
@ -500,7 +500,7 @@ void Control::_validate_property(PropertyInfo &p_property) const {
|
||||
p_property.usage |= PROPERTY_USAGE_READ_ONLY;
|
||||
} else if (p_property.name == "size_flags_horizontal" || p_property.name == "size_flags_vertical") {
|
||||
// Filter allowed size flags based on the parent container configuration.
|
||||
Container *parent_container = Object::cast_to<Container>(parent_node);
|
||||
Container *parent_container = Object::cast_to<Container>(parent_control);
|
||||
Vector<int> size_flags;
|
||||
if (p_property.name == "size_flags_horizontal") {
|
||||
size_flags = parent_container->get_allowed_size_flags_horizontal();
|
||||
@ -540,7 +540,7 @@ void Control::_validate_property(PropertyInfo &p_property) const {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If the parent is NOT a container or not a control at all, display only anchoring-related properties.
|
||||
// If the parent is a non-container control, display only anchoring-related properties.
|
||||
if (p_property.name.begins_with("size_flags_")) {
|
||||
p_property.usage ^= PROPERTY_USAGE_EDITOR;
|
||||
|
||||
@ -562,7 +562,7 @@ void Control::_validate_property(PropertyInfo &p_property) const {
|
||||
}
|
||||
|
||||
// Disable the property if it's managed by the parent container.
|
||||
if (!Object::cast_to<Container>(parent_node)) {
|
||||
if (!Object::cast_to<Container>(parent_control)) {
|
||||
return;
|
||||
}
|
||||
bool property_is_managed_by_container = false;
|
||||
@ -897,11 +897,11 @@ void Control::_update_layout_mode() {
|
||||
}
|
||||
|
||||
Control::LayoutMode Control::_get_layout_mode() const {
|
||||
Node *parent_node = get_parent_control();
|
||||
Control *parent_control = get_parent_control();
|
||||
// In these modes the property is read-only.
|
||||
if (!parent_node) {
|
||||
if (!parent_control) {
|
||||
return LayoutMode::LAYOUT_MODE_UNCONTROLLED;
|
||||
} else if (Object::cast_to<Container>(parent_node)) {
|
||||
} else if (Object::cast_to<Container>(parent_control)) {
|
||||
return LayoutMode::LAYOUT_MODE_CONTAINER;
|
||||
}
|
||||
|
||||
@ -910,20 +910,25 @@ Control::LayoutMode Control::_get_layout_mode() const {
|
||||
return LayoutMode::LAYOUT_MODE_ANCHORS;
|
||||
}
|
||||
|
||||
// Otherwise fallback on what's stored.
|
||||
return data.stored_layout_mode;
|
||||
// Only position/anchors modes are valid for non-container control parent.
|
||||
if (data.stored_layout_mode == LayoutMode::LAYOUT_MODE_POSITION || data.stored_layout_mode == LayoutMode::LAYOUT_MODE_ANCHORS) {
|
||||
return data.stored_layout_mode;
|
||||
}
|
||||
|
||||
// Otherwise fallback to position mode.
|
||||
return LayoutMode::LAYOUT_MODE_POSITION;
|
||||
}
|
||||
|
||||
Control::LayoutMode Control::_get_default_layout_mode() const {
|
||||
Node *parent_node = get_parent_control();
|
||||
Control *parent_control = get_parent_control();
|
||||
// In these modes the property is read-only.
|
||||
if (!parent_node) {
|
||||
if (!parent_control) {
|
||||
return LayoutMode::LAYOUT_MODE_UNCONTROLLED;
|
||||
} else if (Object::cast_to<Container>(parent_node)) {
|
||||
} else if (Object::cast_to<Container>(parent_control)) {
|
||||
return LayoutMode::LAYOUT_MODE_CONTAINER;
|
||||
}
|
||||
|
||||
// Otherwise fallback on the position mode.
|
||||
// Otherwise fallback to the position mode.
|
||||
return LayoutMode::LAYOUT_MODE_POSITION;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user