Allow filtering designs for contained items.

This commit is contained in:
Ottermandias 2023-11-10 18:30:01 +01:00
parent a3583dd5f1
commit 36f6c48f7a
2 changed files with 21 additions and 1 deletions

View file

@ -3,6 +3,7 @@ using System.Buffers.Text;
using System.Runtime.CompilerServices;
using Glamourer.Customization;
using Glamourer.Services;
using OtterGui.Classes;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.String.Functions;
@ -39,6 +40,20 @@ public unsafe struct DesignData
public DesignData()
{ }
public bool ContainsName(LowerString name)
=> name.IsContained(_nameHead)
|| name.IsContained(_nameBody)
|| name.IsContained(_nameHands)
|| name.IsContained(_nameLegs)
|| name.IsContained(_nameFeet)
|| name.IsContained(_nameEars)
|| name.IsContained(_nameNeck)
|| name.IsContained(_nameWrists)
|| name.IsContained(_nameRFinger)
|| name.IsContained(_nameLFinger)
|| name.IsContained(_nameMainhand)
|| name.IsContained(_nameOffhand);
public readonly StainId Stain(EquipSlot slot)
{
var index = slot.ToIndex();

View file

@ -173,7 +173,8 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
else if (design != null)
_designManager.CreateClone(design, _newName, true);
else
Glamourer.Messager.NotificationMessage("Could not create a design, clipboard did not contain valid design data.", NotificationType.Error, false);
Glamourer.Messager.NotificationMessage("Could not create a design, clipboard did not contain valid design data.",
NotificationType.Error, false);
_clipboardText = null;
}
else if (_cloneDesign != null)
@ -206,6 +207,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
FilterTooltip = "Filter designs for those where their full paths or names contain the given substring.\n"
+ "Enter m:[string] to filter for designs with with a mod association containing the string.\n"
+ "Enter t:[string] to filter for designs set to specific tags.\n"
+ "Enter i:[string] to filter for designs containing specific items.\n"
+ "Enter n:[string] to filter only for design names and no paths.";
}
@ -224,6 +226,8 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
'M' => filterValue.Length == 2 ? (LowerString.Empty, -1) : (new LowerString(filterValue[2..]), 2),
't' => filterValue.Length == 2 ? (LowerString.Empty, -1) : (new LowerString(filterValue[2..]), 3),
'T' => filterValue.Length == 2 ? (LowerString.Empty, -1) : (new LowerString(filterValue[2..]), 3),
'i' => filterValue.Length == 2 ? (LowerString.Empty, -1) : (new LowerString(filterValue[2..]), 4),
'I' => filterValue.Length == 2 ? (LowerString.Empty, -1) : (new LowerString(filterValue[2..]), 4),
_ => (new LowerString(filterValue), 0),
},
_ => (new LowerString(filterValue), 0),
@ -259,6 +263,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
1 => !design.Name.Contains(_designFilter),
2 => !design.AssociatedMods.Any(kvp => _designFilter.IsContained(kvp.Key.Name)),
3 => !design.Tags.Any(_designFilter.IsContained),
4 => !design.DesignData.ContainsName(_designFilter),
_ => false, // Should never happen
};
}