mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 05:31:01 +00:00 
			
		
		
		
	Small improvements to the Spatial Editor's multiple viewport mode
This commit is contained in:
		
							parent
							
								
									8c435a343e
								
							
						
					
					
						commit
						7d13f6ad30
					
				
					 6 changed files with 293 additions and 54 deletions
				
			
		|  | @ -3546,69 +3546,77 @@ void SpatialEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) | |||
| 
 | ||||
| 	Ref<InputEventMouseButton> mb = p_event; | ||||
| 
 | ||||
| 	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { | ||||
| 	if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { | ||||
| 
 | ||||
| 		Vector2 size = get_size(); | ||||
| 		if (mb->is_pressed()) { | ||||
| 			Vector2 size = get_size(); | ||||
| 
 | ||||
| 		int h_sep = get_constant("separation", "HSplitContainer"); | ||||
| 		int v_sep = get_constant("separation", "VSplitContainer"); | ||||
| 			int h_sep = get_constant("separation", "HSplitContainer"); | ||||
| 			int v_sep = get_constant("separation", "VSplitContainer"); | ||||
| 
 | ||||
| 		int mid_w = size.width * ratio_h; | ||||
| 		int mid_h = size.height * ratio_v; | ||||
| 			int mid_w = size.width * ratio_h; | ||||
| 			int mid_h = size.height * ratio_v; | ||||
| 
 | ||||
| 		dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2); | ||||
| 		dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2); | ||||
| 			dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2); | ||||
| 			dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2); | ||||
| 
 | ||||
| 		drag_begin_pos = mb->get_position(); | ||||
| 		drag_begin_ratio.x = ratio_h; | ||||
| 		drag_begin_ratio.y = ratio_v; | ||||
| 			drag_begin_pos = mb->get_position(); | ||||
| 			drag_begin_ratio.x = ratio_h; | ||||
| 			drag_begin_ratio.y = ratio_v; | ||||
| 
 | ||||
