@ -599,7 +599,7 @@ void TextEdit::_notification(int p_what) {
Size2 size = get_size ( ) ;
bool rtl = is_layout_rtl ( ) ;
if ( ( ! has_focus ( ) & & ! menu - > has_focus ( ) ) | | ! window_has_focus ) {
if ( ( ! has_focus ( ) & & ! ( menu & & menu - > has_focus ( ) ) ) | | ! window_has_focus ) {
draw_caret = false ;
}
@ -2470,6 +2470,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
_ensure_menu ( ) ;
menu - > set_position ( get_screen_transform ( ) . xform ( mpos ) ) ;
menu - > set_size ( Vector2 ( 1 , 1 ) ) ;
_generate_context_menu ( ) ;
@ -2709,6 +2710,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
// MISC.
if ( k - > is_action ( " ui_menu " , true ) ) {
if ( context_menu_enabled ) {
_ensure_menu ( ) ;
menu - > set_position ( get_screen_transform ( ) . xform ( _get_cursor_pixel_pos ( ) ) ) ;
menu - > set_size ( Vector2 ( 1 , 1 ) ) ;
_generate_context_menu ( ) ;
@ -3214,6 +3216,7 @@ int TextEdit::_get_menu_action_accelerator(const String &p_action) {
void TextEdit : : _generate_context_menu ( ) {
// Reorganize context menu.
_ensure_menu ( ) ;
menu - > clear ( ) ;
if ( ! readonly ) {
menu - > add_item ( RTR ( " Cut " ) , MENU_CUT , is_shortcut_keys_enabled ( ) ? _get_menu_action_accelerator ( " ui_cut " ) : 0 ) ;
@ -3858,10 +3861,12 @@ void TextEdit::set_text_direction(Control::TextDirection p_text_direction) {
text . set_direction_and_language ( dir , ( language ! = " " ) ? language : TranslationServer : : get_singleton ( ) - > get_tool_locale ( ) ) ;
text . invalidate_all ( ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_INHERITED ) , text_direction = = TEXT_DIRECTION_INHERITED ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_AUTO ) , text_direction = = TEXT_DIRECTION_AUTO ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_LTR ) , text_direction = = TEXT_DIRECTION_LTR ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_RTL ) , text_direction = = TEXT_DIRECTION_RTL ) ;
if ( menu_dir ) {
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_INHERITED ) , text_direction = = TEXT_DIRECTION_INHERITED ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_AUTO ) , text_direction = = TEXT_DIRECTION_AUTO ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_LTR ) , text_direction = = TEXT_DIRECTION_LTR ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_RTL ) , text_direction = = TEXT_DIRECTION_RTL ) ;
}
update ( ) ;
}
}
@ -3917,7 +3922,9 @@ String TextEdit::get_language() const {
void TextEdit : : set_draw_control_chars ( bool p_draw_control_chars ) {
if ( draw_control_chars ! = p_draw_control_chars ) {
draw_control_chars = p_draw_control_chars ;
menu - > set_item_checked ( menu - > get_item_index ( MENU_DISPLAY_UCC ) , draw_control_chars ) ;
if ( menu & & menu - > get_item_index ( MENU_DISPLAY_UCC ) > = 0 ) {
menu - > set_item_checked ( menu - > get_item_index ( MENU_DISPLAY_UCC ) , draw_control_chars ) ;
}
text . set_draw_control_chars ( draw_control_chars ) ;
text . invalidate_all ( ) ;
update ( ) ;
@ -5594,7 +5601,12 @@ bool TextEdit::is_virtual_keyboard_enabled() const {
return virtual_keyboard_enabled ;
}
bool TextEdit : : is_menu_visible ( ) const {
return menu & & menu - > is_visible ( ) ;
}
PopupMenu * TextEdit : : get_menu ( ) const {
const_cast < TextEdit * > ( this ) - > _ensure_menu ( ) ;
return menu ;
}
@ -5833,6 +5845,7 @@ void TextEdit::_bind_methods() {
ClassDB : : bind_method ( D_METHOD ( " menu_option " , " option " ) , & TextEdit : : menu_option ) ;
ClassDB : : bind_method ( D_METHOD ( " get_menu " ) , & TextEdit : : get_menu ) ;
ClassDB : : bind_method ( D_METHOD ( " is_menu_visible " ) , & TextEdit : : is_menu_visible ) ;
ClassDB : : bind_method ( D_METHOD ( " draw_minimap " , " draw " ) , & TextEdit : : set_draw_minimap ) ;
ClassDB : : bind_method ( D_METHOD ( " is_drawing_minimap " ) , & TextEdit : : is_drawing_minimap ) ;
@ -5921,6 +5934,54 @@ void TextEdit::_bind_methods() {
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " gui/common/text_edit_undo_stack_max_size " , PropertyInfo ( Variant : : INT , " gui/common/text_edit_undo_stack_max_size " , PROPERTY_HINT_RANGE , " 0,10000,1,or_greater " ) ) ; // No negative numbers.
}
void TextEdit : : _ensure_menu ( ) {
if ( menu ) {
return ;
}
menu = memnew ( PopupMenu ) ;
add_child ( menu ) ;
menu_dir = memnew ( PopupMenu ) ;
menu_dir - > set_name ( " DirMenu " ) ;
menu_dir - > add_radio_check_item ( RTR ( " Same as layout direction " ) , MENU_DIR_INHERITED ) ;
menu_dir - > add_radio_check_item ( RTR ( " Auto-detect direction " ) , MENU_DIR_AUTO ) ;
menu_dir - > add_radio_check_item ( RTR ( " Left-to-right " ) , MENU_DIR_LTR ) ;
menu_dir - > add_radio_check_item ( RTR ( " Right-to-left " ) , MENU_DIR_RTL ) ;
menu - > add_child ( menu_dir ) ;
menu_ctl = memnew ( PopupMenu ) ;
menu_ctl - > set_name ( " CTLMenu " ) ;
menu_ctl - > add_item ( RTR ( " Left-to-right mark (LRM) " ) , MENU_INSERT_LRM ) ;
menu_ctl - > add_item ( RTR ( " Right-to-left mark (RLM) " ) , MENU_INSERT_RLM ) ;
menu_ctl - > add_item ( RTR ( " Start of left-to-right embedding (LRE) " ) , MENU_INSERT_LRE ) ;
menu_ctl - > add_item ( RTR ( " Start of right-to-left embedding (RLE) " ) , MENU_INSERT_RLE ) ;
menu_ctl - > add_item ( RTR ( " Start of left-to-right override (LRO) " ) , MENU_INSERT_LRO ) ;
menu_ctl - > add_item ( RTR ( " Start of right-to-left override (RLO) " ) , MENU_INSERT_RLO ) ;
menu_ctl - > add_item ( RTR ( " Pop direction formatting (PDF) " ) , MENU_INSERT_PDF ) ;
menu_ctl - > add_separator ( ) ;
menu_ctl - > add_item ( RTR ( " Arabic letter mark (ALM) " ) , MENU_INSERT_ALM ) ;
menu_ctl - > add_item ( RTR ( " Left-to-right isolate (LRI) " ) , MENU_INSERT_LRI ) ;
menu_ctl - > add_item ( RTR ( " Right-to-left isolate (RLI) " ) , MENU_INSERT_RLI ) ;
menu_ctl - > add_item ( RTR ( " First strong isolate (FSI) " ) , MENU_INSERT_FSI ) ;
menu_ctl - > add_item ( RTR ( " Pop direction isolate (PDI) " ) , MENU_INSERT_PDI ) ;
menu_ctl - > add_separator ( ) ;
menu_ctl - > add_item ( RTR ( " Zero width joiner (ZWJ) " ) , MENU_INSERT_ZWJ ) ;
menu_ctl - > add_item ( RTR ( " Zero width non-joiner (ZWNJ) " ) , MENU_INSERT_ZWNJ ) ;
menu_ctl - > add_item ( RTR ( " Word joiner (WJ) " ) , MENU_INSERT_WJ ) ;
menu_ctl - > add_item ( RTR ( " Soft hyphen (SHY) " ) , MENU_INSERT_SHY ) ;
menu - > add_child ( menu_ctl ) ;
menu - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
menu_dir - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
menu_ctl - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_INHERITED ) , text_direction = = TEXT_DIRECTION_INHERITED ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_AUTO ) , text_direction = = TEXT_DIRECTION_AUTO ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_LTR ) , text_direction = = TEXT_DIRECTION_LTR ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_RTL ) , text_direction = = TEXT_DIRECTION_RTL ) ;
}
TextEdit : : TextEdit ( ) {
clear ( ) ;
set_focus_mode ( FOCUS_ALL ) ;
@ -5960,44 +6021,7 @@ TextEdit::TextEdit() {
undo_stack_max_size = GLOBAL_GET ( " gui/common/text_edit_undo_stack_max_size " ) ;
menu = memnew ( PopupMenu ) ;
add_child ( menu ) ;
menu_dir = memnew ( PopupMenu ) ;
menu_dir - > set_name ( " DirMenu " ) ;
menu_dir - > add_radio_check_item ( RTR ( " Same as layout direction " ) , MENU_DIR_INHERITED ) ;
menu_dir - > add_radio_check_item ( RTR ( " Auto-detect direction " ) , MENU_DIR_AUTO ) ;
menu_dir - > add_radio_check_item ( RTR ( " Left-to-right " ) , MENU_DIR_LTR ) ;
menu_dir - > add_radio_check_item ( RTR ( " Right-to-left " ) , MENU_DIR_RTL ) ;
menu_dir - > set_item_checked ( menu_dir - > get_item_index ( MENU_DIR_INHERITED ) , true ) ;
menu - > add_child ( menu_dir ) ;
menu_ctl = memnew ( PopupMenu ) ;
menu_ctl - > set_name ( " CTLMenu " ) ;
menu_ctl - > add_item ( RTR ( " Left-to-right mark (LRM) " ) , MENU_INSERT_LRM ) ;
menu_ctl - > add_item ( RTR ( " Right-to-left mark (RLM) " ) , MENU_INSERT_RLM ) ;
menu_ctl - > add_item ( RTR ( " Start of left-to-right embedding (LRE) " ) , MENU_INSERT_LRE ) ;
menu_ctl - > add_item ( RTR ( " Start of right-to-left embedding (RLE) " ) , MENU_INSERT_RLE ) ;
menu_ctl - > add_item ( RTR ( " Start of left-to-right override (LRO) " ) , MENU_INSERT_LRO ) ;
menu_ctl - > add_item ( RTR ( " Start of right-to-left override (RLO) " ) , MENU_INSERT_RLO ) ;
menu_ctl - > add_item ( RTR ( " Pop direction formatting (PDF) " ) , MENU_INSERT_PDF ) ;
menu_ctl - > add_separator ( ) ;
menu_ctl - > add_item ( RTR ( " Arabic letter mark (ALM) " ) , MENU_INSERT_ALM ) ;
menu_ctl - > add_item ( RTR ( " Left-to-right isolate (LRI) " ) , MENU_INSERT_LRI ) ;
menu_ctl - > add_item ( RTR ( " Right-to-left isolate (RLI) " ) , MENU_INSERT_RLI ) ;
menu_ctl - > add_item ( RTR ( " First strong isolate (FSI) " ) , MENU_INSERT_FSI ) ;
menu_ctl - > add_item ( RTR ( " Pop direction isolate (PDI) " ) , MENU_INSERT_PDI ) ;
menu_ctl - > add_separator ( ) ;
menu_ctl - > add_item ( RTR ( " Zero width joiner (ZWJ) " ) , MENU_INSERT_ZWJ ) ;
menu_ctl - > add_item ( RTR ( " Zero width non-joiner (ZWNJ) " ) , MENU_INSERT_ZWNJ ) ;
menu_ctl - > add_item ( RTR ( " Word joiner (WJ) " ) , MENU_INSERT_WJ ) ;
menu_ctl - > add_item ( RTR ( " Soft hyphen (SHY) " ) , MENU_INSERT_SHY ) ;
menu - > add_child ( menu_ctl ) ;
set_readonly ( false ) ;
menu - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
menu_dir - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
menu_ctl - > connect ( " id_pressed " , callable_mp ( this , & TextEdit : : menu_option ) ) ;
}
TextEdit : : ~ TextEdit ( ) {