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/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.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 46cc8b65..7f98a6d2 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 @@ -46,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"] 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" 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/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/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) 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