| 		switch (view) { | ||||
| 			case VIEW_USE_1_VIEWPORT: { | ||||
| 			switch (view) { | ||||
| 				case VIEW_USE_1_VIEWPORT: { | ||||
| 
 | ||||
| 				dragging_h = false; | ||||
| 				dragging_v = false; | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_2_VIEWPORTS: { | ||||
| 
 | ||||
| 				dragging_h = false; | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_2_VIEWPORTS_ALT: { | ||||
| 
 | ||||
| 				dragging_v = false; | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_3_VIEWPORTS: { | ||||
| 
 | ||||
| 				if (dragging_v) | ||||
| 					dragging_h = false; | ||||
| 				else | ||||
| 					dragging_v = false; | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_3_VIEWPORTS_ALT: { | ||||
| 				} break; | ||||
| 				case VIEW_USE_2_VIEWPORTS: { | ||||
| 
 | ||||
| 				if (dragging_h) | ||||
| 					dragging_v = false; | ||||
| 				else | ||||
| 					dragging_h = false; | ||||
| 			} break; | ||||
| 			case VIEW_USE_4_VIEWPORTS: { | ||||
| 
 | ||||
| 			} break; | ||||
| 				} break; | ||||
| 				case VIEW_USE_2_VIEWPORTS_ALT: { | ||||
| 
 | ||||
| 					dragging_v = false; | ||||
| 
 | ||||
| 				} break; | ||||
| 				case VIEW_USE_3_VIEWPORTS: | ||||
| 				case VIEW_USE_3_VIEWPORTS_ALT: | ||||
| 				case VIEW_USE_4_VIEWPORTS: { | ||||
| 
 | ||||
| 					// Do nothing.
 | ||||
| 
 | ||||
| 				} break; | ||||
| 			} | ||||
| 		} else { | ||||
| 			dragging_h = false; | ||||
| 			dragging_v = false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { | ||||
| 		dragging_h = false; | ||||
| 		dragging_v = false; | ||||
| 	} | ||||
| 
 | ||||
| 	Ref<InputEventMouseMotion> mm = p_event; | ||||
| 
 | ||||
| 	if (mm.is_valid() && (dragging_h || dragging_v)) { | ||||
| 	if (mm.is_valid()) { | ||||
| 
 | ||||
| 		if (view == VIEW_USE_3_VIEWPORTS || view == VIEW_USE_3_VIEWPORTS_ALT || view == VIEW_USE_4_VIEWPORTS) { | ||||
| 			Vector2 size = get_size(); | ||||
| 
 | ||||
| 			int h_sep = get_constant("separation", "HSplitContainer"); | ||||
| 			int v_sep = get_constant("separation", "VSplitContainer"); | ||||
| 
 | ||||
| 			int mid_w = size.width * ratio_h; | ||||
| 			int mid_h = size.height * ratio_v; | ||||
| 
 | ||||
| 			bool was_hovering_h = hovering_h; | ||||
| 			bool was_hovering_v = hovering_v; | ||||
| 			hovering_h = mm->get_position().x > (mid_w - h_sep / 2) && mm->get_position().x < (mid_w + h_sep / 2); | ||||
| 			hovering_v = mm->get_position().y > (mid_h - v_sep / 2) && mm->get_position().y < (mid_h + v_sep / 2); | ||||
| 
 | ||||
| 			if (was_hovering_h != hovering_h || was_hovering_v != hovering_v) { | ||||
| 				update(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (dragging_h) { | ||||
| 			float new_ratio = drag_begin_ratio.x + (mm->get_position().x - drag_begin_pos.x) / get_size().width; | ||||
|  | @ -3638,9 +3646,12 @@ void SpatialEditorViewportContainer::_notification(int p_what) { | |||
| 	if (p_what == NOTIFICATION_DRAW && mouseover) { | ||||
| 
 | ||||
| 		Ref<Texture> h_grabber = get_icon("grabber", "HSplitContainer"); | ||||
| 
 | ||||
| 		Ref<Texture> v_grabber = get_icon("grabber", "VSplitContainer"); | ||||
| 
 | ||||
| 		Ref<Texture> hdiag_grabber = get_icon("GuiViewportHdiagsplitter", "EditorIcons"); | ||||
| 		Ref<Texture> vdiag_grabber = get_icon("GuiViewportVdiagsplitter", "EditorIcons"); | ||||
| 		Ref<Texture> vh_grabber = get_icon("GuiViewportVhsplitter", "EditorIcons"); | ||||
| 
 | ||||
| 		Vector2 size = get_size(); | ||||
| 
 | ||||
| 		int h_sep = get_constant("separation", "HSplitContainer"); | ||||
|  | @ -3657,35 +3668,62 @@ void SpatialEditorViewportContainer::_notification(int p_what) { | |||
| 
 | ||||
| 			case VIEW_USE_1_VIEWPORT: { | ||||
| 
 | ||||
| 				//nothing to show
 | ||||
| 				// Nothing to show.
 | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_2_VIEWPORTS: { | ||||
| 
 | ||||
| 				draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); | ||||
| 				set_default_cursor_shape(CURSOR_VSPLIT); | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_2_VIEWPORTS_ALT: { | ||||
| 
 | ||||
| 				draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); | ||||
| 				set_default_cursor_shape(CURSOR_HSPLIT); | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_3_VIEWPORTS: { | ||||
| 
 | ||||
| 				draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); | ||||
| 				draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2)); | ||||
| 				if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { | ||||
| 					draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4)); | ||||
| 					set_default_cursor_shape(CURSOR_DRAG); | ||||
| 				} else if ((hovering_v && !dragging_h) || dragging_v) { | ||||
| 					draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); | ||||
| 					set_default_cursor_shape(CURSOR_VSPLIT); | ||||
| 				} else if (hovering_h || dragging_h) { | ||||
| 					draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2)); | ||||
| 					set_default_cursor_shape(CURSOR_HSPLIT); | ||||
| 				} | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_3_VIEWPORTS_ALT: { | ||||
| 
 | ||||
| 				draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); | ||||
| 				draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); | ||||
| 				if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { | ||||
| 					draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2)); | ||||
| 					set_default_cursor_shape(CURSOR_DRAG); | ||||
| 				} else if ((hovering_v && !dragging_h) || dragging_v) { | ||||
| 					draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); | ||||
| 					set_default_cursor_shape(CURSOR_VSPLIT); | ||||
| 				} else if (hovering_h || dragging_h) { | ||||
| 					draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); | ||||
| 					set_default_cursor_shape(CURSOR_HSPLIT); | ||||
| 				} | ||||
| 
 | ||||
| 			} break; | ||||
| 			case VIEW_USE_4_VIEWPORTS: { | ||||
| 
 | ||||
| 				Vector2 half(mid_w, mid_h); | ||||
| 				draw_texture(v_grabber, half - v_grabber->get_size() / 2.0); | ||||
| 				draw_texture(h_grabber, half - h_grabber->get_size() / 2.0); | ||||
| 				if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { | ||||
| 					draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0); | ||||
| 					set_default_cursor_shape(CURSOR_DRAG); | ||||
| 				} else if ((hovering_v && !dragging_h) || dragging_v) { | ||||
| 					draw_texture(v_grabber, half - v_grabber->get_size() / 2.0); | ||||
| 					set_default_cursor_shape(CURSOR_VSPLIT); | ||||
| 				} else if (hovering_h || dragging_h) { | ||||
| 					draw_texture(h_grabber, half - h_grabber->get_size() / 2.0); | ||||
| 					set_default_cursor_shape(CURSOR_HSPLIT); | ||||
| 				} | ||||
| 
 | ||||
| 			} break; | ||||
| 		} | ||||
|  | @ -3829,10 +3867,13 @@ void SpatialEditorViewportContainer::_bind_methods() { | |||
| 
 | ||||
| SpatialEditorViewportContainer::SpatialEditorViewportContainer() { | ||||
| 
 | ||||
| 	set_clip_contents(true); | ||||
| 	view = VIEW_USE_1_VIEWPORT; | ||||
| 	mouseover = false; | ||||
| 	ratio_h = 0.5; | ||||
| 	ratio_v = 0.5; | ||||
| 	hovering_v = false; | ||||
| 	hovering_h = false; | ||||
| 	dragging_v = false; | ||||
| 	dragging_h = false; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Michael Alexsander Silva Dias
						Michael Alexsander Silva Dias