Skip to content

Commit 0eca686

Browse files
committed
Merge pull request godotengine#99270 from Sauermann/fix-svc-drop-config
Introduce a `SubViewportContainer` config for drag-and-drop target locations
2 parents 38ebcf9 + 117158d commit 0eca686

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed

doc/classes/SubViewportContainer.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
</method>
2121
</methods>
2222
<members>
23+
<member name="consume_drag_and_drop" type="bool" setter="set_consume_drag_and_drop" getter="is_consume_drag_and_drop_enabled" default="false">
24+
If [code]false[/code], the [SubViewportContainer] is not available as a drop target in drag-and-drop operations, and instead the [Control] nodes inside its [Viewport] children are potential drop targets.
25+
If [code]true[/code], the [SubViewportContainer] itself will be considered as a drop target in drag-and-drop operations, preventing the [Control] nodes inside its [Viewport] children from becoming drop targets.
26+
</member>
2327
<member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" overrides="Control" enum="Control.FocusMode" default="1" />
2428
<member name="stretch" type="bool" setter="set_stretch" getter="is_stretch_enabled" default="false">
2529
If [code]true[/code], the sub-viewport will be automatically resized to the control's size.

scene/gui/subviewport_container.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,14 @@ bool SubViewportContainer::_is_propagated_in_gui_input(const Ref<InputEvent> &p_
246246
return false;
247247
}
248248

249+
void SubViewportContainer::set_consume_drag_and_drop(bool p_enable) {
250+
consume_drag_and_drop = p_enable;
251+
}
252+
253+
bool SubViewportContainer::is_consume_drag_and_drop_enabled() {
254+
return consume_drag_and_drop;
255+
}
256+
249257
void SubViewportContainer::add_child_notify(Node *p_child) {
250258
if (Object::cast_to<SubViewport>(p_child)) {
251259
queue_redraw();
@@ -286,8 +294,12 @@ void SubViewportContainer::_bind_methods() {
286294
ClassDB::bind_method(D_METHOD("set_stretch_shrink", "amount"), &SubViewportContainer::set_stretch_shrink);
287295
ClassDB::bind_method(D_METHOD("get_stretch_shrink"), &SubViewportContainer::get_stretch_shrink);
288296

297+
ClassDB::bind_method(D_METHOD("set_consume_drag_and_drop", "amount"), &SubViewportContainer::set_consume_drag_and_drop);
298+
ClassDB::bind_method(D_METHOD("is_consume_drag_and_drop_enabled"), &SubViewportContainer::is_consume_drag_and_drop_enabled);
299+
289300
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "stretch"), "set_stretch", "is_stretch_enabled");
290301
ADD_PROPERTY(PropertyInfo(Variant::INT, "stretch_shrink", PROPERTY_HINT_RANGE, "1,32,1,or_greater"), "set_stretch_shrink", "get_stretch_shrink");
302+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "consume_drag_and_drop"), "set_consume_drag_and_drop", "is_consume_drag_and_drop_enabled");
291303

292304
GDVIRTUAL_BIND(_propagate_input_event, "event");
293305
}

scene/gui/subviewport_container.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class SubViewportContainer : public Container {
3838

3939
bool stretch = false;
4040
int shrink = 1;
41+
bool consume_drag_and_drop = false;
42+
4143
void _notify_viewports(int p_notification);
4244
bool _is_propagated_in_gui_input(const Ref<InputEvent> &p_event);
4345
void _send_event_to_viewports(const Ref<InputEvent> &p_event);
@@ -63,6 +65,9 @@ class SubViewportContainer : public Container {
6365
int get_stretch_shrink() const;
6466
void recalc_force_viewport_sizes();
6567

68+
void set_consume_drag_and_drop(bool p_enable);
69+
bool is_consume_drag_and_drop_enabled();
70+
6671
virtual Size2 get_minimum_size() const override;
6772

6873
virtual Vector<int> get_allowed_size_flags_horizontal() const override;

scene/main/viewport.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3060,6 +3060,14 @@ void Viewport::_update_mouse_over(Vector2 p_pos) {
30603060
}
30613061
v->_update_mouse_over(v->get_final_transform().affine_inverse().xform(pos));
30623062
}
3063+
3064+
Viewport *section_root = get_section_root_viewport();
3065+
if (section_root && c->is_consume_drag_and_drop_enabled()) {
3066+
// Evaluating `consume_drag_and_drop` and adjusting target_control needs to happen
3067+
// after `_update_mouse_over` in the SubViewports, because otherwise physics picking
3068+
// would not work inside SubViewports.
3069+
section_root->gui.target_control = over;
3070+
}
30633071
}
30643072
}
30653073

0 commit comments

Comments
 (0)