Change a bunch of names and tooltips.

This commit is contained in:
Ottermandias 2022-07-21 22:55:19 +02:00
parent 9cb6084d31
commit 714e8e862f
4 changed files with 144 additions and 91 deletions

View file

@ -42,6 +42,9 @@ public partial class ModCollection
public bool HasUnusedSettings public bool HasUnusedSettings
=> _unusedSettings.Count > 0; => _unusedSettings.Count > 0;
public int NumUnusedSettings
=> _unusedSettings.Count;
// Evaluates the settings along the whole inheritance tree. // Evaluates the settings along the whole inheritance tree.
public IEnumerable< ModSettings? > ActualSettings public IEnumerable< ModSettings? > ActualSettings
=> Enumerable.Range( 0, _settings.Count ).Select( i => this[ i ].Settings ); => Enumerable.Range( 0, _settings.Count ).Select( i => this[ i ].Settings );

View file

@ -33,7 +33,7 @@ public partial class ConfigWindow
{ {
using var group = ImRaii.Group(); using var group = ImRaii.Group();
using var id = ImRaii.PushId( "##Inheritance" ); using var id = ImRaii.PushId( "##Inheritance" );
ImGui.TextUnformatted( "The current collection inherits from:" ); ImGui.TextUnformatted( $"The {SelectedCollection} inherits from:" );
DrawCurrentCollectionInheritance(); DrawCurrentCollectionInheritance();
DrawInheritanceTrashButton(); DrawInheritanceTrashButton();
DrawNewInheritanceSelection(); DrawNewInheritanceSelection();
@ -187,10 +187,10 @@ public partial class ConfigWindow
var tt = inheritance switch var tt = inheritance switch
{ {
ModCollection.ValidInheritance.Empty => "No valid collection to inherit from selected.", ModCollection.ValidInheritance.Empty => "No valid collection to inherit from selected.",
ModCollection.ValidInheritance.Valid => "Let the current collection inherit from the selected collection.", ModCollection.ValidInheritance.Valid => $"Let the {SelectedCollection} inherit from this collection.",
ModCollection.ValidInheritance.Self => "The collection can not inherit from itself.", ModCollection.ValidInheritance.Self => "The collection can not inherit from itself.",
ModCollection.ValidInheritance.Contained => "Already inheriting from the selected collection.", ModCollection.ValidInheritance.Contained => "Already inheriting from this collection.",
ModCollection.ValidInheritance.Circle => "Inheriting from selected collection would lead to cyclic inheritance.", ModCollection.ValidInheritance.Circle => "Inheriting from this collection would lead to cyclic inheritance.",
_ => string.Empty, _ => string.Empty,
}; };
if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Plus.ToIconString(), _window._iconButtonSize, tt, if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Plus.ToIconString(), _window._iconButtonSize, tt,
@ -311,7 +311,7 @@ public partial class ConfigWindow
} }
} }
ImGuiUtil.HoverTooltip( "Control + Right-Click to switch the current collection to this one." ImGuiUtil.HoverTooltip( $"Control + Right-Click to switch the {SelectedCollection} to this one."
+ ( withDelete ? "\nControl + Shift + Right-Click to remove this inheritance." : string.Empty ) ); + ( withDelete ? "\nControl + Shift + Right-Click to remove this inheritance." : string.Empty ) );
} }
} }

View file

