2022-05-14 20:51:48 +02:00
extends MarginContainer
class_name EditableTextBlock
const EMOTE_LIST = preload ( " res://configuration/emotes/emote_list.tres " )
onready var nine_patch = get_node ( " NinePatch " )
onready var margin_container = get_node ( " VBoxContainer/MarginContainer " )
onready var content = get_node ( " VBoxContainer/MarginContainer/Content " )
onready var reference_label = get_node ( " VBoxContainer/MarginContainer/ReferenceLabel " )
onready var text_edit = get_node ( " VBoxContainer/MarginContainer/ContentFitTextEdit " )
onready var popup_menu = get_node ( " PopupMenu " )
var edit_mode : bool = false
func _ready ( ) :
margin_container . remove_child ( text_edit )
popup_menu . rect_size . x = 64
2022-06-04 13:33:00 +02:00
content . text = _get_content_string ( )
2022-05-14 20:51:48 +02:00
# warning-ignore:return_value_discarded
Users . connect ( " switched " , self , " _on_user_switched " )
_setup ( )
func _gui_input ( event ) :
if event is InputEventMouseButton :
if event . is_pressed ( ) and event . button_index == BUTTON_RIGHT and ! edit_mode :
popup_menu . clear ( )
popup_menu . rect_size . y = 1
_setup_popup_menu_items ( )
popup_menu . popup ( Rect2 (
event . global_position ,
popup_menu . rect_size
) )
func _get_content_string ( ) - > String : # Virtual.
return " "
func _setup ( ) : # Virtual.
_setup_content ( )
_setup_appearance ( )
func _setup_content ( ) :
var emote_placeholder = " miii "
var emote_size = 21
if _check_if_string_only_contains_emote_tags ( _get_content_string ( ) ) :
emote_placeholder = " mMiii "
emote_size = 32
reference_label . text = _resolve_emotes_to_placeholder (
_get_content_string ( ) ,
emote_placeholder
)
content . bbcode_text = _resolve_emotes_in_string (
_get_content_string ( ) ,
emote_size
)
func _setup_appearance ( ) :
_adjust_appearance_to_user ( )
if text_edit . max_width > 0 :
yield ( get_tree ( ) , " idle_frame " )
if rect_size . x > = 488.0 :
margin_container . remove_child ( reference_label )
content . rect_min_size . x = 488.0
func _setup_popup_menu_items ( ) : # Virtual.
pass
func _adjust_appearance_to_user ( ) : # Virtual.
pass
func _check_if_string_only_contains_emote_tags ( string : String ) :
var test_string = string
for entry in EMOTE_LIST . list :
test_string = test_string . replace ( " : " + entry + " : " , " " )
test_string = test_string . strip_edges ( )
return test_string . empty ( )
func _resolve_emotes_in_string ( string : String , size : int ) - > String :
var result : = string
var str_size = str ( size )
var img_tag = " [img=< " + str_size + " >x< " + str_size + " >] "
for entry in EMOTE_LIST . list :
result = result . replace (
" : " + entry + " : " ,
img_tag + " res://configuration/emotes/ " + entry + " .png[/img] "
)
return result
# We replace the emote_tag in ReferenceLabel with some placeholder string,
# that has about the same width, as an emote, to fit container sizing.
func _resolve_emotes_to_placeholder (
string : String , placeholder : String ) - > String :
var result : = string
for entry in EMOTE_LIST . list :
result = result . replace ( " : " + entry + " : " , placeholder )
return result
func _enable_edit_mode ( ) :
edit_mode = true
if margin_container . is_a_parent_of ( content ) :
content . rect_min_size . x = 0.0
margin_container . remove_child ( content )
if margin_container . is_a_parent_of ( reference_label ) :
margin_container . remove_child ( reference_label )
margin_container . add_child ( text_edit )
yield ( get_tree ( ) , " idle_frame " )
text_edit . text = _get_content_string ( )
text_edit . confirm_on_focus_exit = false
_post_enable_edit_mode ( )
text_edit . adjust_size ( )
func _post_enable_edit_mode ( ) : # Virtual.
pass
func _disable_edit_mode ( ) :
edit_mode = false
if margin_container . is_a_parent_of ( text_edit ) :
margin_container . remove_child ( text_edit )
margin_container . add_child ( content )
margin_container . add_child ( reference_label )
_post_disable_edit_mode ( )
_setup ( )
func _post_disable_edit_mode ( ) : # Virtual.
pass
func _on_user_switched ( ) :
_adjust_appearance_to_user ( )
func _on_popup_menu_id_pressed ( _id ) : # Virtual.
pass
func _on_text_edit_confirmed ( _confirmed_content ) : # Virtual.
pass