Browse Source

-Fix tooltips in inspector, now they show as rich text.

Juan Linietsky 7 years ago
parent
commit
336db8bcd1

+ 2 - 1
editor/editor_help.cpp

@@ -1900,6 +1900,7 @@ void EditorHelpBit::_meta_clicked(String p_select) {
 void EditorHelpBit::_bind_methods() {
 
 	ClassDB::bind_method("_meta_clicked", &EditorHelpBit::_meta_clicked);
+	ClassDB::bind_method(D_METHOD("set_text", "text"), &EditorHelpBit::set_text);
 	ADD_SIGNAL(MethodInfo("request_hide"));
 }
 
@@ -1925,7 +1926,7 @@ EditorHelpBit::EditorHelpBit() {
 
 	rich_text = memnew(RichTextLabel);
 	add_child(rich_text);
-	rich_text->set_anchors_and_margins_preset(Control::PRESET_WIDE);
+	//rich_text->set_anchors_and_margins_preset(Control::PRESET_WIDE);
 	rich_text->connect("meta_clicked", this, "_meta_clicked");
 	rich_text->add_color_override("selection_color", get_color("text_editor/theme/selection_color", "Editor"));
 	rich_text->set_override_selected_font_color(false);

+ 3 - 2
editor/editor_help.h

@@ -272,9 +272,9 @@ public:
 	~EditorHelp();
 };
 
-class EditorHelpBit : public Panel {
+class EditorHelpBit : public PanelContainer {
 
-	GDCLASS(EditorHelpBit, Panel);
+	GDCLASS(EditorHelpBit, PanelContainer);
 
 	RichTextLabel *rich_text;
 	void _go_to_help(String p_what);
@@ -285,6 +285,7 @@ protected:
 	void _notification(int p_what);
 
 public:
+	RichTextLabel *get_rich_text() { return rich_text; }
 	void set_text(const String &p_text);
 	EditorHelpBit();
 };

+ 46 - 3
editor/editor_inspector.cpp

@@ -719,6 +719,24 @@ void EditorProperty::set_object_and_property(Object *p_object, const StringName
 	property = p_property;
 }
 
+Control *EditorProperty::make_custom_tooltip(const String &p_text) const {
+
+	tooltip_text = p_text;
+	EditorHelpBit *help_bit = memnew(EditorHelpBit);
+	help_bit->add_style_override("panel", get_stylebox("panel", "TooltipPanel"));
+	help_bit->get_rich_text()->set_fixed_size_to_width(300);
+
+	String text = TTR("Property: ") + "[u][b]" + p_text.get_slice("::", 0) + "[/b][/u]\n";
+	text += p_text.get_slice("::", 1).strip_edges();
+	help_bit->set_text(text);
+	help_bit->call_deferred("set_text", text); //hack so it uses proper theme once inside scene
+	return help_bit;
+}
+
+String EditorProperty::get_tooltip_text() const {
+	return tooltip_text;
+}
+
 void EditorProperty::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("set_label", "text"), &EditorProperty::set_label);
@@ -745,6 +763,8 @@ void EditorProperty::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_gui_input"), &EditorProperty::_gui_input);
 	ClassDB::bind_method(D_METHOD("_focusable_focused"), &EditorProperty::_focusable_focused);
 
+	ClassDB::bind_method(D_METHOD("get_tooltip_text"), &EditorProperty::get_tooltip_text);
+
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "label"), "set_label", "get_label");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checkable"), "set_checkable", "is_checkable");
@@ -919,6 +939,20 @@ void EditorInspectorCategory::_notification(int p_what) {
 	}
 }
 
+Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) const {
+
+	tooltip_text = p_text;
+	EditorHelpBit *help_bit = memnew(EditorHelpBit);
+	help_bit->add_style_override("panel", get_stylebox("panel", "TooltipPanel"));
+	help_bit->get_rich_text()->set_fixed_size_to_width(300);
+
+	String text = "[u][b]" + p_text.get_slice("::", 0) + "[/b][/u]\n";
+	text += p_text.get_slice("::", 1).strip_edges();
+	help_bit->set_text(text);
+	help_bit->call_deferred("set_text", text); //hack so it uses proper theme once inside scene
+	return help_bit;
+}
+
 Size2 EditorInspectorCategory::get_minimum_size() const {
 
 	Ref<Font> font = get_font("font", "Tree");
@@ -934,6 +968,15 @@ Size2 EditorInspectorCategory::get_minimum_size() const {
 	return ms;
 }
 
+void EditorInspectorCategory::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("get_tooltip_text"), &EditorInspectorCategory::get_tooltip_text);
+}
+
+String EditorInspectorCategory::get_tooltip_text() const {
+
+	return tooltip_text;
+}
+
 EditorInspectorCategory::EditorInspectorCategory() {
 }
 
