浏览代码

-Changed how popups work in Viewport to make them a lot less invasive to the scene tree

Juan Linietsky 9 年之前
父节点
当前提交
07e7909480
共有 2 个文件被更改,包括 51 次插入27 次删除
  1. 49 26
      scene/main/viewport.cpp
  2. 2 1
      scene/main/viewport.h

+ 49 - 26
scene/main/viewport.cpp

@@ -406,7 +406,7 @@ void Viewport::_notification(int p_what) {
 		case NOTIFICATION_EXIT_TREE: {
 
 
-
+			_gui_cancel_tooltip();
 			if (world_2d.is_valid())
 				world_2d->_remove_viewport(this);
 
@@ -434,6 +434,12 @@ void Viewport::_notification(int p_what) {
 		} break;
 		case NOTIFICATION_FIXED_PROCESS: {
 
+			if (gui.tooltip_timer>=0) {
+				gui.tooltip_timer-=get_fixed_process_delta_time();
+				if (gui.tooltip_timer<0) {
+					_gui_show_tooltip();
+				}
+			}
 
 			if (get_tree()->is_debugging_collisions_hint() && contact_2d_debug.is_valid()) {
 
@@ -1376,10 +1382,11 @@ void Viewport::_gui_sort_roots() {
 void Viewport::_gui_cancel_tooltip() {
 
 	gui.tooltip=NULL;
-	if (gui.tooltip_timer)
-		gui.tooltip_timer->stop();
-	if (gui.tooltip_popup)
-		gui.tooltip_popup->hide();
+	gui.tooltip_timer=-1;
+	if (gui.tooltip_popup) {
+		gui.tooltip_popup->queue_delete();
+		gui.tooltip_popup=NULL;
+	}
 
 }
 
@@ -1393,10 +1400,25 @@ void Viewport::_gui_show_tooltip() {
 	if (tooltip.length()==0)
 		return; // bye
 
+	if (gui.tooltip_popup) {
+		memdelete(gui.tooltip_popup);
+		gui.tooltip_popup=NULL;
+	}
 
-	if (!gui.tooltip_label) {
+	Control *rp = gui.tooltip->get_root_parent_control();
+	if (!rp)
 		return;
-	}
+
+
+	gui.tooltip_popup = memnew( TooltipPanel );
+
+	rp->add_child(gui.tooltip_popup);
+	gui.tooltip_popup->force_parent_owned();
+	gui.tooltip_label = memnew( TooltipLabel );
+	gui.tooltip_popup->add_child(gui.tooltip_label);
+	gui.tooltip_popup->set_as_toplevel(true);
+	gui.tooltip_popup->hide();
+
 	Ref<StyleBox> ttp = gui.tooltip_label->get_stylebox("panel","TooltipPanel");
 
 	gui.tooltip_label->set_anchor_and_margin(MARGIN_LEFT,Control::ANCHOR_BEGIN,ttp->get_margin(MARGIN_LEFT));
@@ -1416,11 +1438,10 @@ void Viewport::_gui_show_tooltip() {
 	else if (r.pos.y<0)
 		r.pos.y=0;
 
-	gui.tooltip_popup->set_pos(r.pos);
+	gui.tooltip_popup->set_global_pos(r.pos);
 	gui.tooltip_popup->set_size(r.size);
 
 	gui.tooltip_popup->raise();
-
 	gui.tooltip_popup->show();
 }
 
@@ -1660,7 +1681,8 @@ void Viewport::_gui_input_event(InputEvent p_event) {
 				get_tree()->call_group(SceneTree::GROUP_CALL_REALTIME,"windows","_cancel_input_ID",p_event.ID);
 				get_tree()->set_input_as_handled();
 
-				gui.tooltip_popup->hide();
+				_gui_cancel_tooltip();
+				//gui.tooltip_popup->hide();
 
 			} else {
 
@@ -1792,7 +1814,7 @@ void Viewport::_gui_input_event(InputEvent p_event) {
 			p_event.mouse_motion.relative_x=rel.x;
 			p_event.mouse_motion.relative_y=rel.y;
 
-			if (p_event.mouse_motion.button_mask==0 && gui.tooltip_timer) {
+			if (p_event.mouse_motion.button_mask==0) {
 				//nothing pressed
 
 				bool can_tooltip=true;
@@ -1808,7 +1830,8 @@ void Viewport::_gui_input_event(InputEvent p_event) {
 
 					gui.tooltip=over;
 					gui.tooltip_pos=mpos;//(parent_xform * get_transform()).affine_inverse().xform(pos);
-					gui.tooltip_timer->start();
+					gui.tooltip_timer=gui.tooltip_delay;
+
 				}
 			}
 
@@ -2053,8 +2076,10 @@ void Viewport::_gui_hid_control(Control *p_control) {
 		gui.mouse_over=NULL;
 	if (gui.tooltip == p_control)
 		gui.tooltip=NULL;
-	if (gui.tooltip == p_control)
+	if (gui.tooltip == p_control) {
 		gui.tooltip=NULL;
+		_gui_cancel_tooltip();
+	}
 
 }
 
@@ -2069,6 +2094,9 @@ void Viewport::_gui_remove_control(Control *p_control) {
 		gui.mouse_over=NULL;
 	if (gui.tooltip == p_control)
 		gui.tooltip=NULL;
+	if (gui.tooltip_popup == p_control) {
+		_gui_cancel_tooltip();
+	}
 
 
 }
@@ -2461,21 +2489,16 @@ Viewport::Viewport() {
 	disable_input=false;
 
 	//window tooltip
-	gui.tooltip_timer = memnew( Timer );
-	add_child(gui.tooltip_timer);
-	gui.tooltip_timer->force_parent_owned();
-	gui.tooltip_timer->set_wait_time( GLOBAL_DEF("display/tooltip_delay",0.7));
-	gui.tooltip_timer->connect("timeout",this,"_gui_show_tooltip");
+	gui.tooltip_timer = -1;
+
+	//gui.tooltip_timer->force_parent_owned();
+	gui.tooltip_delay=GLOBAL_DEF("display/tooltip_delay",0.7);
+
 	gui.tooltip=NULL;
-	gui.tooltip_popup = memnew( TooltipPanel );
-	add_child(gui.tooltip_popup);
-	gui.tooltip_popup->force_parent_owned();
-	gui.tooltip_label = memnew( TooltipLabel );
-	gui.tooltip_popup->add_child(gui.tooltip_label);
-	gui.tooltip_popup->set_as_toplevel(true);
-	gui.tooltip_popup->hide();
-	gui.drag_attempted=false;
+	gui.tooltip_label=NULL;
 	gui.drag_preview=NULL;
+	gui.drag_attempted=false;
+
 
 	parent_control=NULL;
 

+ 2 - 1
scene/main/viewport.h

@@ -187,7 +187,8 @@ friend class RenderTargetTexture;
 		bool drag_attempted;
 		Variant drag_data;
 		Control *drag_preview;
-		Timer *tooltip_timer;
+		float tooltip_timer;
+		float tooltip_delay;
 		List<Control*> modal_stack;
 		unsigned int cancelled_input_ID;
 		Matrix32 focus_inv_xform;