|
@@ -3546,69 +3546,77 @@ void SpatialEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event)
|
|
|
|
|
|
Ref<InputEventMouseButton> mb = p_event;
|
|
|
|
|
|
- if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
|
|
|
+ if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
|
|
|
|
|
|
- Vector2 size = get_size();
|
|
|
-
|
|
|
- int h_sep = get_constant("separation", "HSplitContainer");
|
|
|
- int v_sep = get_constant("separation", "VSplitContainer");
|
|
|
-
|
|
|
- int mid_w = size.width * ratio_h;
|
|
|
- int mid_h = size.height * ratio_v;
|
|
|
+ if (mb->is_pressed()) {
|
|
|
+ Vector2 size = get_size();
|
|
|
|
|
|
- dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2);
|
|
|
- dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2);
|
|
|
+ int h_sep = get_constant("separation", "HSplitContainer");
|
|
|
+ int v_sep = get_constant("separation", "VSplitContainer");
|
|
|
|
|
|
- drag_begin_pos = mb->get_position();
|
|
|
- drag_begin_ratio.x = ratio_h;
|
|
|
- drag_begin_ratio.y = ratio_v;
|
|
|
+ int mid_w = size.width * ratio_h;
|
|
|
+ int mid_h = size.height * ratio_v;
|
|
|
|
|
|
- switch (view) {
|
|
|
- case VIEW_USE_1_VIEWPORT: {
|
|
|
+ dragging_h = mb->get_position().x > (mid_w - h_sep / 2) && mb->get_position().x < (mid_w + h_sep / 2);
|
|
|
+ dragging_v = mb->get_position().y > (mid_h - v_sep / 2) && mb->get_position().y < (mid_h + v_sep / 2);
|
|
|
|
|
|
- dragging_h = false;
|
|
|
- dragging_v = false;
|
|
|
+ drag_begin_pos = mb->get_position();
|
|
|
+ drag_begin_ratio.x = ratio_h;
|
|
|
+ drag_begin_ratio.y = ratio_v;
|
|
|
|
|
|
- } break;
|
|
|
- case VIEW_USE_2_VIEWPORTS: {
|
|
|
+ switch (view) {
|
|
|
+ case VIEW_USE_1_VIEWPORT: {
|
|
|
|
|
|
- dragging_h = false;
|
|
|
+ dragging_h = false;
|
|
|
+ dragging_v = false;
|
|
|
|
|
|
- } break;
|
|
|
- case VIEW_USE_2_VIEWPORTS_ALT: {
|
|
|
+ } break;
|
|
|
+ case VIEW_USE_2_VIEWPORTS: {
|
|
|
|
|
|
- dragging_v = false;
|
|
|
+ dragging_h = false;
|
|
|
|
|
|
- } break;
|
|
|
- case VIEW_USE_3_VIEWPORTS: {
|
|
|
+ } break;
|
|
|
+ case VIEW_USE_2_VIEWPORTS_ALT: {
|
|
|
|
|
|
- if (dragging_v)
|
|
|
- dragging_h = false;
|
|
|
- else
|
|
|
dragging_v = false;
|
|
|
|
|
|
- } break;
|
|
|
- case VIEW_USE_3_VIEWPORTS_ALT: {
|
|
|
+ } break;
|
|
|
+ case VIEW_USE_3_VIEWPORTS:
|
|
|
+ case VIEW_USE_3_VIEWPORTS_ALT:
|
|
|
+ case VIEW_USE_4_VIEWPORTS: {
|
|
|
|
|
|
- if (dragging_h)
|
|
|
- dragging_v = false;
|
|
|
- else
|
|
|
- dragging_h = false;
|
|
|
- } break;
|
|
|
- case VIEW_USE_4_VIEWPORTS: {
|
|
|
+ // Do nothing.
|
|
|
|
|
|
- } break;
|
|
|
+ } break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ dragging_h = false;
|
|
|
+ dragging_v = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
|
|
|
- dragging_h = false;
|
|
|
- dragging_v = false;
|
|
|
- }
|
|
|
-
|
|
|
Ref<InputEventMouseMotion> mm = p_event;
|
|
|
|
|
|
- if (mm.is_valid() && (dragging_h || dragging_v)) {
|
|
|
+ if (mm.is_valid()) {
|
|
|
+
|
|
|
+ if (view == VIEW_USE_3_VIEWPORTS || view == VIEW_USE_3_VIEWPORTS_ALT || view == VIEW_USE_4_VIEWPORTS) {
|
|
|
+ Vector2 size = get_size();
|
|
|
+
|
|
|
+ int h_sep = get_constant("separation", "HSplitContainer");
|
|
|
+ int v_sep = get_constant("separation", "VSplitContainer");
|
|
|
+
|
|
|
+ int mid_w = size.width * ratio_h;
|
|
|
+ int mid_h = size.height * ratio_v;
|
|
|
+
|
|
|
+ bool was_hovering_h = hovering_h;
|
|
|
+ bool was_hovering_v = hovering_v;
|
|
|
+ hovering_h = mm->get_position().x > (mid_w - h_sep / 2) && mm->get_position().x < (mid_w + h_sep / 2);
|
|
|
+ hovering_v = mm->get_position().y > (mid_h - v_sep / 2) && mm->get_position().y < (mid_h + v_sep / 2);
|
|
|
+
|
|
|
+ if (was_hovering_h != hovering_h || was_hovering_v != hovering_v) {
|
|
|
+ update();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (dragging_h) {
|
|
|
float new_ratio = drag_begin_ratio.x + (mm->get_position().x - drag_begin_pos.x) / get_size().width;
|
|
@@ -3638,9 +3646,12 @@ void SpatialEditorViewportContainer::_notification(int p_what) {
|
|
|
if (p_what == NOTIFICATION_DRAW && mouseover) {
|
|
|
|
|
|
Ref<Texture> h_grabber = get_icon("grabber", "HSplitContainer");
|
|
|
-
|
|
|
Ref<Texture> v_grabber = get_icon("grabber", "VSplitContainer");
|
|
|
|
|
|
+ Ref<Texture> hdiag_grabber = get_icon("GuiViewportHdiagsplitter", "EditorIcons");
|
|
|
+ Ref<Texture> vdiag_grabber = get_icon("GuiViewportVdiagsplitter", "EditorIcons");
|
|
|
+ Ref<Texture> vh_grabber = get_icon("GuiViewportVhsplitter", "EditorIcons");
|
|
|
+
|
|
|
Vector2 size = get_size();
|
|
|
|
|
|
int h_sep = get_constant("separation", "HSplitContainer");
|
|
@@ -3657,35 +3668,62 @@ void SpatialEditorViewportContainer::_notification(int p_what) {
|
|
|
|
|
|
case VIEW_USE_1_VIEWPORT: {
|
|
|
|
|
|
- //nothing to show
|
|
|
+ // Nothing to show.
|
|
|
|
|
|
} break;
|
|
|
case VIEW_USE_2_VIEWPORTS: {
|
|
|
|
|
|
draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_VSPLIT);
|
|
|
|
|
|
} break;
|
|
|
case VIEW_USE_2_VIEWPORTS_ALT: {
|
|
|
|
|
|
draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_HSPLIT);
|
|
|
|
|
|
} break;
|
|
|
case VIEW_USE_3_VIEWPORTS: {
|
|
|
|
|
|
- draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
|
|
|
- draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2));
|
|
|
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
|
|
|
+ draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4));
|
|
|
+ set_default_cursor_shape(CURSOR_DRAG);
|
|
|
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
|
|
|
+ draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_VSPLIT);
|
|
|
+ } else if (hovering_h || dragging_h) {
|
|
|
+ draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_HSPLIT);
|
|
|
+ }
|
|
|
|
|
|
} break;
|
|
|
case VIEW_USE_3_VIEWPORTS_ALT: {
|
|
|
|
|
|
- draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
|
|
|
- draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
|
|
|
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
|
|
|
+ draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_DRAG);
|
|
|
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
|
|
|
+ draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_VSPLIT);
|
|
|
+ } else if (hovering_h || dragging_h) {
|
|
|
+ draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2));
|
|
|
+ set_default_cursor_shape(CURSOR_HSPLIT);
|
|
|
+ }
|
|
|
+
|
|
|
} break;
|
|
|
case VIEW_USE_4_VIEWPORTS: {
|
|
|
|
|
|
Vector2 half(mid_w, mid_h);
|
|
|
- draw_texture(v_grabber, half - v_grabber->get_size() / 2.0);
|
|
|
- draw_texture(h_grabber, half - h_grabber->get_size() / 2.0);
|
|
|
+ if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) {
|
|
|
+ draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0);
|
|
|
+ set_default_cursor_shape(CURSOR_DRAG);
|
|
|
+ } else if ((hovering_v && !dragging_h) || dragging_v) {
|
|
|
+ draw_texture(v_grabber, half - v_grabber->get_size() / 2.0);
|
|
|
+ set_default_cursor_shape(CURSOR_VSPLIT);
|
|
|
+ } else if (hovering_h || dragging_h) {
|
|
|
+ draw_texture(h_grabber, half - h_grabber->get_size() / 2.0);
|
|
|
+ set_default_cursor_shape(CURSOR_HSPLIT);
|
|
|
+ }
|
|
|
|
|
|
} break;
|
|
|
}
|
|
@@ -3829,10 +3867,13 @@ void SpatialEditorViewportContainer::_bind_methods() {
|
|
|
|
|
|
SpatialEditorViewportContainer::SpatialEditorViewportContainer() {
|
|
|
|
|
|
+ set_clip_contents(true);
|
|
|
view = VIEW_USE_1_VIEWPORT;
|
|
|
mouseover = false;
|
|
|
ratio_h = 0.5;
|
|
|
ratio_v = 0.5;
|
|
|
+ hovering_v = false;
|
|
|
+ hovering_h = false;
|
|
|
dragging_v = false;
|
|
|
dragging_h = false;
|
|
|
}
|