Skip to content

Commit ce4e814

Browse files
committed
Improve alignment shortcuts
1 parent b57f878 commit ce4e814

File tree

7 files changed

+218
-70
lines changed

7 files changed

+218
-70
lines changed

material_maker/doc/user_interface_main_menu.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ Edit menu
8080

8181
* *Select targets* selects all direct and indirect target nodes of the current selection
8282

83-
* *Align Start/Center/End* align selections horizontally
83+
* *Align Top* align selections vertically by their top edge
84+
85+
* *Align Start/End* align selections horizontally
86+
87+
* *Straighten Connections* straighens connection lines between two or more connected nodes.
8488

8589
* *Load Selection* Loads a graph selection previously saved into a file
8690

material_maker/main_window.gd

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,10 @@ const MENU : Array[Dictionary] = [
8585
{ menu="Edit/Select Sources", command="edit_select_sources", shortcut="Control+L" },
8686
{ menu="Edit/Select Targets", command="edit_select_targets", shortcut="Control+Shift+L" },
8787
{ menu="Edit/-" },
88-
{ menu="Edit/Align Start", command="edit_align_start", shortcut="Control+BRACKETLEFT" },
89-
{ menu="Edit/Align Center", command="edit_align_center", shortcut="Control+BACKSLASH" },
90-
{ menu="Edit/Align End", command="edit_align_end", shortcut="Control+BRACKETRIGHT" },
88+
{ menu="Edit/Align Top", command="edit_align_top", shortcut="Shift+W" },
89+
{ menu="Edit/Align Start", command="edit_align_start", shortcut="Shift+A" },
90+
{ menu="Edit/Align End", command="edit_align_end", shortcut="Shift+D" },
91+
{ menu="Edit/Straighten Connections", command="edit_straighten_connections", shortcut="Q" },
9192
{ menu="Edit/-" },
9293
{ menu="Edit/Load Selection", command="edit_load_selection", not_in_ports=["HTML5"] },
9394
{ menu="Edit/Save Selection", command="edit_save_selection", not_in_ports=["HTML5"] },
@@ -995,33 +996,24 @@ func edit_preferences() -> void:
995996
dialog.edit_preferences(mm_globals.config)
996997

997998
func edit_align_start() -> void:
998-
var nodes : Array = get_current_graph_edit().get_selected_nodes()
999-
var min_offset : float = INF
1000-
1001-
for node : GraphElement in nodes:
1002-
min_offset = min(min_offset, node.position_offset.x)
1003-
for node : GraphElement in nodes:
1004-
node.position_offset.x = min_offset
1005-
1006-
func edit_align_center() -> void:
1007-
var nodes : Array = get_current_graph_edit().get_selected_nodes()
1008-
var min_offset : float = INF
1009-
var max_offset : float = -INF
1010-
1011-
for node : GraphElement in nodes:
1012-
max_offset = max(max_offset, node.position_offset.x + node.size.x)
1013-
min_offset = min(min_offset, node.position_offset.x)
1014-
for node : GraphElement in nodes:
1015-
node.position_offset.x = (max_offset + min_offset) * 0.5 - (node.size.x * 0.5)
999+
var graph_edit : MMGraphEdit = get_current_graph_edit()
1000+
if graph_edit != null:
1001+
graph_edit.align_start()
10161002

10171003
func edit_align_end() -> void:
1018-
var nodes : Array = get_current_graph_edit().get_selected_nodes()
1019-
var max_offset : float = -INF
1004+
var graph_edit : MMGraphEdit = get_current_graph_edit()
1005+
if graph_edit != null:
1006+
graph_edit.align_end()
1007+
1008+
func edit_align_top() -> void:
1009+
var graph_edit : MMGraphEdit = get_current_graph_edit()
1010+
if graph_edit != null:
1011+
graph_edit.align_top()
10201012

1021-
for node : GraphElement in nodes:
1022-
max_offset = max(max_offset, node.position_offset.x + node.size.x)
1023-
for node : GraphElement in nodes:
1024-
node.position_offset.x = max_offset - node.size.x
1013+
func edit_straighten_connections() -> void:
1014+
var graph_edit : MMGraphEdit = get_current_graph_edit()
1015+
if graph_edit != null:
1016+
graph_edit.straighten_connections()
10251017

10261018
func view_center() -> void:
10271019
var graph_edit : MMGraphEdit = get_current_graph_edit()

material_maker/panels/graph_edit/graph_align_menu.gd

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ func _on_align_start_pressed() -> void:
55
mm_globals.main_window.edit_align_start()
66

77

8-
func _on_align_center_pressed() -> void:
9-
mm_globals.main_window.edit_align_center()
10-
11-
128
func _on_align_end_pressed() -> void:
139
mm_globals.main_window.edit_align_end()
10+
11+
12+
func _on_align_top_pressed() -> void:
13+
mm_globals.main_window.edit_align_top()
14+
15+
16+
func _on_straighten_pressed() -> void:
17+
mm_globals.main_window.edit_straighten_connections()

material_maker/panels/graph_edit/graph_edit.gd

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,6 @@ func _gui_input(event) -> void:
231231
minimize_selection()
232232
KEY_DELETE,KEY_BACKSPACE,KEY_X:
233233
remove_selection()
234-
KEY_C:
235-
if OS.get_name() == "macOS":
236-
center_view()
237-
KEY_MASK_ALT | KEY_S:
238-
if OS.get_name() == "macOS":
239-
swap_node_inputs()
240234
KEY_LEFT:
241235
scroll_offset.x -= 0.5*size.x
242236
accept_event()
@@ -251,6 +245,26 @@ func _gui_input(event) -> void:
251245
accept_event()
252246
KEY_F:
253247
color_comment_nodes()
248+
249+
# macOS global menu does not support single-key accelerators
250+
# and they also require Cmd/Ctrl to be present in them to work
251+
# see https://github.com/godotengine/godot/issues/108622
252+
# As a workaround the menu items are invoked here
253+
if OS.get_name() == "macOS":
254+
match scancode_with_modifiers:
255+
KEY_C:
256+
center_view()
257+
KEY_MASK_ALT | KEY_S:
258+
swap_node_inputs()
259+
KEY_Q:
260+
straighten_connections()
261+
KEY_MASK_SHIFT | KEY_W:
262+
align_top()
263+
KEY_MASK_SHIFT | KEY_A:
264+
align_start()
265+
KEY_MASK_SHIFT | KEY_D:
266+
align_end()
267+
254268
match event.get_keycode():
255269
KEY_SHIFT, KEY_CTRL, KEY_ALT:
256270
var found_tip : bool = false
@@ -1758,3 +1772,59 @@ func color_comment_nodes() -> void:
17581772
picker.popup_hide.connect(picker.queue_free)
17591773
picker.popup_hide.connect(undoredo.end_group)
17601774
picker.popup()
1775+
1776+
func align_start() -> void:
1777+
var nodes : Array = get_selected_nodes()
1778+
var min_offset : float = INF
1779+
1780+
for node : GraphElement in nodes:
1781+
min_offset = min(min_offset, node.position_offset.x)
1782+
for node : GraphElement in nodes:
1783+
node.position_offset.x = min_offset
1784+
1785+
func align_end() -> void:
1786+
var nodes : Array = get_selected_nodes()
1787+
var max_offset : float = -INF
1788+
1789+
for node : GraphElement in nodes:
1790+
max_offset = max(max_offset, node.position_offset.x + node.size.x)
1791+
for node : GraphElement in nodes:
1792+
node.position_offset.x = max_offset - node.size.x
1793+
1794+
func align_top() -> void:
1795+
var nodes : Array = get_selected_nodes().filter(func(n): return n is GraphNode)
1796+
nodes.sort_custom(func(a: GraphNode, b: GraphNode):
1797+
return a.position_offset.x < b.position_offset.x)
1798+
for node in nodes:
1799+
node.position_offset.y = nodes[0].position_offset.y
1800+
1801+
func straighten_connections() -> void:
1802+
# simple connection straightening
1803+
# this expects selected nodes to be connected along a line
1804+
# and connections are made from left to right(in/out port position)
1805+
# i.e. [] -> [] -> []
1806+
# if there are multiple outgoing connections from one node to the next
1807+
# the top-most connection(by smaller index) is used to align the nodes
1808+
var nodes : Array = get_selected_nodes().filter(func(n): return n is GraphNode)
1809+
if nodes.size() < 2:
1810+
return
1811+
nodes.sort_custom(func(a, b) -> bool:
1812+
return a.position_offset.x < b.position_offset.x)
1813+
for i in nodes.size() - 1:
1814+
var from_node : GraphNode = nodes[i]
1815+
var to_node : GraphNode = nodes[i+1]
1816+
var conn : Dictionary
1817+
var conns : Array[Dictionary]
1818+
for c in connections:
1819+
if c.to_node == to_node.name:
1820+
conns.append(c)
1821+
if conns.is_empty():
1822+
return
1823+
conns.sort_custom(func(a: Dictionary,b: Dictionary) -> bool:
1824+
return a.from_port < b.from_port)
1825+
conn = conns[0]
1826+
if conn.from_node == from_node.name:
1827+
var from_pos_y = from_node.get_output_port_position(conn.from_port).y + from_node.position_offset.y
1828+
var to_pos_y = to_node.get_input_port_position(conn.to_port).y + to_node.position_offset.y
1829+
var y_diff = to_pos_y - from_pos_y
1830+
to_node.position_offset.y -= y_diff

material_maker/projects_panel.tscn

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
[ext_resource type="PackedScene" uid="uid://dpaxvlnn2u1f6" path="res://material_maker/panels/preview_3d/preview_3d.tscn" id="3_qvj7k"]
66
[ext_resource type="Script" uid="uid://bl15iwn2k8qm" path="res://material_maker/widgets/tabs/tabs.gd" id="4_mpinq"]
77
[ext_resource type="Script" uid="uid://c37lcka7r53wk" path="res://material_maker/panels/common/menu_bar_button_with_panel.gd" id="6_r5hxx"]
8-
[ext_resource type="Script" path="res://material_maker/panels/graph_edit/graph_zoom_menu.gd" id="7_lbgjg"]
8+
[ext_resource type="Script" uid="uid://jvurydhtpvc2" path="res://material_maker/panels/graph_edit/graph_zoom_menu.gd" id="7_lbgjg"]
99
[ext_resource type="Script" uid="uid://bos2fu0tsood3" path="res://material_maker/panels/preview_2d/simple_button.gd" id="7_qnupl"]
1010
[ext_resource type="PackedScene" uid="uid://rflulhsuy3ax" path="res://material_maker/widgets/float_edit/float_edit.tscn" id="8_1w3oe"]
11-
[ext_resource type="Script" path="res://material_maker/panels/graph_edit/graph_view_menu.gd" id="8_nl2qi"]
11+
[ext_resource type="Script" uid="uid://bxwor0k6svci8" path="res://material_maker/panels/graph_edit/graph_view_menu.gd" id="8_nl2qi"]
1212
[ext_resource type="Script" uid="uid://pqxjwlcff5ko" path="res://material_maker/panels/graph_edit/graph_align_menu.gd" id="8_r5hxx"]
1313
[ext_resource type="ButtonGroup" uid="uid://biv6we3po8wbb" path="res://material_maker/line_style_btn_group.tres" id="10_lbgjg"]
1414

@@ -423,15 +423,15 @@ icon_alignment = 1
423423
script = ExtResource("7_qnupl")
424424
icon_name = "align_start"
425425

426-
[node name="AlignCenter" type="Button" parent="MenuBar/HBox/AlignMenu/HBox"]
426+
[node name="AlignTop" type="Button" parent="MenuBar/HBox/AlignMenu/HBox"]
427427
custom_minimum_size = Vector2(25, 25)
428428
layout_mode = 2
429-
tooltip_text = "Align Center"
429+
tooltip_text = "Align Top"
430430
shortcut = SubResource("Shortcut_7tisq")
431431
shortcut_in_tooltip = false
432432
icon_alignment = 1
433433
script = ExtResource("7_qnupl")
434-
icon_name = "align_center"
434+
icon_name = "align_top"
435435

436436
[node name="AlignEnd" type="Button" parent="MenuBar/HBox/AlignMenu/HBox"]
437437
custom_minimum_size = Vector2(25, 25)
@@ -443,6 +443,16 @@ icon_alignment = 1
443443
script = ExtResource("7_qnupl")
444444
icon_name = "align_end"
445445

446+
[node name="Straighten" type="Button" parent="MenuBar/HBox/AlignMenu/HBox"]
447+
custom_minimum_size = Vector2(25, 25)
448+
layout_mode = 2
449+
tooltip_text = "Straighten Connections"
450+
shortcut = SubResource("Shortcut_7tisq")
451+
shortcut_in_tooltip = false
452+
icon_alignment = 1
453+
script = ExtResource("7_qnupl")
454+
icon_name = "straighten_connections"
455+
446456
[node name="PreviewsMenu" type="PanelContainer" parent="MenuBar/HBox"]
447457
unique_name_in_owner = true
448458
layout_mode = 2
@@ -507,8 +517,9 @@ Scroll to zoom the 3D Preview."
507517
[connection signal="value_changed" from="MenuBar/HBox/MainGraphMenuBar/HBox/ViewMenu/ViewMenuPanel/VBoxContainer/VBoxContainer2/Curvature/LineCurvature" to="MenuBar/HBox/MainGraphMenuBar/HBox/ViewMenu" method="_on_line_curvature_value_changed"]
508518
[connection signal="value_changed" from="MenuBar/HBox/MainGraphMenuBar/HBox/ViewMenu/ViewMenuPanel/VBoxContainer/VBoxContainer2/Curvature/LineCurvature" to="MenuBar/HBox/MainGraphMenuBar/HBox/ViewMenu/ViewMenuPanel" method="_on_line_curvature_value_changed"]
509519
[connection signal="pressed" from="MenuBar/HBox/AlignMenu/HBox/AlignStart" to="MenuBar/HBox/AlignMenu" method="_on_align_start_pressed"]
510-
[connection signal="pressed" from="MenuBar/HBox/AlignMenu/HBox/AlignCenter" to="MenuBar/HBox/AlignMenu" method="_on_align_center_pressed"]
520+
[connection signal="pressed" from="MenuBar/HBox/AlignMenu/HBox/AlignTop" to="MenuBar/HBox/AlignMenu" method="_on_align_top_pressed"]
511521
[connection signal="pressed" from="MenuBar/HBox/AlignMenu/HBox/AlignEnd" to="MenuBar/HBox/AlignMenu" method="_on_align_end_pressed"]
522+
[connection signal="pressed" from="MenuBar/HBox/AlignMenu/HBox/Straighten" to="MenuBar/HBox/AlignMenu" method="_on_straighten_pressed"]
512523
[connection signal="toggled" from="MenuBar/HBox/PreviewsMenu/HBox/2DPreview" to="." method="show_background_preview_2d"]
513524
[connection signal="toggled" from="MenuBar/HBox/PreviewsMenu/HBox/3DPreview" to="." method="show_background_preview_3d"]
514525
[connection signal="gui_input" from="MenuBar/HBox/PreviewsMenu/HBox/ControlView" to="BackgroundPreviews/Preview3D" method="on_gui_input"]

material_maker/theme/default.tres

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_resource type="Theme" load_steps=166 format=3 uid="uid://b628lwfk6ig2c"]
1+
[gd_resource type="Theme" load_steps=168 format=3 uid="uid://b628lwfk6ig2c"]
22

