prog
This commit is contained in:
230
addons/madtalk/components/DialogNodeItem_condition.gd
Normal file
230
addons/madtalk/components/DialogNodeItem_condition.gd
Normal file
@@ -0,0 +1,230 @@
|
||||
@tool
|
||||
extends Control
|
||||
class_name DialogNodeItem_condition
|
||||
|
||||
signal remove_requested(requester)
|
||||
signal move_up_requested(requester)
|
||||
signal move_down_requested(requester)
|
||||
signal drag_started(requester)
|
||||
signal drag_ended(requester)
|
||||
|
||||
|
||||
|
||||
@export var data: Resource
|
||||
|
||||
|
||||
enum PopupOptions {
|
||||
Edit,
|
||||
MoveUp,
|
||||
MoveDown,
|
||||
Remove
|
||||
}
|
||||
#@onready var dialog_edit = get_node("DialogEdit")
|
||||
var edit_condition_type
|
||||
var edit_specificlist
|
||||
var edit_btntip
|
||||
|
||||
# names of the nodes holding the controls in edit box
|
||||
const edit_specificlist_items = [
|
||||
"Random",
|
||||
"VarBool",
|
||||
"VarAtLeast",
|
||||
"VarUnder",
|
||||
"VarString",
|
||||
"Time",
|
||||
"DayWeek",
|
||||
"DayMonth",
|
||||
"Date",
|
||||
"ElapsedVar",
|
||||
"Custom"
|
||||
]
|
||||
|
||||
@onready var condition_conditionlabel = get_node("ConditionLabel")
|
||||
|
||||
var template_DialogEdit: PackedScene = preload("res://addons/madtalk/components/popups/Condition_DialogEdit.tscn")
|
||||
var dialog_edit: Window
|
||||
|
||||
var template_PopupMenu: PackedScene = preload("res://addons/madtalk/components/popups/DialogNodeItem_PopupMenu.tscn")
|
||||
var popup_menu: PopupMenu
|
||||
|
||||
@onready var dragdrop_line := $DragDropLine
|
||||
|
||||
var sequence_node = null
|
||||
|
||||
func _ready():
|
||||
if data:
|
||||
set_data(data)
|
||||
|
||||
func set_data(new_data):
|
||||
data = new_data
|
||||
update_from_data()
|
||||
|
||||
func update_from_data():
|
||||
if data:
|
||||
var mtdefs = MTDefs.new()
|
||||
condition_conditionlabel.text = mtdefs.Condition_PrintFail(data.condition_type, data.condition_values)
|
||||
|
||||
|
||||
|
||||
func create_dialog_edit():
|
||||
if not dialog_edit:
|
||||
dialog_edit = template_DialogEdit.instantiate() as Window
|
||||
add_child(dialog_edit)
|
||||
dialog_edit.get_node("Panel/BtnConditionType").item_selected.connect(_on_DialogEdit_BtnConditionType_item_selected)
|
||||
dialog_edit.get_node("Panel/BottomBar/BtnSave").pressed.connect(_on_DialogEdit_BtnSave_pressed)
|
||||
dialog_edit.get_node("Panel/BottomBar/BtnCancel").pressed.connect(_on_DialogEdit_BtnCancel_pressed)
|
||||
|
||||
edit_condition_type = dialog_edit.get_node("Panel/BtnConditionType")
|
||||
edit_specificlist = dialog_edit.get_node("Panel/SpecificFields")
|
||||
edit_btntip = dialog_edit.get_node("Panel/BtnTip")
|
||||
|
||||
for item in edit_specificlist.get_children():
|
||||
item.hide()
|
||||
|
||||
func dispose_dialog_edit():
|
||||
if dialog_edit:
|
||||
dialog_edit.queue_free()
|
||||
dialog_edit = null
|
||||
|
||||
|
||||
func create_popup_menu():
|
||||
if not popup_menu:
|
||||
popup_menu = template_PopupMenu.instantiate() as PopupMenu
|
||||
add_child(popup_menu)
|
||||
popup_menu.id_pressed.connect(_on_PopupMenu_id_pressed)
|
||||
|
||||
func dispose_popup_menu():
|
||||
if popup_menu:
|
||||
popup_menu.queue_free()
|
||||
popup_menu = null
|
||||
|
||||
|
||||
func _on_DialogNodeItem_condition_gui_input(event):
|
||||
if (event is InputEventMouseButton):
|
||||
if (event.pressed):
|
||||
if (event.button_index == MOUSE_BUTTON_LEFT):
|
||||
if event.double_click:
|
||||
_on_PopupMenu_id_pressed(PopupOptions.Edit)
|
||||
else:
|
||||
drag_started.emit(self)
|
||||
|
||||
if (event.button_index == MOUSE_BUTTON_RIGHT):
|
||||
var cursor_position = get_viewport().get_mouse_position() if get_viewport().gui_embed_subwindows else DisplayServer.mouse_get_position()
|
||||
create_popup_menu()
|
||||
popup_menu.popup(Rect2(cursor_position,Vector2(10,10)))
|
||||
else:
|
||||
if (event.button_index == MOUSE_BUTTON_LEFT):
|
||||
drag_ended.emit(self)
|
||||
|
||||
|
||||
func _on_PopupMenu_id_pressed(id):
|
||||
dispose_popup_menu()
|
||||
match id:
|
||||
PopupOptions.Edit:
|
||||
create_dialog_edit()
|
||||
edit_condition_type.selected = data.condition_type
|
||||
var values_size = data.condition_values.size()
|
||||
# Nodes not commonly used so get_node is used directly for simplicity
|
||||
# (They are only used here and when saving)
|
||||
|
||||
|
||||
for j in range(edit_specificlist_items.size()):
|
||||
var num_args = MTDefs.ConditionData[j]["num_args"]
|
||||
var node_name = edit_specificlist_items[j]
|
||||
|
||||
for i in range(num_args):
|
||||
var data_type = MTDefs.ConditionData[j]["data_types"][i]
|
||||
var print_type = MTDefs.ConditionData[j]["print_types"][i] if MTDefs.ConditionData[j]["print_types"].size() > i else TYPE_STRING
|
||||
var value = data.condition_values[i] if (values_size > i) else MTDefs.ConditionData[j]["default"][i]
|
||||
|
||||
if print_type == MTDefs.TYPE_WEEKDAY:
|
||||
var node = get_node_or_null("DialogEdit/Panel/SpecificFields/%s/Option%d" % [node_name, i])
|
||||
if node:
|
||||
value = int(value)
|
||||
while value > 6:
|
||||
value -= 7
|
||||
while value < 0:
|
||||
value += 7
|
||||
node.select(int(value))
|
||||
elif print_type == MTDefs.TYPE_CHECK:
|
||||
var node = get_node_or_null("DialogEdit/Panel/SpecificFields/%s/Option%d" % [node_name, i])
|
||||
if node:
|
||||
value = float(value)
|
||||
if value != 0:
|
||||
node.select(0)
|
||||
else:
|
||||
node.select(1)
|
||||
|
||||
elif print_type != null:
|
||||
var node = get_node_or_null("DialogEdit/Panel/SpecificFields/%s/EditValue%d" % [node_name, i])
|
||||
if node:
|
||||
node.text = str(value)
|
||||
|
||||
update_DialogEdit_contents(data.condition_type)
|
||||
dialog_edit.popup_centered()
|
||||
|
||||
PopupOptions.MoveUp:
|
||||
emit_signal("move_up_requested", self)
|
||||
|
||||
PopupOptions.MoveDown:
|
||||
emit_signal("move_down_requested", self)
|
||||
|
||||
PopupOptions.Remove:
|
||||
emit_signal("remove_requested", self)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
func _on_DialogEdit_BtnConditionType_item_selected(index):
|
||||
update_DialogEdit_contents(edit_condition_type.selected)
|
||||
|
||||
func _on_DialogEdit_BtnCancel_pressed():
|
||||
dispose_dialog_edit()
|
||||
|
||||
|
||||
func _on_DialogEdit_BtnSave_pressed():
|
||||
data.condition_type = edit_condition_type.selected
|
||||
|
||||
|
||||
var num_args = MTDefs.ConditionData[data.condition_type]["num_args"]
|
||||
var node_name = edit_specificlist_items[data.condition_type]
|
||||
data.condition_values.resize(num_args)
|
||||
|
||||
for i in range(num_args):
|
||||
var data_type = MTDefs.ConditionData[data.condition_type]["data_types"][i]
|
||||
var print_type = MTDefs.ConditionData[data.condition_type]["print_types"][i] if MTDefs.ConditionData[data.condition_type]["print_types"].size() > i else TYPE_STRING
|
||||
var value
|
||||
if print_type == MTDefs.TYPE_WEEKDAY:
|
||||
value = get_node("DialogEdit/Panel/SpecificFields/%s/Option%d" % [node_name, i]).selected
|
||||
elif print_type == MTDefs.TYPE_CHECK:
|
||||
value = 1 if get_node("DialogEdit/Panel/SpecificFields/%s/Option%d" % [node_name, i]).selected == 0 else 0
|
||||
else:
|
||||
value = get_node("DialogEdit/Panel/SpecificFields/%s/EditValue%d" % [node_name, i]).text
|
||||
|
||||
# Data type is not the same as print type
|
||||
# data type is usually int, float or string, even if the print type is
|
||||
# something else such as checks or day of week
|
||||
# (as those are stored as integers)
|
||||
match data_type:
|
||||
TYPE_INT:
|
||||
data.condition_values[i] = int(value)
|
||||
TYPE_FLOAT:
|
||||
data.condition_values[i] = float(value)
|
||||
TYPE_STRING:
|
||||
data.condition_values[i] = value
|
||||
|
||||
update_from_data()
|
||||
dispose_dialog_edit()
|
||||
|
||||
|
||||
|
||||
func update_DialogEdit_contents(condition):
|
||||
var fieldboxes = edit_specificlist.get_children()
|
||||
for i in range(fieldboxes.size()):
|
||||
if i == condition:
|
||||
fieldboxes[i].show()
|
||||
else:
|
||||
fieldboxes[i].hide()
|
||||
edit_btntip.tip_title = MTDefs.ConditionData[condition]["description"] #edit_condition_type.get_item_text(edit_condition_type.selected)
|
||||
edit_btntip.tip_text = MTDefs.ConditionData[condition]["help"]
|
Reference in New Issue
Block a user