Files
fps_project_1/addons/dreadpon.spatial_gardener/greenhouse/greenhouse_plant_state.gd

195 lines
5.2 KiB
GDScript

@tool
extends "../utility/input_field_resource/input_field_resource.gd"
#-------------------------------------------------------------------------------
# A middle-man between the plant and the UI/painting/placement logic
#-------------------------------------------------------------------------------
const Greenhouse_Plant = preload("greenhouse_plant.gd")
var plant_brush_active:bool = false
var plant_label:String = ''
var plant:Greenhouse_Plant = null
signal prop_action_executed_on_plant(prop_action, final_val, plant)
signal prop_action_executed_on_LOD_variant(prop_action, final_val, LOD_variant, plant)
signal req_octree_reconfigure(plant)
signal req_octree_recenter(plant)
signal req_import_plant_data(plant)
signal req_export_plant_data(plant)
signal req_import_greenhouse_data()
signal req_export_greenhouse_data()
#-------------------------------------------------------------------------------
# Initialization
#-------------------------------------------------------------------------------
func _init():
super()
set_meta("class", "Greenhouse_PlantState")
resource_name = "Greenhouse_PlantState"
# A workaround to trigger the initial creation of a plant
_set("plant/plant", plant)
#-------------------------------------------------------------------------------
# Signal forwarding
#-------------------------------------------------------------------------------
func on_changed_plant():
emit_changed()
func on_prop_action_executed_on_plant(prop_action, final_val, plant):
prop_action_executed_on_plant.emit(prop_action, final_val, plant)
func on_req_octree_reconfigure(plant):
req_octree_reconfigure.emit(plant)
func on_req_octree_recenter(plant):
req_octree_recenter.emit(plant)
func on_req_import_plant_data(plant):
req_import_plant_data.emit(plant)
func on_req_export_plant_data(plant):
req_export_plant_data.emit(plant)
func on_req_import_greenhouse_data():
req_import_greenhouse_data.emit()
func on_req_export_greenhouse_data():
req_export_greenhouse_data.emit()
func on_prop_action_executed_on_LOD_variant(prop_action, final_val, LOD_variant, plant):
prop_action_executed_on_LOD_variant.emit(prop_action, final_val, LOD_variant, plant)
#-------------------------------------------------------------------------------
# Property management
#-------------------------------------------------------------------------------
func _modify_prop(prop:String, val):
match prop:
"plant/plant":
if !is_instance_of(val, Greenhouse_Plant):
val = Greenhouse_Plant.new()
FunLib.ensure_signal(val.changed, on_changed_plant)
FunLib.ensure_signal(val.prop_action_executed, on_prop_action_executed_on_plant, [val])
FunLib.ensure_signal(val.prop_action_executed_on_LOD_variant, on_prop_action_executed_on_LOD_variant, [val])
FunLib.ensure_signal(val.req_octree_reconfigure, on_req_octree_reconfigure, [val])
FunLib.ensure_signal(val.req_octree_recenter, on_req_octree_recenter, [val])
FunLib.ensure_signal(val.req_import_plant_data, on_req_import_plant_data, [val])
FunLib.ensure_signal(val.req_export_plant_data, on_req_export_plant_data, [val])
FunLib.ensure_signal(val.req_import_greenhouse_data, on_req_import_greenhouse_data)
FunLib.ensure_signal(val.req_export_greenhouse_data, on_req_export_greenhouse_data)
if val._undo_redo != _undo_redo:
val.set_undo_redo(_undo_redo)
return val
#-------------------------------------------------------------------------------
# Property export
#-------------------------------------------------------------------------------
func set_undo_redo(val):
super.set_undo_redo(val)
plant.set_undo_redo(_undo_redo)
func _get(prop):
match prop:
"plant/plant_brush_active":
return plant_brush_active
"plant/plant_label":
return plant_label
"plant/plant":
return plant
return null
func _set(prop, val):
var return_val = true
val = _modify_prop(prop, val)
match prop:
"plant/plant_brush_active":
plant_brush_active = val
"plant/plant_label":
plant_label = val
"plant/plant":
plant = val
_:
return_val = false
if return_val:
emit_changed()
return return_val
func _get_prop_dictionary():
return {
"plant/plant_brush_active":
{
"name": "plant/plant_brush_active",
"type": TYPE_BOOL,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_NONE
},
"plant/plant_label":
{
"name": "plant/plant_label",
"type": TYPE_STRING,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_NONE
},
"plant/plant":
{
"name": "plant/plant",
"type": TYPE_OBJECT ,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_RESOURCE_TYPE
},
}
func create_input_fields(_base_control:Control, _resource_previewer, whitelist:Array = []) -> Dictionary:
if plant:
return plant.create_input_fields(_base_control, _resource_previewer, whitelist)
return {}
func _fix_duplicate_signals(copy):
copy._modify_prop("plant/plant", copy.plant)
func get_prop_tooltip(prop:String) -> String:
match prop:
"plant/plant_brush_active":
return "The flag that defines if plant will be used during painting or not"
"plant/plant_brush_active":
return "The label to be displayed on top of the plant's thumbnail"
"plant/plant":
return "The contained plant itself"
return ""