33
[ext_resource type="FontFile" uid="uid://lro0qdrhfytt" path="res://material_maker/theme/font_rubik/Rubik-Light.ttf" id="1_5tfb1"]
44
[ext_resource type="Texture2D" uid="uid://1s0c37uoj4rf" path="res://material_maker/theme/default_theme_icons.svg" id="1_s43fy"]
@@ -397,10 +397,6 @@ metadata/recolor = true
397397
atlas = ExtResource("1_s43fy")
398398
region = Rect2(32, 96, 16, 16)
399399

400-
[sub_resource type="AtlasTexture" id="AtlasTexture_khddu"]
401-
atlas = ExtResource("1_s43fy")
402-
region = Rect2(16, 208, 16, 16)
403-
404400
[sub_resource type="AtlasTexture" id="AtlasTexture_xbfay"]
405401
atlas = ExtResource("1_s43fy")
406402
region = Rect2(32, 208, 16, 16)
@@ -409,6 +405,10 @@ region = Rect2(32, 208, 16, 16)
409405
atlas = ExtResource("1_s43fy")
410406
region = Rect2(0, 208, 16, 16)
411407

408+
[sub_resource type="AtlasTexture" id="AtlasTexture_khddu"]
409+
atlas = ExtResource("1_s43fy")
410+
region = Rect2(16, 208, 16, 16)
411+
412412
[sub_resource type="AtlasTexture" id="AtlasTexture_60g77"]
413413
atlas = ExtResource("1_s43fy")
414414
region = Rect2(96, 144, 16, 16)
@@ -593,6 +593,13 @@ region = Rect2(96, 16, 16, 16)
593593
atlas = ExtResource("1_s43fy")
594594
region = Rect2(48, 16, 16, 16)
595595

