Browse Source

Merge pull request #107085 from KoBeWi/new_in_folder

Always use base directory in `CONTEXT_SLOT_FILESYSTEM_CREATE`
Rémi Verschelde 2 months ago
parent
commit
856da6858c
2 changed files with 23 additions and 3 deletions
  1. 8 1
      doc/classes/EditorContextMenuPlugin.xml
  2. 15 2
      editor/filesystem_dock.cpp

+ 8 - 1
doc/classes/EditorContextMenuPlugin.xml

@@ -89,7 +89,14 @@
 			Context menu of Script editor's script tabs. [method _popup_menu] will be called with the path to the currently edited script, while option callback will receive reference to that script.
 			Context menu of Script editor's script tabs. [method _popup_menu] will be called with the path to the currently edited script, while option callback will receive reference to that script.
 		</constant>
 		</constant>
 		<constant name="CONTEXT_SLOT_FILESYSTEM_CREATE" value="3" enum="ContextMenuSlot">
 		<constant name="CONTEXT_SLOT_FILESYSTEM_CREATE" value="3" enum="ContextMenuSlot">
-			The "Create..." submenu of FileSystem dock's context menu, or the "New" section of the main context menu when empty space is clicked. [method _popup_menu] and option callback will be called with the path of the currently selected folder, wrapped in a list. When clicking the empty space, the list of paths for popup method will be empty.
+			The "Create..." submenu of FileSystem dock's context menu, or the "New" section of the main context menu when empty space is clicked. [method _popup_menu] and option callback will be called with the path of the currently selected folder. When clicking the empty space, the list of paths for popup method will be empty.
+			[codeblock]
+			func _popup_menu(paths):
+			    if paths.is_empty():
+			        add_context_menu_item("New Image File...", create_image)
+			    else:
+			        add_context_menu_item("Image File...", create_image)
+			[/codeblock]
 		</constant>
 		</constant>
 		<constant name="CONTEXT_SLOT_SCRIPT_EDITOR_CODE" value="4" enum="ContextMenuSlot">
 		<constant name="CONTEXT_SLOT_SCRIPT_EDITOR_CODE" value="4" enum="ContextMenuSlot">
 			Context menu of Script editor's code editor. [method _popup_menu] will be called with the path to the [CodeEdit] node. You can fetch it using this code:
 			Context menu of Script editor's code editor. [method _popup_menu] will be called with the path to the [CodeEdit] node. You can fetch it using this code:

+ 15 - 2
editor/filesystem_dock.cpp

@@ -3342,7 +3342,8 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, const Vect
 		new_menu->add_icon_item(get_editor_theme_icon(SNAME("Object")), TTRC("Resource..."), FILE_MENU_NEW_RESOURCE);
 		new_menu->add_icon_item(get_editor_theme_icon(SNAME("Object")), TTRC("Resource..."), FILE_MENU_NEW_RESOURCE);
 		new_menu->add_icon_item(get_editor_theme_icon(SNAME("TextFile")), TTRC("TextFile..."), FILE_MENU_NEW_TEXTFILE);
 		new_menu->add_icon_item(get_editor_theme_icon(SNAME("TextFile")), TTRC("TextFile..."), FILE_MENU_NEW_TEXTFILE);
 
 
-		EditorContextMenuPluginManager::get_singleton()->add_options_from_plugins(new_menu, EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM_CREATE, p_paths);
+		const PackedStringArray folder_path = { p_paths[0].get_base_dir() };
+		EditorContextMenuPluginManager::get_singleton()->add_options_from_plugins(new_menu, EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM_CREATE, folder_path);
 		p_popup->add_separator();
 		p_popup->add_separator();
 	}
 	}
 
 
@@ -3743,13 +3744,25 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
 		if (option_id > -1) {
 		if (option_id > -1) {
 			_tree_rmb_option(option_id);
 			_tree_rmb_option(option_id);
 		} else {
 		} else {
+			bool create = false;
 			Callable custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM, p_event);
 			Callable custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM, p_event);
 			if (!custom_callback.is_valid()) {
 			if (!custom_callback.is_valid()) {
+				create = true;
 				custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM_CREATE, p_event);
 				custom_callback = EditorContextMenuPluginManager::get_singleton()->match_custom_shortcut(EditorContextMenuPlugin::CONTEXT_SLOT_FILESYSTEM_CREATE, p_event);
 			}
 			}
 
 
 			if (custom_callback.is_valid()) {
 			if (custom_callback.is_valid()) {
-				EditorContextMenuPluginManager::get_singleton()->invoke_callback(custom_callback, _tree_get_selected(false));
+				PackedStringArray selected = _tree_get_selected(false);
+				if (create) {
+					if (selected.is_empty()) {
+						selected.append("res://");
+					} else if (selected.size() == 1) {
+						selected.write[0] = selected[0].get_base_dir();
+					} else {
+						return;
+					}
+				}
+				EditorContextMenuPluginManager::get_singleton()->invoke_callback(custom_callback, selected);
 			} else {
 			} else {
 				return;
 				return;
 			}
 			}