1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-23 22:13:14 +00:00
Pixelorama/src/UI/ReferenceImages/ReferencesPanel.gd
Emmanouil Papadeas 572fabbe66 Remove Global.reference_panel
Slowly trying to remove nodes from Global
2024-03-23 02:52:27 +02:00

183 lines
6.5 KiB
GDScript

class_name ReferencesPanel
extends PanelContainer
## Panel for reference image management
const REFERENCE_IMAGE_BUTTON := preload("res://src/UI/ReferenceImages/ReferenceImageButton.tscn")
var list_btn_group := ButtonGroup.new()
var transform_button_group: ButtonGroup
@onready var list := %List as HFlowContainer
@onready var drag_highlight := $Overlay/DragHighlight as ColorRect
@onready var remove_btn := $ScrollContainer/Container/ReferenceEdit/ImageOptions/Remove as Button
@onready var transform_tools_btns := $ScrollContainer/Container/Tools/TransformTools
# these will change their visibility if there are no references
@onready var tip: Label = $ScrollContainer/Container/Tip
@onready var import_tip: Label = $ScrollContainer/Container/Images/ImportTip
@onready var reference_edit: VBoxContainer = $ScrollContainer/Container/ReferenceEdit
@onready var tools: HBoxContainer = $ScrollContainer/Container/Tools
func _ready() -> void:
Global.project_switched.connect(project_changed)
OpenSave.reference_image_imported.connect(_on_references_changed)
transform_button_group = transform_tools_btns.get_child(0).button_group
transform_button_group.pressed.connect(_on_transform_tool_button_group_pressed)
list_btn_group.pressed.connect(_on_reference_image_button_pressed)
Global.canvas.reference_image_container.reference_image_changed.connect(
_on_reference_image_changed
)
# We call this function to update the buttons
_on_references_changed()
_update_ui()
func _notification(what: int) -> void:
if what == NOTIFICATION_DRAG_END:
drag_highlight.hide()
func _on_transform_tool_button_group_pressed(button: Button) -> void:
Global.canvas.reference_image_container.mode = button.get_index()
func _on_move_image_left_pressed() -> void:
var index: int = Global.current_project.reference_index
reorder_reference_image(index, index - 1)
func _on_move_image_right_pressed() -> void:
var index: int = Global.current_project.reference_index
reorder_reference_image(index, index + 1)
## This method allows you to reoreder reference image with undo redo support
## Please use this and not the method with the same name in project.gd
func reorder_reference_image(from: int, to: int, update_reference_index := true) -> void:
var project := Global.current_project
project.undo_redo.create_action("Reorder Reference Image")
project.undo_redo.add_do_method(project.reorder_reference_image.bind(from, to))
project.undo_redo.add_do_method(_on_references_changed)
if update_reference_index:
project.undo_redo.add_do_method(project.set_reference_image_index.bind(to))
else:
project.undo_redo.add_undo_method(
project.set_reference_image_index.bind(project.reference_index)
)
project.undo_redo.add_do_method(_update_ui)
project.undo_redo.add_undo_method(project.reorder_reference_image.bind(to, from))
project.undo_redo.add_undo_method(_on_references_changed)
if update_reference_index:
project.undo_redo.add_undo_method(project.set_reference_image_index.bind(from))
else:
project.undo_redo.add_undo_method(
project.set_reference_image_index.bind(project.reference_index)
)
project.undo_redo.add_undo_method(_update_ui)
project.undo_redo.commit_action()
func _update_ui() -> void:
var index: int = Global.current_project.reference_index
# Enable the buttons as a default
%MoveImageRightBtn.disabled = false
%MoveImageLeftBtn.disabled = false
reference_edit.visible = true
if index == -1:
%MoveImageLeftBtn.disabled = true
%MoveImageRightBtn.disabled = true
reference_edit.visible = false
if index == 0:
%MoveImageLeftBtn.disabled = true
if index == Global.current_project.reference_images.size() - 1:
%MoveImageRightBtn.disabled = true
if %MoveImageLeftBtn.disabled:
%MoveImageLeftBtn.mouse_default_cursor_shape = CURSOR_FORBIDDEN
else:
%MoveImageLeftBtn.mouse_default_cursor_shape = CURSOR_POINTING_HAND
if %MoveImageRightBtn.disabled:
%MoveImageRightBtn.mouse_default_cursor_shape = CURSOR_FORBIDDEN
else:
%MoveImageRightBtn.mouse_default_cursor_shape = CURSOR_POINTING_HAND
# Update the remove button
remove_btn.disabled = index == -1
if remove_btn.disabled:
remove_btn.mouse_default_cursor_shape = CURSOR_FORBIDDEN
else:
remove_btn.mouse_default_cursor_shape = CURSOR_POINTING_HAND
func _on_reference_image_button_pressed(button: Button) -> void:
# We subtract 1 because we already have a default button to "select no reference image
Global.current_project.set_reference_image_index(button.get_index() - 1)
# In case the signal is emitted for another node and not from a pressed button
func _on_reference_image_changed(index: int) -> void:
_update_ui()
# Update the buttons to show which one is pressed
if list_btn_group.get_buttons().size() > 0:
# First we loop through the buttons to "unpress them all"
for b: Button in list_btn_group.get_buttons():
b.set_pressed_no_signal(false)
# Then we get the wanted button and we press it
# NOTE: using list_btn_group.get_buttons()[index + 1] here was causing a bug that
# if you re-arrange by drag and drop, then click on a button, then button before it
# becomes selected instead of the clicked button
if index + 1 < list.get_child_count():
list.get_child(index + 1).set_pressed_no_signal(true)
func project_changed() -> void:
var project_reference_index := Global.current_project.reference_index
_on_references_changed()
_update_ui()
Global.current_project.set_reference_image_index(project_reference_index)
func _on_references_changed() -> void:
# When we change the project we set the default
Global.current_project.set_reference_image_index(-1)
for c in list.get_children():
if c is Button:
c.button_group = null
c.queue_free()
# The default button
var default := REFERENCE_IMAGE_BUTTON.instantiate()
default.references_panel = self
default.button_group = list_btn_group
default.text = "none"
default.get_child(0).visible = false # Hide it's transparent checker
default.button_pressed = true
list.add_child(default)
# if there are no references, hide the none button and show message
tools.visible = true
tip.visible = true
import_tip.visible = false
reference_edit.visible = true
if Global.current_project.reference_images.size() == 0:
default.visible = false
tip.visible = false
import_tip.visible = true
reference_edit.visible = false
# And update.
for ref in Global.current_project.reference_images:
var l: Button = REFERENCE_IMAGE_BUTTON.instantiate()
l.references_panel = self
l.button_group = list_btn_group
if ref.texture:
l.icon = ref.texture
list.add_child(l)