|
@@ -987,13 +987,41 @@ void TextEdit::_notification(int p_what) {
|
|
|
}
|
|
|
|
|
|
int caret_w = (str[j] == '\t') ? cache.font->get_char_size(' ').width : char_w;
|
|
|
- if (draw_caret) {
|
|
|
- if (insert_mode) {
|
|
|
- int caret_h = (block_caret) ? 4 : 1;
|
|
|
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, caret_h)), cache.caret_color);
|
|
|
- } else {
|
|
|
- caret_w = (block_caret) ? caret_w : 1;
|
|
|
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
|
|
|
+ if (ime_text.length() > 0) {
|
|
|
+ int ofs = 0;
|
|
|
+ while (true) {
|
|
|
+ if (ofs >= ime_text.length())
|
|
|
+ break;
|
|
|
+
|
|
|
+ CharType cchar = ime_text[ofs];
|
|
|
+ CharType next = ime_text[ofs + 1];
|
|
|
+ int im_char_width = cache.font->get_char_size(cchar, next).width;
|
|
|
+
|
|
|
+ if ((char_ofs + char_margin + im_char_width) >= xmargin_end)
|
|
|
+ break;
|
|
|
+
|
|
|
+ bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y;
|
|
|
+ if (selected) {
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 3)), color);
|
|
|
+ } else {
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 1)), color);
|
|
|
+ }
|
|
|
+
|
|
|
+ cache.font->draw_char(ci, Point2(char_ofs + char_margin, ofs_y + ascent), cchar, next, color);
|
|
|
+
|
|
|
+ char_ofs += im_char_width;
|
|
|
+ ofs++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ime_text.length() == 0) {
|
|
|
+ if (draw_caret) {
|
|
|
+ if (insert_mode) {
|
|
|
+ int caret_h = (block_caret) ? 4 : 1;
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, caret_h)), cache.caret_color);
|
|
|
+ } else {
|
|
|
+ caret_w = (block_caret) ? caret_w : 1;
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1024,16 +1052,43 @@ void TextEdit::_notification(int p_what) {
|
|
|
if (insert_mode) {
|
|
|
cursor_pos.y += (get_row_height() - 3);
|
|
|
}
|
|
|
+ if (ime_text.length() > 0) {
|
|
|
+ int ofs = 0;
|
|
|
+ while (true) {
|
|
|
+ if (ofs >= ime_text.length())
|
|
|
+ break;
|
|
|
|
|
|
- if (draw_caret) {
|
|
|
- if (insert_mode) {
|
|
|
- int char_w = cache.font->get_char_size(' ').width;
|
|
|
- int caret_h = (block_caret) ? 4 : 1;
|
|
|
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(char_w, caret_h)), cache.caret_color);
|
|
|
- } else {
|
|
|
- int char_w = cache.font->get_char_size(' ').width;
|
|
|
- int caret_w = (block_caret) ? char_w : 1;
|
|
|
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
|
|
|
+ CharType cchar = ime_text[ofs];
|
|
|
+ CharType next = ime_text[ofs + 1];
|
|
|
+ int im_char_width = cache.font->get_char_size(cchar, next).width;
|
|
|
+
|
|
|
+ if ((char_ofs + char_margin + im_char_width) >= xmargin_end)
|
|
|
+ break;
|
|
|
+
|
|
|
+ bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y;
|
|
|
+ if (selected) {
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 3)), color);
|
|
|
+ } else {
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(char_ofs + char_margin, ofs_y + get_row_height()), Size2(im_char_width, 1)), color);
|
|
|
+ }
|
|
|
+
|
|
|
+ cache.font->draw_char(ci, Point2(char_ofs + char_margin, ofs_y + ascent), cchar, next, color);
|
|
|
+
|
|
|
+ char_ofs += im_char_width;
|
|
|
+ ofs++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ime_text.length() == 0) {
|
|
|
+ if (draw_caret) {
|
|
|
+ if (insert_mode) {
|
|
|
+ int char_w = cache.font->get_char_size(' ').width;
|
|
|
+ int caret_h = (block_caret) ? 4 : 1;
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(char_w, caret_h)), cache.caret_color);
|
|
|
+ } else {
|
|
|
+ int char_w = cache.font->get_char_size(' ').width;
|
|
|
+ int caret_w = (block_caret) ? char_w : 1;
|
|
|
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1197,6 +1252,7 @@ void TextEdit::_notification(int p_what) {
|
|
|
|
|
|
if (has_focus()) {
|
|
|
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));
|
|
|
+ OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
|
|
|
}
|
|
|
} break;
|
|
|
case NOTIFICATION_FOCUS_ENTER: {
|
|
@@ -1207,6 +1263,7 @@ void TextEdit::_notification(int p_what) {
|
|
|
|
|
|
Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height();
|
|
|
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);
|
|
|
+ OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
|
|
|
|
|
|
if (OS::get_singleton()->has_virtual_keyboard())
|
|
|
OS::get_singleton()->show_virtual_keyboard(get_text(), get_global_rect());
|
|
@@ -1218,6 +1275,9 @@ void TextEdit::_notification(int p_what) {
|
|
|
case NOTIFICATION_FOCUS_EXIT: {
|
|
|
|
|
|
OS::get_singleton()->set_ime_position(Point2());
|
|
|
+ OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL);
|
|
|
+ ime_text = "";
|
|
|
+ ime_selection = Point2();
|
|
|
|
|
|
if (OS::get_singleton()->has_virtual_keyboard())
|
|
|
OS::get_singleton()->hide_virtual_keyboard();
|
|
@@ -1228,6 +1288,13 @@ void TextEdit::_notification(int p_what) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void TextEdit::_ime_text_callback(void *p_self, String p_text, Point2 p_selection) {
|
|
|
+ TextEdit *self = (TextEdit *)p_self;
|
|
|
+ self->ime_text = p_text;
|
|
|
+ self->ime_selection = p_selection;
|
|
|
+ self->update();
|
|
|
+}
|
|
|
+
|
|
|
void TextEdit::_consume_pair_symbol(CharType ch) {
|
|
|
|
|
|
int cursor_position_to_move = cursor_get_column() + 1;
|