Skip to content

Commit 4dd1133

Browse files
authored
Merge pull request #127 from endlessm/T35541-cleanups
T35541 cleanups
2 parents 60cd9c4 + dbd7643 commit 4dd1133

File tree

3 files changed

+79
-35
lines changed

3 files changed

+79
-35
lines changed

addons/block_code/block_code_plugin.gd

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ static var block_code_button: Button
99
var editor_inspector: EditorInspector
1010
var editor_selection: EditorSelection
1111

12-
var selected_block_code_node: BlockCode
12+
var _selected_block_code: BlockCode
1313

1414
var old_feature_profile: String = ""
1515

@@ -97,31 +97,31 @@ func _exit_tree():
9797
func _ready():
9898
connect("scene_changed", _on_scene_changed)
9999
editor_inspector.connect("edited_object_changed", _on_editor_inspector_edited_object_changed)
100-
editor_inspector.connect("property_edited", _on_editor_inspector_property_edited)
101100
_on_scene_changed(EditorInterface.get_edited_scene_root())
102101
_on_editor_inspector_edited_object_changed()
103102

104103

105104
func _on_scene_changed(scene_root: Node):
106105
main_panel.switch_scene(scene_root)
107-
_on_editor_inspector_edited_object_changed()
108106

109107

110108
func _on_editor_inspector_edited_object_changed():
111109
var edited_object = editor_inspector.get_edited_object()
112110
#var edited_node = edited_object as Node
113111
var selected_nodes = editor_selection.get_selected_nodes()
114112

115-
if edited_object is BlockCode and selected_nodes.has(edited_object):
113+
if edited_object is BlockCode:
114+
make_bottom_panel_item_visible(main_panel)
115+
116+
if edited_object is BlockCode and selected_nodes.size() == 1 and edited_object.owner and edited_object != _selected_block_code:
116117
# If a BlockCode node is being edited, and it was explicitly selected
117118
# (as opposed to edited in the Inspector alone), select its parent node
118119
# as well. This provides a clearer indication of what is being edited.
119120
# Changing the selection will cause edited_object_changed to fire again,
120121
# so we will return early to avoid duplicate work.
121122
var parent_node = edited_object.get_parent()
122123
if parent_node:
123-
EditorInterface.get_selection().add_node.call_deferred(parent_node)
124-
make_bottom_panel_item_visible(main_panel)
124+
editor_selection.add_node.call_deferred(parent_node)
125125
return
126126

127127
if edited_object and edited_object.get_class() == "MultiNodeEdit":
@@ -131,14 +131,46 @@ func _on_editor_inspector_edited_object_changed():
131131
# when we select the parent of a BlockCode node.
132132
edited_object = selected_nodes.filter(func(node): return node is BlockCode).pop_front()
133133

134-
# We will edit either the selected node (if it is a BlockCode node) or
135-
# the first BlockCode child of that node. Keep track of the block code node
136-
# being edited so we know to monitor for changes from EditorInspector.
137-
selected_block_code_node = list_block_code_for_node(edited_object as Node).pop_front()
138-
if not is_block_code_editable(selected_block_code_node):
139-
selected_block_code_node = null
134+
var block_code_node = list_block_code_nodes_for_node(edited_object as Node).pop_front()
135+
select_block_code_node(block_code_node)
136+
137+
138+
func select_block_code_node(block_code: BlockCode):
139+
if block_code == _selected_block_code:
140+
return
141+
142+
if not is_block_code_editable(block_code):
143+
block_code = null
144+
145+
if _selected_block_code:
146+
_selected_block_code.tree_entered.disconnect(_on_selected_block_code_changed)
147+
_selected_block_code.tree_exited.disconnect(_on_selected_block_code_changed)
148+
_selected_block_code.property_list_changed.disconnect(_on_selected_block_code_changed)
149+
editor_inspector.property_edited.disconnect(_on_editor_inspector_property_edited)
150+
151+
_selected_block_code = block_code
152+
153+
if _selected_block_code:
154+
_selected_block_code.tree_entered.connect(_on_selected_block_code_changed)
155+
_selected_block_code.tree_exited.connect(_on_selected_block_code_changed)
156+
_selected_block_code.property_list_changed.connect(_on_selected_block_code_changed)
157+
editor_inspector.property_edited.connect(_on_editor_inspector_property_edited)
140158

141-
main_panel.switch_block_code_node(selected_block_code_node)
159+
_refresh_block_code_node()
160+
161+
162+
func _refresh_block_code_node():
163+
main_panel.switch_block_code_node(_selected_block_code)
164+
165+
166+
func _on_selected_block_code_changed():
167+
if _selected_block_code:
168+
_refresh_block_code_node()
169+
170+
171+
func _on_editor_inspector_property_edited(property: String):
172+
if _selected_block_code:
173+
_refresh_block_code_node()
142174

143175

144176
static func is_block_code_editable(block_code: BlockCode) -> bool:
@@ -154,10 +186,10 @@ static func is_block_code_editable(block_code: BlockCode) -> bool:
154186

155187

156188
static func node_has_block_code(node: Node, recursive: bool = false) -> bool:
157-
return list_block_code_for_node(node, recursive).size() > 0
189+
return list_block_code_nodes_for_node(node, recursive).size() > 0
158190

159191

160-
static func list_block_code_for_node(node: Node, recursive: bool = false) -> Array[BlockCode]:
192+
static func list_block_code_nodes_for_node(node: Node, recursive: bool = false) -> Array[BlockCode]:
161193
var result: Array[BlockCode] = []
162194

