ConnectionsDock: Add tooltip with signal description
Had to create a custom Tree to override `make_custom_control` for the rich text display, similar to EditorProperty. Fixes #30244.
This commit is contained in:
parent
e9d624d7ce
commit
190e866e4d
@ -459,6 +459,21 @@ ConnectDialog::~ConnectDialog() {
|
|||||||
|
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
|
|
||||||
|
// Originally copied and adapted from EditorProperty, try to keep style in sync.
|
||||||
|
Control *ConnectionsDockTree::make_custom_tooltip(const String &p_text) const {
|
||||||
|
|
||||||
|
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(360 * EDSCALE);
|
||||||
|
|
||||||
|
String text = TTR("Signal:") + " [u][b]" + p_text.get_slice("::", 0) + "[/b][/u]";
|
||||||
|
text += p_text.get_slice("::", 1).strip_edges() + "\n";
|
||||||
|
text += p_text.get_slice("::", 2).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;
|
||||||
|
}
|
||||||
|
|
||||||
struct _ConnectionsDockMethodInfoSort {
|
struct _ConnectionsDockMethodInfoSort {
|
||||||
|
|
||||||
_FORCE_INLINE_ bool operator()(const MethodInfo &a, const MethodInfo &b) const {
|
_FORCE_INLINE_ bool operator()(const MethodInfo &a, const MethodInfo &b) const {
|
||||||
@ -892,8 +907,8 @@ void ConnectionsDock::update_tree() {
|
|||||||
|
|
||||||
MethodInfo &mi = E->get();
|
MethodInfo &mi = E->get();
|
||||||
|
|
||||||
String signaldesc;
|
StringName signal_name = mi.name;
|
||||||
signaldesc = mi.name + "(";
|
String signaldesc = "(";
|
||||||
PoolStringArray argnames;
|
PoolStringArray argnames;
|
||||||
if (mi.arguments.size()) {
|
if (mi.arguments.size()) {
|
||||||
signaldesc += " ";
|
signaldesc += " ";
|
||||||
@ -914,19 +929,56 @@ void ConnectionsDock::update_tree() {
|
|||||||
}
|
}
|
||||||
signaldesc += " ";
|
signaldesc += " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
signaldesc += ")";
|
signaldesc += ")";
|
||||||
|
|
||||||
TreeItem *item = tree->create_item(pitem);
|
TreeItem *item = tree->create_item(pitem);
|
||||||
item->set_text(0, signaldesc);
|
item->set_text(0, String(signal_name) + signaldesc);
|
||||||
Dictionary sinfo;
|
Dictionary sinfo;
|
||||||
sinfo["name"] = mi.name;
|
sinfo["name"] = signal_name;
|
||||||
sinfo["args"] = argnames;
|
sinfo["args"] = argnames;
|
||||||
item->set_metadata(0, sinfo);
|
item->set_metadata(0, sinfo);
|
||||||
item->set_icon(0, get_icon("Signal", "EditorIcons"));
|
item->set_icon(0, get_icon("Signal", "EditorIcons"));
|
||||||
|
|
||||||
|
// Set tooltip with the signal's documentation
|
||||||
|
{
|
||||||
|
String descr;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
Map<StringName, Map<StringName, String> >::Element *G = descr_cache.find(base);
|
||||||
|
if (G) {
|
||||||
|
Map<StringName, String>::Element *F = G->get().find(signal_name);
|
||||||
|
if (F) {
|
||||||
|
found = true;
|
||||||
|
descr = F->get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
DocData *dd = EditorHelp::get_doc_data();
|
||||||
|
Map<String, DocData::ClassDoc>::Element *F = dd->class_list.find(base);
|
||||||
|
while (F && descr == String()) {
|
||||||
|
for (int i = 0; i < F->get().signals.size(); i++) {
|
||||||
|
if (F->get().signals[i].name == signal_name.operator String()) {
|
||||||
|
descr = F->get().signals[i].description.strip_edges();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!F->get().inherits.empty()) {
|
||||||
|
F = dd->class_list.find(F->get().inherits);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
descr_cache[base][signal_name] = descr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "::" separators used in make_custom_tooltip for formatting.
|
||||||
|
item->set_tooltip(0, String(signal_name) + "::" + signaldesc + "::" + descr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// List existing connections
|
||||||
List<Object::Connection> connections;
|
List<Object::Connection> connections;
|
||||||
selectedNode->get_signal_connection_list(mi.name, &connections);
|
selectedNode->get_signal_connection_list(signal_name, &connections);
|
||||||
|
|
||||||
for (List<Object::Connection>::Element *F = connections.front(); F; F = F->next()) {
|
for (List<Object::Connection>::Element *F = connections.front(); F; F = F->next()) {
|
||||||
|
|
||||||
@ -980,7 +1032,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
|
|||||||
|
|
||||||
VBoxContainer *vbc = this;
|
VBoxContainer *vbc = this;
|
||||||
|
|
||||||
tree = memnew(Tree);
|
tree = memnew(ConnectionsDockTree);
|
||||||
tree->set_columns(1);
|
tree->set_columns(1);
|
||||||
tree->set_select_mode(Tree::SELECT_ROW);
|
tree->set_select_mode(Tree::SELECT_ROW);
|
||||||
tree->set_hide_root(true);
|
tree->set_hide_root(true);
|
||||||
|
@ -106,6 +106,13 @@ public:
|
|||||||
|
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
|
|
||||||
|
// Custom Tree needed to use a RichTextLabel as tooltip control
|
||||||
|
// when display signal documentation.
|
||||||
|
class ConnectionsDockTree : public Tree {
|
||||||
|
|
||||||
|
virtual Control *make_custom_tooltip(const String &p_text) const;
|
||||||
|
};
|
||||||
|
|
||||||
class ConnectionsDock : public VBoxContainer {
|
class ConnectionsDock : public VBoxContainer {
|
||||||
|
|
||||||
GDCLASS(ConnectionsDock, VBoxContainer);
|
GDCLASS(ConnectionsDock, VBoxContainer);
|
||||||
@ -123,7 +130,7 @@ class ConnectionsDock : public VBoxContainer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Node *selectedNode;
|
Node *selectedNode;
|
||||||
Tree *tree;
|
ConnectionsDockTree *tree;
|
||||||
EditorNode *editor;
|
EditorNode *editor;
|
||||||
|
|
||||||
ConfirmationDialog *disconnect_all_dialog;
|
ConfirmationDialog *disconnect_all_dialog;
|
||||||
@ -133,6 +140,8 @@ class ConnectionsDock : public VBoxContainer {
|
|||||||
PopupMenu *slot_menu;
|
PopupMenu *slot_menu;
|
||||||
UndoRedo *undo_redo;
|
UndoRedo *undo_redo;
|
||||||
|
|
||||||
|
Map<StringName, Map<StringName, String> > descr_cache;
|
||||||
|
|
||||||
void _make_or_edit_connection();
|
void _make_or_edit_connection();
|
||||||
void _connect(Connection cToMake);
|
void _connect(Connection cToMake);
|
||||||
void _disconnect(TreeItem &item);
|
void _disconnect(TreeItem &item);
|
||||||
|
Loading…
Reference in New Issue
Block a user