Rework dock layout management

This commit is contained in:
kobewi 2024-12-18 15:57:54 +01:00
parent 6395450b10
commit b8f34bb8e9
7 changed files with 56 additions and 28 deletions

View file

@ -40,7 +40,6 @@
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_settings.h" #include "editor/editor_settings.h"
#include "editor/editor_string_names.h" #include "editor/editor_string_names.h"
#include "editor/filesystem_dock.h"
#include "editor/gui/editor_bottom_panel.h" #include "editor/gui/editor_bottom_panel.h"
#include "editor/themes/editor_scale.h" #include "editor/themes/editor_scale.h"
#include "editor/window_wrapper.h" #include "editor/window_wrapper.h"
@ -480,6 +479,8 @@ void EditorDockManager::save_docks_to_config(Ref<ConfigFile> p_layout, const Str
Array bottom_docks_dump; Array bottom_docks_dump;
Array closed_docks_dump; Array closed_docks_dump;
for (const KeyValue<Control *, DockInfo> &d : all_docks) { for (const KeyValue<Control *, DockInfo> &d : all_docks) {
d.key->call(SNAME("_save_layout_to_config"), p_layout, p_section);
if (!d.value.at_bottom && d.value.open && (!d.value.previous_at_bottom || !d.value.dock_window)) { if (!d.value.at_bottom && d.value.open && (!d.value.previous_at_bottom || !d.value.dock_window)) {
continue; continue;
} }
@ -516,8 +517,6 @@ void EditorDockManager::save_docks_to_config(Ref<ConfigFile> p_layout, const Str
for (int i = 0; i < hsplits.size(); i++) { for (int i = 0; i < hsplits.size(); i++) {
p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), int(hsplits[i]->get_split_offset() / EDSCALE)); p_layout->set_value(p_section, "dock_hsplit_" + itos(i + 1), int(hsplits[i]->get_split_offset() / EDSCALE));
} }
FileSystemDock::get_singleton()->save_layout_to_config(p_layout, p_section);
} }
void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const String &p_section) { void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const String &p_section) {
@ -548,6 +547,7 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
continue; continue;
} }
Control *dock = dock_map[name]; Control *dock = dock_map[name];
dock->call(SNAME("_load_layout_from_config"), p_layout, p_section);
if (!all_docks[dock].enabled) { if (!all_docks[dock].enabled) {
// Don't open disabled docks. // Don't open disabled docks.
@ -612,9 +612,6 @@ void EditorDockManager::load_docks_from_config(Ref<ConfigFile> p_layout, const S
int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1)); int ofs = p_layout->get_value(p_section, "dock_hsplit_" + itos(i + 1));
hsplits[i]->set_split_offset(ofs * EDSCALE); hsplits[i]->set_split_offset(ofs * EDSCALE);
} }
FileSystemDock::get_singleton()->load_layout_from_config(p_layout, p_section);
_update_docks_menu(); _update_docks_menu();
} }

View file

