Skip to content

Commit 97fa718

Browse files
committed
Merge pull request godotengine#97353 from timothyqiu/tree-at
Add auto translate mode for cells in `Tree`
2 parents 7d4e06e + 3c365a7 commit 97fa718

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

doc/classes/TreeItem.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@
7373
Removes the button at index [param button_index] in column [param column].
7474
</description>
7575
</method>
76+
<method name="get_auto_translate_mode" qualifiers="const">
77+
<return type="int" enum="Node.AutoTranslateMode" />
78+
<param index="0" name="column" type="int" />
79+
<description>
80+
Returns the column's auto translate mode.
81+
</description>
82+
</method>
7683
<method name="get_autowrap_mode" qualifiers="const">
7784
<return type="int" enum="TextServer.AutowrapMode" />
7885
<param index="0" name="column" type="int" />
@@ -493,6 +500,15 @@
493500
Selects the given [param column].
494501
</description>
495502
</method>
503+
<method name="set_auto_translate_mode">
504+
<return type="void" />
505+
<param index="0" name="column" type="int" />
506+
<param index="1" name="mode" type="int" enum="Node.AutoTranslateMode" />
507+
<description>
508+
Sets the given column's auto translate mode to [param mode].
509+
All columns use [constant Node.AUTO_TRANSLATE_MODE_INHERIT] by default, which uses the same auto translate mode as the [Tree] itself.
510+
</description>
511+
</method>
496512
<method name="set_autowrap_mode">
497513
<return type="void" />
498514
<param index="0" name="column" type="int" />

scene/gui/tree.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,26 @@ TreeItem::TreeCellMode TreeItem::get_cell_mode(int p_column) const {
185185
return cells[p_column].mode;
186186
}
187187