163195
if node is BlockCode:
@@ -168,11 +200,6 @@ static func list_block_code_for_node(node: Node, recursive: bool = false) -> Arr
168200
return result
169201

170202

171-
func _on_editor_inspector_property_edited(property: String):
172-
if selected_block_code_node:
173-
_on_editor_inspector_edited_object_changed()
174-
175-
176203
func _get_plugin_name():
177204
return "Block Code"
178205

addons/block_code/ui/main_panel.gd

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ var _current_block_code_node: BlockCode
1919
var _block_code_nodes: Array
2020
var _collapsed: bool = false
2121

22-
var undo_redo: EditorUndoRedoManager
22+
var undo_redo: EditorUndoRedoManager:
23+
set(value):
24+
if undo_redo:
25+
undo_redo.version_changed.disconnect(_on_undo_redo_version_changed)
26+
undo_redo = value
27+
if undo_redo:
28+
undo_redo.version_changed.connect(_on_undo_redo_version_changed)
2329

2430

2531
func _ready():
@@ -28,12 +34,10 @@ func _ready():
2834
_drag_manager.block_dropped.connect(save_script)
2935
_drag_manager.block_modified.connect(save_script)
3036

31-
# Setup block scripting environment
32-
undo_redo.version_changed.connect(_on_undo_redo_version_changed)
33-
3437
if not _delete_node_button.icon:
3538
_delete_node_button.icon = _icon_delete
36-
_collapse_button.icon = _icon_collapse
39+
if not _collapse_button.icon:
40+
_collapse_button.icon = _icon_collapse
3741

3842

3943
func _on_undo_redo_version_changed():
@@ -188,15 +192,13 @@ func _on_node_block_canvas_add_block_code():
188192

189193
undo_redo.add_do_method(edited_node, "add_child", block_code, true)
190194
undo_redo.add_do_property(block_code, "owner", scene_root)
195+
undo_redo.add_do_method(self, "_select_block_code_node", edited_node)
191196
undo_redo.add_do_reference(block_code)
192197
undo_redo.add_undo_method(edited_node, "remove_child", block_code)
193198
undo_redo.add_undo_property(block_code, "owner", null)
194199

195200
undo_redo.commit_action()
196201

197-
EditorInterface.get_selection().clear()
198-
EditorInterface.get_selection().add_node(block_code)
199-
200202

201203
func _on_node_block_canvas_open_scene():
202204
var edited_node: Node = EditorInterface.get_inspector().get_edited_object() as Node
@@ -213,12 +215,27 @@ func _on_node_block_canvas_replace_block_code():
213215

214216
undo_redo.create_action("Replace block code %s" % edited_node.name, UndoRedo.MERGE_DISABLE, scene_root)
215217

218+
# FIXME: When this is undone, the new state is not correctly shown in the
219+
# editor due to an issue in Godot:
220+
# <https://github.com/godotengine/godot/issues/45915>
221+
# Ideally this should fix itself in a future version of Godot.
222+
216223
undo_redo.add_do_method(scene_root, "set_editable_instance", edited_node, true)
224+
undo_redo.add_do_method(self, "_select_block_code_node", edited_node)
217225
undo_redo.add_undo_method(scene_root, "set_editable_instance", edited_node, false)
218226

219227
undo_redo.commit_action()
220228

221-
var block_code_nodes = BlockCodePlugin.list_block_code_for_node(edited_node)
222-
#
229+
230+
func _select_block_code_node(edited_node: Node):
231+
var block_code_nodes = BlockCodePlugin.list_block_code_nodes_for_node(edited_node)
232+
if block_code_nodes.size() > 0:
233+
_set_selection([block_code_nodes.pop_front()])
234+
else:
235+
_set_selection([edited_node])
236+
237+
238+
func _set_selection(nodes: Array[Node]):
223239
EditorInterface.get_selection().clear()
224-
EditorInterface.get_selection().add_node(block_code_nodes.pop_front() if block_code_nodes.size() > 0 else edited_node)
240+
for node in nodes:
241+
EditorInterface.get_selection().add_node(node)

addons/block_code/ui/title_bar/title_bar.gd

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ func _update_node_option_button_items():
4242
if not scene_root:
4343
return
4444

45-
for block_code_node in BlockCodePlugin.list_block_code_for_node(scene_root, true):
46-
if not BlockCodePlugin.is_block_code_editable(block_code_node):
45+
for block_code in BlockCodePlugin.list_block_code_nodes_for_node(scene_root, true):
46+
if not BlockCodePlugin.is_block_code_editable(block_code):
4747
continue
4848

4949
var node_item_index = _node_option_button.item_count
50-
var node_label = "{name} ({type})".format({"name": scene_root.get_path_to(block_code_node).get_concatenated_names(), "type": block_code_node.block_script.script_inherits})
50+
var node_label = "{name} ({type})".format({"name": scene_root.get_path_to(block_code).get_concatenated_names(), "type": block_code.block_script.script_inherits})
5151
_node_option_button.add_item(node_label)
5252
_node_option_button.set_item_icon(node_item_index, _block_code_icon)
53-
_node_option_button.set_item_metadata(node_item_index, block_code_node)
53+
_node_option_button.set_item_metadata(node_item_index, block_code)
5454

5555

5656
func _get_index_for_bsd(bsd: BlockScriptData) -> int:

0 commit comments

Comments
 (0)