Show an icon if a quest is loaded from user directory
authorLiza Carvelli <liza@carvel.li>
Thu, 15 Aug 2024 19:38:47 +0000 (21:38 +0200)
committerLiza Carvelli <liza@carvel.li>
Thu, 15 Aug 2024 19:38:47 +0000 (21:38 +0200)
Questionable/Controller/QuestRegistry.cs
Questionable/Model/Quest.cs
Questionable/Windows/QuestComponents/ActiveQuestComponent.cs

index 3ccd3ee37bcd9aae79d0fd3d6a7615ceb3a4d49f..f1af005012cddcfdfdfad3cbef66611094771e81 100644 (file)
@@ -61,7 +61,8 @@ internal sealed class QuestRegistry
 
         try
         {
-            LoadFromDirectory(new DirectoryInfo(Path.Combine(_pluginInterface.ConfigDirectory.FullName, "Quests")));
+            LoadFromDirectory(new DirectoryInfo(Path.Combine(_pluginInterface.ConfigDirectory.FullName, "Quests")),
+                Quest.ESource.UserDirectory);
         }
         catch (Exception e)
         {
@@ -99,7 +100,7 @@ internal sealed class QuestRegistry
                 Id = questId,
                 Root = questRoot,
                 Info = questInfo,
-                ReadOnly = true,
+                Source = Quest.ESource.Assembly,
             };
             _quests[quest.Id] = quest;
         }
@@ -122,6 +123,7 @@ internal sealed class QuestRegistry
                     foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values)
                         LoadFromDirectory(
                             new DirectoryInfo(Path.Combine(pathProjectDirectory.FullName, expansionFolder)),
+                            Quest.ESource.ProjectDirectory,
                             LogLevel.Trace);
                 }
                 catch (Exception e)
@@ -135,10 +137,10 @@ internal sealed class QuestRegistry
 
     private void ValidateQuests()
     {
-        _questValidator.Validate(_quests.Values.Where(x => !x.ReadOnly));
+        _questValidator.Validate(_quests.Values.Where(x => x.Source != Quest.ESource.Assembly));
     }
 
-    private void LoadQuestFromStream(string fileName, Stream stream)
+    private void LoadQuestFromStream(string fileName, Stream stream, Quest.ESource source)
     {
         _logger.LogTrace("Loading quest from '{FileName}'", fileName);
         ElementId? questId = ExtractQuestIdFromName(fileName);
@@ -157,12 +159,13 @@ internal sealed class QuestRegistry
             Id = questId,
             Root = questRoot,
             Info = questInfo,
-            ReadOnly = false,
+            Source = source,
         };
         _quests[quest.Id] = quest;
     }
 
-    private void LoadFromDirectory(DirectoryInfo directory, LogLevel logLevel = LogLevel.Information)
+    private void LoadFromDirectory(DirectoryInfo directory, Quest.ESource source,
+        LogLevel logLevel = LogLevel.Information)
     {
         if (!directory.Exists)
         {
@@ -176,7 +179,7 @@ internal sealed class QuestRegistry
             try
             {
                 using FileStream stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read);
-                LoadQuestFromStream(fileInfo.Name, stream);
+                LoadQuestFromStream(fileInfo.Name, stream, source);
             }
             catch (Exception e)
             {
@@ -185,7 +188,7 @@ internal sealed class QuestRegistry
         }
 
         foreach (DirectoryInfo childDirectory in directory.GetDirectories())
-            LoadFromDirectory(childDirectory, logLevel);
+            LoadFromDirectory(childDirectory, source, logLevel);
     }
 
     private static ElementId? ExtractQuestIdFromName(string resourceName)
index 3befbc6983b06020db1730e34e039b9813797ada..5f9380e929719f1e8910720924b2effeaaaba008 100644 (file)
@@ -9,7 +9,7 @@ internal sealed class Quest
     public required ElementId Id { get; init; }
     public required QuestRoot Root { get; init; }
     public required IQuestInfo Info { get; init; }
-    public required bool ReadOnly { get; init; }
+    public required ESource Source { get; init; }
 
     public QuestSequence? FindSequence(byte currentSequence)
         => Root.QuestSequence.SingleOrDefault(seq => seq.Sequence == currentSequence);
@@ -27,4 +27,11 @@ internal sealed class Quest
             }
         }
     }
+
+    public enum ESource
+    {
+        Assembly,
+        ProjectDirectory,
+        UserDirectory,
+    }
 }
index aeceab45ff0cc9f99d396cdd0d6c0ea3a439d359..66c4e40132cc513041e371c4d32ed4136fc5b978 100644 (file)
@@ -134,6 +134,17 @@ internal sealed partial class ActiveQuestComponent
             var startedQuest = _questController.StartedQuest;
             if (startedQuest != null)
             {
+                if (startedQuest.Quest.Source == Quest.ESource.UserDirectory)
+                {
+                    ImGui.PushFont(UiBuilder.IconFont);
+                    ImGui.TextColored(ImGuiColors.DalamudOrange, FontAwesomeIcon.FilePen.ToIconString());
+                    ImGui.PopFont();
+                    ImGui.SameLine(0);
+
+                    if (ImGui.IsItemHovered())
+                        ImGui.SetTooltip("This quest is loaded from your 'pluginConfigs\\Questionable\\Quests' directory.\nThis gets loaded even if Questionable ships with a newer/different version of the quest.");
+                }
+
                 ImGui.TextUnformatted(
                     $"Quest: {Shorten(startedQuest.Quest.Info.Name)} / {startedQuest.Sequence} / {startedQuest.Step}");