@@ -13,18 +13,32 @@ var links = {}
1313func _ready ():
1414 super ._ready ()
1515
16- func add_control (text : String , control : Control , is_named_param : bool , short_description : String = "" , long_description : String = "" , is_first : bool = false , is_last : bool = false ) -> void :
16+
17+ func add_control (text : String , control : Control , is_named_param : bool , short_description : String = "" , long_description : String = "" ) -> void :
18+ var drag_button := Button .new ()
19+ drag_button .flat = true
20+ drag_button .add_theme_stylebox_override ("focus" , StyleBoxEmpty .new ())
21+ drag_button .icon = get_theme_icon ("arrow_updown" , "MM_Icons" )
22+ drag_button .mouse_filter = Control .MOUSE_FILTER_STOP
23+ grid .add_child (drag_button )
24+ drag_button .set_drag_forwarding (
25+ row_get_data .bind (drag_button .get_index (), control .name ),
26+ row_can_drop .bind (drag_button .get_index ()),
27+ row_drop_data .bind (drag_button .get_index ()))
28+
1729 var line_edit : LineEdit = LineEdit .new ()
1830 line_edit .set_text (control .name )
1931 line_edit .custom_minimum_size .x = 80
2032 grid .add_child (line_edit )
2133 line_edit .connect ("text_changed" , Callable (self , "on_param_name_changed" ).bind (control .name , line_edit ))
2234 line_edit .connect ("text_submitted" , Callable (self , "on_param_name_entered" ).bind (control .name , line_edit ))
2335 line_edit .connect ("focus_exited" , Callable (self , "on_param_name_entered2" ).bind (control .name , line_edit ))
36+
2437 var label = preload ("res://material_maker/widgets/linked_widgets/editable_label.tscn" ).instantiate ()
2538 label .set_text (text )
2639 label .connect ("label_changed" , Callable (self , "on_label_changed" ).bind (control .name ))
2740 grid .add_child (label )
41+
2842 var description = preload ("res://material_maker/widgets/desc_button/desc_button.tscn" ).instantiate ()
2943 description .short_description = short_description
3044 description .long_description = long_description
@@ -34,6 +48,7 @@ func add_control(text : String, control : Control, is_named_param : bool, short_
3448 control .connect ("mouse_entered" , Callable (self , "on_enter_widget" ).bind (control ))
3549 control .connect ("mouse_exited" , Callable (self , "on_exit_widget" ).bind (control ))
3650 control .tooltip_text = ""
51+
3752 var button = Button .new ()
3853 if is_named_param :
3954 button .icon = preload ("res://material_maker/icons/edit.tres" )
@@ -50,22 +65,6 @@ func add_control(text : String, control : Control, is_named_param : bool, short_
5065 button .tooltip_text = "Remove parameter"
5166 grid .add_child (button )
5267 button .connect ("pressed" , Callable (self , "remove_parameter" ).bind (control .name ))
53- button = Button .new ()
54- button .icon = preload ("res://material_maker/icons/up.tres" )
55- button .tooltip_text = "Move parameter up"
56- grid .add_child (button )
57- if is_first :
58- button .disabled = true
59- else :
60- button .connect ("pressed" , Callable (self , "move_parameter" ).bind (control .name , - 1 ))
61- button = Button .new ()
62- button .icon = preload ("res://material_maker/icons/down.tres" )
63- button .tooltip_text = "Move parameter down"
64- grid .add_child (button )
65- if is_last :
66- button .disabled = true
67- else :
68- button .connect ("pressed" , Callable (self , "move_parameter" ).bind (control .name , 1 ))
6968
7069func update_node () -> void :
7170 await get_tree ().process_frame
@@ -88,7 +87,7 @@ func update_node() -> void:
8887 var shortdesc : String = widget .shortdesc if widget .has ("shortdesc" ) else ""
8988 var longdesc : String = widget .longdesc if widget .has ("longdesc" ) else ""
9089 var is_named_param : bool = ( p .widget_type == "named_parameter" )
91- add_control (generator .get_widget (p .name ).label , control , is_named_param , shortdesc , longdesc , i == 0 , i == parameter_count - 1 )
90+ add_control (generator .get_widget (p .name ).label , control , is_named_param , shortdesc , longdesc )
9291 if generator .widgets [i ].type == "config_control" and control is OptionButton :
9392 var current = null
9493 if control .get_item_count () > 0 and generator .parameters .has (p .name ):
@@ -269,3 +268,72 @@ func on_exit_widget(widget) -> void:
269268 for l in links [widget ]:
270269 l .queue_free ()
271270 links .erase (widget )
271+
272+
273+ func modulate_row_controls (row_index : int , color : Color ):
274+ for i in range (grid .columns * row_index , grid .columns * row_index + grid .columns ):
275+ grid .get_child (i ).modulate = color
276+
277+
278+ func row_get_data (_at_pos : Vector2 , index : int , widget_name : String ) -> Dictionary :
279+ var preview_root := Control .new ()
280+
281+ var bg_panel := PanelContainer .new ()
282+ bg_panel .theme_type_variation = "MM_PanelBackground"
283+
284+ var panel_stylebox := get_theme_stylebox ("panel" , "GraphNode" ).duplicate ()
285+ panel_stylebox .set_corner_radius_all (5 )
286+ panel_stylebox .set_border_width_all (0 )
287+ panel_stylebox .set_expand_margin_all (0 )
288+ panel_stylebox .set_content_margin_all (4.0 )
289+ panel_stylebox .bg_color .a = 0.8
290+ bg_panel .add_theme_stylebox_override ("panel" , panel_stylebox )
291+
292+ var grid_container := GridContainer .new ()
293+ bg_panel .add_child (grid_container )
294+ grid_container .columns = grid .columns
295+ for c in range (index , index + grid .columns ):
296+ var src := grid .get_child (c )
297+ var dupe := src .duplicate (true )
298+
299+ if c == index and dupe is Button :
300+ dupe .toggle_mode = true
301+ dupe .button_pressed = true
302+
303+ dupe .custom_minimum_size .x = src .size .x
304+ grid_container .add_child (dupe )
305+
306+ bg_panel .position = - Vector2 (16 , 16 )
307+ preview_root .add_child (bg_panel )
308+
309+ # match control scale to graph edit zoom
310+ preview_root .scale = Vector2 .ONE * get_parent ().zoom
311+
312+ var row_index : int = floor (index / grid .columns )
313+ modulate_row_controls (row_index , Color .TRANSPARENT )
314+ set_drag_preview (preview_root )
315+
316+ return { "row_index" : row_index , "widget_name" : widget_name , "node_name" : name }
317+
318+
319+ func row_can_drop (_at_pos : Vector2 , data : Dictionary , index : int ) -> bool :
320+ return data .row_index != floor (index / grid .columns ) and data .node_name == name
321+
322+
323+ func row_drop_data (_at_pos : Vector2 , data : Dictionary , index : int ) -> void :
324+ move_parameter (data .widget_name , floor (index / grid .columns ) - data .row_index )
325+
326+ # workaround FloatEdit' focused state when dropping row towards top
327+ await get_tree ().process_frame
328+ for float_edit in grid .get_children ():
329+ if float_edit is PanelContainer :
330+ float_edit .get_child (0 ).add_theme_stylebox_override (
331+ "fill" , get_theme_stylebox ("fill_normal" , "MM_NodeFloatEdit" ))
332+ float_edit .get_child (0 ).add_theme_stylebox_override (
333+ "background" , get_theme_stylebox ("normal" ,"MM_NodeFloatEdit" ))
334+
335+
336+ func _notification (what : int ) -> void :
337+ match what :
338+ NOTIFICATION_DRAG_END :
339+ grid .get_children ().map (func (c ): c .modulate = Color .WHITE )
0 commit comments