From 5867e5e9314272dceaf9359ce4b758ab60a30951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Doug=20No=C3=ABl?= Date: Mon, 26 Jun 2023 05:47:40 -0400 Subject: [PATCH] Update Drag and Drop GUI demo to Godot 4.0 (#881) Co-authored-by: Hugo Locurcio --- gui/drag_and_drop/README.md | 4 +- gui/drag_and_drop/drag_and_drop.tscn | 135 ++++++------------ gui/drag_and_drop/drag_drop_script.gd | 26 +++- gui/drag_and_drop/project.godot | 10 +- .../screenshots/drag_and_drop.png | Bin 4275 -> 0 bytes .../screenshots/drag_and_drop.webp | Bin 0 -> 5830 bytes 6 files changed, 78 insertions(+), 97 deletions(-) delete mode 100644 gui/drag_and_drop/screenshots/drag_and_drop.png create mode 100644 gui/drag_and_drop/screenshots/drag_and_drop.webp diff --git a/gui/drag_and_drop/README.md b/gui/drag_and_drop/README.md index bc99e620..ba570af4 100644 --- a/gui/drag_and_drop/README.md +++ b/gui/drag_and_drop/README.md @@ -7,10 +7,10 @@ A demo showcasing drag and drop functionality. Language: GDScript -Renderer: GLES 2 +Renderer: Compatibility Check out this demo on the asset library: https://godotengine.org/asset-library/asset/133 ## Screenshots -![Screenshot](screenshots/drag_and_drop.png) +![Screenshot](screenshots/drag_and_drop.webp) diff --git a/gui/drag_and_drop/drag_and_drop.tscn b/gui/drag_and_drop/drag_and_drop.tscn index 416cf66b..86431d01 100644 --- a/gui/drag_and_drop/drag_and_drop.tscn +++ b/gui/drag_and_drop/drag_and_drop.tscn @@ -1,25 +1,20 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=2 format=3 uid="uid://bfrbj2aq7xqe4"] -[ext_resource path="res://drag_drop_script.gd" type="Script" id=1] +[ext_resource type="Script" path="res://drag_drop_script.gd" id="1"] [node name="DragAndDrop" type="Control"] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -512.0 -offset_top = -300.0 -offset_right = 512.0 -offset_bottom = 300.0 -rect_pivot_offset = Vector2(512, 300) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(512, 300) size_flags_horizontal = 2 size_flags_vertical = 2 -__meta__ = { -"__editor_plugin_screen__": "2D", -"_edit_use_anchors_": false -} [node name="Information" type="Label" parent="."] +layout_mode = 0 anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 @@ -31,12 +26,9 @@ offset_bottom = -150.0 size_flags_horizontal = 2 size_flags_vertical = 0 text = "Drag colors from button to button, or change button colors and drag them again." -align = 1 -__meta__ = { -"_edit_use_anchors_": false -} [node name="GridContainer" type="GridContainer" parent="."] +layout_mode = 0 anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 @@ -46,108 +38,75 @@ offset_top = -150.0 offset_right = 250.0 offset_bottom = 200.0 columns = 3 -__meta__ = { -"_edit_use_anchors_": false -} [node name="ColorPickerButton0" type="ColorPickerButton" parent="GridContainer"] -offset_left = 34.0 -offset_top = 25.0 -offset_right = 130.0 -offset_bottom = 89.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0.671032, 0.605183, 0, 1) -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} +color = Color(0.937255, 0.266667, 0.266667, 1) +script = ExtResource("1") [node name="ColorPickerButton1" type="ColorPickerButton" parent="GridContainer"] -offset_left = 202.0 -offset_top = 25.0 -offset_right = 298.0 -offset_bottom = 89.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0, 0.797347, 0.741037, 1) -script = ExtResource( 1 ) +color = Color(0.960784, 0.619608, 0.0431373, 1) +script = ExtResource("1") [node name="ColorPickerButton2" type="ColorPickerButton" parent="GridContainer"] -offset_left = 370.0 -offset_top = 25.0 -offset_right = 466.0 -offset_bottom = 89.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0.443924, 0, 0.632923, 1) -script = ExtResource( 1 ) +color = Color(0.517647, 0.8, 0.0862745, 1) +script = ExtResource("1") [node name="ColorPickerButton3" type="ColorPickerButton" parent="GridContainer"] -offset_left = 34.0 -offset_top = 143.0 -offset_right = 130.0 -offset_bottom = 207.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(1, 1, 1, 1) -script = ExtResource( 1 ) +color = Color(0.0627451, 0.72549, 0.505882, 1) +script = ExtResource("1") [node name="ColorPickerButton4" type="ColorPickerButton" parent="GridContainer"] -offset_left = 202.0 -offset_top = 143.0 -offset_right = 298.0 -offset_bottom = 207.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(1, 0.933842, 0, 1) -script = ExtResource( 1 ) +color = Color(0.0235294, 0.713726, 0.831373, 1) +script = ExtResource("1") [node name="ColorPickerButton5" type="ColorPickerButton" parent="GridContainer"] -offset_left = 370.0 -offset_top = 143.0 -offset_right = 466.0 -offset_bottom = 207.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0.287293, 0.886362, 0.122933, 1) -script = ExtResource( 1 ) +color = Color(0.231373, 0.509804, 0.964706, 1) +script = ExtResource("1") [node name="ColorPickerButton6" type="ColorPickerButton" parent="GridContainer"] -offset_left = 34.0 -offset_top = 261.0 -offset_right = 130.0 -offset_bottom = 325.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0.908461, 0, 0.88789, 1) -script = ExtResource( 1 ) +color = Color(0.545098, 0.360784, 0.964706, 1) +script = ExtResource("1") [node name="ColorPickerButton7" type="ColorPickerButton" parent="GridContainer"] -offset_left = 202.0 -offset_top = 261.0 -offset_right = 298.0 -offset_bottom = 325.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0, 0.283703, 0, 1) -script = ExtResource( 1 ) +color = Color(0.85098, 0.27451, 0.937255, 1) +script = ExtResource("1") [node name="ColorPickerButton8" type="ColorPickerButton" parent="GridContainer"] -offset_left = 370.0 -offset_top = 261.0 -offset_right = 466.0 -offset_bottom = 325.0 -rect_min_size = Vector2(96, 64) +custom_minimum_size = Vector2(96, 64) +layout_mode = 2 size_flags_horizontal = 6 size_flags_vertical = 6 -color = Color(0, 0, 0.178211, 1) -script = ExtResource( 1 ) +color = Color(0.470588, 0.443137, 0.423529, 1) +script = ExtResource("1") diff --git a/gui/drag_and_drop/drag_drop_script.gd b/gui/drag_and_drop/drag_drop_script.gd index 2b30e25f..9865746b 100644 --- a/gui/drag_and_drop/drag_drop_script.gd +++ b/gui/drag_and_drop/drag_drop_script.gd @@ -1,18 +1,32 @@ extends ColorPickerButton -func get_drag_data(_pos): +# Returns the data to pass from an object when you click and drag away from +# this object. Also calls set_drag_preview() to show the mouse dragging +# something so the user knows that the operation is working. +func _get_drag_data(_pos): # Use another colorpicker as drag preview. var cpb = ColorPickerButton.new() cpb.color = color - cpb.size = Vector2(50, 50) - set_drag_preview(cpb) + cpb.size = Vector2(80.0, 50.0) + + # Allows us to center the color picker on the mouse + var preview = Control.new() + preview.add_child(cpb) + cpb.position = -0.5 * cpb.size + + # Sets what the user will see they are dragging + set_drag_preview(preview) + # Return color as drag data. return color -func can_drop_data(_pos, data): +# Returns a boolean by examining the data being dragged to see if it's valid +# to drop here. +func _can_drop_data(_pos, data): return typeof(data) == TYPE_COLOR - -func drop_data(_pos, data): +# Takes the data being dragged and processes it. In this case, we are +# assigning a new color to the target color picker button. +func _drop_data(_pos, data): color = data diff --git a/gui/drag_and_drop/project.godot b/gui/drag_and_drop/project.godot index 870e9820..e63b1c2a 100644 --- a/gui/drag_and_drop/project.godot +++ b/gui/drag_and_drop/project.godot @@ -6,7 +6,7 @@ ; [section] ; section goes between [] ; param=value ; assign values to parameters -config_version=4 +config_version=5 [application] @@ -16,9 +16,17 @@ config/description="A demo showcasing drag and drop functionality. - Drag and drop the color buttons to copy their colors over. - Click on the buttons to manually adjust their color." run/main_scene="res://drag_and_drop.tscn" +config/features=PackedStringArray("4.0") +run/low_processor_mode=true config/icon="res://icon.webp" [display] window/stretch/mode="canvas_items" window/stretch/aspect="expand" +window/vsync/vsync_mode=0 + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/gui/drag_and_drop/screenshots/drag_and_drop.png b/gui/drag_and_drop/screenshots/drag_and_drop.png deleted file mode 100644 index 38cc5d6aab4e729f92fbe50d77b764f2dcdae9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4275 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 O<7=rS)JjyaA^!x2Rx!i? diff --git a/gui/drag_and_drop/screenshots/drag_and_drop.webp b/gui/drag_and_drop/screenshots/drag_and_drop.webp new file mode 100644 index 0000000000000000000000000000000000000000..433f3164d3425674aa1b1e463519252e83415b5c GIT binary patch literal 5830 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 z