浏览代码

Keep the bottom panel size separate.

DexterFstone 2 月之前
父节点
当前提交
cd943d18b2
共有 4 个文件被更改,包括 53 次插入9 次删除
  1. 5 8
      editor/editor_node.cpp
  2. 3 0
      editor/editor_node.h
  3. 40 1
      editor/gui/editor_bottom_panel.cpp
  4. 5 0
      editor/gui/editor_bottom_panel.h

+ 5 - 8
editor/editor_node.cpp

@@ -6012,9 +6012,6 @@ void EditorNode::_load_editor_layout() {
 void EditorNode::_save_central_editor_layout_to_config(Ref<ConfigFile> p_config_file) {
 void EditorNode::_save_central_editor_layout_to_config(Ref<ConfigFile> p_config_file) {
 	// Bottom panel.
 	// Bottom panel.
 
 
-	int center_split_offset = center_split->get_split_offset();
-	p_config_file->set_value(EDITOR_NODE_CONFIG_SECTION, "center_split_offset", center_split_offset);
-
 	bottom_panel->save_layout_to_config(p_config_file, EDITOR_NODE_CONFIG_SECTION);
 	bottom_panel->save_layout_to_config(p_config_file, EDITOR_NODE_CONFIG_SECTION);
 
 
 	// Debugger tab.
 	// Debugger tab.
@@ -6032,11 +6029,6 @@ void EditorNode::_load_central_editor_layout_from_config(Ref<ConfigFile> p_confi
 
 
 	bottom_panel->load_layout_from_config(p_config_file, EDITOR_NODE_CONFIG_SECTION);
 	bottom_panel->load_layout_from_config(p_config_file, EDITOR_NODE_CONFIG_SECTION);
 
 
-	if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "center_split_offset")) {
-		int center_split_offset = p_config_file->get_value(EDITOR_NODE_CONFIG_SECTION, "center_split_offset");
-		center_split->set_split_offset(center_split_offset);
-	}
-
 	// Debugger tab.
 	// Debugger tab.
 
 
 	if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "selected_default_debugger_tab_idx")) {
 	if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "selected_default_debugger_tab_idx")) {
@@ -7722,6 +7714,10 @@ void EditorNode::_add_to_main_menu(const String &p_name, PopupMenu *p_menu) {
 	}
 	}
 }
 }
 
 
+void EditorNode::_bottom_panel_resized() {
+	bottom_panel->set_bottom_panel_offset(center_split->get_split_offset());
+}
+
 #ifdef ANDROID_ENABLED
 #ifdef ANDROID_ENABLED
 void EditorNode::_touch_actions_panel_mode_changed() {
 void EditorNode::_touch_actions_panel_mode_changed() {
 	int panel_mode = EDITOR_GET("interface/touchscreen/touch_actions_panel");
 	int panel_mode = EDITOR_GET("interface/touchscreen/touch_actions_panel");
@@ -8171,6 +8167,7 @@ EditorNode::EditorNode() {
 	center_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	center_split->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	center_split->set_collapsed(true);
 	center_split->set_collapsed(true);
 	center_vb->add_child(center_split);
 	center_vb->add_child(center_split);
+	center_split->connect("drag_ended", callable_mp(this, &EditorNode::_bottom_panel_resized));
 
 
 	right_hsplit = memnew(DockSplitContainer);
 	right_hsplit = memnew(DockSplitContainer);
 	right_hsplit->set_name("DockHSplitRight");
 	right_hsplit->set_name("DockHSplitRight");

+ 3 - 0
editor/editor_node.h

@@ -718,6 +718,8 @@ private:
 	void _update_main_menu_type();
 	void _update_main_menu_type();
 	void _add_to_main_menu(const String &p_name, PopupMenu *p_menu);
 	void _add_to_main_menu(const String &p_name, PopupMenu *p_menu);
 
 
+	void _bottom_panel_resized();
+
 protected:
 protected:
 	friend class FileSystemDock;
 	friend class FileSystemDock;
 
 
@@ -743,6 +745,7 @@ public:
 
 
 	static EditorTitleBar *get_title_bar() { return singleton->title_bar; }
 	static EditorTitleBar *get_title_bar() { return singleton->title_bar; }
 	static VSplitContainer *get_top_split() { return singleton->top_split; }
 	static VSplitContainer *get_top_split() { return singleton->top_split; }
+	static DockSplitContainer *get_center_split() { return singleton->center_split; }
 	static EditorBottomPanel *get_bottom_panel() { return singleton->bottom_panel; }
 	static EditorBottomPanel *get_bottom_panel() { return singleton->bottom_panel; }
 	static EditorMainScreen *get_editor_main_screen() { return singleton->editor_main_screen; }
 	static EditorMainScreen *get_editor_main_screen() { return singleton->editor_main_screen; }
 
 

+ 40 - 1
editor/gui/editor_bottom_panel.cpp

@@ -52,6 +52,7 @@ void EditorBottomPanel::_notification(int p_what) {
 }
 }
 
 
 void EditorBottomPanel::_on_tab_changed(int p_idx) {
 void EditorBottomPanel::_on_tab_changed(int p_idx) {
+	callable_mp(this, &EditorBottomPanel::_update_center_split_offset).call_deferred();
 	callable_mp(this, &EditorBottomPanel::_repaint).call_deferred();
 	callable_mp(this, &EditorBottomPanel::_repaint).call_deferred();
 }
 }
 
 
@@ -68,13 +69,32 @@ void EditorBottomPanel::_theme_changed() {
 	}
 	}
 }
 }
 
 