@ -184,8 +184,6 @@ FileSystemList::FileSystemList() {
popup_editor->connect("popup_hide", callable_mp(this, &FileSystemList::_text_editor_popup_modal_close)); popup_editor->connect("popup_hide", callable_mp(this, &FileSystemList::_text_editor_popup_modal_close));
} }
FileSystemDock *FileSystemDock::singleton = nullptr;
Ref<Texture2D> FileSystemDock::_get_tree_item_icon(bool p_is_valid, const String &p_file_type, const String &p_icon_path) { Ref<Texture2D> FileSystemDock::_get_tree_item_icon(bool p_is_valid, const String &p_file_type, const String &p_icon_path) {
if (!p_icon_path.is_empty()) { if (!p_icon_path.is_empty()) {
Ref<Texture2D> icon = ResourceLoader::load(p_icon_path); Ref<Texture2D> icon = ResourceLoader::load(p_icon_path);
@ -3940,6 +3938,9 @@ void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_set_dock_horizontal", "enable"), &FileSystemDock::_set_dock_horizontal); ClassDB::bind_method(D_METHOD("_set_dock_horizontal", "enable"), &FileSystemDock::_set_dock_horizontal);
ClassDB::bind_method(D_METHOD("_can_dock_horizontal"), &FileSystemDock::_can_dock_horizontal); ClassDB::bind_method(D_METHOD("_can_dock_horizontal"), &FileSystemDock::_can_dock_horizontal);
ClassDB::bind_method(D_METHOD("_save_layout_to_config"), &FileSystemDock::_save_layout_to_config);
ClassDB::bind_method(D_METHOD("_load_layout_from_config"), &FileSystemDock::_load_layout_from_config);
ADD_SIGNAL(MethodInfo("inherit", PropertyInfo(Variant::STRING, "file"))); ADD_SIGNAL(MethodInfo("inherit", PropertyInfo(Variant::STRING, "file")));
ADD_SIGNAL(MethodInfo("instantiate", PropertyInfo(Variant::PACKED_STRING_ARRAY, "files"))); ADD_SIGNAL(MethodInfo("instantiate", PropertyInfo(Variant::PACKED_STRING_ARRAY, "files")));
@ -3953,7 +3954,7 @@ void FileSystemDock::_bind_methods() {
ADD_SIGNAL(MethodInfo("display_mode_changed")); ADD_SIGNAL(MethodInfo("display_mode_changed"));
} }
void FileSystemDock::save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const { void FileSystemDock::_save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const {
p_layout->set_value(p_section, "dock_filesystem_h_split_offset", get_h_split_offset()); p_layout->set_value(p_section, "dock_filesystem_h_split_offset", get_h_split_offset());
p_layout->set_value(p_section, "dock_filesystem_v_split_offset", get_v_split_offset()); p_layout->set_value(p_section, "dock_filesystem_v_split_offset", get_v_split_offset());
p_layout->set_value(p_section, "dock_filesystem_display_mode", get_display_mode()); p_layout->set_value(p_section, "dock_filesystem_display_mode", get_display_mode());
@ -3965,7 +3966,7 @@ void FileSystemDock::save_layout_to_config(Ref<ConfigFile> p_layout, const Strin
p_layout->set_value(p_section, "dock_filesystem_uncollapsed_paths", uncollapsed_paths); p_layout->set_value(p_section, "dock_filesystem_uncollapsed_paths", uncollapsed_paths);
} }
void FileSystemDock::load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section) { void FileSystemDock::_load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section) {
if (p_layout->has_section_key(p_section, "dock_filesystem_h_split_offset")) { if (p_layout->has_section_key(p_section, "dock_filesystem_h_split_offset")) {
int fs_h_split_ofs = p_layout->get_value(p_section, "dock_filesystem_h_split_offset"); int fs_h_split_ofs = p_layout->get_value(p_section, "dock_filesystem_h_split_offset");
set_h_split_offset(fs_h_split_ofs); set_h_split_offset(fs_h_split_ofs);

View file

@ -357,8 +357,11 @@ private:
bool _can_dock_horizontal() const; bool _can_dock_horizontal() const;
void _set_dock_horizontal(bool p_enable); void _set_dock_horizontal(bool p_enable);
void _save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const;
void _load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section);
private: private:
static FileSystemDock *singleton; inline static FileSystemDock *singleton = nullptr;
public: public:
static FileSystemDock *get_singleton() { return singleton; } static FileSystemDock *get_singleton() { return singleton; }
@ -414,9 +417,6 @@ public:
void remove_resource_tooltip_plugin(const Ref<EditorResourceTooltipPlugin> &p_plugin); void remove_resource_tooltip_plugin(const Ref<EditorResourceTooltipPlugin> &p_plugin);
Control *create_tooltip_for_path(const String &p_path) const; Control *create_tooltip_for_path(const String &p_path) const;
void save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const;
void load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section);
FileSystemDock(); FileSystemDock();
~FileSystemDock(); ~FileSystemDock();
}; };

View file

@ -30,6 +30,7 @@
#include "history_dock.h" #include "history_dock.h"
#include "core/io/config_file.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_settings.h" #include "editor/editor_settings.h"
#include "editor/editor_string_names.h" #include "editor/editor_string_names.h"
@ -172,6 +173,17 @@ void HistoryDock::refresh_version() {
action_list->set_current(idx); action_list->set_current(idx);
} }
void HistoryDock::_save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const {
p_layout->set_value(p_section, "dock_history_include_scene", current_scene_checkbox->is_pressed());
p_layout->set_value(p_section, "dock_history_include_global", global_history_checkbox->is_pressed());
}
void HistoryDock::_load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section) {
current_scene_checkbox->set_pressed_no_signal(p_layout->get_value(p_section, "dock_history_include_scene", true));
global_history_checkbox->set_pressed_no_signal(p_layout->get_value(p_section, "dock_history_include_global", true));
refresh_history();
}
void HistoryDock::seek_history(int p_index) { void HistoryDock::seek_history(int p_index) {
bool include_scene = current_scene_checkbox->is_pressed(); bool include_scene = current_scene_checkbox->is_pressed();
bool include_global = global_history_checkbox->is_pressed(); bool include_global = global_history_checkbox->is_pressed();
@ -220,9 +232,9 @@ void HistoryDock::_notification(int p_notification) {
} }
} }
void HistoryDock::save_options() { void HistoryDock::_bind_methods() {
EditorSettings::get_singleton()->set_project_metadata("history", "include_scene", current_scene_checkbox->is_pressed()); ClassDB::bind_method(D_METHOD("_save_layout_to_config"), &HistoryDock::_save_layout_to_config);
EditorSettings::get_singleton()->set_project_metadata("history", "include_global", global_history_checkbox->is_pressed()); ClassDB::bind_method(D_METHOD("_load_layout_from_config"), &HistoryDock::_load_layout_from_config);
} }
HistoryDock::HistoryDock() { HistoryDock::HistoryDock() {
@ -235,28 +247,21 @@ HistoryDock::HistoryDock() {
HBoxContainer *mode_hb = memnew(HBoxContainer); HBoxContainer *mode_hb = memnew(HBoxContainer);
add_child(mode_hb); add_child(mode_hb);
bool include_scene = EditorSettings::get_singleton()->get_project_metadata("history", "include_scene", true);
bool include_global = EditorSettings::get_singleton()->get_project_metadata("history", "include_global", true);
current_scene_checkbox = memnew(CheckBox); current_scene_checkbox = memnew(CheckBox);
mode_hb->add_child(current_scene_checkbox); mode_hb->add_child(current_scene_checkbox);
current_scene_checkbox->set_flat(true); current_scene_checkbox->set_flat(true);
current_scene_checkbox->set_pressed(include_scene);
current_scene_checkbox->set_text(TTR("Scene")); current_scene_checkbox->set_text(TTR("Scene"));
current_scene_checkbox->set_h_size_flags(SIZE_EXPAND_FILL); current_scene_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
current_scene_checkbox->set_clip_text(true); current_scene_checkbox->set_clip_text(true);
current_scene_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1)); current_scene_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
current_scene_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::save_options).unbind(1));
global_history_checkbox = memnew(CheckBox); global_history_checkbox = memnew(CheckBox);
mode_hb->add_child(global_history_checkbox); mode_hb->add_child(global_history_checkbox);
global_history_checkbox->set_flat(true); global_history_checkbox->set_flat(true);
global_history_checkbox->set_pressed(include_global);
global_history_checkbox->set_text(TTR("Global")); global_history_checkbox->set_text(TTR("Global"));
global_history_checkbox->set_h_size_flags(SIZE_EXPAND_FILL); global_history_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
global_history_checkbox->set_clip_text(true); global_history_checkbox->set_clip_text(true);
global_history_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1)); global_history_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
global_history_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::save_options).unbind(1));
action_list = memnew(ItemList); action_list = memnew(ItemList);
action_list->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED); action_list->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);