@@ -1395,7 +1438,7 @@ void EditorInspector::update_tree() {
 					class_descr_cache[type] = descr.word_wrap(80);
 				}
 
-				category->set_tooltip(TTR("Class:") + " " + p.name + (class_descr_cache[type] == "" ? "" : "\n\n" + class_descr_cache[type]));
+				category->set_tooltip(p.name + "::" + (class_descr_cache[type] == "" ? "" : class_descr_cache[type]));
 			}
 
 			for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
@@ -1587,9 +1630,9 @@ void EditorInspector::update_tree() {
 					ep->connect("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
 					ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
 					if (doc_hint != String()) {
-						ep->set_tooltip(TTR("Property:") + " " + property_prefix + p.name + "\n\n" + doc_hint);
+						ep->set_tooltip(property_prefix + p.name + "::" + doc_hint);
 					} else {
-						ep->set_tooltip(TTR("Property:") + " " + property_prefix + p.name);
+						ep->set_tooltip(property_prefix + p.name);
 					}
 					ep->set_draw_red(draw_red);
 					ep->set_use_folding(use_folding);

+ 11 - 0
editor/editor_inspector.h

@@ -85,6 +85,8 @@ private:
 	Control *label_reference;
 	Control *bottom_editor;
 
+	mutable String tooltip_text;
+
 protected:
 	void _notification(int p_what);
 	static void _bind_methods();
@@ -143,6 +145,10 @@ public:
 	float get_name_split_ratio() const;
 
 	void set_object_and_property(Object *p_object, const StringName &p_property);
+	virtual Control *make_custom_tooltip(const String &p_text) const;
+
+	String get_tooltip_text() const;
+
 	EditorProperty();
 };
 
@@ -180,12 +186,17 @@ class EditorInspectorCategory : public Control {
 	Ref<Texture> icon;
 	String label;
 	Color bg_color;
+	mutable String tooltip_text;
 
 protected:
 	void _notification(int p_what);
+	static void _bind_methods();
 
 public:
 	virtual Size2 get_minimum_size() const;
+	virtual Control *make_custom_tooltip(const String &p_text) const;
+
+	String get_tooltip_text() const;
 
 	EditorInspectorCategory();
 };

+ 1 - 1
editor/editor_node.cpp

@@ -5270,7 +5270,7 @@ EditorNode::EditorNode() {
 	video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor."));
 	video_restart_dialog->get_ok()->set_text(TTR("Save & Restart"));
 	video_restart_dialog->connect("confirmed", this, "_menu_option", varray(SET_VIDEO_DRIVER_SAVE_AND_RESTART));
-	add_child(video_restart_dialog);
+	gui_base->add_child(video_restart_dialog);
 
 	progress_hb = memnew(BackgroundProgress);
 

+ 8 - 0
scene/gui/control.cpp

@@ -2188,10 +2188,17 @@ void Control::set_tooltip(const String &p_tooltip) {
 
 	data.tooltip = p_tooltip;
 }
+
 String Control::get_tooltip(const Point2 &p_pos) const {
 
 	return data.tooltip;
 }
+Control *Control::make_custom_tooltip(const String &p_text) const {
+	if (get_script_instance()) {
+		return const_cast<Control *>(this)->call("_make_custom_tooltip", p_text);
+	}
+	return NULL;
+}
 
 void Control::set_default_cursor_shape(CursorShape p_shape) {
 
@@ -2820,6 +2827,7 @@ void Control::_bind_methods() {
 	BIND_VMETHOD(MethodInfo(Variant::OBJECT, "get_drag_data", PropertyInfo(Variant::VECTOR2, "position")));
 	BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_drop_data", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::NIL, "data")));
 	BIND_VMETHOD(MethodInfo("drop_data", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::NIL, "data")));
+	BIND_VMETHOD(MethodInfo(Variant::OBJECT, "_make_custom_tooltip", PropertyInfo(Variant::STRING, "for_text")));
 
 	ADD_GROUP("Anchor", "anchor_");
 	ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.01"), "_set_anchor", "get_anchor", MARGIN_LEFT);

+ 1 - 0
scene/gui/control.h

@@ -454,6 +454,7 @@ public:
 
 	void set_tooltip(const String &p_tooltip);
 	virtual String get_tooltip(const Point2 &p_pos) const;
+	virtual Control *make_custom_tooltip(const String &p_text) const;
 
 	/* CURSOR */
 

+ 19 - 0
scene/gui/rich_text_label.cpp

@@ -1253,6 +1253,9 @@ void RichTextLabel::_validate_line_caches(ItemFrame *p_frame) {
 
 	//validate invalid lines
 	Size2 size = get_size();
+	if (fixed_width != -1) {
+		size.width = fixed_width;
+	}
 	Rect2 text_rect = _get_text_rect();
 	Color font_color_shadow = get_color("font_color_shadow");
 	bool use_outline = get_constant("shadow_as_outline");
@@ -2245,6 +2248,21 @@ int RichTextLabel::get_total_character_count() const {
 	return tc;
 }
 
+void RichTextLabel::set_fixed_size_to_width(int p_width) {
+	fixed_width = p_width;
+	minimum_size_changed();
+}
+
+Size2 RichTextLabel::get_minimum_size() const {
+
+	if (fixed_width != -1) {
+		const_cast<RichTextLabel *>(this)->_validate_line_caches(main);
+		return Size2(fixed_width, const_cast<RichTextLabel *>(this)->get_content_height());
+	}
+
+	return Size2();
+}
+
 RichTextLabel::RichTextLabel() {
 
 	main = memnew(ItemFrame);
@@ -2287,6 +2305,7 @@ RichTextLabel::RichTextLabel() {
 	percent_visible = 1;
 	visible_line_count = 0;
 
+	fixed_width = -1;
 	set_clip_contents(true);
 }
 

+ 5 - 0
scene/gui/rich_text_label.h

@@ -293,6 +293,8 @@ private:
 
 	void _update_all_lines();
 
+	int fixed_width;
+
 protected:
 	void _notification(int p_what);
 
@@ -368,6 +370,9 @@ public:
 	void set_percent_visible(float p_percent);
 	float get_percent_visible() const;
 
+	void set_fixed_size_to_width(int p_width);
+	virtual Size2 get_minimum_size() const;
+
 	RichTextLabel();
 	~RichTextLabel();
 };

+ 40 - 22
scene/main/viewport.cpp

@@ -41,7 +41,7 @@
 #include "scene/3d/spatial.h"
 #include "scene/gui/control.h"
 #include "scene/gui/label.h"
-#include "scene/gui/panel.h"
+#include "scene/gui/panel_container.h"
 #include "scene/main/timer.h"
 #include "scene/resources/mesh.h"
 #include "scene/scene_string_names.h"
@@ -166,9 +166,9 @@ ViewportTexture::~ViewportTexture() {
 
 /////////////////////////////////////
 
-class TooltipPanel : public Panel {
+class TooltipPanel : public PanelContainer {
 
-	GDCLASS(TooltipPanel, Panel)
+	GDCLASS(TooltipPanel, PanelContainer)
 public:
 	TooltipPanel(){};
 };
@@ -1305,10 +1305,11 @@ void Viewport::_gui_cancel_tooltip() {
 	if (gui.tooltip_popup) {
 		gui.tooltip_popup->queue_delete();
 		gui.tooltip_popup = NULL;
+		gui.tooltip_label = NULL;
 	}
 }
 
-String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos) {
+String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos, Control **r_which) {
 
 	Vector2 pos = p_pos;
 	String tooltip;
@@ -1317,6 +1318,10 @@ String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos) {
 
 		tooltip = p_control->get_tooltip(pos);
 
+		if (r_which) {
+			*r_which = p_control;
+		}
+
 		if (tooltip != String())
 			break;
 		pos = p_control->get_transform().xform(pos);
@@ -1338,41 +1343,49 @@ void Viewport::_gui_show_tooltip() {
 		return;
 	}
 
-	String tooltip = _gui_get_tooltip(gui.tooltip, gui.tooltip->get_global_transform().xform_inv(gui.tooltip_pos));
+	Control *which = NULL;
+	String tooltip = _gui_get_tooltip(gui.tooltip, gui.tooltip->get_global_transform().xform_inv(gui.tooltip_pos), &which);
 	if (tooltip.length() == 0)
 		return; // bye
 
 	if (gui.tooltip_popup) {
 		memdelete(gui.tooltip_popup);
 		gui.tooltip_popup = NULL;
+		gui.tooltip_label = NULL;
 	}
 
-	if (!gui.tooltip) {
+	if (!which) {
 		return;
 	}
 
-	Control *rp = gui.tooltip->get_root_parent_control();
+	Control *rp = which; //->get_root_parent_control();
 	if (!rp)
 		return;
 
-	gui.tooltip_popup = memnew(TooltipPanel);
+	gui.tooltip_popup = which->make_custom_tooltip(tooltip);
+
+	if (!gui.tooltip_popup) {
+		gui.tooltip_popup = memnew(TooltipPanel);
+
+		gui.tooltip_label = memnew(TooltipLabel);
+		gui.tooltip_popup->add_child(gui.tooltip_label);
+
+		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));
+		gui.tooltip_label->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, ttp->get_margin(MARGIN_TOP));
+		gui.tooltip_label->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -ttp->get_margin(MARGIN_RIGHT));
+		gui.tooltip_label->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -ttp->get_margin(MARGIN_BOTTOM));
+		gui.tooltip_label->set_text(tooltip.strip_edges());
+	}
 
 	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_popup->hide();
 
-	gui.tooltip_label->set_anchor_and_margin(MARGIN_LEFT, Control::ANCHOR_BEGIN, ttp->get_margin(MARGIN_LEFT));
-	gui.tooltip_label->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, ttp->get_margin(MARGIN_TOP));
-	gui.tooltip_label->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -ttp->get_margin(MARGIN_RIGHT));
-	gui.tooltip_label->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -ttp->get_margin(MARGIN_BOTTOM));
-	gui.tooltip_label->set_text(tooltip.strip_edges());
-	Rect2 r(gui.tooltip_pos + Point2(10, 10), gui.tooltip_label->get_minimum_size() + ttp->get_minimum_size());
-	Rect2 vr = gui.tooltip_label->get_viewport_rect();
+	Rect2 r(gui.tooltip_pos + Point2(10, 10), gui.tooltip_popup->get_minimum_size());
+	Rect2 vr = gui.tooltip_popup->get_viewport_rect();
 	if (r.size.x + r.position.x > vr.size.x)
 		r.position.x = vr.size.x - r.size.x;
 	else if (r.position.x < 0)
