diff --git a/OtterGui b/OtterGui index 70d9f814..b6c4877c 160000 --- a/OtterGui +++ b/OtterGui @@ -1 +1 @@ -Subproject commit 70d9f81436c82cc51734f0661d10f461da4f1840 +Subproject commit b6c4877cc586f47931e71f284f865833846d9baa diff --git a/Penumbra/UI/Classes/ModFileSystemSelector.Filters.cs b/Penumbra/UI/Classes/ModFileSystemSelector.Filters.cs index 91d64c6e..79156cb5 100644 --- a/Penumbra/UI/Classes/ModFileSystemSelector.Filters.cs +++ b/Penumbra/UI/Classes/ModFileSystemSelector.Filters.cs @@ -246,22 +246,10 @@ public partial class ModFileSystemSelector return false; } - // Add the state filter combo-button to the right of the filter box. - protected override float CustomFilters( float width ) + private void DrawFilterCombo( ref bool everything ) { - var pos = ImGui.GetCursorPos(); - var remainingWidth = width - ImGui.GetFrameHeight(); - var comboPos = new Vector2( pos.X + remainingWidth, pos.Y ); - - var everything = _stateFilter == ModFilterExtensions.UnfilteredStateMods; - - ImGui.SetCursorPos( comboPos ); - // Draw combo button - using var color = ImRaii.PushColor( ImGuiCol.Button, Colors.FilterActive, !everything ); using var combo = ImRaii.Combo( "##filterCombo", string.Empty, ImGuiComboFlags.NoPreview | ImGuiComboFlags.PopupAlignLeft | ImGuiComboFlags.HeightLargest ); - color.Pop(); - if( combo ) { using var style = ImRaii.PushStyle( ImGuiStyleVar.ItemSpacing, @@ -285,8 +273,22 @@ public partial class ModFileSystemSelector } } } + } - combo.Dispose(); + // Add the state filter combo-button to the right of the filter box. + protected override float CustomFilters( float width ) + { + var pos = ImGui.GetCursorPos(); + var remainingWidth = width - ImGui.GetFrameHeight(); + var comboPos = new Vector2( pos.X + remainingWidth, pos.Y ); + + var everything = _stateFilter == ModFilterExtensions.UnfilteredStateMods; + + ImGui.SetCursorPos( comboPos ); + // Draw combo button + using var color = ImRaii.PushColor( ImGuiCol.Button, Colors.FilterActive, !everything ); + DrawFilterCombo( ref everything ); + ConfigWindow.OpenTutorial( ConfigWindow.BasicTutorialSteps.ModFilters ); if( ImGui.IsItemClicked( ImGuiMouseButton.Right ) ) { _stateFilter = ModFilterExtensions.UnfilteredStateMods; diff --git a/Penumbra/UI/Classes/ModFileSystemSelector.cs b/Penumbra/UI/Classes/ModFileSystemSelector.cs index 4f6c722d..9db6abb2 100644 --- a/Penumbra/UI/Classes/ModFileSystemSelector.cs +++ b/Penumbra/UI/Classes/ModFileSystemSelector.cs @@ -201,7 +201,7 @@ public sealed partial class ModFileSystemSelector : FileSystemSelector< Mod, Mod { var button = ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.FileImport.ToIconString(), size, "Import one or multiple mods from Tex Tools Mod Pack Files.", !Penumbra.ModManager.Valid, true ); - ConfigWindow.OpenTutorial( 13 ); + ConfigWindow.OpenTutorial( ConfigWindow.BasicTutorialSteps.ModImport ); if (!button) { return; @@ -312,7 +312,7 @@ public sealed partial class ModFileSystemSelector : FileSystemSelector< Mod, Mod { ImGui.OpenPopup( "ExtendedHelp" ); } - ConfigWindow.OpenTutorial( 14 ); + ConfigWindow.OpenTutorial( ConfigWindow.BasicTutorialSteps.AdvancedHelp ); } // Helpers. diff --git a/Penumbra/UI/ConfigWindow.CollectionsTab.cs b/Penumbra/UI/ConfigWindow.CollectionsTab.cs index 14b8f838..75d08bd2 100644 --- a/Penumbra/UI/ConfigWindow.CollectionsTab.cs +++ b/Penumbra/UI/ConfigWindow.CollectionsTab.cs @@ -23,7 +23,7 @@ public partial class ConfigWindow public void Draw() { using var tab = ImRaii.TabItem( "Collections" ); - OpenTutorial( 5 ); + OpenTutorial( BasicTutorialSteps.Collections ); if( !tab ) { return; @@ -194,7 +194,7 @@ public partial class ConfigWindow { ImGui.Dummy( _window._defaultSpace ); var open = ImGui.CollapsingHeader( "Active Collections" ); - OpenTutorial( 9 ); + OpenTutorial( BasicTutorialSteps.ActiveCollections ); if( !open ) { return; @@ -202,7 +202,7 @@ public partial class ConfigWindow ImGui.Dummy( _window._defaultSpace ); DrawDefaultCollectionSelector(); - OpenTutorial( 10 ); + OpenTutorial( BasicTutorialSteps.DefaultCollection ); ImGui.Dummy( _window._defaultSpace ); foreach( var type in CollectionTypeExtensions.Special ) { @@ -248,7 +248,7 @@ public partial class ConfigWindow DrawNewCharacterCollection(); } - OpenTutorial( 11 ); + OpenTutorial( BasicTutorialSteps.SpecialCollections ); ImGui.Dummy( _window._defaultSpace ); } @@ -257,7 +257,7 @@ public partial class ConfigWindow { ImGui.Dummy( _window._defaultSpace ); var open = ImGui.CollapsingHeader( "Collection Settings", ImGuiTreeNodeFlags.DefaultOpen ); - OpenTutorial( 6 ); + OpenTutorial( BasicTutorialSteps.EditingCollections ); if( !open ) { return; @@ -265,12 +265,12 @@ public partial class ConfigWindow ImGui.Dummy( _window._defaultSpace ); DrawCurrentCollectionSelector(); - OpenTutorial( 7 ); + OpenTutorial( BasicTutorialSteps.CurrentCollection ); ImGui.Dummy( _window._defaultSpace ); DrawNewCollectionInput(); ImGui.Dummy( _window._defaultSpace ); DrawInheritanceBlock(); - OpenTutorial( 8 ); + OpenTutorial( BasicTutorialSteps.Inheritance ); } } } \ No newline at end of file diff --git a/Penumbra/UI/ConfigWindow.ModPanel.Settings.cs b/Penumbra/UI/ConfigWindow.ModPanel.Settings.cs index 2689f3bd..e76c145d 100644 --- a/Penumbra/UI/ConfigWindow.ModPanel.Settings.cs +++ b/Penumbra/UI/ConfigWindow.ModPanel.Settings.cs @@ -36,7 +36,7 @@ public partial class ConfigWindow private void DrawSettingsTab() { using var tab = DrawTab( SettingsTabHeader, Tabs.Settings ); - OpenTutorial( 17 ); + OpenTutorial( BasicTutorialSteps.ModOptions ); if( !tab ) { return; @@ -52,10 +52,10 @@ public partial class ConfigWindow ImGui.Dummy( _window._defaultSpace ); _window._penumbra.Api.InvokePreSettingsPanel( _mod.ModPath.Name ); DrawEnabledInput(); - OpenTutorial( 15 ); + OpenTutorial( BasicTutorialSteps.EnablingMods ); ImGui.SameLine(); DrawPriorityInput(); - OpenTutorial( 16 ); + OpenTutorial( BasicTutorialSteps.Priority ); DrawRemoveSettings(); ImGui.Dummy( _window._defaultSpace ); for( var idx = 0; idx < _mod.Groups.Count; ++idx ) diff --git a/Penumbra/UI/ConfigWindow.ModsTab.cs b/Penumbra/UI/ConfigWindow.ModsTab.cs index 8bd9e34c..adcd512d 100644 --- a/Penumbra/UI/ConfigWindow.ModsTab.cs +++ b/Penumbra/UI/ConfigWindow.ModsTab.cs @@ -22,7 +22,7 @@ public partial class ConfigWindow try { using var tab = ImRaii.TabItem( "Mods" ); - OpenTutorial( 12 ); + OpenTutorial( BasicTutorialSteps.Mods ); if( !tab ) { return; @@ -59,11 +59,17 @@ public partial class ConfigWindow using var style = ImRaii.PushStyle( ImGuiStyleVar.FrameRounding, 0 ).Push( ImGuiStyleVar.ItemSpacing, Vector2.Zero ); var buttonSize = new Vector2( ImGui.GetContentRegionAvail().X / 8f, 0 ); - DrawDefaultCollectionButton( 3 * buttonSize ); - ImGui.SameLine(); - DrawInheritedCollectionButton( 3 * buttonSize ); - ImGui.SameLine(); - DrawCollectionSelector( "##collectionSelector", 2 * buttonSize.X, CollectionType.Current, false, null ); + using( var group = ImRaii.Group() ) + { + DrawDefaultCollectionButton( 3 * buttonSize ); + ImGui.SameLine(); + DrawInheritedCollectionButton( 3 * buttonSize ); + ImGui.SameLine(); + DrawCollectionSelector( "##collectionSelector", 2 * buttonSize.X, CollectionType.Current, false, null ); + } + + OpenTutorial( BasicTutorialSteps.CollectionSelectors ); + if( !Penumbra.CollectionManager.CurrentCollectionInUse ) { ImGuiUtil.DrawTextButton( "The currently selected collection is not used in any way.", -Vector2.UnitX, Colors.PressEnterWarningBg ); diff --git a/Penumbra/UI/ConfigWindow.SettingsTab.General.cs b/Penumbra/UI/ConfigWindow.SettingsTab.General.cs index 224828c4..badf9f22 100644 --- a/Penumbra/UI/ConfigWindow.SettingsTab.General.cs +++ b/Penumbra/UI/ConfigWindow.SettingsTab.General.cs @@ -31,11 +31,11 @@ public partial class ConfigWindow { if( !ImGui.CollapsingHeader( "General" ) ) { - OpenTutorial( 4 ); + OpenTutorial( BasicTutorialSteps.GeneralSettings ); return; } - OpenTutorial( 4 ); + OpenTutorial( BasicTutorialSteps.GeneralSettings ); Checkbox( "Hide Config Window when UI is Hidden", "Hide the penumbra main window when you manually hide the in-game user interface.", Penumbra.Config.HideUiWhenUiHidden, diff --git a/Penumbra/UI/ConfigWindow.SettingsTab.cs b/Penumbra/UI/ConfigWindow.SettingsTab.cs index 2c2356ea..bcb2e4f1 100644 --- a/Penumbra/UI/ConfigWindow.SettingsTab.cs +++ b/Penumbra/UI/ConfigWindow.SettingsTab.cs @@ -28,6 +28,10 @@ public partial class ConfigWindow public void Draw() { using var tab = ImRaii.TabItem( "Settings" ); + OpenTutorial( BasicTutorialSteps.Fin ); + OpenTutorial( BasicTutorialSteps.Faq1 ); + OpenTutorial( BasicTutorialSteps.Faq2 ); + OpenTutorial( BasicTutorialSteps.Faq3 ); if( !tab ) { return; @@ -154,7 +158,7 @@ public partial class ConfigWindow + "It should also be placed near the root of a logical drive - the shorter the total path to this folder, the better.\n" + "Definitely do not place it in your Dalamud directory or any sub-directory thereof." ); group.Dispose(); - OpenTutorial( 1 ); + OpenTutorial( BasicTutorialSteps.ModDirectory ); ImGui.SameLine(); var pos = ImGui.GetCursorPosX(); ImGui.NewLine(); @@ -188,7 +192,7 @@ public partial class ConfigWindow _window._penumbra.SetEnabled( enabled ); } - OpenTutorial( 2 ); + OpenTutorial( BasicTutorialSteps.EnableMods ); } private static void DrawShowAdvancedBox() @@ -208,13 +212,13 @@ public partial class ConfigWindow // Manually split due to tutorial. ImGuiComponents.HelpMarker( tt ); - OpenTutorial( 0 ); + OpenTutorial( BasicTutorialSteps.GeneralTooltips ); ImGui.SameLine(); ImGui.TextUnformatted( "Show Advanced Settings" ); ImGuiUtil.HoverTooltip( tt ); } - OpenTutorial( 3 ); + OpenTutorial( BasicTutorialSteps.AdvancedSettings ); } private static void DrawColorSettings() diff --git a/Penumbra/UI/ConfigWindow.Tutorial.cs b/Penumbra/UI/ConfigWindow.Tutorial.cs index 9e879c51..157a9d9c 100644 --- a/Penumbra/UI/ConfigWindow.Tutorial.cs +++ b/Penumbra/UI/ConfigWindow.Tutorial.cs @@ -1,3 +1,4 @@ +using System; using OtterGui.Widgets; using Penumbra.UI.Classes; @@ -15,13 +16,41 @@ public partial class ConfigWindow } } - public static void OpenTutorial( int id ) - => Tutorial.Open( id, Penumbra.Config.TutorialStep, v => + public static void OpenTutorial( BasicTutorialSteps step ) + => Tutorial.Open( ( int )step, Penumbra.Config.TutorialStep, v => { Penumbra.Config.TutorialStep = v; Penumbra.Config.Save(); } ); + public enum BasicTutorialSteps + { + GeneralTooltips, + ModDirectory, + EnableMods, + AdvancedSettings, + GeneralSettings, + Collections, + EditingCollections, + CurrentCollection, + Inheritance, + ActiveCollections, + DefaultCollection, + SpecialCollections, + Mods, + ModImport, + AdvancedHelp, + ModFilters, + CollectionSelectors, + EnablingMods, + Priority, + ModOptions, + Fin, + Faq1, + Faq2, + Faq3, + } + public static readonly Tutorial Tutorial = new Tutorial() { BorderColor = Colors.TutorialBorder, @@ -32,23 +61,27 @@ public partial class ConfigWindow + "Hover over them when you are unsure what something does or how to do something." ) .Register( "Initial Setup, Step 1: Mod Directory", "The first step is to set up your mod directory, which is where your mods are extracted to.\n\n" - + "The mod directory should be a short path - like 'D:\\FFXIVMods', if you want to store your mods on D: - and be on a fast hard drive." ) + + "The mod directory should be a short path - like 'C:\\FFXIVMods' - on your fastest available drive. Faster drives improve performance.\n\n" + + "The folder should be an empty folder no other applications write to." ) .Register( "Initial Setup, Step 2: Enable Mods", "Do not forget to enable your mods in case they are not." ) .Register( "Advanced Settings", "When you are just starting, you should leave this off.\n\n" + "If you need to do any editing of your mods, you will have to turn it on later." ) .Register( "General Settings", "Look through all of these settings before starting, they might help you a lot!\n\n" + "If you do not know what some of these do yet, return to this later!" ) .Register( "Initial Setup, Step 3: Collections", "Collections are lists of settings for your installed mods.\n\n" - + "This is our next stop!" ) + + "This is our next stop!\n\n" + + "Go here after setting up your root folder to continue the tutorial!" ) .Register( "Initial Setup, Step 4: Editing Collections", "First, we need to open the Collection Settings.\n\n" + "In here, we can create new collections, delete collections, or make them inherit from each other." ) .Register( "Initial Setup, Step 5: Current Collection", "We should already have a Default Collection, and for our simple setup, we do not need to do anything here.\n\n" - + "The current collection is the one we are currently editing. Any changes we make in our mod settings later will edit this collection." ) + + "The current collection is the one we are currently editing. Any changes we make in our mod settings later in the next tab will edit this collection." ) .Register( "Inheritance", - "This is a more advanced feature. Click the 'What is Inheritance?' button for more information, but we will ignore this for now." ) + "This is a more advanced feature. Click the help button for more information, but we will ignore this for now." ) .Register( "Initial Setup, Step 6: Active Collections", "Active Collections are those that are actually in use at the moment.\n\n" - + "Any collection in use will apply to the game under certain conditions." ) + + "Any collection in use will apply to the game under certain conditions.\n\n" + + "The Current Collection is also active for technical reasons.\n\n" + + "Open this now to continue." ) .Register( "Initial Setup, Step 7: Default Collection", "The Default Collection - which should currently also be set to a collection named Default - is the main one.\n\n" + "As long as no more specific collection applies to something, the mods from the Default Collection will be used.\n\n" @@ -56,15 +89,21 @@ public partial class ConfigWindow .Register( "Special Collections", "Special Collections are those that are used only for special characters in the game, either by specific conditions, or by name.\n\n" + "We will skip this for now, but hovering over the creation buttons should explain how they work." ) - .Register( "Initial Setup, Step 8: Mods", "Our last stop is the Mods tab, where you can import and setup your mods." ) + .Register( "Initial Setup, Step 8: Mods", "Our last stop is the Mods tab, where you can import and setup your mods.\n\n" + + "Please go there after verifying that your Current Collection and Default Collection are setup to your liking." ) .Register( "Initial Setup, Step 9: Mod Import", "Click this button to open a file selector with which to select TTMP mod files. You can select multiple at once.\n\n" + "It is not recommended to import huge mod packs of all your TexTools mods, but rather import the mods themselves, otherwise you lose out on a lot of Penumbra features!\n\n" + "A feature to import raw texture mods for Tattoos etc. is available under Advanced Editing, but is currently a work in progress." ) // TODO .Register( "Advanced Help", "Click this button to get detailed information on what you can do in the mod selector.\n\n" + "Import and select a mod now to continue." ) + .Register( "Mod Filters", "You can filter the available mods by name, author, changed items or various attributes here." ) + .Register( "Collection Selectors", "This row provides shortcuts to set your Current Collection.\n\n" + + "The first button sets it to your Default Collection (if any).\n\n" + + "The second button sets it to the collection the settings of the currently selected mod are inherited from (if any).\n\n" + + "The third is a regular collection selector to let you choose among all your collections." ) .Register( "Initial Setup, Step 11: Enabling Mods", - "Enable a mod here. Disabled mods will not apply to anything in the current collection (which can be seen and changed in the top-right corner).\n\n" + "Enable a mod here. Disabled mods will not apply to anything in the current collection.\n\n" + "Mods can be enabled or disabled in a collection, or they can be unconfigured, in which case they will use Inheritance." ) .Register( "Initial Setup, Step 12: Priority", "If two enabled mods in one collection change the same files, there is a conflict.\n\n" + "Conflicts can be solved by setting a priority. The mod with the higher number will be used for all the conflicting files.\n\n" @@ -76,5 +115,6 @@ public partial class ConfigWindow .Register( "FAQ 1", "Penumbra can not easily change which items a mod applies to." ) .Register( "FAQ 2", "It is advised to not use TexTools and Penumbra at the same time. Penumbra may refuse to work if TexTools broke your game indices." ) - .Register( "FAQ 3", "Penumbra can change the skin material a mod uses. This is under advanced editing." ); + .Register( "FAQ 3", "Penumbra can change the skin material a mod uses. This is under advanced editing." ) + .EnsureSize( Enum.GetValues< BasicTutorialSteps >().Length ); } \ No newline at end of file diff --git a/Penumbra/UI/ConfigWindow.cs b/Penumbra/UI/ConfigWindow.cs index 124c0350..30465fb6 100644 --- a/Penumbra/UI/ConfigWindow.cs +++ b/Penumbra/UI/ConfigWindow.cs @@ -79,10 +79,6 @@ public sealed partial class ConfigWindow : Window, IDisposable } else { - OpenTutorial( 18 ); - OpenTutorial( 19 ); - OpenTutorial( 20 ); - OpenTutorial( 21 ); using var bar = ImRaii.TabBar( string.Empty, ImGuiTabBarFlags.NoTooltip ); SetupSizes(); _settingsTab.Draw();