Skip to content

Commit

Permalink
Manual Merge from PR godotengine#95044
Browse files Browse the repository at this point in the history
  • Loading branch information
deviousdaemon committed Nov 22, 2024
1 parent 4c8e510 commit 4365c0d
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 34 deletions.
6 changes: 2 additions & 4 deletions editor/connections_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -910,10 +910,8 @@ Control *ConnectionsDockTree::make_custom_tooltip(const String &p_text) const {
if (p_text.contains("::")) {
return nullptr;
}

EditorHelpBit *help_bit = memnew(EditorHelpBit(p_text));
EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<ConnectionsDockTree *>(this));
return memnew(Control); // Make the standard tooltip invisible.
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
return EditorHelpBitTooltip::show_tooltip(p_text, const_cast<ConnectionsDockTree *>(this));
}

struct _ConnectionsDockMethodInfoSort {
Expand Down
49 changes: 44 additions & 5 deletions editor/editor_help.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ const Vector<String> packed_array_types = {
DocTools *EditorHelp::doc = nullptr;
DocTools *EditorHelp::ext_doc = nullptr;

//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
bool EditorHelpBitTooltip::_is_tooltip_visible = false;

static bool _attempt_doc_load(const String &p_class) {
// Docgen always happens in the outer-most class: it also generates docs for inner classes.
String outer_class = p_class.get_slice(".", 0);
Expand Down Expand Up @@ -3830,6 +3833,14 @@ void EditorHelpBitTooltip::_safe_queue_free() {
void EditorHelpBitTooltip::_target_gui_input(const Ref<InputEvent> &p_event) {
const Ref<InputEventMouse> mouse_event = p_event;
if (mouse_event.is_valid()) {
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
// For some unknown reason, we receive mouse motion of zero when the tooltip
// is opened even if the mouse is not moving on Windows now that the toolip
// FLAG_POPUP is false.
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_relative().is_zero_approx()) {
return;
}
_start_timer();
}
}
Expand All @@ -3842,6 +3853,10 @@ void EditorHelpBitTooltip::_notification(int p_what) {
case NOTIFICATION_WM_MOUSE_EXIT:
_start_timer();
break;
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
case NOTIFICATION_EXIT_TREE:
_is_tooltip_visible = false;
break;
}
}

Expand All @@ -3863,15 +3878,39 @@ void EditorHelpBitTooltip::_input_from_window(const Ref<InputEvent> &p_event) {
}
}

void EditorHelpBitTooltip::show_tooltip(EditorHelpBit *p_help_bit, Control *p_target) {
ERR_FAIL_NULL(p_help_bit);
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
Control *EditorHelpBitTooltip::show_tooltip(const String &p_symbol, Control *p_target, const String &p_description) {
// Show the custom tooltip only if it is not already visible.
// The Viewport will retrigger make_custom_tooltip every few seconds
// because the return control is not visible even if the custom tooltip is displayed.
if (_is_tooltip_visible) {
return _make_invisible_control();
}

EditorHelpBit *help_bit = memnew(EditorHelpBit(p_symbol));
if (!p_description.is_empty()) {
help_bit->set_description(p_description);
}
EditorHelpBitTooltip *tooltip = memnew(EditorHelpBitTooltip(p_target));
p_help_bit->connect("request_hide", callable_mp(tooltip, &EditorHelpBitTooltip::_safe_queue_free));
tooltip->add_child(p_help_bit);
help_bit->connect("request_hide", callable_mp(tooltip, &EditorHelpBitTooltip::_safe_queue_free));
tooltip->add_child(help_bit);
p_target->add_child(tooltip);
p_help_bit->update_content_height();
help_bit->update_content_height();
// When FLAG_POPUP is false, it prevents the editor from losing focus when displaying the tooltip.
// This way, clicks and double-clicks are still available outside the tooltip.
tooltip->set_flag(Window::FLAG_POPUP, false);
tooltip->popup_under_cursor();
_is_tooltip_visible = true;

return _make_invisible_control();
}

Control *EditorHelpBitTooltip::_make_invisible_control() {
Control *control = memnew(Control);
control->set_visible(false);
return control;
}
//END

// Copy-paste from `Viewport::_gui_show_tooltip()`.
void EditorHelpBitTooltip::popup_under_cursor() {
Expand Down
7 changes: 6 additions & 1 deletion editor/editor_help.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,20 +325,25 @@ class EditorHelpBit : public VBoxContainer {
class EditorHelpBitTooltip : public PopupPanel {
GDCLASS(EditorHelpBitTooltip, PopupPanel);

//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
static bool _is_tooltip_visible;
Timer *timer = nullptr;
int _pushing_input = 0;
bool _need_free = false;

void _start_timer();
void _safe_queue_free();
void _target_gui_input(const Ref<InputEvent> &p_event);
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
static Control *_make_invisible_control();

protected:
void _notification(int p_what);
virtual void _input_from_window(const Ref<InputEvent> &p_event) override;

public:
static void show_tooltip(EditorHelpBit *p_help_bit, Control *p_target);
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
static Control *show_tooltip(const String &p_symbol, Control *p_target, const String &p_description = String());

void popup_under_cursor();

Expand Down
26 changes: 14 additions & 12 deletions editor/editor_inspector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -998,41 +998,44 @@ void EditorProperty::_update_flags() {
}
}

//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
Control *EditorProperty::make_custom_tooltip(const String &p_text) const {
String custom_warning;
if (object->has_method("_get_property_warning")) {
custom_warning = object->call("_get_property_warning", property);
}

if (has_doc_tooltip || !custom_warning.is_empty()) {
EditorHelpBit *help_bit = memnew(EditorHelpBit);

String symbol;
String description;
if (has_doc_tooltip) {
help_bit->parse_symbol(p_text);
symbol = p_text;

const EditorInspector *inspector = get_parent_inspector();
if (inspector) {
const String custom_description = inspector->get_custom_property_description(p_text);
if (!custom_description.is_empty()) {
help_bit->set_description(custom_description);
description = custom_description;
}
}
}

if (!custom_warning.is_empty()) {
String description = "[b][color=" + get_theme_color(SNAME("warning_color")).to_html(false) + "]" + custom_warning + "[/color][/b]";
if (!help_bit->get_description().is_empty()) {
description += "\n" + help_bit->get_description();
const String custom_warning_description = "[b][color=" + get_theme_color(SNAME("warning_color")).to_html(false) + "]" + custom_warning + "[/color][/b]";
if (description.is_empty()) {
description = custom_warning_description;
} else {
description = custom_warning_description + "\n" + description;
}
help_bit->set_description(description);
}

EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<EditorProperty *>(this));
return memnew(Control); // Make the standard tooltip invisible.
return EditorHelpBitTooltip::show_tooltip(symbol, const_cast<EditorProperty *>(this), description);
}

return nullptr;
}
//END

void EditorProperty::menu_option(int p_option) {
switch (p_option) {
Expand Down Expand Up @@ -1307,9 +1310,8 @@ Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) cons
return nullptr;
}

EditorHelpBit *help_bit = memnew(EditorHelpBit(p_text));
EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<EditorInspectorCategory *>(this));
return memnew(Control); // Make the standard tooltip invisible.
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
return EditorHelpBitTooltip::show_tooltip(p_text, const_cast<EditorInspectorCategory *>(this));
}

void EditorInspectorCategory::set_as_favorite(EditorInspector *p_for_inspector) {
Expand Down
5 changes: 2 additions & 3 deletions editor/plugins/theme_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2280,9 +2280,8 @@ ThemeTypeDialog::ThemeTypeDialog() {
///////////////////////

Control *ThemeItemLabel::make_custom_tooltip(const String &p_text) const {
EditorHelpBit *help_bit = memnew(EditorHelpBit(p_text));
EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<ThemeItemLabel *>(this));
return memnew(Control); // Make the standard tooltip invisible.
//Stardusk Fix blinking inspector tooltip? PR https://github.com/godotengine/godot/pull/95044
return EditorHelpBitTooltip::show_tooltip(p_text, const_cast<ThemeItemLabel *>(this));
}

VBoxContainer *ThemeTypeEditor::_create_item_list(Theme::DataType p_data_type) {
Expand Down
9 changes: 1 addition & 8 deletions platform/linuxbsd/x11/display_server_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4853,14 +4853,7 @@ void DisplayServerX11::process_events() {

WindowID window_id_other = INVALID_WINDOW_ID;
Window wd_other_x11_window;
if (wd.focused) {
// Handle cases where an unfocused popup is open that needs to receive button-up events.
WindowID popup_id = _get_focused_window_or_popup();
if (popup_id != INVALID_WINDOW_ID && popup_id != window_id) {
window_id_other = popup_id;
wd_other_x11_window = windows[popup_id].x11_window;
}
} else {
if (!wd.focused) {
// Propagate the event to the focused window,
// because it's received only on the topmost window.
// Note: This is needed for drag & drop to work between windows,
Expand Down
9 changes: 8 additions & 1 deletion scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1450,7 +1450,14 @@ void Viewport::_gui_show_tooltip() {

// Controls can implement `make_custom_tooltip` to provide their own tooltip.
// This should be a Control node which will be added as child to a TooltipPanel.
Control *base_tooltip = tooltip_owner ? tooltip_owner->make_custom_tooltip(gui.tooltip_text) : nullptr;
Control *base_tooltip = tooltip_owner->make_custom_tooltip(gui.tooltip_text);

// When the custom control is not visible, don't show any tooltip.
// This way, the custom tooltip from ConnectionsDockTree can create
// its own tooltip without conflicting with the default one, even an empty tooltip.
if (base_tooltip && !base_tooltip->is_visible()) {
return;
}

if (gui.tooltip_text.is_empty() && !base_tooltip) {
return; // Nothing to show.
Expand Down

0 comments on commit 4365c0d

Please sign in to comment.