Add descriptions for SubMods

Adjusted importing of TexTools mods to give each option its own description instead of combining all option descriptions into the group description.
This commit is contained in:
Caraxi 2023-02-04 17:26:13 +10:30
parent e34aca68aa
commit 9f6a45041d
7 changed files with 64 additions and 19 deletions

View file

@ -173,7 +173,6 @@ public partial class TexToolsImporter
{ {
var name = numGroups == 1 ? _currentGroupName : $"{_currentGroupName}, Part {groupId + 1}"; var name = numGroups == 1 ? _currentGroupName : $"{_currentGroupName}, Part {groupId + 1}";
options.Clear(); options.Clear();
var description = new StringBuilder();
var groupFolder = Mod.NewSubFolderName( _currentModDirectory, name ) var groupFolder = Mod.NewSubFolderName( _currentModDirectory, name )
?? new DirectoryInfo( Path.Combine( _currentModDirectory.FullName, ?? new DirectoryInfo( Path.Combine( _currentModDirectory.FullName,
numGroups == 1 ? $"Group {groupPriority + 1}" : $"Group {groupPriority + 1}, Part {groupId + 1}" ) ); numGroups == 1 ? $"Group {groupPriority + 1}" : $"Group {groupPriority + 1}, Part {groupId + 1}" ) );
@ -188,12 +187,6 @@ public partial class TexToolsImporter
?? new DirectoryInfo( Path.Combine( groupFolder.FullName, $"Option {i + optionIdx + 1}" ) ); ?? new DirectoryInfo( Path.Combine( groupFolder.FullName, $"Option {i + optionIdx + 1}" ) );
ExtractSimpleModList( optionFolder, option.ModsJsons ); ExtractSimpleModList( optionFolder, option.ModsJsons );
options.Add( Mod.CreateSubMod( _currentModDirectory, optionFolder, option ) ); options.Add( Mod.CreateSubMod( _currentModDirectory, optionFolder, option ) );
description.Append( option.Description );
if( !string.IsNullOrEmpty( option.Description ) )
{
description.Append( '\n' );
}
if( option.IsChecked ) if( option.IsChecked )
{ {
defaultSettings = group.SelectionType == GroupType.Multi defaultSettings = group.SelectionType == GroupType.Multi
@ -220,7 +213,7 @@ public partial class TexToolsImporter
} }
Mod.CreateOptionGroup( _currentModDirectory, group.SelectionType, name, groupPriority, groupPriority, Mod.CreateOptionGroup( _currentModDirectory, group.SelectionType, name, groupPriority, groupPriority,
defaultSettings ?? 0, description.ToString(), options ); defaultSettings ?? 0, string.Empty, options );
++groupPriority; ++groupPriority;
} }
} }

View file