@ -55,13 +55,14 @@ public partial class ConfigWindow
} }
// Only gets drawn when actually relevant. // Only gets drawn when actually relevant.
private static void DrawCleanCollectionButton() private static void DrawCleanCollectionButton( Vector2 width )
{ {
if( Penumbra.Config.ShowAdvanced && Penumbra.CollectionManager.Current.HasUnusedSettings ) if( Penumbra.Config.ShowAdvanced && Penumbra.CollectionManager.Current.HasUnusedSettings )
{ {
ImGui.SameLine(); ImGui.SameLine();
if( ImGuiUtil.DrawDisabledButton( "Clean Settings", Vector2.Zero if( ImGuiUtil.DrawDisabledButton(
, "Remove all stored settings for mods not currently available and fix invalid settings.\nUse at own risk." $"Clean {Penumbra.CollectionManager.Current.NumUnusedSettings} Unused Settings###CleanSettings", width
, "Remove all stored settings for mods not currently available and fix invalid settings.\n\nUse at own risk."
, false ) ) , false ) )
{ {
Penumbra.CollectionManager.Current.CleanUnavailableSettings(); Penumbra.CollectionManager.Current.CleanUnavailableSettings();
@ -70,11 +71,11 @@ public partial class ConfigWindow
} }
// Draw the new collection input as well as its buttons. // Draw the new collection input as well as its buttons.
private void DrawNewCollectionInput() private void DrawNewCollectionInput( Vector2 width )
{ {
// Input for new collection name. Also checks for validity when changed. // Input for new collection name. Also checks for validity when changed.
ImGui.SetNextItemWidth( _window._inputTextWidth.X ); ImGui.SetNextItemWidth( _window._inputTextWidth.X );
if( ImGui.InputTextWithHint( "##New Collection", "New Collection Name", ref _newCollectionName, 64 ) ) if( ImGui.InputTextWithHint( "##New Collection", "New Collection Name...", ref _newCollectionName, 64 ) )
{ {
_canAddCollection = Penumbra.CollectionManager.CanAddCollection( _newCollectionName, out _ ); _canAddCollection = Penumbra.CollectionManager.CanAddCollection( _newCollectionName, out _ );
} }
@ -82,40 +83,45 @@ public partial class ConfigWindow
ImGui.SameLine(); ImGui.SameLine();
ImGuiComponents.HelpMarker( ImGuiComponents.HelpMarker(
"A collection is a set of settings for your installed mods, including their enabled status, their priorities and their mod-specific configuration.\n" "A collection is a set of settings for your installed mods, including their enabled status, their priorities and their mod-specific configuration.\n"
+ "You can use multiple collections to quickly switch between sets of mods." ); + "You can use multiple collections to quickly switch between sets of enabled mods." );
// Creation buttons. // Creation buttons.
var tt = _canAddCollection ? string.Empty : "Please enter a unique name only consisting of symbols valid in a path but no '|' before creating a collection."; var tt = _canAddCollection
if( ImGuiUtil.DrawDisabledButton( "Create New Empty Collection", Vector2.Zero, tt, !_canAddCollection ) ) ? string.Empty
: "Please enter a unique name only consisting of symbols valid in a path but no '|' before creating a collection.";
if( ImGuiUtil.DrawDisabledButton( "Create Empty Collection", width, tt, !_canAddCollection ) )
{ {
CreateNewCollection( false ); CreateNewCollection( false );
} }
ImGui.SameLine(); ImGui.SameLine();
if( ImGuiUtil.DrawDisabledButton( "Duplicate Current Collection", Vector2.Zero, tt, !_canAddCollection ) ) if( ImGuiUtil.DrawDisabledButton( $"Duplicate {SelectedCollection}", width, tt, !_canAddCollection ) )
{ {
CreateNewCollection( true ); CreateNewCollection( true );
} }
// Deletion conditions.
var deleteCondition = Penumbra.CollectionManager.Current.Name != ModCollection.DefaultCollection;
tt = deleteCondition ? string.Empty : "You can not delete the default collection.";
ImGui.SameLine();
if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Trash.ToIconString(), Vector2.Zero, tt, !deleteCondition, true ) )
{
Penumbra.CollectionManager.RemoveCollection( Penumbra.CollectionManager.Current );
}
DrawCleanCollectionButton();
} }
private void DrawCurrentCollectionSelector() private void DrawCurrentCollectionSelector( Vector2 width )
{ {
using var group = ImRaii.Group(); using var group = ImRaii.Group();
DrawCollectionSelector( "##current", _window._inputTextWidth.X, CollectionType.Current, false, null ); DrawCollectionSelector( "##current", _window._inputTextWidth.X, CollectionType.Current, false, null );
ImGui.SameLine(); ImGui.SameLine();
ImGuiUtil.LabeledHelpMarker( "Current Collection", ImGuiUtil.LabeledHelpMarker( SelectedCollection,
"This collection will be modified when using the Installed Mods tab and making changes. It does not apply to anything by itself." ); "This collection will be modified when using the Installed Mods tab and making changes.\nIt is not automatically assigned to anything." );
// Deletion conditions.
var deleteCondition = Penumbra.CollectionManager.Current.Name != ModCollection.DefaultCollection;
var modifierHeld = Penumbra.Config.DeleteModModifier.IsActive();
var tt = deleteCondition
? modifierHeld ? string.Empty : $"Hold {Penumbra.Config.DeleteModModifier} while clicking to delete the collection."
: $"You can not delete the collection {ModCollection.DefaultCollection}.";
if( ImGuiUtil.DrawDisabledButton( $"Delete {SelectedCollection}", width, tt, !deleteCondition || !modifierHeld ) )
{
Penumbra.CollectionManager.RemoveCollection( Penumbra.CollectionManager.Current );
}
DrawCleanCollectionButton( width );
} }
private void DrawDefaultCollectionSelector() private void DrawDefaultCollectionSelector()
@ -123,16 +129,17 @@ public partial class ConfigWindow
using var group = ImRaii.Group(); using var group = ImRaii.Group();
DrawCollectionSelector( "##default", _window._inputTextWidth.X, CollectionType.Default, true, null ); DrawCollectionSelector( "##default", _window._inputTextWidth.X, CollectionType.Default, true, null );
ImGui.SameLine(); ImGui.SameLine();
ImGuiUtil.LabeledHelpMarker( "Default Collection", ImGuiUtil.LabeledHelpMarker( DefaultCollection,
"Mods in the default collection are loaded for any character that is not explicitly named in the character collections below.\n" ); $"Mods in the {DefaultCollection} are loaded for anything that is not associated with a character in the game "
+ "as well as any character for whom no more specific conditions from below apply." );
} }
// We do not check for valid character names. // We do not check for valid character names.
private void DrawNewSpecialCollection() private void DrawNewSpecialCollection()
{ {
const string description = "Special Collections apply to certain types of characters.\n" const string description = $"{CharacterGroups} apply to certain types of characters based on a condition.\n"
+ "All of them take precedence before the Default collection,\n" + $"All of them take precedence before the {DefaultCollection},\n"
+ "but all character collections take precedence before them."; + $"but all {IndividualAssignments} take precedence before them.";
ImGui.SetNextItemWidth( _window._inputTextWidth.X ); ImGui.SetNextItemWidth( _window._inputTextWidth.X );
if( _currentType == null || Penumbra.CollectionManager.ByType( _currentType.Value ) != null ) if( _currentType == null || Penumbra.CollectionManager.ByType( _currentType.Value ) != null )
@ -163,8 +170,10 @@ public partial class ConfigWindow
ImGui.SameLine(); ImGui.SameLine();
var disabled = _currentType == null; var disabled = _currentType == null;
var tt = disabled ? "Please select a special collection type before creating the collection.\n\n" + description : description; var tt = disabled
if( ImGuiUtil.DrawDisabledButton( "Create New Special Collection", Vector2.Zero, tt, disabled ) ) ? $"Please select a condition for a {GroupAssignment} before creating the collection.\n\n" + description
: description;
if( ImGuiUtil.DrawDisabledButton( $"Assign {ConditionalGroup}", new Vector2( 120 * ImGuiHelpers.GlobalScale, 0 ), tt, disabled ) )
{ {
Penumbra.CollectionManager.CreateSpecialCollection( _currentType!.Value ); Penumbra.CollectionManager.CreateSpecialCollection( _currentType!.Value );
_currentType = null; _currentType = null;
@ -174,36 +183,27 @@ public partial class ConfigWindow
// We do not check for valid character names. // We do not check for valid character names.
private void DrawNewCharacterCollection() private void DrawNewCharacterCollection()
{ {
const string description = "Character Collections apply specifically to game objects of the given name.\n" const string description = "Character Collections apply specifically to individual game objects of the given name.\n"
+ "The default collection does not apply to any character that has a character collection specified.\n" + $"More general {GroupAssignment} or the {DefaultCollection} do not apply if an .\n"
+ "Certain actors - like the ones in cutscenes or preview windows - will try to use appropriate character collections.\n"; + "Certain actors - like the ones in cutscenes or preview windows - will try to use appropriate character collections.\n";
ImGui.SetNextItemWidth( _window._inputTextWidth.X ); ImGui.SetNextItemWidth( _window._inputTextWidth.X );
ImGui.InputTextWithHint( "##NewCharacter", "New Character Name", ref _newCharacterName, 32 ); ImGui.InputTextWithHint( "##NewCharacter", "Character Name...", ref _newCharacterName, 32 );
ImGui.SameLine(); ImGui.SameLine();
var disabled = _newCharacterName.Length == 0; var disabled = _newCharacterName.Length == 0;
var tt = disabled ? "Please enter a Character name before creating the collection.\n\n" + description : description; var tt = disabled
if( ImGuiUtil.DrawDisabledButton( "Create New Character Collection", Vector2.Zero, tt, disabled ) ) ? $"Please enter the name of a {ConditionalIndividual} before assigning the collection.\n\n" + description
: description;
if( ImGuiUtil.DrawDisabledButton( $"Assign {ConditionalIndividual}", new Vector2( 120 * ImGuiHelpers.GlobalScale, 0 ), tt,
disabled ) )
{ {
Penumbra.CollectionManager.CreateCharacterCollection( _newCharacterName ); Penumbra.CollectionManager.CreateCharacterCollection( _newCharacterName );
_newCharacterName = string.Empty; _newCharacterName = string.Empty;
} }
} }
private void DrawActiveCollectionSelectors() private void DrawSpecialCollections()
{ {
ImGui.Dummy( _window._defaultSpace );
var open = ImGui.CollapsingHeader( "Active Collections", ImGuiTreeNodeFlags.DefaultOpen );
OpenTutorial( BasicTutorialSteps.ActiveCollections );
if( !open )
{
return;
}
ImGui.Dummy( _window._defaultSpace );
DrawDefaultCollectionSelector();
OpenTutorial( BasicTutorialSteps.DefaultCollection );
ImGui.Dummy( _window._defaultSpace );
foreach( var type in CollectionTypeExtensions.Special ) foreach( var type in CollectionTypeExtensions.Special )
{ {
var collection = Penumbra.CollectionManager.ByType( type ); var collection = Penumbra.CollectionManager.ByType( type );
@ -223,32 +223,65 @@ public partial class ConfigWindow
ImGuiUtil.LabeledHelpMarker( type.ToName(), type.ToDescription() ); ImGuiUtil.LabeledHelpMarker( type.ToName(), type.ToDescription() );
} }
} }
}
using( var group = ImRaii.Group() ) private void DrawSpecialAssignments()
{
using var _ = ImRaii.Group();
ImGui.TextUnformatted( CharacterGroups );
ImGui.Separator();
DrawSpecialCollections();
ImGui.Dummy( Vector2.Zero );
DrawNewSpecialCollection();
}
private void DrawIndividualAssignments()
{
using var _ = ImRaii.Group();
ImGui.TextUnformatted( $"Individual {ConditionalIndividual}s" );
ImGui.Separator();
foreach( var name in Penumbra.CollectionManager.Characters.Keys.OrderBy( k => k ).ToArray() )
{ {
DrawNewSpecialCollection(); using var id = ImRaii.PushId( name );
ImGui.Dummy( _window._defaultSpace ); DrawCollectionSelector( string.Empty, _window._inputTextWidth.X, CollectionType.Character, true, name );
ImGui.SameLine();
foreach( var name in Penumbra.CollectionManager.Characters.Keys.OrderBy( k => k ).ToArray() ) if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Trash.ToIconString(), _window._iconButtonSize, string.Empty,
false, true ) )
{ {
using var id = ImRaii.PushId( name ); Penumbra.CollectionManager.RemoveCharacterCollection( name );
DrawCollectionSelector( string.Empty, _window._inputTextWidth.X, CollectionType.Character, true, name );
ImGui.SameLine();
if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Trash.ToIconString(), _window._iconButtonSize, string.Empty,
false, true ) )
{
Penumbra.CollectionManager.RemoveCharacterCollection( name );
}
ImGui.SameLine();
ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted( name );
} }
DrawNewCharacterCollection(); ImGui.SameLine();
ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted( name );
} }
OpenTutorial( BasicTutorialSteps.SpecialCollections ); ImGui.Dummy( Vector2.Zero );
DrawNewCharacterCollection();
}
private void DrawActiveCollectionSelectors()
{
ImGui.Dummy( _window._defaultSpace );
var open = ImGui.CollapsingHeader( ActiveCollections, ImGuiTreeNodeFlags.DefaultOpen );
OpenTutorial( BasicTutorialSteps.ActiveCollections );
if( !open )
{
return;
}
ImGui.Dummy( _window._defaultSpace );
DrawDefaultCollectionSelector();
OpenTutorial( BasicTutorialSteps.DefaultCollection );
ImGui.Dummy( _window._defaultSpace );
DrawSpecialAssignments();
OpenTutorial( BasicTutorialSteps.SpecialCollections1 );
ImGui.Dummy( _window._defaultSpace );
DrawIndividualAssignments();
OpenTutorial( BasicTutorialSteps.SpecialCollections2 );
ImGui.Dummy( _window._defaultSpace ); ImGui.Dummy( _window._defaultSpace );
} }
@ -263,11 +296,12 @@ public partial class ConfigWindow
return; return;
} }
var width = new Vector2( ( _window._inputTextWidth.X - ImGui.GetStyle().ItemSpacing.X ) / 2, 0 );
ImGui.Dummy( _window._defaultSpace ); ImGui.Dummy( _window._defaultSpace );
DrawCurrentCollectionSelector(); DrawCurrentCollectionSelector( width );
OpenTutorial( BasicTutorialSteps.CurrentCollection ); OpenTutorial( BasicTutorialSteps.CurrentCollection );
ImGui.Dummy( _window._defaultSpace ); ImGui.Dummy( _window._defaultSpace );
DrawNewCollectionInput(); DrawNewCollectionInput( width );
ImGui.Dummy( _window._defaultSpace ); ImGui.Dummy( _window._defaultSpace );
DrawInheritanceBlock(); DrawInheritanceBlock();
OpenTutorial( BasicTutorialSteps.Inheritance ); OpenTutorial( BasicTutorialSteps.Inheritance );

