From 0a207ad032273365f41b9032631d9eb26dfc0d5e Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Thu, 20 Jun 2024 20:19:08 +0200
Subject: [PATCH 1/8] Add simple Create Project Structure launcher action

---
 .../create_project_folder_structure.py        | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 client/ayon_core/plugins/actions/create_project_folder_structure.py

diff --git a/client/ayon_core/plugins/actions/create_project_folder_structure.py b/client/ayon_core/plugins/actions/create_project_folder_structure.py
new file mode 100644
index 0000000000..6df52abbcb
--- /dev/null
+++ b/client/ayon_core/plugins/actions/create_project_folder_structure.py
@@ -0,0 +1,20 @@
+from ayon_core.pipeline import LauncherAction
+from ayon_core.pipeline import project_folders
+
+
+class CreateProjectStructureAction(LauncherAction):
+    """Create project structure as defined in settings."""
+    name = "create_project_structure"
+    label = "Create Project Structure"
+    icon = "sitemap"
+    color = "#e0e1e1"
+    order = 1000
+
+    def is_compatible(self, selection) -> bool:
+        return (
+            selection.is_project_selected and
+            not selection.is_folder_selected
+        )
+
+    def process(self, selection, **kwargs):
+        project_folders.create_project_folders(selection.project_name)
\ No newline at end of file

From 905241f6f4c0674c173b8070579431802b8f1b88 Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Thu, 20 Jun 2024 20:25:24 +0200
Subject: [PATCH 2/8] Cosmetics

---
 .../plugins/actions/create_project_folder_structure.py          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/ayon_core/plugins/actions/create_project_folder_structure.py b/client/ayon_core/plugins/actions/create_project_folder_structure.py
index 6df52abbcb..e555f08301 100644
--- a/client/ayon_core/plugins/actions/create_project_folder_structure.py
+++ b/client/ayon_core/plugins/actions/create_project_folder_structure.py
@@ -17,4 +17,4 @@ def is_compatible(self, selection) -> bool:
         )
 
     def process(self, selection, **kwargs):
-        project_folders.create_project_folders(selection.project_name)
\ No newline at end of file
+        project_folders.create_project_folders(selection.project_name)

From fbd27357729146efed795db1302cc97897807621 Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Thu, 20 Jun 2024 20:26:47 +0200
Subject: [PATCH 3/8] Cosmetics

---
 .../plugins/actions/create_project_folder_structure.py         | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/client/ayon_core/plugins/actions/create_project_folder_structure.py b/client/ayon_core/plugins/actions/create_project_folder_structure.py
index e555f08301..95c46099d7 100644
--- a/client/ayon_core/plugins/actions/create_project_folder_structure.py
+++ b/client/ayon_core/plugins/actions/create_project_folder_structure.py
@@ -1,5 +1,4 @@
-from ayon_core.pipeline import LauncherAction
-from ayon_core.pipeline import project_folders
+from ayon_core.pipeline import LauncherAction, project_folders
 
 
 class CreateProjectStructureAction(LauncherAction):

From 18f750f39a893d93fe66c5447c7c033c531e8baa Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Fri, 21 Jun 2024 09:38:57 +0200
Subject: [PATCH 4/8] Update
 client/ayon_core/plugins/actions/create_project_folder_structure.py

Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com>
---
 .../plugins/actions/create_project_folder_structure.py        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/client/ayon_core/plugins/actions/create_project_folder_structure.py b/client/ayon_core/plugins/actions/create_project_folder_structure.py
index 95c46099d7..c12db9b353 100644
--- a/client/ayon_core/plugins/actions/create_project_folder_structure.py
+++ b/client/ayon_core/plugins/actions/create_project_folder_structure.py
@@ -11,8 +11,8 @@ class CreateProjectStructureAction(LauncherAction):
 
     def is_compatible(self, selection) -> bool:
         return (
-            selection.is_project_selected and
-            not selection.is_folder_selected
+            selection.is_project_selected
+            and not selection.is_folder_selected
         )
 
     def process(self, selection, **kwargs):

From 56fb5c4c021777664b64922b153499ee7cf8ee26 Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Fri, 4 Oct 2024 11:08:56 +0200
Subject: [PATCH 5/8] Rename action to Create Project Folders

