|
@@ -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();
|
|
|
}
|