@@ -1891,13 +1904,18 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
 			bool is_tooltip_shown = false;
 
 			if (gui.tooltip_popup) {
-				if (can_tooltip) {
+				if (can_tooltip && gui.tooltip) {
 					String tooltip = _gui_get_tooltip(over, gui.tooltip->get_global_transform().xform_inv(mpos));
 
 					if (tooltip.length() == 0)
 						_gui_cancel_tooltip();
-					else if (tooltip == gui.tooltip_label->get_text())
+					else if (gui.tooltip_label) {
+						if (tooltip == gui.tooltip_label->get_text()) {
+							is_tooltip_shown = true;
+						}
+					} else if (tooltip == String(gui.tooltip_popup->call("get_tooltip_text"))) {
 						is_tooltip_shown = true;
+					}
 				} else
 					_gui_cancel_tooltip();
 			}

+ 2 - 2
scene/main/viewport.h

@@ -255,7 +255,7 @@ private:
 		Control *key_focus;
 		Control *mouse_over;
 		Control *tooltip;
-		Panel *tooltip_popup;
+		Control *tooltip_popup;
 		Label *tooltip_label;
 		Point2 tooltip_pos;
 		Point2 last_mouse_pos;
@@ -312,7 +312,7 @@ private:
 	void _gui_remove_root_control(List<Control *>::Element *RI);
 	void _gui_remove_subwindow_control(List<Control *>::Element *SI);
 
-	String _gui_get_tooltip(Control *p_control, const Vector2 &p_pos);
+	String _gui_get_tooltip(Control *p_control, const Vector2 &p_pos, Control **r_which = NULL);
 	void _gui_cancel_tooltip();
 	void _gui_show_tooltip();