Merge pull request #8520 from Hinsbart/tree_tooltips
Tree: Ability to add tooltips to TreeItem buttons.
This commit is contained in:
commit
2feb24953c
4 changed files with 38 additions and 22 deletions
|
@ -481,9 +481,9 @@ void ProjectSettings::_update_actions() {
|
||||||
TreeItem *item = input_editor->create_item(root);
|
TreeItem *item = input_editor->create_item(root);
|
||||||
//item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
|
//item->set_cell_mode(0,TreeItem::CELL_MODE_CHECK);
|
||||||
item->set_text(0, name);
|
item->set_text(0, name);
|
||||||
item->add_button(0, get_icon("Add", "EditorIcons"), 1);
|
item->add_button(0, get_icon("Add", "EditorIcons"), 1, false, TTR("Add Event"));
|
||||||
if (!GlobalConfig::get_singleton()->get_input_presets().find(pi.name)) {
|
if (!GlobalConfig::get_singleton()->get_input_presets().find(pi.name)) {
|
||||||
item->add_button(0, get_icon("Remove", "EditorIcons"), 2);
|
item->add_button(0, get_icon("Remove", "EditorIcons"), 2, false, TTR("Remove"));
|
||||||
item->set_editable(0, true);
|
item->set_editable(0, true);
|
||||||
}
|
}
|
||||||
item->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
|
item->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
|
||||||
|
@ -553,7 +553,7 @@ void ProjectSettings::_update_actions() {
|
||||||
action->set_icon(0, get_icon("JoyAxis", "EditorIcons"));
|
action->set_icon(0, get_icon("JoyAxis", "EditorIcons"));
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
action->add_button(0, get_icon("Remove", "EditorIcons"), 2);
|
action->add_button(0, get_icon("Remove", "EditorIcons"), 2, false, TTR("Remove"));
|
||||||
action->set_metadata(0, i);
|
action->set_metadata(0, i);
|
||||||
action->set_meta("__input", ie);
|
action->set_meta("__input", ie);
|
||||||
}
|
}
|
||||||
|
@ -1012,7 +1012,7 @@ void ProjectSettings::_update_translations() {
|
||||||
t->set_text(0, translations[i].replace_first("res://", ""));
|
t->set_text(0, translations[i].replace_first("res://", ""));
|
||||||
t->set_tooltip(0, translations[i]);
|
t->set_tooltip(0, translations[i]);
|
||||||
t->set_metadata(0, i);
|
t->set_metadata(0, i);
|
||||||
t->add_button(0, get_icon("Del", "EditorIcons"), 0);
|
t->add_button(0, get_icon("Del", "EditorIcons"), 0, false, TTR("Remove"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1058,7 +1058,7 @@ void ProjectSettings::_update_translations() {
|
||||||
t->set_text(0, keys[i].replace_first("res://", ""));
|
t->set_text(0, keys[i].replace_first("res://", ""));
|
||||||
t->set_tooltip(0, keys[i]);
|
t->set_tooltip(0, keys[i]);
|
||||||
t->set_metadata(0, keys[i]);
|
t->set_metadata(0, keys[i]);
|
||||||
t->add_button(0, get_icon("Del", "EditorIcons"), 0);
|
t->add_button(0, get_icon("Del", "EditorIcons"), 0, false, TTR("Remove"));
|
||||||
if (keys[i] == remap_selected) {
|
if (keys[i] == remap_selected) {
|
||||||
t->select(0);
|
t->select(0);
|
||||||
translation_res_option_add_button->set_disabled(false);
|
translation_res_option_add_button->set_disabled(false);
|
||||||
|
@ -1076,7 +1076,7 @@ void ProjectSettings::_update_translations() {
|
||||||
t2->set_text(0, path.replace_first("res://", ""));
|
t2->set_text(0, path.replace_first("res://", ""));
|
||||||
t2->set_tooltip(0, path);
|
t2->set_tooltip(0, path);
|
||||||
t2->set_metadata(0, j);
|
t2->set_metadata(0, j);
|
||||||
t2->add_button(0, get_icon("Del", "EditorIcons"), 0);
|
t2->add_button(0, get_icon("Del", "EditorIcons"), 0, false, TTR("Remove"));
|
||||||
t2->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
|
t2->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
|
||||||
t2->set_text(1, langnames);
|
t2->set_text(1, langnames);
|
||||||
t2->set_editable(1, true);
|
t2->set_editable(1, true);
|
||||||
|
|
|
@ -337,27 +337,27 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
|
||||||
|
|
||||||
String warning = p_node->get_configuration_warning();
|
String warning = p_node->get_configuration_warning();
|
||||||
if (warning != String()) {
|
if (warning != String()) {
|
||||||
item->add_button(0, get_icon("NodeWarning", "EditorIcons"), BUTTON_WARNING);
|
item->add_button(0, get_icon("NodeWarning", "EditorIcons"), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + p_node->get_configuration_warning());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has_connections = p_node->has_persistent_signal_connections();
|
bool has_connections = p_node->has_persistent_signal_connections();
|
||||||
bool has_groups = p_node->has_persistent_groups();
|
bool has_groups = p_node->has_persistent_groups();
|
||||||
|
|
||||||
if (has_connections && has_groups) {
|
if (has_connections && has_groups) {
|
||||||
item->add_button(0, get_icon("ConnectionAndGroups", "EditorIcons"), BUTTON_SIGNALS);
|
item->add_button(0, get_icon("ConnectionAndGroups", "EditorIcons"), BUTTON_SIGNALS, false, TTR("Node has connection(s) and group(s)\nClick to show signals dock."));
|
||||||
} else if (has_connections) {
|
} else if (has_connections) {
|
||||||
item->add_button(0, get_icon("Connect", "EditorIcons"), BUTTON_SIGNALS);
|
item->add_button(0, get_icon("Connect", "EditorIcons"), BUTTON_SIGNALS, false, TTR("Node has connections.\nClick to show signals dock."));
|
||||||
} else if (has_groups) {
|
} else if (has_groups) {
|
||||||
item->add_button(0, get_icon("Groups", "EditorIcons"), BUTTON_GROUPS);
|
item->add_button(0, get_icon("Groups", "EditorIcons"), BUTTON_GROUPS, false, TTR("Node is in group(s).\nClick to show groups dock."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_node == get_scene_node() && p_node->get_scene_inherited_state().is_valid()) {
|
if (p_node == get_scene_node() && p_node->get_scene_inherited_state().is_valid()) {
|
||||||
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE);
|
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Subscene options"));
|
||||||
item->set_tooltip(0, TTR("Inherits:") + " " + p_node->get_scene_inherited_state()->get_path() + "\n" + TTR("Type:") + " " + p_node->get_class());
|
item->set_tooltip(0, TTR("Inherits:") + " " + p_node->get_scene_inherited_state()->get_path() + "\n" + TTR("Type:") + " " + p_node->get_class());
|
||||||
} else if (p_node != get_scene_node() && p_node->get_filename() != "" && can_open_instance) {
|
} else if (p_node != get_scene_node() && p_node->get_filename() != "" && can_open_instance) {
|
||||||
|
|
||||||
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE);
|
item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Subscene options"));
|
||||||
item->set_tooltip(0, TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class());
|
item->set_tooltip(0, TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class());
|
||||||
} else {
|
} else {
|
||||||
item->set_tooltip(0, String(p_node->get_name()) + "\n" + TTR("Type:") + " " + p_node->get_class());
|
item->set_tooltip(0, String(p_node->get_name()) + "\n" + TTR("Type:") + " " + p_node->get_class());
|
||||||
|
@ -370,24 +370,24 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
|
||||||
|
|
||||||
if (!p_node->get_script().is_null()) {
|
if (!p_node->get_script().is_null()) {
|
||||||
|
|
||||||
item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT);
|
item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT, false, TTR("Open script"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_node->is_class("CanvasItem")) {
|
if (p_node->is_class("CanvasItem")) {
|
||||||
|
|
||||||
bool is_locked = p_node->has_meta("_edit_lock_"); //_edit_group_
|
bool is_locked = p_node->has_meta("_edit_lock_"); //_edit_group_
|
||||||
if (is_locked)
|
if (is_locked)
|
||||||
item->add_button(0, get_icon("Lock", "EditorIcons"), BUTTON_LOCK);
|
item->add_button(0, get_icon("Lock", "EditorIcons"), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock"));
|
||||||
|
|
||||||
bool is_grouped = p_node->has_meta("_edit_group_");
|
bool is_grouped = p_node->has_meta("_edit_group_");
|
||||||
if (is_grouped)
|
if (is_grouped)
|
||||||
item->add_button(0, get_icon("Group", "EditorIcons"), BUTTON_GROUP);
|
item->add_button(0, get_icon("Group", "EditorIcons"), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make selectable"));
|
||||||
|
|
||||||
bool v = p_node->call("is_visible");
|
bool v = p_node->call("is_visible");
|
||||||
if (v)
|
if (v)
|
||||||
item->add_button(0, get_icon("Visible", "EditorIcons"), BUTTON_VISIBILITY);
|
item->add_button(0, get_icon("Visible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||||
else
|
else
|
||||||
item->add_button(0, get_icon("Hidden", "EditorIcons"), BUTTON_VISIBILITY);
|
item->add_button(0, get_icon("Hidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||||
|
|
||||||
if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
|
if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
|
||||||
p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
|
p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
|
||||||
|
@ -397,9 +397,9 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
|
||||||
|
|
||||||
bool v = p_node->call("is_visible");
|
bool v = p_node->call("is_visible");
|
||||||
if (v)
|
if (v)
|
||||||
item->add_button(0, get_icon("Visible", "EditorIcons"), BUTTON_VISIBILITY);
|
item->add_button(0, get_icon("Visible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||||
else
|
else
|
||||||
item->add_button(0, get_icon("Hidden", "EditorIcons"), BUTTON_VISIBILITY);
|
item->add_button(0, get_icon("Hidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||||
|
|
||||||
if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
|
if (!p_node->is_connected("visibility_changed", this, "_node_visibility_changed"))
|
||||||
p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
|
p_node->connect("visibility_changed", this, "_node_visibility_changed", varray(p_node));
|
||||||
|
|
|
@ -464,7 +464,7 @@ void TreeItem::deselect(int p_column) {
|
||||||
_cell_deselected(p_column);
|
_cell_deselected(p_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreeItem::add_button(int p_column, const Ref<Texture> &p_button, int p_id, bool p_disabled) {
|
void TreeItem::add_button(int p_column, const Ref<Texture> &p_button, int p_id, bool p_disabled, const String &p_tooltip) {
|
||||||
|
|
||||||
ERR_FAIL_INDEX(p_column, cells.size());
|
ERR_FAIL_INDEX(p_column, cells.size());
|
||||||
ERR_FAIL_COND(!p_button.is_valid());
|
ERR_FAIL_COND(!p_button.is_valid());
|
||||||
|
@ -474,6 +474,7 @@ void TreeItem::add_button(int p_column, const Ref<Texture> &p_button, int p_id,
|
||||||
p_id = cells[p_column].buttons.size();
|
p_id = cells[p_column].buttons.size();
|
||||||
button.id = p_id;
|
button.id = p_id;
|
||||||
button.disabled = p_disabled;
|
button.disabled = p_disabled;
|
||||||
|
button.tooltip = p_tooltip;
|
||||||
cells[p_column].buttons.push_back(button);
|
cells[p_column].buttons.push_back(button);
|
||||||
_changed_notify(p_column);
|
_changed_notify(p_column);
|
||||||
}
|
}
|
||||||
|
@ -669,7 +670,7 @@ void TreeItem::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("clear_custom_bg_color", "column"), &TreeItem::clear_custom_bg_color);
|
ClassDB::bind_method(D_METHOD("clear_custom_bg_color", "column"), &TreeItem::clear_custom_bg_color);
|
||||||
ClassDB::bind_method(D_METHOD("get_custom_bg_color", "column"), &TreeItem::get_custom_bg_color);
|
ClassDB::bind_method(D_METHOD("get_custom_bg_color", "column"), &TreeItem::get_custom_bg_color);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("add_button", "column", "button:Texture", "button_idx", "disabled"), &TreeItem::add_button, DEFVAL(-1), DEFVAL(false));
|
ClassDB::bind_method(D_METHOD("add_button", "column", "button:Texture", "button_idx", "disabled", "tooltip"), &TreeItem::add_button, DEFVAL(-1), DEFVAL(false), DEFVAL(""));
|
||||||
ClassDB::bind_method(D_METHOD("get_button_count", "column"), &TreeItem::get_button_count);
|
ClassDB::bind_method(D_METHOD("get_button_count", "column"), &TreeItem::get_button_count);
|
||||||
ClassDB::bind_method(D_METHOD("get_button:Texture", "column", "button_idx"), &TreeItem::get_button);
|
ClassDB::bind_method(D_METHOD("get_button:Texture", "column", "button_idx"), &TreeItem::get_button);
|
||||||
ClassDB::bind_method(D_METHOD("set_button", "column", "button_idx", "button:Texture"), &TreeItem::set_button);
|
ClassDB::bind_method(D_METHOD("set_button", "column", "button_idx", "button:Texture"), &TreeItem::set_button);
|
||||||
|
@ -3290,6 +3291,19 @@ String Tree::get_tooltip(const Point2 &p_pos) const {
|
||||||
|
|
||||||
if (it) {
|
if (it) {
|
||||||
|
|
||||||
|
TreeItem::Cell &c = it->cells[col];
|
||||||
|
int col_width = get_column_width(col);
|
||||||
|
for (int j = c.buttons.size() - 1; j >= 0; j--) {
|
||||||
|
Ref<Texture> b = c.buttons[j].texture;
|
||||||
|
Size2 size = b->get_size() + cache.button_pressed->get_minimum_size();
|
||||||
|
if (pos.x > col_width - size.width) {
|
||||||
|
String tooltip = c.buttons[j].tooltip;
|
||||||
|
if (tooltip != "") {
|
||||||
|
return tooltip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
col_width -= size.width;
|
||||||
|
}
|
||||||
String ret;
|
String ret;
|
||||||
if (it->get_tooltip(col) == "")
|
if (it->get_tooltip(col) == "")
|
||||||
ret = it->get_text(col);
|
ret = it->get_text(col);
|
||||||
|
|
|
@ -93,10 +93,12 @@ private:
|
||||||
bool disabled;
|
bool disabled;
|
||||||
Ref<Texture> texture;
|
Ref<Texture> texture;
|
||||||
Color color;
|
Color color;
|
||||||
|
String tooltip;
|
||||||
Button() {
|
Button() {
|
||||||
id = 0;
|
id = 0;
|
||||||
disabled = false;
|
disabled = false;
|
||||||
color = Color(1, 1, 1, 1);
|
color = Color(1, 1, 1, 1);
|
||||||
|
tooltip = "";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -180,7 +182,7 @@ public:
|
||||||
void set_icon_max_width(int p_column, int p_max);
|
void set_icon_max_width(int p_column, int p_max);
|
||||||
int get_icon_max_width(int p_column) const;
|
int get_icon_max_width(int p_column) const;
|
||||||
|
|
||||||
void add_button(int p_column, const Ref<Texture> &p_button, int p_id = -1, bool p_disabled = false);
|
void add_button(int p_column, const Ref<Texture> &p_button, int p_id = -1, bool p_disabled = false, const String &p_tooltip = "");
|
||||||
int get_button_count(int p_column) const;
|
int get_button_count(int p_column) const;
|
||||||
Ref<Texture> get_button(int p_column, int p_idx) const;
|
Ref<Texture> get_button(int p_column, int p_idx) const;
|
||||||
int get_button_id(int p_column, int p_idx) const;
|
int get_button_id(int p_column, int p_idx) const;
|
||||||
|
|
Loading…
Reference in a new issue