Skip to content

Commit 7553772

Browse files
committed
Implement ctrl + rmb drag to cut connections
1 parent e0c7076 commit 7553772

File tree

5 files changed

+107
-12
lines changed

5 files changed

+107
-12
lines changed

export_presets.cfg

Lines changed: 8 additions & 8 deletions
Large diffs are not rendered by default.

material_maker/icons/knife.png

484 Bytes
Loading

material_maker/icons/knife.png.import

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://bekpys1u4i2vy"
6+
path="res://.godot/imported/knife.png-9be43fe7b9385d6c0d1c865ae71cccfc.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://material_maker/icons/knife.png"
14+
dest_files=["res://.godot/imported/knife.png-9be43fe7b9385d6c0d1c865ae71cccfc.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1

material_maker/panels/graph_edit/graph_edit.gd

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ var undoredo_move_node_selection_changed : bool = true
4141
enum ConnectionStyle {DIRECT, BEZIER, ROUNDED, MANHATTAN, DIAGONAL}
4242
var connection_line_style : int = ConnectionStyle.BEZIER
4343

44+
@onready var drag_cut_cursor = preload("res://material_maker/icons/knife.png")
45+
var connections_to_cut : Array[Dictionary]
46+
var drag_cut_line : Line2D = Line2D.new()
47+
var valid_drag_cut_entry: bool = false
48+
const CURSOR_HOT_SPOT : Vector2 = Vector2(2.0, 27.22)
49+
4450
signal save_path_changed
4551
signal graph_changed
4652
signal view_updated
@@ -53,6 +59,7 @@ func _ready() -> void:
5359
for t in range(41):
5460
add_valid_connection_type(t, 42)
5561
add_valid_connection_type(42, t)
62+
node_popup.about_to_popup.connect(func(): valid_drag_cut_entry = false)
5663

5764
func _exit_tree():
5865
remove_crash_recovery_file()
@@ -121,6 +128,22 @@ func _gui_input(event) -> void:
121128
accept_event()
122129
node_popup.position = Vector2i(get_screen_transform()*get_local_mouse_position())
123130
node_popup.show_popup()
131+
elif event.is_action_released("ui_cut_drag"):
132+
var conns : Array[Dictionary]
133+
for p in len(drag_cut_line.points) - 1:
134+
var rect : Rect2
135+
rect.position = drag_cut_line.points[p]
136+
rect.end = drag_cut_line.points[p + 1]
137+
conns = get_connections_intersecting_with_rect(rect.abs())
138+
if conns.size():
139+
connections_to_cut.append_array(conns)
140+
if connections_to_cut.size():
141+
on_cut_connections(connections_to_cut)
142+
connections_to_cut.clear()
143+
Input.set_custom_mouse_cursor(null)
144+
drag_cut_line.clear_points()
145+
conns.clear()
146+
queue_redraw()
124147
elif event.is_action_pressed("ui_hierarchy_up"):
125148
on_ButtonUp_pressed()
126149
elif event.is_action_pressed("ui_hierarchy_down"):
@@ -142,6 +165,7 @@ func _gui_input(event) -> void:
142165
event.control = true
143166
do_zoom(1.0/1.1)
144167
elif event.button_index == MOUSE_BUTTON_RIGHT and event.is_pressed():
168+
valid_drag_cut_entry = true
145169
for c in get_children():
146170
if ! c is GraphNode:
147171
continue
@@ -161,10 +185,11 @@ func _gui_input(event) -> void:
161185
if c.has_method("on_clicked_output"):
162186
c.on_clicked_output(slot.index, Input.is_key_pressed(KEY_SHIFT))
163187
return
164-
# Only popup the UI library if Ctrl is not pressed to avoid conflicting
165-
# with the Ctrl + Space shortcut.
166-
node_popup.position = Vector2i(get_screen_transform()*get_local_mouse_position())
167-
node_popup.show_popup()
188+
# Only show add node popup if Ctrl is not pressed to
189+
# avoid conflicting with drag-cut shortcut (Ctrl + RMB)
190+
if !event.ctrl_pressed:
191+
node_popup.position = Vector2i(get_screen_transform()*get_local_mouse_position())
192+
node_popup.show_popup()
168193
else:
169194
if event.button_index == MOUSE_BUTTON_LEFT:
170195
if event.double_click:
@@ -219,13 +244,27 @@ func _gui_input(event) -> void:
219244
if rect.has_point(get_global_mouse_position()):
220245
mm_globals.set_tip_text("Space/#RMB: Nodes menu, Arrow keys: Pan, Mouse wheel: Zoom", 3)
221246

247+
if (event.button_mask & MOUSE_BUTTON_MASK_RIGHT) != 0 and valid_drag_cut_entry:
248+
if event.ctrl_pressed:
249+
Input.set_custom_mouse_cursor(
250+
drag_cut_cursor, Input.CURSOR_ARROW, CURSOR_HOT_SPOT)
251+
drag_cut_line.add_point(get_local_mouse_position())
252+
queue_redraw()
253+
elif drag_cut_line.points.size():
254+
drag_cut_line.add_point(get_local_mouse_position())
255+
queue_redraw()
256+
222257
func get_padded_node_rect(graph_node:GraphNode) -> Rect2:
223258
var rect : Rect2 = graph_node.get_global_rect()
224259
var padding := 8 * graph_node.get_global_transform().get_scale().x
225260
rect.position.x -= padding
226261
rect.size.x += padding*2
227262
return Rect2(rect.position, rect.size)
228263

264+
func _draw() -> void:
265+
if drag_cut_line.points.size() > 1:
266+
draw_polyline(drag_cut_line.points, Color.WHITE, 0.5)
267+
229268

230269
# Misc. useful functions
231270
func get_source(node, port) -> Dictionary:
@@ -306,6 +345,23 @@ func do_disconnect_node(from : String, from_slot : int, to : String, to_slot : i
306345
return true
307346
return false
308347

348+
func on_cut_connections(connections : Array):
349+
var generator_hier_name : String = generator.get_hier_name()
350+
var conns : Array = []
351+
for c in connections:
352+
var from_gen = get_node(str(c.from_node)).generator
353+
var to_gen = get_node(str(c.to_node)).generator
354+
if do_disconnect_node(c.from_node, c.from_port, c.to_node, c.to_port):
355+
conns.append({from=from_gen.name,from_port=c.from_port, to=to_gen.name, to_port=c.to_port})
356+
var undo_actions = [
357+
{ type="add_to_graph", parent=generator_hier_name, generators=[], connections=conns }
358+
]
359+
var redo_actions = [
360+
{ type="remove_connections", parent=generator_hier_name, connections=conns }
361+
]
362+
undoredo.add("Cut node connections", undo_actions, redo_actions)
363+
364+
309365
func on_disconnect_node(from : String, from_slot : int, to : String, to_slot : int) -> void:
310366
var from_gen = get_node(from).generator
311367
var to_gen = get_node(to).generator

project.godot

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ ui_next_tab={
109109
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":true,"pressed":false,"keycode":16777218,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
110110
]
111111
}
112+
ui_cut_drag={
113+
"deadzone": 0.5,
114+
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"button_mask":2,"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
115+
]
116+
}
112117

113118
[locale]
114119

0 commit comments

Comments
 (0)