summaryrefslogtreecommitdiffstats
path: root/editor/editor_dock_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/editor_dock_manager.cpp')
-rw-r--r--editor/editor_dock_manager.cpp175
1 files changed, 162 insertions, 13 deletions
diff --git a/editor/editor_dock_manager.cpp b/editor/editor_dock_manager.cpp
index 54789bdef1..0a13377857 100644
--- a/editor/editor_dock_manager.cpp
+++ b/editor/editor_dock_manager.cpp
@@ -113,6 +113,8 @@ void EditorDockManager::_dock_select_popup_theme_changed() {
dock_tab_move_left->set_icon(dock_select_popup->get_editor_theme_icon(SNAME("Back")));
dock_tab_move_right->set_icon(dock_select_popup->get_editor_theme_icon(SNAME("Forward")));
}
+
+ dock_to_bottom->set_icon(dock_select_popup->get_editor_theme_icon(SNAME("ControlAlignBottomWide")));
}
void EditorDockManager::_dock_popup_exit() {
@@ -122,6 +124,19 @@ void EditorDockManager::_dock_popup_exit() {
void EditorDockManager::_dock_pre_popup(int p_dock_slot) {
dock_popup_selected_idx = p_dock_slot;
+ dock_bottom_selected_idx = -1;
+
+ if (bool(dock_slot[p_dock_slot]->get_current_tab_control()->call("_can_dock_horizontal"))) {
+ dock_to_bottom->show();
+ } else {
+ dock_to_bottom->hide();
+ }
+
+ if (dock_float) {
+ dock_float->show();
+ }
+ dock_tab_move_right->show();
+ dock_tab_move_left->show();
}
void EditorDockManager::_dock_move_left() {
@@ -179,23 +194,43 @@ void EditorDockManager::_dock_select_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseButton> mb = me;
- if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed() && dock_popup_selected_idx != nrect) {
- dock_slot[nrect]->move_tab_from_tab_container(dock_slot[dock_popup_selected_idx], dock_slot[dock_popup_selected_idx]->get_current_tab(), dock_slot[nrect]->get_tab_count());
+ if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) {
+ if (dock_bottom_selected_idx != -1) {
+ EditorNode::get_singleton()->remove_bottom_panel_item(bottom_docks[dock_bottom_selected_idx]);
- if (dock_slot[dock_popup_selected_idx]->get_tab_count() == 0) {
- dock_slot[dock_popup_selected_idx]->hide();
- } else {
- dock_slot[dock_popup_selected_idx]->set_current_tab(0);
+ bottom_docks[dock_bottom_selected_idx]->call("_set_dock_horizontal", false);
+
+ dock_slot[nrect]->add_child(bottom_docks[dock_bottom_selected_idx]);
+ dock_slot[nrect]->show();
+ bottom_docks.remove_at(dock_bottom_selected_idx);
+ dock_bottom_selected_idx = -1;
+ dock_popup_selected_idx = nrect; // Move to dock popup selected.
+ dock_select->queue_redraw();
+
+ update_dock_slots_visibility(true);
+
+ _edit_current();
+ emit_signal(SNAME("layout_changed"));
}
- dock_popup_selected_idx = nrect;
- dock_slot[nrect]->show();
- dock_select->queue_redraw();
+ if (dock_popup_selected_idx != nrect) {
+ dock_slot[nrect]->move_tab_from_tab_container(dock_slot[dock_popup_selected_idx], dock_slot[dock_popup_selected_idx]->get_current_tab(), dock_slot[nrect]->get_tab_count());
+
+ if (dock_slot[dock_popup_selected_idx]->get_tab_count() == 0) {
+ dock_slot[dock_popup_selected_idx]->hide();
+ } else {
+ dock_slot[dock_popup_selected_idx]->set_current_tab(0);
+ }
- update_dock_slots_visibility(true);
+ dock_popup_selected_idx = nrect;
+ dock_slot[nrect]->show();
+ dock_select->queue_redraw();
- _edit_current();
- emit_signal(SNAME("layout_changed"));
+ update_dock_slots_visibility(true);
+
+ _edit_current();
+ emit_signal(SNAME("layout_changed"));
+ }
}
}
}
@@ -327,6 +362,44 @@ void EditorDockManager::_dock_make_selected_float() {
_edit_current();
}
+void EditorDockManager::bottom_dock_show_placement_popup(const Rect2i &p_position, Control *p_dock) {
+ dock_bottom_selected_idx = bottom_docks.find(p_dock);
+ ERR_FAIL_COND(dock_bottom_selected_idx == -1);
+ dock_popup_selected_idx = -1;
+ dock_to_bottom->hide();
+
+ Vector2 popup_pos = p_position.position;
+ popup_pos.y += p_position.size.height;
+
+ if (!EditorNode::get_singleton()->get_gui_base()->is_layout_rtl()) {
+ popup_pos.x -= dock_select_popup->get_size().width;
+ popup_pos.x += p_position.size.width;
+ }
+ dock_select_popup->set_position(popup_pos);
+ dock_select_popup->popup();
+ if (dock_float) {
+ dock_float->hide();
+ }
+ dock_tab_move_right->hide();
+ dock_tab_move_left->hide();
+}
+
+void EditorDockManager::_dock_move_selected_to_bottom() {
+ Control *dock = dock_slot[dock_popup_selected_idx]->get_current_tab_control();
+ dock_slot[dock_popup_selected_idx]->remove_child(dock);
+
+ dock->call("_set_dock_horizontal", true);
+
+ bottom_docks.push_back(dock);
+ EditorNode::get_singleton()->add_bottom_panel_item(dock->get_name(), dock, true);
+ dock_select_popup->hide();
+ update_dock_slots_visibility(true);
+ _edit_current();
+ emit_signal(SNAME("layout_changed"));
+
+ EditorNode::get_singleton()->make_bottom_panel_item_visible(dock);
+}
+
void EditorDockManager::_dock_make_float(Control *p_dock, int p_slot_index, bool p_show_window) {
ERR_FAIL_NULL(p_dock);
@@ -434,6 +507,16 @@ void EditorDockManager::save_docks_to_config(Ref<ConfigFile> p_layout, const Str
p_layout->set_value(p_section, "dock_floating", floating_docks_dump);
+ Array bottom_docks_dump;
+
+ for (Control *bdock : bottom_docks) {
+ Control *dock = bdock;
+ String name = dock->get_name();
+ bottom_docks_dump.push_back(name);
+ }
+
+ p_layout->set_value(p_section, "dock_bottom", bottom_docks_dump);
+
for (int i = 0; i < vsplits.size(); i++) {
if (vsplits[i]->is_visible_in_tree()) {
p_layout->set_value(p_section, "dock_split_" + itos(i + 1), vsplits[i]->get_split_offset());
@@ -464,6 +547,7 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
// FIXME: Find it, in a horribly inefficient way.
int atidx = -1;
+ int bottom_idx = -1;
Control *node = nullptr;
for (int k = 0; k < DOCK_SLOT_MAX; k++) {
if (!dock_slot[k]->has_node(name)) {
@@ -492,6 +576,18 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
}
}
}
+
+ if (atidx == -1) {
+ // Try bottom docks.
+ for (Control *bdock : bottom_docks) {
+ if (bdock->get_name() == name) {
+ node = bdock;
+ bottom_idx = bottom_docks.find(node);
+ break;
+ }
+ }
+ }
+
if (!node) {
// Well, it's not anywhere.
continue;
@@ -505,6 +601,11 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
dock_slot[i]->move_tab_from_tab_container(dock_slot[atidx], dock_slot[atidx]->get_tab_idx_from_control(node), 0);
dock_slot[i]->set_block_signals(false);
dock_slot[atidx]->set_block_signals(false);
+ } else if (bottom_idx != -1) {
+ bottom_docks.erase(node);
+ EditorNode::get_singleton()->remove_bottom_panel_item(node);
+ dock_slot[i]->add_child(node);
+ node->call("_set_dock_horizontal", false);
}
WindowWrapper *wrapper = Object::cast_to<WindowWrapper>(node);
@@ -527,6 +628,46 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
}
}
+ Array dock_bottom = p_layout->get_value(p_section, "dock_bottom", Array());
+ for (int i = 0; i < dock_bottom.size(); i++) {
+ const String &name = dock_bottom[i];
+ // FIXME: Find it, in a horribly inefficient way.
+ int atidx = -1;
+ Control *node = nullptr;
+ for (int k = 0; k < DOCK_SLOT_MAX; k++) {
+ if (!dock_slot[k]->has_node(name)) {
+ continue;
+ }
+ node = Object::cast_to<Control>(dock_slot[k]->get_node(name));
+ if (!node) {
+ continue;
+ }
+ atidx = k;
+ break;
+ }
+
+ if (atidx == -1) {
+ // Try floating docks.
+ for (WindowWrapper *wrapper : floating_docks) {
+ if (wrapper->get_meta("dock_name") == name) {
+ atidx = wrapper->get_meta("dock_slot");
+ node = wrapper->get_wrapped_control();
+ wrapper->set_window_enabled(false);
+ break;
+ }
+ }
+ }
+
+ if (node) {
+ dock_slot[atidx]->remove_child(node);
+
+ node->call("_set_dock_horizontal", true);
+
+ bottom_docks.push_back(node);
+ EditorNode::get_singleton()->add_bottom_panel_item(node->get_name(), node, true);
+ }
+ }
+
for (int i = 0; i < vsplits.size(); i++) {
if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) {
continue;
@@ -711,9 +852,17 @@ EditorDockManager::EditorDockManager() {
dock_float->set_tooltip_text(TTR("Make this dock floating."));
}
dock_float->set_focus_mode(Control::FOCUS_NONE);
- dock_float->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
+ dock_float->set_h_size_flags(Control::SIZE_EXPAND_FILL);
dock_float->connect("pressed", callable_mp(this, &EditorDockManager::_dock_make_selected_float));
dock_vb->add_child(dock_float);
+ dock_to_bottom = memnew(Button);
+ dock_to_bottom->set_text(TTR("Move to Bottom"));
+ dock_to_bottom->set_focus_mode(Control::FOCUS_NONE);
+ dock_to_bottom->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ dock_to_bottom->connect("pressed", callable_mp(this, &EditorDockManager::_dock_move_selected_to_bottom));
+ dock_to_bottom->hide();
+ dock_vb->add_child(dock_to_bottom);
+
dock_select_popup->reset_size();
}