Skip to content

Commit 0101317

Browse files
committed
Add auto translate mode for items in ItemList
1 parent 506d6e4 commit 0101317

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

doc/classes/ItemList.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@
7373
[b]Note:[/b] The returned value is unreliable if called right after modifying the [ItemList], before it redraws in the next frame.
7474
</description>
7575
</method>
76+
<method name="get_item_auto_translate_mode" qualifiers="const">
77+
<return type="int" enum="Node.AutoTranslateMode" />
78+
<param index="0" name="idx" type="int" />
79+
<description>
80+
Returns item's auto translate mode.
81+
</description>
82+
</method>
7683
<method name="get_item_custom_bg_color" qualifiers="const">
7784
<return type="Color" />
7885
<param index="0" name="idx" type="int" />
@@ -230,6 +237,15 @@
230237
[b]Note:[/b] This method does not trigger the item selection signal.
231238
</description>
232239
</method>
240+
<method name="set_item_auto_translate_mode">
241+
<return type="void" />
242+
<param index="0" name="idx" type="int" />
243+
<param index="1" name="mode" type="int" enum="Node.AutoTranslateMode" />
244+
<description>
245+
Sets the auto translate mode of the item associated with the specified index.
246+
Items use [constant Node.AUTO_TRANSLATE_MODE_INHERIT] by default, which uses the same auto translate mode as the [ItemList] itself.
247+
</description>
248+
</method>
233249
<method name="set_item_custom_bg_color">
234250
<return type="void" />
235251
<param index="0" name="idx" type="int" />

scene/gui/item_list.cpp

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
#include "core/config/project_settings.h"
3434
#include "core/os/os.h"
35-
#include "core/string/translation.h"
3635
#include "scene/theme/theme_db.h"
3736