+void EditorBottomPanel::set_bottom_panel_offset(int p_offset) {
+	Control *current_tab = get_current_tab_control();
+	if (current_tab) {
+		String name = current_tab->get_name();
+		String key = name.to_snake_case();
+		dock_offsets[key] = p_offset;
+	}
+}
+
+int EditorBottomPanel::get_bottom_panel_offset() {
+	Control *current_tab = get_current_tab_control();
+	if (current_tab) {
+		String name = current_tab->get_name();
+		String key = name.to_snake_case();
+		return dock_offsets[key];
+	}
+	return 0;
+}
+
 void EditorBottomPanel::_repaint() {
 void EditorBottomPanel::_repaint() {
 	bool panel_collapsed = get_current_tab() == -1;
 	bool panel_collapsed = get_current_tab() == -1;
 	if (panel_collapsed == (get_previous_tab() == -1)) {
 	if (panel_collapsed == (get_previous_tab() == -1)) {
 		return;
 		return;
 	}
 	}
 
 
-	SplitContainer *center_split = Object::cast_to<SplitContainer>(get_parent());
+	DockSplitContainer *center_split = EditorNode::get_center_split();
 	ERR_FAIL_NULL(center_split);
 	ERR_FAIL_NULL(center_split);
 
 
 	center_split->set_dragger_visibility(panel_collapsed ? SplitContainer::DRAGGER_HIDDEN : SplitContainer::DRAGGER_VISIBLE);
 	center_split->set_dragger_visibility(panel_collapsed ? SplitContainer::DRAGGER_HIDDEN : SplitContainer::DRAGGER_VISIBLE);
@@ -91,9 +111,19 @@ void EditorBottomPanel::_repaint() {
 
 
 void EditorBottomPanel::save_layout_to_config(Ref<ConfigFile> p_config_file, const String &p_section) const {
 void EditorBottomPanel::save_layout_to_config(Ref<ConfigFile> p_config_file, const String &p_section) const {
 	p_config_file->set_value(p_section, "selected_bottom_panel_item", get_current_tab() != -1 ? Variant(get_current_tab()) : Variant());
 	p_config_file->set_value(p_section, "selected_bottom_panel_item", get_current_tab() != -1 ? Variant(get_current_tab()) : Variant());
+
+	for (const KeyValue<String, int> &E : dock_offsets) {
+		p_config_file->set_value(p_section, "dock_" + E.key + "_offset", E.value);
+	}
 }
 }
 
 
 void EditorBottomPanel::load_layout_from_config(Ref<ConfigFile> p_config_file, const String &p_section) {
 void EditorBottomPanel::load_layout_from_config(Ref<ConfigFile> p_config_file, const String &p_section) {
+	for (const Control *dock : bottom_docks) {
+		String name = dock->get_name();
+		String key = name.to_snake_case();
+		dock_offsets[key] = p_config_file->get_value(p_section, "dock_" + key + "_offset", 0);
+	}
+
 	if (p_config_file->has_section_key(p_section, "selected_bottom_panel_item")) {
 	if (p_config_file->has_section_key(p_section, "selected_bottom_panel_item")) {
 		int stored_current_tab = p_config_file->get_value(p_section, "selected_bottom_panel_item");
 		int stored_current_tab = p_config_file->get_value(p_section, "selected_bottom_panel_item");
 
 
@@ -101,6 +131,8 @@ void EditorBottomPanel::load_layout_from_config(Ref<ConfigFile> p_config_file, c
 			// Make sure we don't try to open contextual editors which are not enabled in the current context.
 			// Make sure we don't try to open contextual editors which are not enabled in the current context.
 			if (!get_tab_bar()->is_tab_hidden(stored_current_tab)) {
 			if (!get_tab_bar()->is_tab_hidden(stored_current_tab)) {
 				set_current_tab(stored_current_tab);
 				set_current_tab(stored_current_tab);
+
+				callable_mp(this, &EditorBottomPanel::_update_center_split_offset).call_deferred();
 				return;
 				return;
 			}
 			}
 		}
 		}
@@ -156,6 +188,13 @@ void EditorBottomPanel::_expand_button_toggled(bool p_pressed) {
 	EditorNode::get_top_split()->set_visible(!p_pressed);
 	EditorNode::get_top_split()->set_visible(!p_pressed);
 }
 }
 
 
+void EditorBottomPanel::_update_center_split_offset() {
+	DockSplitContainer *center_split = EditorNode::get_center_split();
+	ERR_FAIL_NULL(center_split);
+
+	center_split->set_split_offset(get_bottom_panel_offset());
+}
+
 Button *EditorBottomPanel::add_item(String p_text, Control *p_item, const Ref<Shortcut> &p_shortcut, bool p_at_front) {
 Button *EditorBottomPanel::add_item(String p_text, Control *p_item, const Ref<Shortcut> &p_shortcut, bool p_at_front) {
 	p_item->set_name(p_text);
 	p_item->set_name(p_text);
 	add_child(p_item);
 	add_child(p_item);

+ 5 - 0
editor/gui/editor_bottom_panel.h

@@ -48,6 +48,7 @@ class EditorBottomPanel : public TabContainer {
 	bool lock_panel_switching = false;
 	bool lock_panel_switching = false;
 	LocalVector<Control *> bottom_docks;
 	LocalVector<Control *> bottom_docks;
 	LocalVector<Ref<Shortcut>> dock_shortcuts;
 	LocalVector<Ref<Shortcut>> dock_shortcuts;
+	HashMap<String, int> dock_offsets;
 
 
 	LocalVector<Button *> legacy_buttons;
 	LocalVector<Button *> legacy_buttons;
 	void _on_button_visibility_changed(Button *p_button, Control *p_control);
 	void _on_button_visibility_changed(Button *p_button, Control *p_control);
@@ -56,6 +57,7 @@ class EditorBottomPanel : public TabContainer {
 	void _on_tab_changed(int p_idx);
 	void _on_tab_changed(int p_idx);
 	void _pin_button_toggled(bool p_pressed);
 	void _pin_button_toggled(bool p_pressed);
 	void _expand_button_toggled(bool p_pressed);
 	void _expand_button_toggled(bool p_pressed);
+	void _update_center_split_offset();
 
 
 protected:
 protected:
 	void _notification(int p_what);
 	void _notification(int p_what);
@@ -75,6 +77,9 @@ public:
 	void set_expanded(bool p_expanded);
 	void set_expanded(bool p_expanded);
 	void _theme_changed();
 	void _theme_changed();
 
 
+	void set_bottom_panel_offset(int p_offset);
+	int get_bottom_panel_offset();
+
 	EditorBottomPanel();
 	EditorBottomPanel();
 	~EditorBottomPanel();
 	~EditorBottomPanel();
 };
 };