From 4628e5354ecd9b87ba792fbcb4bb118804ccfb0a Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 20 Oct 2023 17:02:41 +0200 Subject: [PATCH] Reworked the wide mode setting for the filesystem dock. Now the code is more flexible and less error prone. --- doc/classes/EditorSettings.xml | 9 ++- editor/editor_node.cpp | 28 +++++-- editor/editor_settings.cpp | 12 ++- editor/filesystem_dock.cpp | 129 ++++++++++++--------------------- editor/filesystem_dock.h | 40 ++++++---- 5 files changed, 109 insertions(+), 109 deletions(-) diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 08830ec3d..891a0bf52 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -159,12 +159,15 @@ If [code]true[/code], displays folders in the FileSystem dock's bottom pane when split mode is enabled. If [code]false[/code], only files will be displayed in the bottom pane. Split mode can be toggled by pressing the icon next to the [code]res://[/code] folder path. [b]Note:[/b] This setting has no effect when split mode is disabled (which is the default). + + Controls where the editor will display the FileSystem panel. + + + Controls whether the FileSystem panel can be split horizontally or vertically. + The thumbnail size to use in the FileSystem dock (in pixels). See also [member filesystem/file_dialog/thumbnail_size]. - - If [code]true[/code], the editor will display the FileSystem panel at the bottom as an openable panel instead of a dock. - The refresh interval to use for the inspector dock's properties. The effect of this setting is mainly noticeable when adjusting gizmos in the 2D/3D editor and looking at the inspector at the same time. Lower values make the inspector more often, but take up more CPU time. diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 54071c7a9..b8c75cdbf 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -4547,6 +4547,7 @@ void EditorNode::_save_docks_to_config(Ref p_layout, const String &p p_layout->set_value(p_section, "dock_filesystem_split", filesystem_dock->get_split_offset()); p_layout->set_value(p_section, "dock_filesystem_display_mode", filesystem_dock->get_display_mode()); p_layout->set_value(p_section, "dock_filesystem_file_list_display_mode", filesystem_dock->get_file_list_display_mode()); + p_layout->set_value(p_section, "dock_filesystem_split_mode", filesystem_dock->get_split_mode()); for (int i = 0; i < vsplits.size(); i++) { if (vsplits[i]->is_visible_in_tree()) { @@ -4732,21 +4733,26 @@ void EditorNode::_load_docks_from_config(Ref p_layout, const String } } - if (p_layout->has_section_key(p_section, "dock_filesystem_split")) { - int fs_split_ofs = p_layout->get_value(p_section, "dock_filesystem_split"); - filesystem_dock->set_split_offset(fs_split_ofs); - } - if (p_layout->has_section_key(p_section, "dock_filesystem_display_mode")) { FileSystemDock::DisplayMode dock_filesystem_display_mode = FileSystemDock::DisplayMode(int(p_layout->get_value(p_section, "dock_filesystem_display_mode"))); filesystem_dock->set_display_mode(dock_filesystem_display_mode); } + if (p_layout->has_section_key(p_section, "dock_filesystem_split_mode")) { + FileSystemDock::SplitMode dock_filesystem_split_mode = FileSystemDock::SplitMode(int(p_layout->get_value(p_section, "dock_filesystem_split_mode"))); + filesystem_dock->set_split_mode(dock_filesystem_split_mode); + } + if (p_layout->has_section_key(p_section, "dock_filesystem_file_list_display_mode")) { FileSystemDock::FileListDisplayMode dock_filesystem_file_list_display_mode = FileSystemDock::FileListDisplayMode(int(p_layout->get_value(p_section, "dock_filesystem_file_list_display_mode"))); filesystem_dock->set_file_list_display_mode(dock_filesystem_file_list_display_mode); } + if (p_layout->has_section_key(p_section, "dock_filesystem_split")) { + int fs_split_ofs = p_layout->get_value(p_section, "dock_filesystem_split"); + filesystem_dock->set_split_offset(fs_split_ofs); + } + for (int i = 0; i < vsplits.size(); i++) { if (!p_layout->has_section_key(p_section, "dock_split_" + itos(i + 1))) { continue; @@ -6841,7 +6847,7 @@ EditorNode::EditorNode() { filesystem_dock->connect("instance", this, "_instance_request"); filesystem_dock->connect("display_mode_changed", this, "_save_docks"); - bool filesystem_dock_wide = EDITOR_GET("docks/filesystem/wide_bottom_panel"); + int filesystem_dock_mode = EDITOR_GET("docks/filesystem/dock_mode"); // Scene: Top left dock_slot[DOCK_SLOT_LEFT_UR]->add_child(scene_tree_dock); @@ -6851,10 +6857,13 @@ EditorNode::EditorNode() { dock_slot[DOCK_SLOT_LEFT_UR]->add_child(import_dock); dock_slot[DOCK_SLOT_LEFT_UR]->set_tab_title(import_dock->get_index(), TTR("Import")); - if (!filesystem_dock_wide) { + if (filesystem_dock_mode == static_cast(FileSystemDock::DOCK_MODE_DOCK)) { // FileSystem: Bottom left dock_slot[DOCK_SLOT_LEFT_BR]->add_child(filesystem_dock); dock_slot[DOCK_SLOT_LEFT_BR]->set_tab_title(filesystem_dock->get_index(), TTR("FileSystem")); + + filesystem_dock->set_dock_mode(FileSystemDock::DOCK_MODE_DOCK); + filesystem_dock->set_applied_dock_mode(FileSystemDock::DOCK_MODE_DOCK); } // Inspector: Full height right @@ -6957,11 +6966,14 @@ EditorNode::EditorNode() { bottom_panel_raise->set_toggle_mode(true); bottom_panel_raise->connect("toggled", this, "_bottom_panel_raise_toggled"); - if (filesystem_dock_wide) { + if (filesystem_dock_mode == static_cast(FileSystemDock::DOCK_MODE_BOTTOM_BAR)) { filesystem_dock->set_custom_minimum_size(Size2(0, 230 * EDSCALE)); ToolButton *fs_button = add_bottom_panel_item(TTR("FileSystem"), filesystem_dock); filesystem_dock->set_bottom_panel_tool_button(fs_button); fs_button->set_shortcut(ED_SHORTCUT("editor/toggle_filesystem_panel", TTR("Toggle FileSystem Panel"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_QUOTELEFT)); + + filesystem_dock->set_dock_mode(FileSystemDock::DOCK_MODE_BOTTOM_BAR); + filesystem_dock->set_applied_dock_mode(FileSystemDock::DOCK_MODE_BOTTOM_BAR); } log = memnew(EditorLog); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 4401ad74f..a7d437ea5 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -427,8 +427,12 @@ void EditorSettings::_load_defaults(Ref p_extra_config) { _initial_set("docks/filesystem/thumbnail_size", 64); hints["docks/filesystem/thumbnail_size"] = PropertyInfo(Variant::INT, "docks/filesystem/thumbnail_size", PROPERTY_HINT_RANGE, "32,128,16"); _initial_set("docks/filesystem/always_show_folders", true); - _initial_set("docks/filesystem/wide_bottom_panel", false); - hints["docks/filesystem/wide_bottom_panel"] = PropertyInfo(Variant::BOOL, "docks/filesystem/wide_bottom_panel", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); + + _initial_set("docks/filesystem/dock_mode", 0); + hints["docks/filesystem/dock_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/dock_mode", PROPERTY_HINT_ENUM, "Dock,Bottom Bar", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); + + _initial_set("docks/filesystem/split_mode", 0); + hints["docks/filesystem/split_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/split_mode", PROPERTY_HINT_ENUM, "Vertical,Horizontal", PROPERTY_USAGE_DEFAULT); // Property editor _initial_set("docks/property_editor/auto_refresh_interval", 0.3); @@ -641,9 +645,9 @@ void EditorSettings::_load_defaults(Ref p_extra_config) { _initial_set("editors/visual_editors/minimap_opacity", 0.85); hints["editors/visual_editors/minimap_opacity"] = PropertyInfo(Variant::REAL, "editors/visual_editors/minimap_opacity", PROPERTY_HINT_RANGE, "0.0,1.0,0.01", PROPERTY_USAGE_DEFAULT); -/* Run */ + /* Run */ -// Window placement + // Window placement _initial_set("run/window_placement/rect", 1); hints["run/window_placement/rect"] = PropertyInfo(Variant::INT, "run/window_placement/rect", PROPERTY_HINT_ENUM, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen"); String screen_hints = "Same as Editor,Previous Monitor,Next Monitor"; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index aa0609a77..3969814c3 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -190,11 +190,6 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory subdirectory_item->select(0); subdirectory_item->set_as_cursor(0); } - } else if (display_mode == DISPLAY_MODE_WIDE) { - if (lpath.get_base_dir() == path.get_base_dir()) { - subdirectory_item->select(0); - subdirectory_item->set_as_cursor(0); - } } if (searched_string.length() > 0) { @@ -334,34 +329,17 @@ void FileSystemDock::_update_tree(const Vector &p_uncollapsed_paths, boo } void FileSystemDock::set_display_mode(DisplayMode p_display_mode) { - if (display_mode != DISPLAY_MODE_WIDE && p_display_mode != DISPLAY_MODE_WIDE) { - display_mode = p_display_mode; - _update_display_mode(false); - } + display_mode = p_display_mode; + _update_display_mode(false); } void FileSystemDock::_update_display_mode(bool p_force) { - if (old_display_mode == DISPLAY_MODE_WIDE || display_mode == DISPLAY_MODE_WIDE) { - // Changing between wide and normal needs restart, ignore - - if (p_force || old_display_mode != display_mode) { - tree->ensure_cursor_is_visible(); - _update_tree(_compute_uncollapsed_paths()); - _update_file_list(true); - } - - old_display_mode = display_mode; - - return; - } - // Compute the new display mode. if (p_force || old_display_mode != display_mode) { + button_toggle_display_mode->set_pressed_no_signal(display_mode == DISPLAY_MODE_SPLIT); + switch (display_mode) { case DISPLAY_MODE_TREE_ONLY: - button_toggle_display_mode->set_pressed(display_mode == DISPLAY_MODE_SPLIT); - button_toggle_display_mode->show(); - tree->show(); tree->set_v_size_flags(SIZE_EXPAND_FILL); toolbar2_hbc->show(); @@ -371,9 +349,6 @@ void FileSystemDock::_update_display_mode(bool p_force) { break; case DISPLAY_MODE_SPLIT: - button_toggle_display_mode->set_pressed(display_mode == DISPLAY_MODE_SPLIT); - button_toggle_display_mode->show(); - tree->show(); tree->set_v_size_flags(SIZE_EXPAND_FILL); tree->ensure_cursor_is_visible(); @@ -383,9 +358,6 @@ void FileSystemDock::_update_display_mode(bool p_force) { file_list_vb->show(); _update_file_list(true); break; - - case DISPLAY_MODE_WIDE: - break; } old_display_mode = display_mode; } @@ -1038,11 +1010,9 @@ void FileSystemDock::_preview_invalidated(const String &p_path) { void FileSystemDock::_fs_changed() { button_hist_prev->set_disabled(history_pos == 0); button_hist_next->set_disabled(history_pos == history.size() - 1); - scanning_vb->hide(); - if (split_box) { - split_box->show(); - } + scanning_vb->hide(); + split_box->show(); if (tree->is_visible()) { _update_tree(_compute_uncollapsed_paths()); @@ -1059,11 +1029,9 @@ void FileSystemDock::_set_scanning_mode() { button_hist_prev->set_disabled(true); button_hist_next->set_disabled(true); - if (split_box) { - split_box->hide(); - } - + split_box->hide(); scanning_vb->show(); + set_process(true); if (EditorFileSystem::get_singleton()->is_scanning()) { scanning_progress->set_value(EditorFileSystem::get_singleton()->get_scanning_progress() * 100); @@ -1994,8 +1962,6 @@ void FileSystemDock::_focus_current_search_box() { current_search_box = tree_search_box; } else if (display_mode == DISPLAY_MODE_SPLIT) { current_search_box = file_list_search_box; - } else if (display_mode == DISPLAY_MODE_WIDE) { - current_search_box = file_list_search_box; } if (current_search_box) { @@ -2027,10 +1993,6 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from _update_file_list(false); _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector(), false, false, unfold_path); } break; - case DISPLAY_MODE_WIDE: { - _update_file_list(false); - _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector(), false, false, unfold_path); - } break; } } @@ -2040,11 +2002,6 @@ void FileSystemDock::_rescan() { } void FileSystemDock::_toggle_split_mode(bool p_active) { - if (display_mode == DISPLAY_MODE_WIDE) { - //shouldn't happen - return; - } - set_display_mode(p_active ? DISPLAY_MODE_SPLIT : DISPLAY_MODE_TREE_ONLY); emit_signal("display_mode_changed"); } @@ -2065,6 +2022,27 @@ void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) { _toggle_file_display(); } +void FileSystemDock::set_dock_mode(DockMode p_dock_mode) { + dock_mode = p_dock_mode; +} + +void FileSystemDock::set_applied_dock_mode(DockMode p_dock_mode) { + applied_dock_mode = p_dock_mode; +} + +void FileSystemDock::set_split_mode(SplitMode p_split_mode) { + split_mode = p_split_mode; + + if (split_mode == SPLIT_MODE_HORIZONTAL) { + split_box->set_mode(CSplitContainer::CONTAINER_MODE_HORIZONTAL); + } else { + split_box->set_mode(CSplitContainer::CONTAINER_MODE_VERTICAL); + } +} +FileSystemDock::SplitMode FileSystemDock::get_split_mode() { + return split_mode; +} + int FileSystemDock::add_custom_popup_creation_entry(const String &entry_text, const String &theme_icon_name, const String &theme_icon_category) { int current_max_id = FILE_NEW_CUSTOM_ENTRY_START; @@ -2096,7 +2074,7 @@ void FileSystemDock::remove_custom_popup_creation_entry(const int id) { } void FileSystemDock::ensure_visible() { - if (display_mode == DISPLAY_MODE_WIDE) { + if (applied_dock_mode == DOCK_MODE_BOTTOM_BAR) { if (bottom_panel_tool_button) { bottom_panel_tool_button->set_pressed(true); } @@ -2910,7 +2888,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { #endif ED_SHORTCUT("filesystem_dock/open_search", TTR("Focus the search box"), KEY_MASK_CMD | KEY_F); - bool wide = EDITOR_DEF_RST("docks/filesystem/wide_bottom_panel", false); + bool wide = static_cast(static_cast(EDITOR_GET("docks/filesystem/dock_mode"))); VBoxContainer *top_vbc = memnew(VBoxContainer); add_child(top_vbc); @@ -2952,10 +2930,6 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { button_toggle_display_mode->set_tooltip(TTR("Toggle Split Mode")); toolbar_hbc->add_child(button_toggle_display_mode); - if (wide) { - button_toggle_display_mode->hide(); - } - toolbar2_hbc = memnew(HBoxContainer); toolbar2_hbc->add_theme_constant_override("separation", 0); top_vbc->add_child(toolbar2_hbc); @@ -2969,10 +2943,6 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { tree_button_sort = _create_file_menu_button(); toolbar2_hbc->add_child(tree_button_sort); - if (wide) { - toolbar2_hbc->hide(); - } - file_list_popup = memnew(PopupMenu); file_list_popup->set_hide_on_window_lose_focus(true); add_child(file_list_popup); @@ -2981,22 +2951,10 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { tree_popup->set_hide_on_window_lose_focus(true); add_child(tree_popup); - wide_hsplit_box = NULL; - split_box = NULL; - SplitContainer *split_container = NULL; - - if (!wide) { - split_box = memnew(VSplitContainer); - split_box->set_v_size_flags(SIZE_EXPAND_FILL); - add_child(split_box); - split_container = split_box; - } else { - wide_hsplit_box = memnew(HSplitContainer); - wide_hsplit_box->set_v_size_flags(SIZE_EXPAND_FILL); - wide_hsplit_box->set_h_size_flags(SIZE_EXPAND_FILL); - add_child(wide_hsplit_box); - split_container = wide_hsplit_box; - } + split_box = memnew(CSplitContainer); + split_box->set_v_size_flags(SIZE_EXPAND_FILL); + split_box->set_h_size_flags(SIZE_EXPAND_FILL); + add_child(split_box); tree = memnew(Tree); @@ -3005,7 +2963,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { tree->set_allow_rmb_select(true); tree->set_select_mode(Tree::SELECT_MULTI); tree->set_custom_minimum_size(Size2(0, 15 * EDSCALE)); - split_container->add_child(tree); + split_box->add_child(tree); tree->connect("item_activated", this, "_tree_activate_file"); tree->connect("multi_selected", this, "_tree_multi_selected"); @@ -3016,7 +2974,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { file_list_vb = memnew(VBoxContainer); file_list_vb->set_v_size_flags(SIZE_EXPAND_FILL); - split_container->add_child(file_list_vb); + split_box->add_child(file_list_vb); path_hb = memnew(HBoxContainer); file_list_vb->add_child(path_hb); @@ -3137,16 +3095,25 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { history.push_back("res://"); if (wide) { - display_mode = DISPLAY_MODE_WIDE; - old_display_mode = DISPLAY_MODE_WIDE; + display_mode = DISPLAY_MODE_SPLIT; + old_display_mode = DISPLAY_MODE_SPLIT; + split_mode = SPLIT_MODE_VERTICAL; } else { display_mode = DISPLAY_MODE_TREE_ONLY; old_display_mode = DISPLAY_MODE_TREE_ONLY; + split_mode = SPLIT_MODE_HORIZONTAL; } + set_split_mode(split_mode); + + _update_display_mode(true); + file_list_display_mode = FILE_LIST_DISPLAY_THUMBNAILS; always_show_folders = false; + + dock_mode = DOCK_MODE_DOCK; + applied_dock_mode = DOCK_MODE_DOCK; } FileSystemDock::~FileSystemDock() { diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 115c63bc8..f17f9d990 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -83,7 +83,16 @@ public: enum DisplayMode { DISPLAY_MODE_TREE_ONLY, DISPLAY_MODE_SPLIT, - DISPLAY_MODE_WIDE, + }; + + enum SplitMode { + SPLIT_MODE_VERTICAL, + SPLIT_MODE_HORIZONTAL, + }; + + enum DockMode { + DOCK_MODE_DOCK, + DOCK_MODE_BOTTOM_BAR, }; enum FileSortOption { @@ -130,8 +139,7 @@ private: VBoxContainer *scanning_vb; ProgressBar *scanning_progress; - HSplitContainer *wide_hsplit_box; - VSplitContainer *split_box; + CSplitContainer *split_box; VBoxContainer *file_list_vb; @@ -162,6 +170,11 @@ private: DisplayMode display_mode; DisplayMode old_display_mode; + DockMode dock_mode; + DockMode applied_dock_mode; + + SplitMode split_mode; + PopupMenu *file_list_popup; PopupMenu *tree_popup; @@ -345,18 +358,10 @@ public: void fix_dependencies(const String &p_for_file); int get_split_offset() { - if (split_box) { - return split_box->get_split_offset(); - } else { - return wide_hsplit_box->get_split_offset(); - } + return split_box->get_split_offset(); } void set_split_offset(int p_offset) { - if (split_box) { - split_box->set_split_offset(p_offset); - } else { - wide_hsplit_box->set_split_offset(p_offset); - } + split_box->set_split_offset(p_offset); } void select_file(const String &p_file); @@ -369,6 +374,15 @@ public: void set_file_list_display_mode(FileListDisplayMode p_mode); FileListDisplayMode get_file_list_display_mode() { return file_list_display_mode; } + void set_dock_mode(DockMode p_dock_mode); + DockMode get_dock_mode() { return dock_mode; } + + void set_applied_dock_mode(DockMode p_dock_mode); + DockMode get_applied_dock_mode() { return applied_dock_mode; } + + void set_split_mode(SplitMode p_split_mode); + SplitMode get_split_mode(); + int add_custom_popup_creation_entry(const String &entry_text, const String &theme_icon_name = "", const String &theme_icon_category = ""); void remove_custom_popup_creation_entry(const int id);