188+
/* auto translate mode */
189+
void TreeItem::set_auto_translate_mode(int p_column, Node::AutoTranslateMode p_mode) {
190+
ERR_FAIL_INDEX(p_column, cells.size());
191+
192+
if (cells[p_column].auto_translate_mode == p_mode) {
193+
return;
194+
}
195+
196+
cells.write[p_column].auto_translate_mode = p_mode;
197+
cells.write[p_column].dirty = true;
198+
cells.write[p_column].cached_minimum_size_dirty = true;
199+
200+
_changed_notify(p_column);
201+
}
202+
203+
Node::AutoTranslateMode TreeItem::get_auto_translate_mode(int p_column) const {
204+
ERR_FAIL_INDEX_V(p_column, cells.size(), Node::AUTO_TRANSLATE_MODE_INHERIT);
205+
return cells[p_column].auto_translate_mode;
206+
}
207+
188208
/* multiline editable */
189209
void TreeItem::set_edit_multiline(int p_column, bool p_multiline) {
190210
ERR_FAIL_INDEX(p_column, cells.size());
@@ -247,6 +267,24 @@ void TreeItem::propagate_check(int p_column, bool p_emit_signal) {
247267
_propagate_check_through_parents(p_column, p_emit_signal);
248268
}
249269

270+
String TreeItem::atr(int p_column, const String &p_text) const {
271+
ERR_FAIL_INDEX_V(p_column, cells.size(), tree->atr(p_text));
272+
273+
switch (cells[p_column].auto_translate_mode) {
274+
case Node::AUTO_TRANSLATE_MODE_INHERIT: {
275+
return tree->atr(p_text);
276+
} break;
277+
case Node::AUTO_TRANSLATE_MODE_ALWAYS: {
278+
return tree->tr(p_text);
279+
} break;
280+
case Node::AUTO_TRANSLATE_MODE_DISABLED: {
281+
return p_text;
282+
} break;
283+
}
284+
285+
ERR_FAIL_V_MSG(tree->atr(p_text), "Unexpected auto translate mode: " + itos(cells[p_column].auto_translate_mode));
286+
}
287+
250288
void TreeItem::_propagate_check_through_children(int p_column, bool p_checked, bool p_emit_signal) {
251289
TreeItem *current = get_first_child();
252290
while (current) {
@@ -323,7 +361,7 @@ void TreeItem::set_text(int p_column, String p_text) {
323361
} else {
324362
// Don't auto translate if it's in string mode and editable, as the text can be changed to anything by the user.
325363
if (tree && (!cells[p_column].editable || cells[p_column].mode != TreeItem::CELL_MODE_STRING)) {
326-
cells.write[p_column].xl_text = tree->atr(p_text);
364+
cells.write[p_column].xl_text = atr(p_column, p_text);
327365
} else {
328366
cells.write[p_column].xl_text = p_text;
329367
}
@@ -1621,6 +1659,9 @@ void TreeItem::_bind_methods() {
16211659
ClassDB::bind_method(D_METHOD("set_cell_mode", "column", "mode"), &TreeItem::set_cell_mode);
16221660
ClassDB::bind_method(D_METHOD("get_cell_mode", "column"), &TreeItem::get_cell_mode);
16231661

1662+
ClassDB::bind_method(D_METHOD("set_auto_translate_mode", "column", "mode"), &TreeItem::set_auto_translate_mode);
1663+
ClassDB::bind_method(D_METHOD("get_auto_translate_mode", "column"), &TreeItem::get_auto_translate_mode);
1664+
16241665
ClassDB::bind_method(D_METHOD("set_edit_multiline", "column", "multiline"), &TreeItem::set_edit_multiline);
16251666
ClassDB::bind_method(D_METHOD("is_edit_multiline", "column"), &TreeItem::is_edit_multiline);
16261667

@@ -2009,15 +2050,15 @@ void Tree::update_item_cell(TreeItem *p_item, int p_col) {
20092050

20102051
int option = (int)p_item->cells[p_col].val;
20112052

2012-
valtext = atr(ETR("(Other)"));
2053+
valtext = p_item->atr(p_col, ETR("(Other)"));
20132054
Vector<String> strings = p_item->cells[p_col].text.split(",");
20142055
for (int j = 0; j < strings.size(); j++) {
20152056
int value = j;
20162057
if (!strings[j].get_slicec(':', 1).is_empty()) {
20172058
value = strings[j].get_slicec(':', 1).to_int();
20182059
}
20192060
if (option == value) {
2020-
valtext = atr(strings[j].get_slicec(':', 0));
2061+
valtext = p_item->atr(p_col, strings[j].get_slicec(':', 0));
20212062
break;
20222063
}
20232064
}
@@ -2028,7 +2069,7 @@ void Tree::update_item_cell(TreeItem *p_item, int p_col) {
20282069
} else {
20292070
// Don't auto translate if it's in string mode and editable, as the text can be changed to anything by the user.
20302071
if (!p_item->cells[p_col].editable || p_item->cells[p_col].mode != TreeItem::CELL_MODE_STRING) {
2031-
p_item->cells.write[p_col].xl_text = atr(p_item->cells[p_col].text);
2072+
p_item->cells.write[p_col].xl_text = p_item->atr(p_col, p_item->cells[p_col].text);
20322073
} else {
20332074
p_item->cells.write[p_col].xl_text = p_item->cells[p_col].text;
20342075
}

scene/gui/tree.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class TreeItem : public Object {
6464
Rect2i icon_region;
6565
String text;
6666
String xl_text;
67+
Node::AutoTranslateMode auto_translate_mode = Node::AUTO_TRANSLATE_MODE_INHERIT;
6768
bool edit_multiline = false;
6869
String suffix;
6970
Ref<TextParagraph> text_buf;
@@ -210,6 +211,10 @@ class TreeItem : public Object {
210211
void set_cell_mode(int p_column, TreeCellMode p_mode);
211212
TreeCellMode get_cell_mode(int p_column) const;
212213

214+
/* auto translate mode */
215+
void set_auto_translate_mode(int p_column, Node::AutoTranslateMode p_mode);
216+
Node::AutoTranslateMode get_auto_translate_mode(int p_column) const;
217+
213218
/* multiline editable */
214219
void set_edit_multiline(int p_column, bool p_multiline);
215220
bool is_edit_multiline(int p_column) const;
@@ -222,6 +227,8 @@ class TreeItem : public Object {
222227

223228
void propagate_check(int p_column, bool p_emit_signal = true);
224229

230+
String atr(int p_column, const String &p_text) const;
231+
225232
private:
226233
// Check helpers.
227234
void _propagate_check_through_children(int p_column, bool p_checked, bool p_emit_signal);

0 commit comments

Comments
 (0)