import the woofer

This commit is contained in:
Haze Weathers 2025-03-01 17:50:05 -05:00
parent 825fee53e2
commit 3e89acfea8
92 changed files with 5783 additions and 0 deletions

View file

@ -0,0 +1,100 @@
@tool
extends EditorProperty
const StateChartUtil = preload("../state_chart_util.gd")
var _refactor_window_scene:PackedScene = preload("../event_refactor/event_refactor.tscn")
# The main control for editing the property.
var _property_control:LineEdit = LineEdit.new()
# drop down button for the popup menu
var _dropdown_button:Button = Button.new()
# popup menu with event names
var _popup_menu:PopupMenu = PopupMenu.new()
# the state chart we are currently editing
var _chart:StateChart
# the undo redo manager
var _undo_redo:EditorUndoRedoManager
func _init(transition:Transition, undo_redo:EditorUndoRedoManager):
# save the variables
_chart = StateChartUtil.find_parent_state_chart(transition)
_undo_redo = undo_redo
# setup the ui
_popup_menu.index_pressed.connect(_on_event_selected)
_dropdown_button.icon = get_theme_icon("arrow", "OptionButton")
_dropdown_button.flat = true
_dropdown_button.pressed.connect(_show_popup)
# build the actual editor
var hbox := HBoxContainer.new()
hbox.add_child(_property_control)
hbox.add_child(_dropdown_button)
_property_control.size_flags_horizontal = Control.SIZE_EXPAND_FILL
# Add the control as a direct child of EditorProperty node.
add_child(hbox)
add_child(_popup_menu)
# Make sure the control is able to retain the focus.
add_focusable(_property_control)
_property_control.text_changed.connect(_on_text_changed)
## Shows the popup when the user clicks the button.
func _show_popup():
# always show up-to-date information in selector
var known_events = StateChartUtil.events_of(_chart)
_popup_menu.clear()
_popup_menu.add_item("<empty>")
_popup_menu.add_icon_item(get_theme_icon("Tools", "EditorIcons"), "Manage...")
if known_events.size() > 0:
_popup_menu.add_separator()
for event in known_events:
_popup_menu.add_item(event)
# and show it relative to the dropdown button
var gt := _dropdown_button.get_global_rect()
_popup_menu.reset_size()
var ms := _popup_menu.get_contents_minimum_size().x
var popup_pos := gt.end - Vector2(ms, 0) + Vector2(DisplayServer.window_get_position())
_popup_menu.set_position(popup_pos)
_popup_menu.popup()
func _on_event_selected(index:int) -> void:
# index 1 == "Manage"
if index == 1:
# open refactor window
var window = _refactor_window_scene.instantiate()
add_child(window)
window.open(_chart, _undo_redo)
return
# replace content with selection from popup
var event := _popup_menu.get_item_text(index) if index > 0 else ""
_property_control.text = event
_on_text_changed(event)
_property_control.grab_focus()
func _on_text_changed(new_text:String):
emit_changed(get_edited_property(), new_text)
func _update_property() -> void:
# Read the current value from the property.
var new_value = get_edited_object()[get_edited_property()]
# if the text is already correct, don't change it.
if new_value == _property_control.text:
return
_property_control.text = new_value

View file

@ -0,0 +1,29 @@
@tool
extends EditorInspectorPlugin
const EventEditor = preload("event_editor.gd")
var _undo_redo:EditorUndoRedoManager
func setup(undo_redo:EditorUndoRedoManager):
_undo_redo = undo_redo
func _can_handle(_object):
# We support all objects in this example.
return true
func _parse_property(object, type, name, _hint_type, _hint_string, _usage_flags, _wide):
# We handle properties of type integer.
if object is Transition and name == "event" and type == TYPE_STRING_NAME:
# Create an instance of the custom property editor and register
# it to a specific property path.
var editor = EventEditor.new(object as Transition, _undo_redo)
add_property_editor(name, editor)
# Inform the editor to remove the default property editor for
# this property type.
return true
else:
return false