瀏覽代碼

Fixes set_anchors_and_margins_preset()

Gilles Roudiere 8 年之前
父節點
當前提交
bd8a5fba30
共有 1 個文件被更改,包括 65 次插入35 次删除
  1. 65 35
      scene/gui/control.cpp

+ 65 - 35
scene/gui/control.cpp

@@ -1472,102 +1472,132 @@ void Control::set_anchors_preset(LayoutPreset p_preset, bool p_keep_margin) {
 }
 
 void Control::set_margins_preset(LayoutPreset p_preset, LayoutPresetMode p_resize_mode, int p_margin) {
-	if (!is_inside_tree())
-		return;
-
-	Point2 new_pos;
+	// Calculate the size if the node is not resized
 	Size2 min_size = get_minimum_size();
 	Size2 new_size = get_size();
-	Size2 parent_size = get_parent_area_size();
+	if (p_resize_mode == PRESET_MODE_MINSIZE || p_resize_mode == PRESET_MODE_KEEP_HEIGHT) {
+		new_size.x = min_size.x;
+	}
+	if (p_resize_mode == PRESET_MODE_MINSIZE || p_resize_mode == PRESET_MODE_KEEP_WIDTH) {
+		new_size.y = min_size.y;
+	}
+
+	float pw = _get_parent_range(0);
+	float ph = _get_parent_range(1);
 
-	// Width
+	//Left
 	switch (p_preset) {
+		case PRESET_TOP_LEFT:
+		case PRESET_BOTTOM_LEFT:
+		case PRESET_CENTER_LEFT:
 		case PRESET_TOP_WIDE:
 		case PRESET_BOTTOM_WIDE:
+		case PRESET_LEFT_WIDE:
 		case PRESET_HCENTER_WIDE:
 		case PRESET_WIDE:
-			new_size.x = parent_size.x - 2 * p_margin;
+			data.margin[0] = pw * (0.0 - data.anchor[0]) + p_margin;
 			break;
-		default:
-			if (p_resize_mode == PRESET_MODE_MINSIZE || p_resize_mode == PRESET_MODE_KEEP_HEIGHT) {
-				new_size.x = min_size.x;
-			}
+
+		case PRESET_CENTER_TOP:
+		case PRESET_CENTER_BOTTOM:
+		case PRESET_CENTER:
+		case PRESET_VCENTER_WIDE:
+			data.margin[0] = pw * (0.5 - data.anchor[0]) - new_size.x / 2;
+			break;
+
+		case PRESET_TOP_RIGHT:
+		case PRESET_BOTTOM_RIGHT:
+		case PRESET_CENTER_RIGHT:
+		case PRESET_RIGHT_WIDE:
+			data.margin[0] = pw * (1.0 - data.anchor[0]) - new_size.x - p_margin;
 			break;
 	}
 
-	// Height
+	// Top
 	switch (p_preset) {
+		case PRESET_TOP_LEFT:
+		case PRESET_TOP_RIGHT:
+		case PRESET_CENTER_TOP:
 		case PRESET_LEFT_WIDE:
 		case PRESET_RIGHT_WIDE:
+		case PRESET_TOP_WIDE:
 		case PRESET_VCENTER_WIDE:
 		case PRESET_WIDE:
-			new_size.y = parent_size.y - 2 * p_margin;
+			data.margin[1] = ph * (0.0 - data.anchor[1]) + p_margin;
 			break;
-		default:
-			if (p_resize_mode == PRESET_MODE_MINSIZE || p_resize_mode == PRESET_MODE_KEEP_WIDTH) {
-				new_size.y = min_size.y;
-			}
+
+		case PRESET_CENTER_LEFT:
+		case PRESET_CENTER_RIGHT:
+		case PRESET_CENTER:
+		case PRESET_HCENTER_WIDE:
+			data.margin[1] = ph * (0.5 - data.anchor[1]) - new_size.y / 2;
+			break;
+
+		case PRESET_BOTTOM_LEFT:
+		case PRESET_BOTTOM_RIGHT:
+		case PRESET_CENTER_BOTTOM:
+		case PRESET_BOTTOM_WIDE:
+			data.margin[1] = ph * (1.0 - data.anchor[1]) - new_size.y - p_margin;
 			break;
 	}
 
-	// x pos
+	// Right
 	switch (p_preset) {
 		case PRESET_TOP_LEFT:
 		case PRESET_BOTTOM_LEFT:
 		case PRESET_CENTER_LEFT:
-		case PRESET_TOP_WIDE:
-		case PRESET_BOTTOM_WIDE:
 		case PRESET_LEFT_WIDE:
-		case PRESET_HCENTER_WIDE:
-		case PRESET_WIDE:
-			new_pos.x = p_margin;
+			data.margin[2] = pw * (0.0 - data.anchor[2]) + new_size.x + p_margin;
 			break;
 
 		case PRESET_CENTER_TOP:
 		case PRESET_CENTER_BOTTOM:
 		case PRESET_CENTER:
 		case PRESET_VCENTER_WIDE:
-			new_pos.x = (parent_size.x - new_size.x) / 2.0;
+			data.margin[2] = pw * (0.5 - data.anchor[2]) + new_size.x / 2;
 			break;
 
 		case PRESET_TOP_RIGHT:
 		case PRESET_BOTTOM_RIGHT:
 		case PRESET_CENTER_RIGHT:
+		case PRESET_TOP_WIDE:
 		case PRESET_RIGHT_WIDE:
-			new_pos.x = parent_size.x - new_size.x - p_margin;
+		case PRESET_BOTTOM_WIDE:
+		case PRESET_HCENTER_WIDE:
+		case PRESET_WIDE:
+			data.margin[2] = pw * (1.0 - data.anchor[2]) - p_margin;
 			break;
 	}
 
-	// y pos
+	// Bottom
 	switch (p_preset) {
 		case PRESET_TOP_LEFT:
 		case PRESET_TOP_RIGHT:
 		case PRESET_CENTER_TOP:
-		case PRESET_LEFT_WIDE:
-		case PRESET_RIGHT_WIDE:
 		case PRESET_TOP_WIDE:
-		case PRESET_VCENTER_WIDE:
-		case PRESET_WIDE:
-			new_pos.y = p_margin;
+			data.margin[3] = ph * (0.0 - data.anchor[3]) + new_size.y + p_margin;
 			break;
 
 		case PRESET_CENTER_LEFT:
 		case PRESET_CENTER_RIGHT:
 		case PRESET_CENTER:
 		case PRESET_HCENTER_WIDE:
-			new_pos.y = (parent_size.y - new_size.y) / 2.0;
+			data.margin[3] = ph * (0.5 - data.anchor[3]) + new_size.y / 2;
 			break;
 
 		case PRESET_BOTTOM_LEFT:
 		case PRESET_BOTTOM_RIGHT:
 		case PRESET_CENTER_BOTTOM:
+		case PRESET_LEFT_WIDE:
+		case PRESET_RIGHT_WIDE:
 		case PRESET_BOTTOM_WIDE:
-			new_pos.y = parent_size.y - new_size.y - p_margin;
+		case PRESET_VCENTER_WIDE:
+		case PRESET_WIDE:
+			data.margin[3] = ph * (1.0 - data.anchor[3]) - p_margin;
 			break;
 	}
 
-	set_position(new_pos);
-	set_size(new_size);
+	_size_changed();
 }
 
 void Control::set_anchors_and_margins_preset(LayoutPreset p_preset, LayoutPresetMode p_resize_mode, int p_margin) {