mirror of
https://github.com/litruv/PNGTuber-Plus.git
synced 2026-07-24 02:26:02 +10:00
wobble sync groups !build
This commit is contained in:
207
ui_scenes/spriteEditMenu/wobble_sync_control.gd
Normal file
207
ui_scenes/spriteEditMenu/wobble_sync_control.gd
Normal file
@@ -0,0 +1,207 @@
|
||||
extends Control
|
||||
|
||||
## WobbleSyncControl - UI component for managing wobble sync groups
|
||||
## Designed to integrate into the sprite editor panel
|
||||
|
||||
@onready var groupDropdown = $VBoxContainer/GroupRow/GroupDropdown
|
||||
@onready var syncIndicator = $VBoxContainer/SyncIndicator
|
||||
@onready var createGroupDialog = $CreateGroupDialog
|
||||
@onready var groupNameInput = $CreateGroupDialog/VBoxContainer/LineEdit
|
||||
|
||||
var currentSprite = null
|
||||
var updating_dropdown = false # Flag to prevent recursive calls
|
||||
|
||||
signal group_changed(sprite_id: int, group_name: String)
|
||||
|
||||
func _ready():
|
||||
# Wait for autoload to be ready
|
||||
await get_tree().process_frame
|
||||
|
||||
# Connect UI signals - no add button to connect
|
||||
groupDropdown.item_selected.connect(_on_group_dropdown_selected)
|
||||
createGroupDialog.confirmed.connect(_on_create_group_confirmed)
|
||||
createGroupDialog.canceled.connect(_on_create_group_cancelled)
|
||||
|
||||
# Connect to wobble sync manager signals
|
||||
if WobbleSyncManager:
|
||||
WobbleSyncManager.group_created.connect(_on_group_created)
|
||||
WobbleSyncManager.group_deleted.connect(_on_group_deleted)
|
||||
|
||||
# Setup create group dialog
|
||||
createGroupDialog.title = "Create Wobble Sync Group"
|
||||
createGroupDialog.size = Vector2(300, 150)
|
||||
createGroupDialog.unresizable = false
|
||||
createGroupDialog.transient = true # Prevent click-through
|
||||
createGroupDialog.exclusive = true # Make modal
|
||||
createGroupDialog.popup_window = false # Keep as embedded dialog
|
||||
createGroupDialog.always_on_top = true
|
||||
|
||||
updateUI()
|
||||
|
||||
## Update the UI based on current sprite selection
|
||||
func updateUI():
|
||||
updateGroupDropdown()
|
||||
updateSyncIndicator()
|
||||
|
||||
## Update the group dropdown with available options
|
||||
func updateGroupDropdown():
|
||||
updating_dropdown = true # Prevent recursive calls
|
||||
|
||||
groupDropdown.clear()
|
||||
|
||||
# Add "None" option
|
||||
groupDropdown.add_item("None")
|
||||
|
||||
# Add existing groups
|
||||
if WobbleSyncManager:
|
||||
var groups = WobbleSyncManager.getGroupNames()
|
||||
print("DEBUG: updateGroupDropdown - available groups: ", groups)
|
||||
for group_name in groups:
|
||||
groupDropdown.add_item(group_name)
|
||||
else:
|
||||
print("DEBUG: updateGroupDropdown - WobbleSyncManager not available")
|
||||
|
||||
# Add "Create New..." option
|
||||
groupDropdown.add_separator()
|
||||
groupDropdown.add_item("Create New...")
|
||||
|
||||
# Select current group if sprite is synced
|
||||
if currentSprite != null and currentSprite.wobbleSyncGroup != "":
|
||||
print("DEBUG: updateGroupDropdown - sprite has group '", currentSprite.wobbleSyncGroup, "'")
|
||||
var group_index = -1
|
||||
for i in range(groupDropdown.get_item_count()):
|
||||
if groupDropdown.get_item_text(i) == currentSprite.wobbleSyncGroup:
|
||||
group_index = i
|
||||
break
|
||||
|
||||
if group_index != -1:
|
||||
print("DEBUG: updateGroupDropdown - selecting group at index ", group_index)
|
||||
groupDropdown.selected = group_index
|
||||
else:
|
||||
print("DEBUG: updateGroupDropdown - group '", currentSprite.wobbleSyncGroup, "' not found in dropdown")
|
||||
groupDropdown.selected = 0 # Select "None"
|
||||
else:
|
||||
print("DEBUG: updateGroupDropdown - sprite has no group, selecting 'None'")
|
||||
groupDropdown.selected = 0 # Select "None"
|
||||
|
||||
updating_dropdown = false
|
||||
|
||||
## Update the sync indicator
|
||||
func updateSyncIndicator():
|
||||
if currentSprite == null:
|
||||
syncIndicator.visible = false
|
||||
return
|
||||
|
||||
if currentSprite.isSynced():
|
||||
syncIndicator.visible = true
|
||||
syncIndicator.text = "⚡ Synced to \"" + currentSprite.wobbleSyncGroup + "\""
|
||||
else:
|
||||
syncIndicator.visible = false
|
||||
|
||||
## Set the current sprite to manage
|
||||
func setSprite(sprite):
|
||||
print("DEBUG: WobbleSyncControl.setSprite called with sprite ID: ", sprite.id if sprite else "null")
|
||||
currentSprite = sprite
|
||||
if currentSprite:
|
||||
print("DEBUG: Current sprite wobbleSyncGroup: '", currentSprite.wobbleSyncGroup, "'")
|
||||
print("DEBUG: Current sprite isSynced(): ", currentSprite.isSynced())
|
||||
updateUI()
|
||||
|
||||
## Get available groups for the dropdown (excluding "None" and "Create New...")
|
||||
func getAvailableGroups() -> Array:
|
||||
var groups = []
|
||||
for i in range(1, groupDropdown.get_item_count() - 2): # Skip "None" and "Create New..."
|
||||
groups.append(groupDropdown.get_item_text(i))
|
||||
return groups
|
||||
|
||||
## Handle group dropdown selection
|
||||
func _on_group_dropdown_selected(index: int):
|
||||
if currentSprite == null or updating_dropdown:
|
||||
return
|
||||
|
||||
var selected_text = groupDropdown.get_item_text(index)
|
||||
print("DEBUG: Dropdown selected: '", selected_text, "' at index ", index)
|
||||
|
||||
match selected_text:
|
||||
"None":
|
||||
# Remove sprite from any group
|
||||
if currentSprite.wobbleSyncGroup != "" and WobbleSyncManager:
|
||||
print("DEBUG: Removing sprite ID ", currentSprite.id, " from group '", currentSprite.wobbleSyncGroup, "'")
|
||||
WobbleSyncManager.removeSpriteFromAllGroups(currentSprite.id)
|
||||
Global.pushUpdate("Removed sprite from wobble sync group")
|
||||
|
||||
"Create New...":
|
||||
print("DEBUG: User selected 'Create New...' from dropdown")
|
||||
# Show create group dialog
|
||||
groupNameInput.text = ""
|
||||
groupNameInput.placeholder_text = "Enter group name..."
|
||||
createGroupDialog.popup_centered_clamped(Vector2i(300, 150))
|
||||
groupNameInput.grab_focus()
|
||||
# Reset dropdown to current selection
|
||||
updateGroupDropdown()
|
||||
|
||||
_:
|
||||
# Join selected group
|
||||
if WobbleSyncManager and WobbleSyncManager.hasGroup(selected_text):
|
||||
print("DEBUG: Adding sprite ID ", currentSprite.id, " to group '", selected_text, "'")
|
||||
WobbleSyncManager.addSpriteToGroup(currentSprite.id, selected_text)
|
||||
# Refresh sprite editor to show updated wobble values
|
||||
if Global.spriteEdit:
|
||||
Global.spriteEdit.setImage()
|
||||
else:
|
||||
print("DEBUG: Group '", selected_text, "' not found or WobbleSyncManager not available")
|
||||
|
||||
updateSyncIndicator()
|
||||
|
||||
## Handle create group dialog confirmation
|
||||
func _on_create_group_confirmed():
|
||||
var group_name = groupNameInput.text.strip_edges()
|
||||
print("DEBUG: Create group confirmed with name: '", group_name, "'")
|
||||
|
||||
if group_name == "":
|
||||
print("DEBUG: Group name is empty")
|
||||
Global.pushUpdate("Group name cannot be empty")
|
||||
return
|
||||
|
||||
if WobbleSyncManager and WobbleSyncManager.hasGroup(group_name):
|
||||
print("DEBUG: Group '", group_name, "' already exists")
|
||||
Global.pushUpdate("Group \"" + group_name + "\" already exists")
|
||||
return
|
||||
|
||||
# Create group with current sprite
|
||||
if currentSprite != null and WobbleSyncManager:
|
||||
print("DEBUG: Creating group '", group_name, "' with sprite ID ", currentSprite.id)
|
||||
if WobbleSyncManager.createGroup(group_name, currentSprite.id):
|
||||
print("DEBUG: Group created successfully")
|
||||
createGroupDialog.hide()
|
||||
updateUI()
|
||||
# Refresh sprite editor to show sync status
|
||||
if Global.spriteEdit:
|
||||
Global.spriteEdit.setImage()
|
||||
else:
|
||||
print("DEBUG: Failed to create group")
|
||||
else:
|
||||
print("DEBUG: No current sprite to add to group")
|
||||
|
||||
## Handle create group dialog cancellation
|
||||
func _on_create_group_cancelled():
|
||||
createGroupDialog.hide()
|
||||
updateGroupDropdown() # Reset dropdown to current selection
|
||||
|
||||
## Handle group creation signal from manager
|
||||
func _on_group_created(group_name: String):
|
||||
updateGroupDropdown()
|
||||
|
||||
## Handle group deletion signal from manager
|
||||
func _on_group_deleted(group_name: String):
|
||||
updateGroupDropdown()
|
||||
updateSyncIndicator()
|
||||
|
||||
## Check if current sprite can have wobble syncing applied
|
||||
func canSync() -> bool:
|
||||
return currentSprite != null
|
||||
|
||||
## Force refresh the UI - useful after loading saves
|
||||
func forceRefresh():
|
||||
print("DEBUG: WobbleSyncControl.forceRefresh called")
|
||||
updateUI()
|
||||
Reference in New Issue
Block a user