2020-07-09 12:22:17 +00:00
|
|
|
|
extends Node
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
signal color_changed(color, button)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var pen_pressure := 1.0
|
2022-02-17 14:07:03 +00:00
|
|
|
|
var horizontal_mirror := false
|
|
|
|
|
var vertical_mirror := false
|
2022-02-28 17:24:14 +00:00
|
|
|
|
var pixel_perfect := false
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var control := false
|
|
|
|
|
var shift := false
|
|
|
|
|
var alt := false
|
|
|
|
|
|
2022-02-21 16:02:02 +00:00
|
|
|
|
var tools := {
|
|
|
|
|
"RectSelect":
|
2022-02-22 00:58:52 +00:00
|
|
|
|
Tool.new(
|
2022-02-22 22:10:16 +00:00
|
|
|
|
"RectSelect",
|
|
|
|
|
"Rectangular Selection",
|
|
|
|
|
"rectangle_select",
|
|
|
|
|
preload("res://src/Tools/SelectionTools/RectSelect.tscn")
|
2022-02-22 00:58:52 +00:00
|
|
|
|
),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"EllipseSelect":
|
2022-02-22 00:58:52 +00:00
|
|
|
|
Tool.new(
|
2022-02-22 22:10:16 +00:00
|
|
|
|
"EllipseSelect",
|
|
|
|
|
"Elliptical Selection",
|
|
|
|
|
"ellipse_select",
|
|
|
|
|
preload("res://src/Tools/SelectionTools/EllipseSelect.tscn")
|
2022-02-22 00:58:52 +00:00
|
|
|
|
),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"PolygonSelect":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"PolygonSelect",
|
|
|
|
|
"Polygonal Selection",
|
|
|
|
|
"polygon_select",
|
2022-02-22 22:10:16 +00:00
|
|
|
|
preload("res://src/Tools/SelectionTools/PolygonSelect.tscn"),
|
|
|
|
|
"Double-click to connect the last point to the starting point"
|
2022-02-21 16:02:02 +00:00
|
|
|
|
),
|
|
|
|
|
"ColorSelect":
|
2022-02-22 22:10:16 +00:00
|
|
|
|
Tool.new(
|
|
|
|
|
"ColorSelect",
|
|
|
|
|
"Select By Color",
|
|
|
|
|
"color_select",
|
|
|
|
|
preload("res://src/Tools/SelectionTools/ColorSelect.tscn")
|
|
|
|
|
),
|
|
|
|
|
"MagicWand":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"MagicWand",
|
|
|
|
|
"Magic Wand",
|
|
|
|
|
"magic_wand",
|
|
|
|
|
preload("res://src/Tools/SelectionTools/MagicWand.tscn")
|
|
|
|
|
),
|
|
|
|
|
"Lasso":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"Lasso",
|
|
|
|
|
"Lasso / Free Select Tool",
|
|
|
|
|
"lasso",
|
|
|
|
|
preload("res://src/Tools/SelectionTools/Lasso.tscn")
|
|
|
|
|
),
|
|
|
|
|
"Move": Tool.new("Move", "Move", "move", preload("res://src/Tools/Move.tscn")),
|
|
|
|
|
"Zoom": Tool.new("Zoom", "Zoom", "zoom", preload("res://src/Tools/Zoom.tscn")),
|
|
|
|
|
"Pan": Tool.new("Pan", "Pan", "pan", preload("res://src/Tools/Pan.tscn")),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"ColorPicker":
|
|
|
|
|
Tool.new(
|
2022-02-22 22:10:16 +00:00
|
|
|
|
"ColorPicker",
|
|
|
|
|
"Color Picker",
|
|
|
|
|
"colorpicker",
|
|
|
|
|
preload("res://src/Tools/ColorPicker.tscn"),
|
|
|
|
|
"Select a color from a pixel of the sprite"
|
2022-02-21 16:02:02 +00:00
|
|
|
|
),
|
2022-02-22 22:10:16 +00:00
|
|
|
|
"Pencil":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"Pencil",
|
|
|
|
|
"Pencil",
|
|
|
|
|
"pencil",
|
|
|
|
|
preload("res://src/Tools/Pencil.tscn"),
|
|
|
|
|
"Hold %s to make a line",
|
|
|
|
|
["Shift"]
|
|
|
|
|
),
|
|
|
|
|
"Eraser":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"Eraser",
|
|
|
|
|
"Eraser",
|
|
|
|
|
"eraser",
|
|
|
|
|
preload("res://src/Tools/Eraser.tscn"),
|
|
|
|
|
"Hold %s to make a line",
|
|
|
|
|
["Shift"]
|
|
|
|
|
),
|
|
|
|
|
"Bucket": Tool.new("Bucket", "Bucket", "fill", preload("res://src/Tools/Bucket.tscn")),
|
|
|
|
|
"Shading":
|
|
|
|
|
Tool.new("Shading", "Shading Tool", "shading", preload("res://src/Tools/Shading.tscn")),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"LineTool":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"LineTool",
|
|
|
|
|
"Line Tool",
|
|
|
|
|
"linetool",
|
2022-02-22 22:10:16 +00:00
|
|
|
|
preload("res://src/Tools/LineTool.tscn"),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"""Hold %s to snap the angle of the line
|
|
|
|
|
Hold %s to center the shape on the click origin
|
|
|
|
|
Hold %s to displace the shape's origin""",
|
2022-04-27 12:03:39 +00:00
|
|
|
|
["Shift", "configurable_ctrl", "configurable_alt"]
|
2022-02-21 16:02:02 +00:00
|
|
|
|
),
|
|
|
|
|
"RectangleTool":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"RectangleTool",
|
|
|
|
|
"Rectangle Tool",
|
|
|
|
|
"rectangletool",
|
2022-02-22 22:10:16 +00:00
|
|
|
|
preload("res://src/Tools/RectangleTool.tscn"),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"""Hold %s to create a 1:1 shape
|
|
|
|
|
Hold %s to center the shape on the click origin
|
|
|
|
|
Hold %s to displace the shape's origin""",
|
2022-04-27 12:03:39 +00:00
|
|
|
|
["configurable_shift", "configurable_ctrl", "configurable_alt"]
|
2022-02-21 16:02:02 +00:00
|
|
|
|
),
|
|
|
|
|
"EllipseTool":
|
|
|
|
|
Tool.new(
|
|
|
|
|
"EllipseTool",
|
|
|
|
|
"Ellipse Tool",
|
|
|
|
|
"ellipsetool",
|
2022-02-22 22:10:16 +00:00
|
|
|
|
preload("res://src/Tools/EllipseTool.tscn"),
|
2022-02-21 16:02:02 +00:00
|
|
|
|
"""Hold %s to create a 1:1 shape
|
|
|
|
|
Hold %s to center the shape on the click origin
|
|
|
|
|
Hold %s to displace the shape's origin""",
|
2022-04-27 12:03:39 +00:00
|
|
|
|
["configurable_shift", "configurable_ctrl", "configurable_alt"]
|
2022-02-21 16:02:02 +00:00
|
|
|
|
),
|
2021-11-25 12:48:30 +00:00
|
|
|
|
}
|
2022-02-21 16:02:02 +00:00
|
|
|
|
|
|
|
|
|
var _tool_button_scene: PackedScene = preload("res://src/Tools/ToolButton.tscn")
|
|
|
|
|
var _slots := {}
|
|
|
|
|
var _panels := {}
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var _tool_buttons: Node
|
|
|
|
|
var _active_button := -1
|
|
|
|
|
var _last_position := Vector2.INF
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
|
2022-02-21 16:02:02 +00:00
|
|
|
|
class Tool:
|
|
|
|
|
var name := ""
|
|
|
|
|
var display_name := ""
|
|
|
|
|
var scene: PackedScene
|
|
|
|
|
var icon: Texture
|
2022-02-22 22:10:16 +00:00
|
|
|
|
var cursor_icon: Texture
|
2022-02-21 16:02:02 +00:00
|
|
|
|
var shortcut := ""
|
|
|
|
|
var extra_hint := ""
|
|
|
|
|
var extra_shortcuts := [] # Array of String(s)
|
2022-04-27 12:03:39 +00:00
|
|
|
|
var extra_shortcuts_order := [] # Array to keep shift, ctrl, alt in order
|
2022-02-21 16:02:02 +00:00
|
|
|
|
var button_node: BaseButton
|
|
|
|
|
|
|
|
|
|
func _init(
|
|
|
|
|
_name: String,
|
|
|
|
|
_display_name: String,
|
|
|
|
|
_shortcut: String,
|
2022-02-22 22:10:16 +00:00
|
|
|
|
_scene: PackedScene,
|
2022-02-21 16:02:02 +00:00
|
|
|
|
_extra_hint := "",
|
2022-02-22 22:10:16 +00:00
|
|
|
|
_extra_shortucts := []
|
2022-02-21 16:02:02 +00:00
|
|
|
|
) -> void:
|
|
|
|
|
name = _name
|
|
|
|
|
display_name = _display_name
|
|
|
|
|
shortcut = _shortcut
|
2022-02-22 22:10:16 +00:00
|
|
|
|
scene = _scene
|
2022-02-21 16:02:02 +00:00
|
|
|
|
extra_hint = _extra_hint
|
|
|
|
|
extra_shortcuts = _extra_shortucts
|
2022-04-27 12:03:39 +00:00
|
|
|
|
extra_shortcuts_order = _extra_shortucts.duplicate()
|
2022-02-21 16:02:02 +00:00
|
|
|
|
icon = load("res://assets/graphics/tools/%s.png" % name.to_lower())
|
2022-02-22 22:10:16 +00:00
|
|
|
|
cursor_icon = load("res://assets/graphics/tools/cursors/%s.png" % name.to_lower())
|
2022-02-21 16:02:02 +00:00
|
|
|
|
|
|
|
|
|
func generate_hint_tooltip() -> String:
|
|
|
|
|
var hint := display_name
|
2022-02-22 21:38:47 +00:00
|
|
|
|
var shortcuts := []
|
|
|
|
|
var left_text := ""
|
|
|
|
|
var right_text := ""
|
|
|
|
|
if InputMap.has_action("left_" + shortcut + "_tool"):
|
|
|
|
|
var left_shortcut: String = InputMap.get_action_list("left_" + shortcut + "_tool")[0].as_text()
|
|
|
|
|
shortcuts.append(left_shortcut)
|
|
|
|
|
left_text = "\n%s for left mouse button"
|
|
|
|
|
if InputMap.has_action("right_" + shortcut + "_tool"):
|
|
|
|
|
var right_shortcut: String = InputMap.get_action_list("right_" + shortcut + "_tool")[0].as_text()
|
|
|
|
|
shortcuts.append(right_shortcut)
|
|
|
|
|
right_text = "\n%s for right mouse button"
|
|
|
|
|
|
|
|
|
|
if !shortcuts.empty():
|
|
|
|
|
hint += "\n" + left_text + right_text
|
|
|
|
|
|
2022-02-21 16:02:02 +00:00
|
|
|
|
if !extra_hint.empty():
|
|
|
|
|
hint += "\n\n" + extra_hint
|
|
|
|
|
|
2022-04-27 12:03:39 +00:00
|
|
|
|
# Some tools have shift,ctrl,alt "HARD CODED" in them using (InputEventWithModifiers)
|
|
|
|
|
# But Others only use the regular is_action_pressed() function
|
|
|
|
|
# their Shift, Ctrl, Alt are listed Below
|
|
|
|
|
var code_shift = InputMap.get_action_list("shift")[0].get_scancode_with_modifiers()
|
|
|
|
|
var code_ctrl = InputMap.get_action_list("ctrl")[0].get_scancode_with_modifiers()
|
|
|
|
|
var code_alt = InputMap.get_action_list("alt")[0].get_scancode_with_modifiers()
|
|
|
|
|
var configurable_shift: String = OS.get_scancode_string(code_shift)
|
|
|
|
|
var configurable_ctrl: String = OS.get_scancode_string(code_ctrl)
|
|
|
|
|
var configurable_alt: String = OS.get_scancode_string(code_alt)
|
|
|
|
|
for shortcut_idx in extra_shortcuts.size():
|
|
|
|
|
if extra_shortcuts_order[shortcut_idx] == "configurable_shift":
|
|
|
|
|
extra_shortcuts[shortcut_idx] = configurable_shift
|
|
|
|
|
if extra_shortcuts_order[shortcut_idx] == "configurable_ctrl":
|
|
|
|
|
extra_shortcuts[shortcut_idx] = configurable_ctrl
|
|
|
|
|
if extra_shortcuts_order[shortcut_idx] == "configurable_alt":
|
|
|
|
|
extra_shortcuts[shortcut_idx] = configurable_alt
|
2022-02-21 16:02:02 +00:00
|
|
|
|
shortcuts.append_array(extra_shortcuts)
|
2022-04-27 12:03:39 +00:00
|
|
|
|
|
2022-02-22 21:38:47 +00:00
|
|
|
|
if shortcuts.empty():
|
|
|
|
|
hint = tr(hint)
|
|
|
|
|
else:
|
|
|
|
|
hint = tr(hint) % shortcuts
|
2022-02-21 16:02:02 +00:00
|
|
|
|
return hint
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
class Slot:
|
|
|
|
|
var name: String
|
|
|
|
|
var kname: String
|
|
|
|
|
var tool_node: Node = null
|
|
|
|
|
var button: int
|
|
|
|
|
var color: Color
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func _init(slot_name: String) -> void:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
name = slot_name
|
|
|
|
|
kname = name.replace(" ", "_").to_lower()
|
|
|
|
|
|
|
|
|
|
|
2020-10-23 17:18:39 +00:00
|
|
|
|
func _ready() -> void:
|
2021-06-26 11:01:07 +00:00
|
|
|
|
_tool_buttons = Global.control.find_node("ToolButtons")
|
2022-02-21 16:02:02 +00:00
|
|
|
|
for t in tools:
|
|
|
|
|
add_tool_button(tools[t])
|
2020-07-09 12:22:17 +00:00
|
|
|
|
_slots[BUTTON_LEFT] = Slot.new("Left tool")
|
|
|
|
|
_slots[BUTTON_RIGHT] = Slot.new("Right tool")
|
2021-08-16 23:56:19 +00:00
|
|
|
|
_panels[BUTTON_LEFT] = Global.control.find_node("LeftPanelContainer", true, false)
|
|
|
|
|
_panels[BUTTON_RIGHT] = Global.control.find_node("RightPanelContainer", true, false)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var tool_name: String = Global.config_cache.get_value(
|
|
|
|
|
_slots[BUTTON_LEFT].kname, "tool", "Pencil"
|
|
|
|
|
)
|
2022-02-21 16:02:02 +00:00
|
|
|
|
if not tool_name in tools:
|
2021-11-17 17:59:14 +00:00
|
|
|
|
tool_name = "Pencil"
|
|
|
|
|
set_tool(tool_name, BUTTON_LEFT)
|
|
|
|
|
tool_name = Global.config_cache.get_value(_slots[BUTTON_RIGHT].kname, "tool", "Eraser")
|
2022-02-21 16:02:02 +00:00
|
|
|
|
if not tool_name in tools:
|
2021-11-17 17:59:14 +00:00
|
|
|
|
tool_name = "Eraser"
|
|
|
|
|
set_tool(tool_name, BUTTON_RIGHT)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
update_tool_buttons()
|
|
|
|
|
update_tool_cursors()
|
|
|
|
|
|
2022-02-17 14:07:03 +00:00
|
|
|
|
horizontal_mirror = Global.config_cache.get_value("preferences", "horizontal_mirror", false)
|
|
|
|
|
vertical_mirror = Global.config_cache.get_value("preferences", "vertical_mirror", false)
|
2022-02-28 17:24:14 +00:00
|
|
|
|
pixel_perfect = Global.config_cache.get_value("preferences", "pixel_perfect", false)
|
2022-02-17 14:07:03 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
# Yield is necessary for the color picker nodes to update their color values
|
|
|
|
|
yield(get_tree(), "idle_frame")
|
|
|
|
|
var color_value: Color = Global.config_cache.get_value(
|
|
|
|
|
_slots[BUTTON_LEFT].kname, "color", Color.black
|
|
|
|
|
)
|
2021-11-17 17:59:14 +00:00
|
|
|
|
assign_color(color_value, BUTTON_LEFT, false)
|
|
|
|
|
color_value = Global.config_cache.get_value(_slots[BUTTON_RIGHT].kname, "color", Color.white)
|
|
|
|
|
assign_color(color_value, BUTTON_RIGHT, false)
|
|
|
|
|
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2022-02-21 16:02:02 +00:00
|
|
|
|
func add_tool_button(t: Tool) -> void:
|
|
|
|
|
var tool_button: BaseButton = _tool_button_scene.instance()
|
|
|
|
|
tool_button.name = t.name
|
|
|
|
|
tool_button.get_node("ToolIcon").texture = t.icon
|
2022-02-22 21:38:47 +00:00
|
|
|
|
tool_button.hint_tooltip = t.generate_hint_tooltip()
|
2022-02-21 16:02:02 +00:00
|
|
|
|
t.button_node = tool_button
|
|
|
|
|
_tool_buttons.add_child(tool_button)
|
|
|
|
|
tool_button.connect("pressed", _tool_buttons, "_on_Tool_pressed", [tool_button])
|
|
|
|
|
|
|
|
|
|
|
2022-02-22 00:58:52 +00:00
|
|
|
|
func remove_tool(t: Tool) -> void:
|
|
|
|
|
t.button_node.queue_free()
|
|
|
|
|
tools.erase(t.name)
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func set_tool(name: String, button: int) -> void:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
var slot = _slots[button]
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var panel: Node = _panels[button]
|
2022-02-21 16:02:02 +00:00
|
|
|
|
var node: Node = tools[name].scene.instance()
|
2022-02-11 01:16:33 +00:00
|
|
|
|
if button == BUTTON_LEFT: # As guides are only moved with left mouse
|
|
|
|
|
if name == "Pan": # tool you want to give more access at guides
|
|
|
|
|
Global.move_guides_on_canvas = true
|
|
|
|
|
else:
|
|
|
|
|
Global.move_guides_on_canvas = false
|
2020-07-09 12:22:17 +00:00
|
|
|
|
node.name = name
|
|
|
|
|
node.tool_slot = slot
|
|
|
|
|
slot.tool_node = node
|
|
|
|
|
slot.button = button
|
|
|
|
|
panel.add_child(slot.tool_node)
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func assign_tool(name: String, button: int) -> void:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
var slot = _slots[button]
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var panel: Node = _panels[button]
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
if slot.tool_node != null:
|
|
|
|
|
if slot.tool_node.name == name:
|
|
|
|
|
return
|
|
|
|
|
panel.remove_child(slot.tool_node)
|
|
|
|
|
slot.tool_node.queue_free()
|
|
|
|
|
|
|
|
|
|
set_tool(name, button)
|
|
|
|
|
update_tool_buttons()
|
|
|
|
|
update_tool_cursors()
|
|
|
|
|
Global.config_cache.set_value(slot.kname, "tool", name)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func default_color() -> void:
|
|
|
|
|
assign_color(Color.black, BUTTON_LEFT)
|
|
|
|
|
assign_color(Color.white, BUTTON_RIGHT)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func swap_color() -> void:
|
|
|
|
|
var left = _slots[BUTTON_LEFT].color
|
|
|
|
|
var right = _slots[BUTTON_RIGHT].color
|
2020-10-23 17:18:39 +00:00
|
|
|
|
assign_color(right, BUTTON_LEFT, false)
|
|
|
|
|
assign_color(left, BUTTON_RIGHT, false)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func assign_color(color: Color, button: int, change_alpha := true) -> void:
|
|
|
|
|
var c: Color = _slots[button].color
|
2020-10-23 17:18:39 +00:00
|
|
|
|
# This was requested by Issue #54 on GitHub
|
|
|
|
|
if color.a == 0 and change_alpha:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
if color.r != c.r or color.g != c.g or color.b != c.b:
|
|
|
|
|
color.a = 1
|
|
|
|
|
_slots[button].color = color
|
|
|
|
|
Global.config_cache.set_value(_slots[button].kname, "color", color)
|
|
|
|
|
emit_signal("color_changed", color, button)
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func get_assigned_color(button: int) -> Color:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
return _slots[button].color
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func set_button_size(button_size: int) -> void:
|
2021-06-13 23:14:31 +00:00
|
|
|
|
if button_size == Global.ButtonSize.SMALL:
|
|
|
|
|
for t in _tool_buttons.get_children():
|
|
|
|
|
t.rect_min_size = Vector2(24, 24)
|
|
|
|
|
t.get_node("BackgroundLeft").rect_size.x = 12
|
|
|
|
|
t.get_node("BackgroundRight").rect_size.x = 12
|
|
|
|
|
t.get_node("BackgroundRight").rect_position = Vector2(24, 24)
|
|
|
|
|
else:
|
|
|
|
|
for t in _tool_buttons.get_children():
|
|
|
|
|
t.rect_min_size = Vector2(32, 32)
|
|
|
|
|
t.get_node("BackgroundLeft").rect_size.x = 16
|
|
|
|
|
t.get_node("BackgroundRight").rect_size.x = 16
|
|
|
|
|
t.get_node("BackgroundRight").rect_position = Vector2(32, 32)
|
|
|
|
|
|
|
|
|
|
|
2020-07-09 12:22:17 +00:00
|
|
|
|
func update_tool_buttons() -> void:
|
|
|
|
|
for child in _tool_buttons.get_children():
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var left_background: NinePatchRect = child.get_node("BackgroundLeft")
|
|
|
|
|
var right_background: NinePatchRect = child.get_node("BackgroundRight")
|
2021-06-13 23:14:31 +00:00
|
|
|
|
left_background.visible = _slots[BUTTON_LEFT].tool_node.name == child.name
|
|
|
|
|
right_background.visible = _slots[BUTTON_RIGHT].tool_node.name == child.name
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
|
2022-02-21 16:02:02 +00:00
|
|
|
|
func update_hint_tooltips() -> void:
|
|
|
|
|
for tool_name in tools:
|
|
|
|
|
var t: Tool = tools[tool_name]
|
|
|
|
|
t.button_node.hint_tooltip = t.generate_hint_tooltip()
|
|
|
|
|
|
|
|
|
|
|
2020-07-09 12:22:17 +00:00
|
|
|
|
func update_tool_cursors() -> void:
|
2022-02-22 22:10:16 +00:00
|
|
|
|
var left_tool: Tool = tools[_slots[BUTTON_LEFT].tool_node.name]
|
|
|
|
|
Global.left_cursor.texture = left_tool.cursor_icon
|
|
|
|
|
var right_tool: Tool = tools[_slots[BUTTON_RIGHT].tool_node.name]
|
|
|
|
|
Global.right_cursor.texture = right_tool.cursor_icon
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func draw_indicator() -> void:
|
|
|
|
|
if Global.left_square_indicator_visible:
|
|
|
|
|
_slots[BUTTON_LEFT].tool_node.draw_indicator()
|
|
|
|
|
if Global.right_square_indicator_visible:
|
|
|
|
|
_slots[BUTTON_RIGHT].tool_node.draw_indicator()
|
|
|
|
|
|
|
|
|
|
|
2021-03-30 17:07:13 +00:00
|
|
|
|
func draw_preview() -> void:
|
|
|
|
|
_slots[BUTTON_LEFT].tool_node.draw_preview()
|
|
|
|
|
_slots[BUTTON_RIGHT].tool_node.draw_preview()
|
|
|
|
|
|
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
func handle_draw(position: Vector2, event: InputEvent) -> void:
|
2020-07-09 12:22:17 +00:00
|
|
|
|
if not (Global.can_draw and Global.has_focus):
|
|
|
|
|
return
|
|
|
|
|
|
2021-03-29 20:00:09 +00:00
|
|
|
|
var draw_pos := position
|
|
|
|
|
if Global.mirror_view:
|
|
|
|
|
draw_pos.x = Global.current_project.size.x - position.x - 1
|
|
|
|
|
|
2020-07-09 12:22:17 +00:00
|
|
|
|
if event is InputEventWithModifiers:
|
|
|
|
|
control = event.control
|
|
|
|
|
shift = event.shift
|
|
|
|
|
alt = event.alt
|
|
|
|
|
|
|
|
|
|
if event is InputEventMouseButton:
|
|
|
|
|
if event.button_index in [BUTTON_LEFT, BUTTON_RIGHT]:
|
|
|
|
|
if event.pressed and _active_button == -1:
|
|
|
|
|
_active_button = event.button_index
|
2021-03-29 20:00:09 +00:00
|
|
|
|
_slots[_active_button].tool_node.draw_start(draw_pos)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
elif not event.pressed and event.button_index == _active_button:
|
2021-03-29 20:00:09 +00:00
|
|
|
|
_slots[_active_button].tool_node.draw_end(draw_pos)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
_active_button = -1
|
|
|
|
|
|
|
|
|
|
if event is InputEventMouseMotion:
|
2021-01-26 14:34:25 +00:00
|
|
|
|
pen_pressure = event.pressure
|
|
|
|
|
if Global.pressure_sensitivity_mode == Global.PressureSensitivity.NONE:
|
|
|
|
|
pen_pressure = 1.0
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
|
|
|
|
if not position.is_equal_approx(_last_position):
|
|
|
|
|
_last_position = position
|
|
|
|
|
_slots[BUTTON_LEFT].tool_node.cursor_move(position)
|
|
|
|
|
_slots[BUTTON_RIGHT].tool_node.cursor_move(position)
|
|
|
|
|
if _active_button != -1:
|
2021-03-29 20:00:09 +00:00
|
|
|
|
_slots[_active_button].tool_node.draw_move(draw_pos)
|
2020-07-09 12:22:17 +00:00
|
|
|
|
|
2021-11-25 12:48:30 +00:00
|
|
|
|
var project: Project = Global.current_project
|
2020-07-09 12:22:17 +00:00
|
|
|
|
var text := "[%s×%s]" % [project.size.x, project.size.y]
|
|
|
|
|
if Global.has_focus:
|
|
|
|
|
text += " %s, %s" % [position.x, position.y]
|
|
|
|
|
if not _slots[BUTTON_LEFT].tool_node.cursor_text.empty():
|
|
|
|
|
text += " %s" % _slots[BUTTON_LEFT].tool_node.cursor_text
|
|
|
|
|
if not _slots[BUTTON_RIGHT].tool_node.cursor_text.empty():
|
|
|
|
|
text += " %s" % _slots[BUTTON_RIGHT].tool_node.cursor_text
|
|
|
|
|
Global.cursor_position_label.text = text
|