@ -124,6 +124,23 @@ public sealed partial class Mod
ModOptionChanged.Invoke( ModOptionChangeType.DisplayChange, mod, groupIdx, -1, -1 ); ModOptionChanged.Invoke( ModOptionChangeType.DisplayChange, mod, groupIdx, -1, -1 );
} }
public void ChangeOptionDescription( Mod mod, int groupIdx, int optionIdx, string newDescription )
{
var group = mod._groups[ groupIdx ];
var option = group[ optionIdx ];
if( option.Description == newDescription )
{
return;
}
var _ = option switch
{
SubMod s => s.Description = newDescription,
};
ModOptionChanged.Invoke( ModOptionChangeType.DisplayChange, mod, groupIdx, optionIdx, -1 );
}
public void ChangeGroupPriority( Mod mod, int groupIdx, int newPriority ) public void ChangeGroupPriority( Mod mod, int groupIdx, int newPriority )
{ {
var group = mod._groups[ groupIdx ]; var group = mod._groups[ groupIdx ];

View file

@ -116,6 +116,7 @@ public partial class Mod
var mod = new SubMod( null! ) // Mod is irrelevant here, only used for saving. var mod = new SubMod( null! ) // Mod is irrelevant here, only used for saving.
{ {
Name = option.Name, Name = option.Name,
Description = option.Description,
}; };
foreach( var (_, gamePath, file) in list ) foreach( var (_, gamePath, file) in list )
{ {

View file

@ -10,6 +10,7 @@ public interface ISubMod
{ {
public string Name { get; } public string Name { get; }
public string FullName { get; } public string FullName { get; }
public string Description { get; }
public IReadOnlyDictionary< Utf8GamePath, FullPath > Files { get; } public IReadOnlyDictionary< Utf8GamePath, FullPath > Files { get; }
public IReadOnlyDictionary< Utf8GamePath, FullPath > FileSwaps { get; } public IReadOnlyDictionary< Utf8GamePath, FullPath > FileSwaps { get; }
@ -22,6 +23,8 @@ public interface ISubMod
j.WriteStartObject(); j.WriteStartObject();
j.WritePropertyName( nameof( Name ) ); j.WritePropertyName( nameof( Name ) );
j.WriteValue( mod.Name ); j.WriteValue( mod.Name );
j.WritePropertyName( nameof(Description) );
j.WriteValue( mod.Description );
if( priority != null ) if( priority != null )
{ {
j.WritePropertyName( nameof( IModGroup.Priority ) ); j.WritePropertyName( nameof( IModGroup.Priority ) );

View file

@ -107,6 +107,8 @@ public partial class Mod
public string FullName public string FullName
=> GroupIdx < 0 ? "Default Option" : $"{ParentMod.Groups[ GroupIdx ].Name}: {Name}"; => GroupIdx < 0 ? "Default Option" : $"{ParentMod.Groups[ GroupIdx ].Name}: {Name}";
public string Description { get; set; } = string.Empty;
internal IMod ParentMod { get; private init; } internal IMod ParentMod { get; private init; }
internal int GroupIdx { get; private set; } internal int GroupIdx { get; private set; }
internal int OptionIdx { get; private set; } internal int OptionIdx { get; private set; }
@ -143,8 +145,9 @@ public partial class Mod
ManipulationData.Clear(); ManipulationData.Clear();
// Every option has a name, but priorities are only relevant for multi group options. // Every option has a name, but priorities are only relevant for multi group options.
Name = json[ nameof( ISubMod.Name ) ]?.ToObject< string >() ?? string.Empty; Name = json[ nameof( ISubMod.Name ) ]?.ToObject< string >() ?? string.Empty;
priority = json[ nameof( IModGroup.Priority ) ]?.ToObject< int >() ?? 0; Description = json[ nameof( ISubMod.Description ) ]?.ToObject< string >() ?? string.Empty;
priority = json[ nameof( IModGroup.Priority ) ]?.ToObject< int >() ?? 0;
var files = ( JObject? )json[ nameof( Files ) ]; var files = ( JObject? )json[ nameof( Files ) ];
if( files != null ) if( files != null )

View file

@ -301,16 +301,18 @@ public partial class ConfigWindow
// Open a popup to edit a multi-line mod or option description. // Open a popup to edit a multi-line mod or option description.
private static class DescriptionEdit private static class DescriptionEdit
{ {
private const string PopupName = "Edit Description"; private const string PopupName = "Edit Description";
private static string _newDescription = string.Empty; private static string _newDescription = string.Empty;
private static int _newDescriptionIdx = -1; private static int _newDescriptionIdx = -1;
private static int _newDesriptionOptionIdx = -1;
private static Mod? _mod; private static Mod? _mod;
public static void OpenPopup( Mod mod, int groupIdx ) public static void OpenPopup( Mod mod, int groupIdx, int optionIdx = -1 )
{ {
_newDescriptionIdx = groupIdx; _newDescriptionIdx = groupIdx;
_newDescription = groupIdx < 0 ? mod.Description : mod.Groups[ groupIdx ].Description; _newDesriptionOptionIdx = optionIdx;
_mod = mod; _newDescription = groupIdx < 0 ? mod.Description : optionIdx < 0 ? mod.Groups[ groupIdx ].Description : mod.Groups[ groupIdx ][ optionIdx ].Description;
_mod = mod;
ImGui.OpenPopup( PopupName ); ImGui.OpenPopup( PopupName );
} }
@ -355,7 +357,14 @@ public partial class ConfigWindow
Penumbra.ModManager.ChangeModDescription( _mod.Index, _newDescription ); Penumbra.ModManager.ChangeModDescription( _mod.Index, _newDescription );
break; break;
case >= 0: case >= 0:
Penumbra.ModManager.ChangeGroupDescription( _mod, _newDescriptionIdx, _newDescription ); if( _newDesriptionOptionIdx < 0 )
{
Penumbra.ModManager.ChangeGroupDescription( _mod, _newDescriptionIdx, _newDescription );
}
else
{
Penumbra.ModManager.ChangeOptionDescription( _mod, _newDescriptionIdx, _newDesriptionOptionIdx, _newDescription );
}
break; break;
} }
@ -468,7 +477,7 @@ public partial class ConfigWindow
public static void Draw( ModPanel panel, int groupIdx ) public static void Draw( ModPanel panel, int groupIdx )
{ {
using var table = ImRaii.Table( string.Empty, 5, ImGuiTableFlags.SizingFixedFit ); using var table = ImRaii.Table( string.Empty, 6, ImGuiTableFlags.SizingFixedFit );
if( !table ) if( !table )
{ {
return; return;
@ -478,6 +487,7 @@ public partial class ConfigWindow
ImGui.TableSetupColumn( "default", ImGuiTableColumnFlags.WidthFixed, ImGui.GetFrameHeight() ); ImGui.TableSetupColumn( "default", ImGuiTableColumnFlags.WidthFixed, ImGui.GetFrameHeight() );
ImGui.TableSetupColumn( "name", ImGuiTableColumnFlags.WidthFixed, ImGui.TableSetupColumn( "name", ImGuiTableColumnFlags.WidthFixed,
panel._window._inputTextWidth.X - 68 * ImGuiHelpers.GlobalScale - ImGui.GetFrameHeight() ); panel._window._inputTextWidth.X - 68 * ImGuiHelpers.GlobalScale - ImGui.GetFrameHeight() );
ImGui.TableSetupColumn( "description", ImGuiTableColumnFlags.WidthFixed, panel._window._iconButtonSize.X );
ImGui.TableSetupColumn( "delete", ImGuiTableColumnFlags.WidthFixed, panel._window._iconButtonSize.X ); ImGui.TableSetupColumn( "delete", ImGuiTableColumnFlags.WidthFixed, panel._window._iconButtonSize.X );
ImGui.TableSetupColumn( "priority", ImGuiTableColumnFlags.WidthFixed, 50 * ImGuiHelpers.GlobalScale ); ImGui.TableSetupColumn( "priority", ImGuiTableColumnFlags.WidthFixed, 50 * ImGuiHelpers.GlobalScale );
@ -532,6 +542,11 @@ public partial class ConfigWindow
Penumbra.ModManager.RenameOption( panel._mod, groupIdx, optionIdx, newOptionName ); Penumbra.ModManager.RenameOption( panel._mod, groupIdx, optionIdx, newOptionName );
} }
ImGui.TableNextColumn();
if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Edit.ToIconString(), panel._window._iconButtonSize, "Edit option description.", false, true ) )
{
panel._delayedActions.Enqueue( () => DescriptionEdit.OpenPopup( panel._mod, groupIdx, optionIdx ) );
}
ImGui.TableNextColumn(); ImGui.TableNextColumn();
if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Trash.ToIconString(), panel._window._iconButtonSize, if( ImGuiUtil.DrawDisabledButton( FontAwesomeIcon.Trash.ToIconString(), panel._window._iconButtonSize,
"Delete this option.\nHold Control while clicking to delete.", !ImGui.GetIO().KeyCtrl, true ) ) "Delete this option.\nHold Control while clicking to delete.", !ImGui.GetIO().KeyCtrl, true ) )

View file

@ -1,6 +1,7 @@
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Components;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
@ -179,6 +180,12 @@ public partial class ConfigWindow
Penumbra.CollectionManager.Current.SetModSetting( _mod.Index, groupIdx, ( uint )idx2 ); Penumbra.CollectionManager.Current.SetModSetting( _mod.Index, groupIdx, ( uint )idx2 );
} }
if( !string.IsNullOrEmpty( group[ idx2 ].Description ) )
{
ImGui.SameLine();
ImGuiComponents.HelpMarker(group[idx2].Description);
}
id.Pop(); id.Pop();
} }
} }
@ -213,6 +220,12 @@ public partial class ConfigWindow
Penumbra.CollectionManager.Current.SetModSetting( _mod.Index, groupIdx, flags ); Penumbra.CollectionManager.Current.SetModSetting( _mod.Index, groupIdx, flags );
} }
if( !string.IsNullOrEmpty( group[ idx2 ].Description ) )
{
ImGui.SameLine();
ImGuiComponents.HelpMarker(group[idx2].Description);
}
id.Pop(); id.Pop();
} }