---
 ...ject_folder_structure.py => create_project_folders.py} | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
 rename client/ayon_core/plugins/actions/{create_project_folder_structure.py => create_project_folders.py} (68%)

diff --git a/client/ayon_core/plugins/actions/create_project_folder_structure.py b/client/ayon_core/plugins/actions/create_project_folders.py
similarity index 68%
rename from client/ayon_core/plugins/actions/create_project_folder_structure.py
rename to client/ayon_core/plugins/actions/create_project_folders.py
index c12db9b353..2dd26b578a 100644
--- a/client/ayon_core/plugins/actions/create_project_folder_structure.py
+++ b/client/ayon_core/plugins/actions/create_project_folders.py
@@ -1,10 +1,10 @@
 from ayon_core.pipeline import LauncherAction, project_folders
 
 
-class CreateProjectStructureAction(LauncherAction):
-    """Create project structure as defined in settings."""
-    name = "create_project_structure"
-    label = "Create Project Structure"
+class CreateProjectFoldersAction(LauncherAction):
+    """Create project folders as defined in settings."""
+    name = "create_project_folders"
+    label = "Create Project Folders"
     icon = "sitemap"
     color = "#e0e1e1"
     order = 1000

From 8383fdefa40814aa40fe3ca1ef311f7261f8cebb Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Fri, 4 Oct 2024 11:12:03 +0200
Subject: [PATCH 6/8] Hide action if setting is empty

---
 .../plugins/actions/create_project_folders.py          | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/client/ayon_core/plugins/actions/create_project_folders.py b/client/ayon_core/plugins/actions/create_project_folders.py
index 2dd26b578a..934a9169d7 100644
--- a/client/ayon_core/plugins/actions/create_project_folders.py
+++ b/client/ayon_core/plugins/actions/create_project_folders.py
@@ -10,6 +10,16 @@ class CreateProjectFoldersAction(LauncherAction):
     order = 1000
 
     def is_compatible(self, selection) -> bool:
+
+        # Disable when the project folder structure setting is empty
+        # in settings
+        project_settings = selection.get_project_settings()
+        folder_structure = (
+            project_settings["core"]["project_folder_structure"]
+        ).strip()
+        if not folder_structure or folder_structure == "{}":
+            return False
+
         return (
             selection.is_project_selected
             and not selection.is_folder_selected

From 5aa7e9c8caa7a400f0b01db3a12a8e9e49fbed64 Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Fri, 4 Oct 2024 11:17:33 +0200
Subject: [PATCH 7/8] Add description to setting

---
 server/settings/main.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/server/settings/main.py b/server/settings/main.py
index 249bab85fd..5eaacc7072 100644
--- a/server/settings/main.py
+++ b/server/settings/main.py
@@ -301,6 +301,11 @@ class CoreSettings(BaseSettingsModel):
         "{}",
         widget="textarea",
         title="Project folder structure",
+        description=(
+            "Defines project folders to create on 'Create project folders'."
+            " When empty, the action will be hidden from users in the"
+            " launcher because there is nothing to create."
+        ),
         section="---"
     )
     project_environments: str = SettingsField(

From 5065e0e8dbb4da9e4a05918abced984b2f077e5d Mon Sep 17 00:00:00 2001
From: Roy Nieterau <roy_nieterau@hotmail.com>
Date: Fri, 4 Oct 2024 12:04:14 +0200
Subject: [PATCH 8/8] Explicit description to describe diff between ftrack and
 launcher

---
 server/settings/main.py | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/server/settings/main.py b/server/settings/main.py
index 5eaacc7072..a5129e69af 100644
--- a/server/settings/main.py
+++ b/server/settings/main.py
@@ -303,8 +303,12 @@ class CoreSettings(BaseSettingsModel):
         title="Project folder structure",
         description=(
             "Defines project folders to create on 'Create project folders'."
-            " When empty, the action will be hidden from users in the"
-            " launcher because there is nothing to create."
+            "\n\n"
+            "- In the launcher, this only creates the folders on disk and "
+            " when the setting is empty it will be hidden from users in the"
+            " launcher.\n"
+            "- In `ayon-ftrack` this will create the folders on disk **and**"
+            " will also create ftrack entities. It is never hidden there."
         ),
         section="---"
     )