View file

@ -34,6 +34,7 @@
#include "scene/gui/box_container.h" #include "scene/gui/box_container.h"
class CheckBox; class CheckBox;
class ConfigFile;
class ItemList; class ItemList;
class EditorUndoRedoManager; class EditorUndoRedoManager;
@ -53,10 +54,13 @@ class HistoryDock : public VBoxContainer {
void refresh_history(); void refresh_history();
void on_version_changed(); void on_version_changed();
void refresh_version(); void refresh_version();
void save_options();
void _save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const;
void _load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section);
protected: protected:
void _notification(int p_notification); void _notification(int p_notification);
static void _bind_methods();
public: public:
void seek_history(int p_index); void seek_history(int p_index);

View file

@ -30,6 +30,7 @@
#include "node_dock.h" #include "node_dock.h"
#include "core/io/config_file.h"
#include "editor/connections_dialog.h" #include "editor/connections_dialog.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/themes/editor_scale.h" #include "editor/themes/editor_scale.h"
@ -48,9 +49,21 @@ void NodeDock::show_connections() {
connections->show(); connections->show();
} }
void NodeDock::_save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const {
p_layout->set_value(p_section, "dock_node_current_tab", int(groups_button->is_pressed()));
}
void NodeDock::_load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section) {
const int current_tab = p_layout->get_value(p_section, "dock_node_current_tab", 0);
if (current_tab == 0) {
show_connections();
} else if (current_tab == 1) {
show_groups();
}
}
void NodeDock::_notification(int p_what) { void NodeDock::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
connections_button->set_button_icon(get_editor_theme_icon(SNAME("Signals"))); connections_button->set_button_icon(get_editor_theme_icon(SNAME("Signals")));
groups_button->set_button_icon(get_editor_theme_icon(SNAME("Groups"))); groups_button->set_button_icon(get_editor_theme_icon(SNAME("Groups")));
@ -58,7 +71,10 @@ void NodeDock::_notification(int p_what) {
} }
} }
NodeDock *NodeDock::singleton = nullptr; void NodeDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_save_layout_to_config"), &NodeDock::_save_layout_to_config);
ClassDB::bind_method(D_METHOD("_load_layout_from_config"), &NodeDock::_load_layout_from_config);
}
void NodeDock::update_lists() { void NodeDock::update_lists() {
connections->update_tree(); connections->update_tree();

View file

@ -33,6 +33,7 @@
#include "groups_editor.h" #include "groups_editor.h"
class ConfigFile;
class ConnectionsDock; class ConnectionsDock;
class NodeDock : public VBoxContainer { class NodeDock : public VBoxContainer {
@ -48,14 +49,18 @@ class NodeDock : public VBoxContainer {
Label *select_a_node = nullptr; Label *select_a_node = nullptr;
void _save_layout_to_config(Ref<ConfigFile> p_layout, const String &p_section) const;
void _load_layout_from_config(Ref<ConfigFile> p_layout, const String &p_section);
private: private:
static NodeDock *singleton; inline static NodeDock *singleton = nullptr;
public: public:
static NodeDock *get_singleton() { return singleton; } static NodeDock *get_singleton() { return singleton; }
protected: protected:
void _notification(int p_what); void _notification(int p_what);
static void _bind_methods();
public: public:
void set_node(Node *p_node); void set_node(Node *p_node);