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

This commit is contained in:
Juan Linietsky 2018-07-20 18:14:33 -03:00
parent 002bacc01f
commit 336db8bcd1
11 changed files with 138 additions and 31 deletions

View file

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

View file

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

View file

@ -719,6 +719,24 @@ void EditorProperty::set_object_and_property(Object *p_object, const StringName
property = p_property; 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() { void EditorProperty::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_label", "text"), &EditorProperty::set_label); 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("_gui_input"), &EditorProperty::_gui_input);
ClassDB::bind_method(D_METHOD("_focusable_focused"), &EditorProperty::_focusable_focused); 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::STRING, "label"), "set_label", "get_label");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checkable"), "set_checkable", "is_checkable"); 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 { Size2 EditorInspectorCategory::get_minimum_size() const {
Ref<Font> font = get_font("font", "Tree"); Ref<Font> font = get_font("font", "Tree");
@ -934,6 +968,15 @@ Size2 EditorInspectorCategory::get_minimum_size() const {
return ms; 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() { EditorInspectorCategory::EditorInspectorCategory() {
} }
@ -1395,7 +1438,7 @@ void EditorInspector::update_tree() {
class_descr_cache[type] = descr.word_wrap(80); 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()) { 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("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED); ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
if (doc_hint != String()) { 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 { } 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_draw_red(draw_red);
ep->set_use_folding(use_folding); ep->set_use_folding(use_folding);

View file

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

View file

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

View file

@ -2188,10 +2188,17 @@ void Control::set_tooltip(const String &p_tooltip) {
data.tooltip = p_tooltip; data.tooltip = p_tooltip;
} }
String Control::get_tooltip(const Point2 &p_pos) const { String Control::get_tooltip(const Point2 &p_pos) const {
return data.tooltip; 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) { 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::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(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("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_GROUP("Anchor", "anchor_");
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.01"), "_set_anchor", "get_anchor", MARGIN_LEFT); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.01"), "_set_anchor", "get_anchor", MARGIN_LEFT);

View file

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

View file

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

View file

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

View file

@ -41,7 +41,7 @@
#include "scene/3d/spatial.h" #include "scene/3d/spatial.h"
#include "scene/gui/control.h" #include "scene/gui/control.h"
#include "scene/gui/label.h" #include "scene/gui/label.h"
#include "scene/gui/panel.h" #include "scene/gui/panel_container.h"
#include "scene/main/timer.h" #include "scene/main/timer.h"
#include "scene/resources/mesh.h" #include "scene/resources/mesh.h"
#include "scene/scene_string_names.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: public:
TooltipPanel(){}; TooltipPanel(){};
}; };
@ -1305,10 +1305,11 @@ void Viewport::_gui_cancel_tooltip() {
if (gui.tooltip_popup) { if (gui.tooltip_popup) {
gui.tooltip_popup->queue_delete(); gui.tooltip_popup->queue_delete();
gui.tooltip_popup = NULL; 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; Vector2 pos = p_pos;
String tooltip; String tooltip;
@ -1317,6 +1318,10 @@ String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos) {
tooltip = p_control->get_tooltip(pos); tooltip = p_control->get_tooltip(pos);
if (r_which) {
*r_which = p_control;
}
if (tooltip != String()) if (tooltip != String())
break; break;
pos = p_control->get_transform().xform(pos); pos = p_control->get_transform().xform(pos);
@ -1338,41 +1343,49 @@ void Viewport::_gui_show_tooltip() {
return; 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) if (tooltip.length() == 0)
return; // bye return; // bye
if (gui.tooltip_popup) { if (gui.tooltip_popup) {
memdelete(gui.tooltip_popup); memdelete(gui.tooltip_popup);
gui.tooltip_popup = NULL; gui.tooltip_popup = NULL;
gui.tooltip_label = NULL;
} }
if (!gui.tooltip) { if (!which) {
return; return;
} }
Control *rp = gui.tooltip->get_root_parent_control(); Control *rp = which; //->get_root_parent_control();
if (!rp) if (!rp)
return; 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); rp->add_child(gui.tooltip_popup);
gui.tooltip_popup->force_parent_owned(); 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->set_as_toplevel(true);
gui.tooltip_popup->hide(); //gui.tooltip_popup->hide();
Ref<StyleBox> ttp = gui.tooltip_label->get_stylebox("panel", "TooltipPanel"); Rect2 r(gui.tooltip_pos + Point2(10, 10), gui.tooltip_popup->get_minimum_size());
Rect2 vr = gui.tooltip_popup->get_viewport_rect();
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();
if (r.size.x + r.position.x > vr.size.x) if (r.size.x + r.position.x > vr.size.x)
r.position.x = vr.size.x - r.size.x; r.position.x = vr.size.x - r.size.x;
else if (r.position.x < 0) else if (r.position.x < 0)
@ -1891,13 +1904,18 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
bool is_tooltip_shown = false; bool is_tooltip_shown = false;
if (gui.tooltip_popup) { 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)); String tooltip = _gui_get_tooltip(over, gui.tooltip->get_global_transform().xform_inv(mpos));
if (tooltip.length() == 0) if (tooltip.length() == 0)
_gui_cancel_tooltip(); _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; is_tooltip_shown = true;
}
} else } else
_gui_cancel_tooltip(); _gui_cancel_tooltip();
} }

View file

@ -255,7 +255,7 @@ private:
Control *key_focus; Control *key_focus;
Control *mouse_over; Control *mouse_over;
Control *tooltip; Control *tooltip;
Panel *tooltip_popup; Control *tooltip_popup;
Label *tooltip_label; Label *tooltip_label;
Point2 tooltip_pos; Point2 tooltip_pos;
Point2 last_mouse_pos; Point2 last_mouse_pos;
@ -312,7 +312,7 @@ private:
void _gui_remove_root_control(List<Control *>::Element *RI); void _gui_remove_root_control(List<Control *>::Element *RI);
void _gui_remove_subwindow_control(List<Control *>::Element *SI); 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_cancel_tooltip();
void _gui_show_tooltip(); void _gui_show_tooltip();