summaryrefslogtreecommitdiff
path: root/scene
diff options
context:
space:
mode:
Diffstat (limited to 'scene')
-rw-r--r--scene/gui/button.cpp20
-rw-r--r--scene/gui/button.h1
-rw-r--r--scene/gui/label.cpp38
-rw-r--r--scene/gui/label.h1
-rw-r--r--scene/gui/popup_menu.cpp33
-rw-r--r--scene/gui/popup_menu.h1
-rw-r--r--scene/main/node.h1
-rw-r--r--scene/main/scene_main_loop.cpp3
8 files changed, 67 insertions, 31 deletions
diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp
index a7e08f9f7e..f28595b622 100644
--- a/scene/gui/button.cpp
+++ b/scene/gui/button.cpp
@@ -34,7 +34,7 @@
Size2 Button::get_minimum_size() const {
- Size2 minsize=get_font("font")->get_string_size( text );
+ Size2 minsize=get_font("font")->get_string_size( xl_text );
if (clip_text)
minsize.width=0;
@@ -48,7 +48,7 @@ Size2 Button::get_minimum_size() const {
minsize.height=MAX( minsize.height, _icon->get_height() );
minsize.width+=_icon->get_width();
- if (text!="")
+ if (xl_text!="")
minsize.width+=get_constant("hseparation");
}
@@ -59,6 +59,13 @@ Size2 Button::get_minimum_size() const {
void Button::_notification(int p_what) {
+ if (p_what==NOTIFICATION_TRANSLATION_CHANGED) {
+
+ xl_text=XL_MESSAGE(text);
+ minimum_size_changed();
+ update();
+ }
+
if (p_what==NOTIFICATION_DRAW) {
RID ci = get_canvas_item();
@@ -114,7 +121,7 @@ void Button::_notification(int p_what) {
Point2 icon_ofs = (!_icon.is_null())?Point2( _icon->get_width() + get_constant("hseparation"), 0):Point2();
int text_clip=size.width - style->get_minimum_size().width - icon_ofs.width;
- Point2 text_ofs = (size - style->get_minimum_size() - icon_ofs - font->get_string_size( text ) )/2.0;
+ Point2 text_ofs = (size - style->get_minimum_size() - icon_ofs - font->get_string_size( xl_text ) )/2.0;
switch(align) {
case ALIGN_LEFT: {
@@ -128,14 +135,14 @@ void Button::_notification(int p_what) {
text_ofs+=style->get_offset();
} break;
case ALIGN_RIGHT: {
- text_ofs.x=size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size( text ).x;
+ text_ofs.x=size.x - style->get_margin(MARGIN_RIGHT) - font->get_string_size( xl_text ).x;
text_ofs.y+=style->get_offset().y;
} break;
}
text_ofs.y+=font->get_ascent();
- font->draw( ci, text_ofs.floor(), text, color,clip_text?text_clip:-1);
+ font->draw( ci, text_ofs.floor(), xl_text, color,clip_text?text_clip:-1);
if (!_icon.is_null()) {
int valign = size.height-style->get_minimum_size().y;
@@ -152,7 +159,8 @@ void Button::set_text(const String& p_text) {
if (text==p_text)
return;
- text=XL_MESSAGE(p_text);
+ text=p_text;
+ xl_text=XL_MESSAGE(p_text);
update();
_change_notify("text");
minimum_size_changed();
diff --git a/scene/gui/button.h b/scene/gui/button.h
index 408e31e111..710581a556 100644
--- a/scene/gui/button.h
+++ b/scene/gui/button.h
@@ -49,6 +49,7 @@ private:
bool flat;
String text;
+ String xl_text;
Ref<Texture> icon;
bool clip_text;
TextAlign align;
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index dda9e4b128..cd500a62bc 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -68,6 +68,13 @@ int Label::get_line_height() const {
void Label::_notification(int p_what) {
+ if (p_what==NOTIFICATION_TRANSLATION_CHANGED) {
+
+ xl_text=XL_MESSAGE(text);
+ minimum_size_changed();
+ update();
+ }
+
if (p_what==NOTIFICATION_DRAW) {
if (clip || autowrap) {
@@ -240,8 +247,8 @@ void Label::_notification(int p_what) {
for (int i=0;i<from->word_len;i++) {
if (visible_chars < 0 || chars_total_shadow<visible_chars) {
- CharType c = text[i+pos];
- CharType n = text[i+pos+1];
+ CharType c = xl_text[i+pos];
+ CharType n = xl_text[i+pos+1];
if (uppercase) {
c=String::char_uppercase(c);
n=String::char_uppercase(c);
@@ -263,8 +270,8 @@ void Label::_notification(int p_what) {
for (int i=0;i<from->word_len;i++) {
if (visible_chars < 0 || chars_total<visible_chars) {
- CharType c = text[i+pos];
- CharType n = text[i+pos+1];
+ CharType c = xl_text[i+pos];
+ CharType n = xl_text[i+pos+1];
if (uppercase) {
c=String::char_uppercase(c);
n=String::char_uppercase(c);
@@ -319,9 +326,9 @@ int Label::get_longest_line_width() const {
int max_line_width=0;
int line_width=0;
- for (int i=0;i<text.size();i++) {
+ for (int i=0;i<xl_text.size();i++) {
- CharType current=text[i];
+ CharType current=xl_text[i];
if (uppercase)
current=String::char_uppercase(current);
@@ -335,7 +342,7 @@ int Label::get_longest_line_width() const {
}
} else {
- int char_width=font->get_char_size(current,text[i+1]).width;
+ int char_width=font->get_char_size(current,xl_text[i+1]).width;
line_width+=char_width;
}
@@ -396,9 +403,9 @@ void Label::regenerate_word_cache() {
WordCache *last=NULL;
- for (int i=0;i<text.size()+1;i++) {
+ for (int i=0;i<xl_text.size()+1;i++) {
- CharType current=i<text.length()?text[i]:' '; //always a space at the end, so the algo works
+ CharType current=i<xl_text.length()?xl_text[i]:' '; //always a space at the end, so the algo works
if (uppercase)
current=String::char_uppercase(current);
@@ -438,7 +445,7 @@ void Label::regenerate_word_cache() {
total_char_cache++;
}
- if (i<text.length() && text[i] == ' ') {
+ if (i<xl_text.length() && xl_text[i] == ' ') {
total_char_cache--; // do not count spaces
if (line_width > 0 || last==NULL || last->char_pos!=WordCache::CHAR_WRAPLINE) {
space_count++;
@@ -455,7 +462,7 @@ void Label::regenerate_word_cache() {
word_pos=i;
}
- char_width=font->get_char_size(current,text[i+1]).width;
+ char_width=font->get_char_size(current,xl_text[i+1]).width;
current_word_size+=char_width;
line_width+=char_width;
total_char_cache++;
@@ -541,12 +548,11 @@ Label::VAlign Label::get_valign() const{
void Label::set_text(const String& p_string) {
- String str = XL_MESSAGE(p_string);
- if (text==str)
+ if (text==p_string)
return;
-
- text=str;
+ text=p_string;
+ xl_text=XL_MESSAGE(p_string);
word_cache_dirty=true;
if (percent_visible<1)
visible_chars=get_total_character_count()*percent_visible;
@@ -693,7 +699,7 @@ Label::Label(const String &p_text) {
align=ALIGN_LEFT;
valign=VALIGN_TOP;
- text="";
+ xl_text="";
word_cache=NULL;
word_cache_dirty=true;
autowrap=false;
diff --git a/scene/gui/label.h b/scene/gui/label.h
index 8a166bbe52..80e4c970f6 100644
--- a/scene/gui/label.h
+++ b/scene/gui/label.h
@@ -58,6 +58,7 @@ private:
Align align;
VAlign valign;
String text;
+ String xl_text;
bool autowrap;
bool clip;
Size2 minsize;
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index 34b2675c52..9eaf393a21 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -96,7 +96,7 @@ Size2 PopupMenu::get_minimum_size() const {
size.width+=check_w+hseparation;
}
- String text = items[i].shortcut.is_valid() ? String(tr(items[i].shortcut->get_name())) : items[i].text;
+ String text = items[i].shortcut.is_valid() ? String(tr(items[i].shortcut->get_name())) : items[i].xl_text;
size.width+=font->get_string_size(text).width;
if (i>0)
size.height+=vseparation;
@@ -421,7 +421,16 @@ void PopupMenu::_notification(int p_what) {
switch(p_what) {
+ case NOTIFICATION_TRANSLATION_CHANGED: {
+ for(int i=0;i<items.size();i++) {
+ items[i].xl_text=XL_MESSAGE(items[i].text);
+ }
+
+ minimum_size_changed();
+ update();
+
+ } break;
case NOTIFICATION_DRAW: {
RID ci = get_canvas_item();
@@ -496,7 +505,7 @@ void PopupMenu::_notification(int p_what) {
}
item_ofs.y+=font->get_ascent();
- String text = items[i].shortcut.is_valid() ? String(tr(items[i].shortcut->get_name())) : items[i].text;
+ String text = items[i].shortcut.is_valid() ? String(tr(items[i].shortcut->get_name())) : items[i].xl_text;
if (!items[i].separator) {
font->draw(ci,item_ofs+Point2(0,Math::floor((h-font_h)/2.0)),text,items[i].disabled?font_color_disabled:(i==mouse_over?font_color_hover:font_color));
@@ -537,6 +546,7 @@ void PopupMenu::add_icon_item(const Ref<Texture>& p_icon,const String& p_label,i
Item item;
item.icon=p_icon;
item.text=p_label;
+ item.xl_text=XL_MESSAGE(p_label);
item.accel=p_accel;
item.ID=p_ID;
items.push_back(item);
@@ -545,7 +555,8 @@ void PopupMenu::add_icon_item(const Ref<Texture>& p_icon,const String& p_label,i
void PopupMenu::add_item(const String& p_label,int p_ID,uint32_t p_accel) {
Item item;
- item.text=XL_MESSAGE(p_label);
+ item.text=p_label;
+ item.xl_text=XL_MESSAGE(p_label);
item.accel=p_accel;
item.ID=p_ID;
items.push_back(item);
@@ -555,7 +566,8 @@ void PopupMenu::add_item(const String& p_label,int p_ID,uint32_t p_accel) {
void PopupMenu::add_submenu_item(const String& p_label, const String& p_submenu,int p_ID){
Item item;
- item.text=XL_MESSAGE(p_label);
+ item.text=p_label;
+ item.xl_text=XL_MESSAGE(p_label);
item.ID=p_ID;
item.submenu=p_submenu;
items.push_back(item);
@@ -566,7 +578,8 @@ void PopupMenu::add_icon_check_item(const Ref<Texture>& p_icon,const String& p_l
Item item;
item.icon=p_icon;
- item.text=XL_MESSAGE(p_label);
+ item.text=p_label;
+ item.xl_text=XL_MESSAGE(p_label);
item.accel=p_accel;
item.ID=p_ID;
item.checkable=true;
@@ -576,7 +589,8 @@ void PopupMenu::add_icon_check_item(const Ref<Texture>& p_icon,const String& p_l
void PopupMenu::add_check_item(const String& p_label,int p_ID,uint32_t p_accel) {
Item item;
- item.text=XL_MESSAGE(p_label);
+ item.text=p_label;
+ item.xl_text=XL_MESSAGE(p_label);
item.accel=p_accel;
item.ID=p_ID;
item.checkable=true;
@@ -649,7 +663,8 @@ void PopupMenu::add_check_shortcut(const Ref<ShortCut>& p_shortcut, int p_ID, bo
void PopupMenu::set_item_text(int p_idx,const String& p_text) {
ERR_FAIL_INDEX(p_idx,items.size());
- items[p_idx].text=XL_MESSAGE(p_text);
+ items[p_idx].text=p_text;
+ items[p_idx].xl_text=XL_MESSAGE(p_text);
update();
@@ -1082,8 +1097,8 @@ void PopupMenu::get_translatable_strings(List<String> *p_strings) const {
for(int i=0;i<items.size();i++) {
- if (items[i].text!="")
- p_strings->push_back(items[i].text);
+ if (items[i].xl_text!="")
+ p_strings->push_back(items[i].xl_text);
}
}
diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h
index be12a5fc3c..b5fca9a451 100644
--- a/scene/gui/popup_menu.h
+++ b/scene/gui/popup_menu.h
@@ -44,6 +44,7 @@ class PopupMenu : public Popup {
struct Item {
Ref<Texture> icon;
String text;
+ String xl_text;
bool checked;
bool checkable;
bool separator;
diff --git a/scene/main/node.h b/scene/main/node.h
index 117ce64645..f9d334629e 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -222,6 +222,7 @@ public:
NOTIFICATION_DRAG_BEGIN=21,
NOTIFICATION_DRAG_END=22,
NOTIFICATION_PATH_CHANGED=23,
+ NOTIFICATION_TRANSLATION_CHANGED=24,
};
/* NODE/TREE */
diff --git a/scene/main/scene_main_loop.cpp b/scene/main/scene_main_loop.cpp
index 418f4362b0..7ea7e49020 100644
--- a/scene/main/scene_main_loop.cpp
+++ b/scene/main/scene_main_loop.cpp
@@ -650,6 +650,9 @@ void SceneTree::_notification(int p_notification) {
get_root()->propagate_notification(p_notification);
} break;
+ case NOTIFICATION_TRANSLATION_CHANGED: {
+ get_root()->propagate_notification(Node::NOTIFICATION_TRANSLATION_CHANGED);
+ } break;
case NOTIFICATION_WM_UNFOCUS_REQUEST: {
notify_group(GROUP_CALL_REALTIME|GROUP_CALL_MULIILEVEL,"input",NOTIFICATION_WM_UNFOCUS_REQUEST);