From ac4c748ed8fc88768f1618c7ca227155f599890d Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Fri, 26 Jul 2024 13:54:53 -0600 Subject: [PATCH 1/4] Block: Allow to grab focus Set the focus mode on Blocks so they can process input events. When dragged on the canvas, set the dropped block to be focused. Note the subtle interaction between FocusMode.FOCUS_ALL, which allows focusing by mouse click, and MouseFilter.MOUSE_FILTER_IGNORE, which filters out mouse click events. The combination means that the mouse click will be handled in Godot for focusing the block, but the mouse click can't be processed in _gui_input(). --- addons/block_code/drag_manager/drag_manager.gd | 1 + addons/block_code/ui/blocks/block/block.gd | 1 + addons/block_code/ui/blocks/control_block/control_block.tscn | 1 + addons/block_code/ui/blocks/entry_block/entry_block.tscn | 2 +- .../block_code/ui/blocks/parameter_block/parameter_block.tscn | 3 ++- .../block_code/ui/blocks/statement_block/statement_block.tscn | 1 + 6 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/block_code/drag_manager/drag_manager.gd b/addons/block_code/drag_manager/drag_manager.gd index f8adf904..b9acd708 100644 --- a/addons/block_code/drag_manager/drag_manager.gd +++ b/addons/block_code/drag_manager/drag_manager.gd @@ -79,6 +79,7 @@ func drag_ended(): if block: connect_block_canvas_signals(block) + block.grab_focus() _block_canvas.release_scope() diff --git a/addons/block_code/ui/blocks/block/block.gd b/addons/block_code/ui/blocks/block/block.gd index 5cb37baf..425607e4 100644 --- a/addons/block_code/ui/blocks/block/block.gd +++ b/addons/block_code/ui/blocks/block/block.gd @@ -47,6 +47,7 @@ func _set_bottom_snap_path(value: NodePath): func _ready(): if bottom_snap == null: _set_bottom_snap_path(bottom_snap_path) + focus_mode = FocusMode.FOCUS_ALL mouse_filter = Control.MOUSE_FILTER_IGNORE diff --git a/addons/block_code/ui/blocks/control_block/control_block.tscn b/addons/block_code/ui/blocks/control_block/control_block.tscn index a482e11f..3e61a57d 100644 --- a/addons/block_code/ui/blocks/control_block/control_block.tscn +++ b/addons/block_code/ui/blocks/control_block/control_block.tscn @@ -5,6 +5,7 @@ [node name="ControlBlock" type="MarginContainer"] size_flags_horizontal = 0 +focus_mode = 2 mouse_filter = 2 script = ExtResource("1_2hbir") block_name = "control_block" diff --git a/addons/block_code/ui/blocks/entry_block/entry_block.tscn b/addons/block_code/ui/blocks/entry_block/entry_block.tscn index 6abed53e..c5825940 100644 --- a/addons/block_code/ui/blocks/entry_block/entry_block.tscn +++ b/addons/block_code/ui/blocks/entry_block/entry_block.tscn @@ -4,9 +4,9 @@ [ext_resource type="Script" path="res://addons/block_code/ui/blocks/entry_block/entry_block.gd" id="2_3ik8h"] [node name="EntryBlock" instance=ExtResource("1_byjbb")] +focus_mode = 2 script = ExtResource("2_3ik8h") signal_name = "" -defaults = {} block_name = "entry_block" label = "EntryBlock" block_type = 1 diff --git a/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn b/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn index 46cc8b65..d6f4f394 100644 --- a/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn +++ b/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn @@ -18,8 +18,9 @@ corner_radius_bottom_left = 16 offset_right = 16.0 offset_bottom = 8.0 size_flags_horizontal = 0 +focus_mode = 2 +mouse_filter = 2 script = ExtResource("1_0hajy") -defaults = null block_name = "parameter_block" label = "Param" block_type = 3 diff --git a/addons/block_code/ui/blocks/statement_block/statement_block.tscn b/addons/block_code/ui/blocks/statement_block/statement_block.tscn index 96ed6e48..d2375b10 100644 --- a/addons/block_code/ui/blocks/statement_block/statement_block.tscn +++ b/addons/block_code/ui/blocks/statement_block/statement_block.tscn @@ -7,6 +7,7 @@ [node name="StatementBlock" type="MarginContainer"] size_flags_horizontal = 0 +focus_mode = 2 mouse_filter = 2 script = ExtResource("1_6wvlf") block_name = "statement_block" From 7ef2b2a4869c1ea8561555a1502c469c96d6c7e0 Mon Sep 17 00:00:00 2001 From: Dylan McCall Date: Wed, 31 Jul 2024 18:38:57 -0700 Subject: [PATCH 2/4] Move get_parent_block to Util --- addons/block_code/drag_manager/drag.gd | 3 ++- .../ui/blocks/utilities/snap_point/snap_point.gd | 7 ------- addons/block_code/ui/util.gd | 8 ++++++++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/addons/block_code/drag_manager/drag.gd b/addons/block_code/drag_manager/drag.gd index 8a667755..31f64ae1 100644 --- a/addons/block_code/drag_manager/drag.gd +++ b/addons/block_code/drag_manager/drag.gd @@ -6,6 +6,7 @@ const BlockCanvas = preload("res://addons/block_code/ui/block_canvas/block_canva const Constants = preload("res://addons/block_code/ui/constants.gd") const InstructionTree = preload("res://addons/block_code/instruction_tree/instruction_tree.gd") const Types = preload("res://addons/block_code/types/types.gd") +const Util = preload("res://addons/block_code/ui/util.gd") enum DragAction { NONE, PLACE, REMOVE } @@ -33,7 +34,7 @@ var target_snap_point: SnapPoint: var snap_block: Block: get: - return target_snap_point.get_parent_block() if target_snap_point else null + return Util.get_parent_block(target_snap_point) if target_snap_point else null func _init(block: Block, block_scope: String, offset: Vector2, block_canvas: BlockCanvas): diff --git a/addons/block_code/ui/blocks/utilities/snap_point/snap_point.gd b/addons/block_code/ui/blocks/utilities/snap_point/snap_point.gd index d4be8386..8b39f4b5 100644 --- a/addons/block_code/ui/blocks/utilities/snap_point/snap_point.gd +++ b/addons/block_code/ui/blocks/utilities/snap_point/snap_point.gd @@ -29,13 +29,6 @@ func _ready(): _update_snapped_block_from_children() -func get_parent_block() -> Block: - var parent = get_parent() - while parent and not parent is Block: - parent = parent.get_parent() - return parent as Block - - func _update_snapped_block_from_children(): # Temporary migration to set the snapped_block property based on children # of this node. diff --git a/addons/block_code/ui/util.gd b/addons/block_code/ui/util.gd index 46918d2f..0be96820 100644 --- a/addons/block_code/ui/util.gd +++ b/addons/block_code/ui/util.gd @@ -12,3 +12,11 @@ static func node_is_part_of_edited_scene(node: Node) -> bool: var edited_scene_parent := tree.edited_scene_root.get_parent() return edited_scene_parent and edited_scene_parent.is_ancestor_of(node) + + +## Get the nearest Block node that is a parent of the provided node. +static func get_parent_block(node: Node) -> Block: + var parent = node.get_parent() + while parent and not parent is Block: + parent = parent.get_parent() + return parent as Block From 71ad9f33cf9eb3963c305632323621082a2b0053 Mon Sep 17 00:00:00 2001 From: Dylan McCall Date: Wed, 31 Jul 2024 18:40:38 -0700 Subject: [PATCH 3/4] Change Background border color when block is focused --- .../ui/blocks/utilities/background/background.gd | 12 ++++++++++-- .../ui/blocks/utilities/background/gutter.gd | 12 ++++++++++-- addons/block_code/ui/constants.gd | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/addons/block_code/ui/blocks/utilities/background/background.gd b/addons/block_code/ui/blocks/utilities/background/background.gd index e8aec7c1..5b84d13f 100644 --- a/addons/block_code/ui/blocks/utilities/background/background.gd +++ b/addons/block_code/ui/blocks/utilities/background/background.gd @@ -2,8 +2,10 @@ extends Control const Constants = preload("res://addons/block_code/ui/constants.gd") +const Util = preload("res://addons/block_code/ui/util.gd") var outline_color: Color +var parent_block: Block @export var color: Color: set = _set_color @@ -41,6 +43,12 @@ func _set_shift_bottom(new_shift_bottom): queue_redraw() +func _ready(): + parent_block = Util.get_parent_block(self) + parent_block.focus_entered.connect(queue_redraw) + parent_block.focus_exited.connect(queue_redraw) + + func _draw(): var fill_polygon: PackedVector2Array fill_polygon.append(Vector2(0.0, 0.0)) @@ -97,5 +105,5 @@ func _draw(): edge_polygon.append(Vector2(0.0, size.y + outline_middle)) draw_colored_polygon(fill_polygon, color) - draw_polyline(stroke_polygon, outline_color, Constants.OUTLINE_WIDTH) - draw_polyline(edge_polygon, outline_color, Constants.OUTLINE_WIDTH) + draw_polyline(stroke_polygon, Constants.FOCUS_BORDER_COLOR if parent_block.has_focus() else outline_color, Constants.OUTLINE_WIDTH) + draw_polyline(edge_polygon, Constants.FOCUS_BORDER_COLOR if parent_block.has_focus() else outline_color, Constants.OUTLINE_WIDTH) diff --git a/addons/block_code/ui/blocks/utilities/background/gutter.gd b/addons/block_code/ui/blocks/utilities/background/gutter.gd index f449949f..026250fe 100644 --- a/addons/block_code/ui/blocks/utilities/background/gutter.gd +++ b/addons/block_code/ui/blocks/utilities/background/gutter.gd @@ -2,8 +2,10 @@ extends Control const Constants = preload("res://addons/block_code/ui/constants.gd") +const Util = preload("res://addons/block_code/ui/util.gd") var outline_color: Color +var parent_block: Block @export var color: Color: set = _set_color @@ -15,6 +17,12 @@ func _set_color(new_color): queue_redraw() +func _ready(): + parent_block = Util.get_parent_block(self) + parent_block.focus_entered.connect(queue_redraw) + parent_block.focus_exited.connect(queue_redraw) + + func _draw(): var fill_polygon: PackedVector2Array fill_polygon.append(Vector2(0.0, 0.0)) @@ -33,5 +41,5 @@ func _draw(): right_polygon.append(Vector2(size.x, size.y)) draw_colored_polygon(fill_polygon, color) - draw_polyline(left_polygon, outline_color, Constants.OUTLINE_WIDTH) - draw_polyline(right_polygon, outline_color, Constants.OUTLINE_WIDTH) + draw_polyline(left_polygon, Constants.FOCUS_BORDER_COLOR if parent_block.has_focus() else outline_color, Constants.OUTLINE_WIDTH) + draw_polyline(right_polygon, Constants.FOCUS_BORDER_COLOR if parent_block.has_focus() else outline_color, Constants.OUTLINE_WIDTH) diff --git a/addons/block_code/ui/constants.gd b/addons/block_code/ui/constants.gd index 88d6d9ab..dcb65e23 100644 --- a/addons/block_code/ui/constants.gd +++ b/addons/block_code/ui/constants.gd @@ -9,3 +9,5 @@ const KNOB_Z = 5.0 const CONTROL_MARGIN = 20.0 const OUTLINE_WIDTH = 3.0 const MINIMUM_SNAP_DISTANCE = 80.0 + +const FOCUS_BORDER_COLOR = Color(225, 242, 0) From 73eda98b5f09f0e61e9acce5a2e86044f2401d2b Mon Sep 17 00:00:00 2001 From: Dylan McCall Date: Wed, 31 Jul 2024 18:41:21 -0700 Subject: [PATCH 4/4] Add a focus style override for ParameterBlock --- .../blocks/parameter_block/parameter_block.gd | 25 ++++++++++++++++--- .../parameter_block/parameter_block.tscn | 2 ++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/addons/block_code/ui/blocks/parameter_block/parameter_block.gd b/addons/block_code/ui/blocks/parameter_block/parameter_block.gd index 75b11b4a..247e3051 100644 --- a/addons/block_code/ui/blocks/parameter_block/parameter_block.gd +++ b/addons/block_code/ui/blocks/parameter_block/parameter_block.gd @@ -2,6 +2,7 @@ class_name ParameterBlock extends Block +const Constants = preload("res://addons/block_code/ui/constants.gd") const Util = preload("res://addons/block_code/ui/util.gd") @export var block_format: String = "" @@ -16,16 +17,24 @@ var param_name_input_pairs: Array var param_input_strings: Dictionary # Only loaded from serialized var spawned_by: ParameterOutput +var _panel_normal: StyleBox +var _panel_focus: StyleBox + func _ready(): super() + _panel_normal = _panel.get_theme_stylebox("panel").duplicate() + _panel_normal.bg_color = color + _panel_normal.border_color = color.darkened(0.2) + + _panel_focus = _panel.get_theme_stylebox("panel").duplicate() + _panel_focus.bg_color = color + _panel_focus.border_color = Constants.FOCUS_BORDER_COLOR + block_type = Types.BlockType.VALUE if not Util.node_is_part_of_edited_scene(self): - var new_panel = _panel.get_theme_stylebox("panel").duplicate() - new_panel.bg_color = color - new_panel.border_color = color.darkened(0.2) - _panel.add_theme_stylebox_override("panel", new_panel) + _panel.add_theme_stylebox_override("panel", _panel_normal) format() @@ -73,3 +82,11 @@ static func get_scene_path(): func format(): param_name_input_pairs = StatementBlock.format_string(self, %HBoxContainer, block_format, defaults) + + +func _on_focus_entered(): + _panel.add_theme_stylebox_override("panel", _panel_focus) + + +func _on_focus_exited(): + _panel.add_theme_stylebox_override("panel", _panel_normal) diff --git a/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn b/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn index d6f4f394..7f98a6d2 100644 --- a/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn +++ b/addons/block_code/ui/blocks/parameter_block/parameter_block.tscn @@ -47,4 +47,6 @@ unique_name_in_owner = true layout_mode = 2 mouse_filter = 2 +[connection signal="focus_entered" from="." to="." method="_on_focus_entered"] +[connection signal="focus_exited" from="." to="." method="_on_focus_exited"] [connection signal="mouse_down" from="DragDropArea" to="." method="_on_drag_drop_area_mouse_down"]