View file

@ -1,12 +1,22 @@
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
namespace Penumbra.UI; namespace Penumbra.UI;
public partial class ConfigWindow public partial class ConfigWindow
{ {
public const string SelectedCollection = "Selected Collection";
public const string DefaultCollection = "Base Collection";
public const string ActiveCollections = "Active Collections";
public const string GroupAssignment = "Group Assignment";
public const string CharacterGroups = "Character Groups";
public const string ConditionalGroup = "Group";
public const string ConditionalIndividual = "Character";
public const string IndividualAssignments = "Individual Assignments";
private static void UpdateTutorialStep() private static void UpdateTutorialStep()
{ {
var tutorial = Tutorial.CurrentEnabledId( Penumbra.Config.TutorialStep ); var tutorial = Tutorial.CurrentEnabledId( Penumbra.Config.TutorialStep );
@ -38,7 +48,8 @@ public partial class ConfigWindow
Inheritance, Inheritance,
ActiveCollections, ActiveCollections,
DefaultCollection, DefaultCollection,
SpecialCollections, SpecialCollections1,
SpecialCollections2,
Mods, Mods,
ModImport, ModImport,
AdvancedHelp, AdvancedHelp,
@ -75,24 +86,29 @@ public partial class ConfigWindow
+ "Go here after setting up your root folder to continue the tutorial!" ) + "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" .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." ) + "In here, we can create new collections, delete collections, or make them inherit from each other." )
.Register( "Initial Setup, Step 5: Current Collection", .Register( $"Initial Setup, Step 5: {SelectedCollection}",
"We should already have a Default Collection, and for our simple setup, we do not need to do anything here.\n\n" $"The {SelectedCollection} is the one we are currently editing. Any changes we make in our mod settings later in the next tab 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." ) + $"We should already have a collection named {ModCollection.DefaultCollection} selected, and for our simple setup, we do not need to do anything here.\n\n" )
.Register( "Inheritance", .Register( "Inheritance",
"This is a more advanced feature. Click the help 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" .Register( $"Initial Setup, Step 6: {ActiveCollections}",
+ "Any collection in use will apply to the game under certain conditions.\n\n" $"{ActiveCollections} are those that are actually assigned to conditions at the moment.\n\n"
+ "The Current Collection is also active for technical reasons.\n\n" + "Any collection assigned here will apply to the game under certain conditions.\n\n"
+ $"The {SelectedCollection} is also active for technical reasons, while not necessarily being assigned to anything.\n\n"
+ "Open this now to continue." ) + "Open this now to continue." )
.Register( "Initial Setup, Step 7: Default Collection", .Register( $"Initial Setup, Step 7: {DefaultCollection}",
"The Default Collection - which should currently also be set to a collection named Default - is the main one.\n\n" $"The {DefaultCollection} - which should currently be set to a collection named {ModCollection.DefaultCollection} - 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" + $"As long as no more specific conditions apply to an object in the game, the mods from the {DefaultCollection} will be used.\n\n"
+ "This is also the collection you need to use for all UI mods." ) + "This is also the collection you need to use for all UI mods, music mods or any mods not associated with a character in the game at all." )
.Register( "Special Collections", .Register( GroupAssignment + 's',
"Special Collections are those that are used only for special characters in the game, either by specific conditions, or by name.\n\n" "Collections assigned here are used for groups of characters for which specific conditions are met.\n\n"
+ "We will skip this for now, but hovering over the creation buttons should explain how they work." ) + "The more specific the condition, the higher its priority (i.e. Your Character > Player Characters > Race).\n\n"
+ $"{IndividualAssignments} always take precedence before groups.")
.Register( IndividualAssignments,
"Collections assigned here are used only for individual characters or NPCs that have the specified name.\n\n"
+ "They may also apply to objects 'owned' by those characters, e.g. minions or mounts - see the general settings for options on this.\n\n" )
.Register( "Initial Setup, Step 8: Mods", "Our last stop is the Mods tab, where you can import and setup your mods.\n\n" .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." ) + $"Please go there after verifying that your {SelectedCollection} and {DefaultCollection} are setup to your liking." )
.Register( "Initial Setup, Step 9: Mod Import", .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" "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" + "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"
@ -100,8 +116,8 @@ public partial class ConfigWindow
.Register( "Advanced Help", "Click this button to get detailed information on what you can do in the mod selector.\n\n" .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." ) + "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( "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" .Register( "Collection Selectors", $"This row provides shortcuts to set your {SelectedCollection}.\n\n"
+ "The first button sets it to your Default Collection (if any).\n\n" + $"The first button sets it to your {DefaultCollection} (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 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." ) + "The third is a regular collection selector to let you choose among all your collections." )
.Register( "Initial Setup, Step 11: Enabling Mods", .Register( "Initial Setup, Step 11: Enabling Mods",