596+
[sub_resource type="AtlasTexture" id="AtlasTexture_8xpdb"]
597+
atlas = ExtResource("1_s43fy")
598+
region = Rect2(48, 208, 15, 16)
599+
600+
[sub_resource type="AtlasTexture" id="AtlasTexture_a1e3v"]
601+
atlas = SubResource("AtlasTexture_8xpdb")
602+
596603
[sub_resource type="AtlasTexture" id="AtlasTexture_en6gw"]
597604
atlas = ExtResource("1_s43fy")
598605
region = Rect2(0, 0, 16, 16)
@@ -1226,9 +1233,9 @@ MM_Icons/icons/2D_preview = SubResource("AtlasTexture_1yu4y")
12261233
MM_Icons/icons/3D_preview = SubResource("AtlasTexture_ao7ds")
12271234
MM_Icons/icons/3D_preview_control = SubResource("AtlasTexture_hht3q")
12281235
MM_Icons/icons/add_image = SubResource("AtlasTexture_86qok")
1229-
MM_Icons/icons/align_center = SubResource("AtlasTexture_khddu")
12301236
MM_Icons/icons/align_end = SubResource("AtlasTexture_xbfay")
12311237
MM_Icons/icons/align_start = SubResource("AtlasTexture_nw6qx")
1238+
MM_Icons/icons/align_top = SubResource("AtlasTexture_khddu")
12321239
MM_Icons/icons/arrange_nodes = SubResource("AtlasTexture_60g77")
12331240
MM_Icons/icons/arrow_left = SubResource("AtlasTexture_q32qs")
12341241
MM_Icons/icons/arrow_right = SubResource("AtlasTexture_r3xak")
@@ -1273,6 +1280,7 @@ MM_Icons/icons/spline_link = SubResource("AtlasTexture_fs6qc")
12731280
MM_Icons/icons/spline_progressive = SubResource("AtlasTexture_70aex")
12741281
MM_Icons/icons/spline_reverse = SubResource("AtlasTexture_ahanl")
12751282
MM_Icons/icons/spline_unlink = SubResource("AtlasTexture_iofl8")
1283+
MM_Icons/icons/straighten_connections = SubResource("AtlasTexture_a1e3v")
12761284
MM_Icons/icons/view = SubResource("AtlasTexture_en6gw")
12771285
MM_Icons/icons/zoom = SubResource("AtlasTexture_iyaen")
12781286
MM_Icons/icons/zoom_in = SubResource("AtlasTexture_5k62t")

0 commit comments

Comments
 (0)