3837
void ItemList::_shape_text(int p_idx) {
@@ -58,12 +57,12 @@ int ItemList::add_item(const String &p_item, const Ref<Texture2D> &p_texture, bo
5857
Item item;
5958
item.icon = p_texture;
6059
item.text = p_item;
61-
item.xl_text = atr(p_item);
6260
item.selectable = p_selectable;
6361
items.push_back(item);
6462
int item_id = items.size() - 1;
6563

66-
_shape_text(items.size() - 1);
64+
items.write[item_id].xl_text = _atr(item_id, p_item);
65+
_shape_text(item_id);
6766

6867
queue_redraw();
6968
shape_changed = true;
@@ -95,7 +94,7 @@ void ItemList::set_item_text(int p_idx, const String &p_text) {
9594
}
9695

9796
items.write[p_idx].text = p_text;
98-
items.write[p_idx].xl_text = atr(p_text);
97+
items.write[p_idx].xl_text = _atr(p_idx, p_text);
9998
_shape_text(p_idx);
10099
queue_redraw();
101100
shape_changed = true;
@@ -141,6 +140,24 @@ String ItemList::get_item_language(int p_idx) const {
141140
return items[p_idx].language;
142141
}
143142

143+
void ItemList::set_item_auto_translate_mode(int p_idx, AutoTranslateMode p_mode) {
144+
if (p_idx < 0) {
145+
p_idx += get_item_count();
146+
}
147+
ERR_FAIL_INDEX(p_idx, items.size());
148+
if (items[p_idx].auto_translate_mode != p_mode) {
149+
items.write[p_idx].auto_translate_mode = p_mode;
150+
items.write[p_idx].xl_text = _atr(p_idx, items[p_idx].text);
151+
_shape_text(p_idx);
152+
queue_redraw();
153+
}
154+
}
155+
156+
Node::AutoTranslateMode ItemList::get_item_auto_translate_mode(int p_idx) const {
157+
ERR_FAIL_INDEX_V(p_idx, items.size(), AUTO_TRANSLATE_MODE_INHERIT);
158+
return items[p_idx].auto_translate_mode;
159+
}
160+
144161
void ItemList::set_item_tooltip_enabled(int p_idx, const bool p_enabled) {
145162
if (p_idx < 0) {
146163
p_idx += get_item_count();
@@ -1022,7 +1039,7 @@ void ItemList::_notification(int p_what) {
10221039
} break;
10231040
case NOTIFICATION_TRANSLATION_CHANGED: {
10241041
for (int i = 0; i < items.size(); i++) {
1025-
items.write[i].xl_text = atr(items[i].text);
1042+
items.write[i].xl_text = _atr(i, items[i].text);
10261043
_shape_text(i);
10271044
}
10281045
shape_changed = true;
@@ -1509,6 +1526,23 @@ void ItemList::_mouse_exited() {
15091526
}
15101527
}
15111528

1529+
String ItemList::_atr(int p_idx, const String &p_text) const {
1530+
ERR_FAIL_INDEX_V(p_idx, items.size(), atr(p_text));
1531+
switch (items[p_idx].auto_translate_mode) {
1532+
case AUTO_TRANSLATE_MODE_INHERIT: {
1533+
return atr(p_text);
1534+
} break;
1535+
case AUTO_TRANSLATE_MODE_ALWAYS: {
1536+
return tr(p_text);
1537+
} break;
1538+
case AUTO_TRANSLATE_MODE_DISABLED: {
1539+
return p_text;
1540+
} break;
1541+
}
1542+
1543+
ERR_FAIL_V_MSG(atr(p_text), "Unexpected auto translate mode: " + itos(items[p_idx].auto_translate_mode));
1544+
}
1545+
15121546
int ItemList::get_item_at_position(const Point2 &p_pos, bool p_exact) const {
15131547
Vector2 pos = p_pos;
15141548
pos -= theme_cache.panel_style->get_offset();
@@ -1748,6 +1782,9 @@ void ItemList::_bind_methods() {
17481782
ClassDB::bind_method(D_METHOD("set_item_language", "idx", "language"), &ItemList::set_item_language);
17491783
ClassDB::bind_method(D_METHOD("get_item_language", "idx"), &ItemList::get_item_language);
17501784

1785+
ClassDB::bind_method(D_METHOD("set_item_auto_translate_mode", "idx", "mode"), &ItemList::set_item_auto_translate_mode);
1786+
ClassDB::bind_method(D_METHOD("get_item_auto_translate_mode", "idx"), &ItemList::get_item_auto_translate_mode);
1787+
17511788
ClassDB::bind_method(D_METHOD("set_item_icon_transposed", "idx", "transposed"), &ItemList::set_item_icon_transposed);
17521789
ClassDB::bind_method(D_METHOD("is_item_icon_transposed", "idx"), &ItemList::is_item_icon_transposed);
17531790

scene/gui/item_list.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class ItemList : public Control {
6262
Ref<TextParagraph> text_buf;
6363
String language;
6464
TextDirection text_direction = TEXT_DIRECTION_AUTO;
65+
AutoTranslateMode auto_translate_mode = AUTO_TRANSLATE_MODE_INHERIT;
6566

6667
bool selectable = true;
6768
bool selected = false;
@@ -159,6 +160,8 @@ class ItemList : public Control {
159160
void _shape_text(int p_idx);
160161
void _mouse_exited();
161162

163+
String _atr(int p_idx, const String &p_text) const;
164+
162165
protected:
163166
void _notification(int p_what);
164167
bool _set(const StringName &p_name, const Variant &p_value);
@@ -183,6 +186,9 @@ class ItemList : public Control {
183186
void set_item_language(int p_idx, const String &p_language);
184187
String get_item_language(int p_idx) const;
185188

189+
void set_item_auto_translate_mode(int p_idx, AutoTranslateMode p_mode);
190+
AutoTranslateMode get_item_auto_translate_mode(int p_idx) const;
191+
186192
void set_item_icon(int p_idx, const Ref<Texture2D> &p_icon);
187193
Ref<Texture2D> get_item_icon(int p_idx) const;
188194

0 commit comments

Comments
 (0)