197 lines
5.8 KiB
C#
197 lines
5.8 KiB
C#
using Dalamud.Interface.Utility.Raii;
|
|
using MareSynchronos.API.Dto.CharaData;
|
|
using MareSynchronos.MareConfiguration.Models;
|
|
using MareSynchronos.Services.CharaData.Models;
|
|
using System.Text;
|
|
|
|
namespace MareSynchronos.UI;
|
|
|
|
internal sealed partial class CharaDataHubUi
|
|
{
|
|
private static string GetAccessTypeString(AccessTypeDto dto) => dto switch
|
|
{
|
|
AccessTypeDto.AllPairs => "All Pairs",
|
|
AccessTypeDto.ClosePairs => "Direct Pairs",
|
|
AccessTypeDto.Individuals => "Specified",
|
|
AccessTypeDto.Public => "Everyone",
|
|
_ => ((int)dto).ToString()
|
|
};
|
|
|
|
private static string GetShareTypeString(ShareTypeDto dto) => dto switch
|
|
{
|
|
ShareTypeDto.Private => "Code Only",
|
|
ShareTypeDto.Shared => "Shared",
|
|
_ => ((int)dto).ToString()
|
|
};
|
|
|
|
private static string GetWorldDataTooltipText(PoseEntryExtended poseEntry)
|
|
{
|
|
if (!poseEntry.HasWorldData) return "This Pose has no world data attached.";
|
|
return poseEntry.WorldDataDescriptor;
|
|
}
|
|
|
|
|
|
private void GposeMetaInfoAction(Action<CharaDataMetaInfoExtendedDto?> gposeActionDraw, string actionDescription, CharaDataMetaInfoExtendedDto? dto, bool hasValidGposeTarget, bool isSpawning)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.AppendLine(actionDescription);
|
|
bool isDisabled = false;
|
|
|
|
void AddErrorStart(StringBuilder sb)
|
|
{
|
|
sb.Append(UiSharedService.TooltipSeparator);
|
|
sb.AppendLine("Cannot execute:");
|
|
}
|
|
|
|
if (dto == null)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- No metainfo present");
|
|
isDisabled = true;
|
|
}
|
|
if (!dto?.CanBeDownloaded ?? false)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Character is not downloadable");
|
|
isDisabled = true;
|
|
}
|
|
if (!_uiSharedService.IsInGpose)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires to be in GPose");
|
|
isDisabled = true;
|
|
}
|
|
if (!hasValidGposeTarget && !isSpawning)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires a valid GPose target");
|
|
isDisabled = true;
|
|
}
|
|
if (isSpawning && !_charaDataManager.BrioAvailable)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires Brio to be installed.");
|
|
isDisabled = true;
|
|
}
|
|
|
|
using (ImRaii.Group())
|
|
{
|
|
using var dis = ImRaii.Disabled(isDisabled);
|
|
gposeActionDraw.Invoke(dto);
|
|
}
|
|
if (sb.Length > 0)
|
|
{
|
|
UiSharedService.AttachToolTip(sb.ToString());
|
|
}
|
|
}
|
|
|
|
private void GposePoseAction(Action poseActionDraw, string poseDescription, bool hasValidGposeTarget)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.AppendLine(poseDescription);
|
|
bool isDisabled = false;
|
|
|
|
void AddErrorStart(StringBuilder sb)
|
|
{
|
|
sb.Append(UiSharedService.TooltipSeparator);
|
|
sb.AppendLine("Cannot execute:");
|
|
}
|
|
|
|
if (!_uiSharedService.IsInGpose)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires to be in GPose");
|
|
isDisabled = true;
|
|
}
|
|
if (!hasValidGposeTarget)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires a valid GPose target");
|
|
isDisabled = true;
|
|
}
|
|
if (!_charaDataManager.BrioAvailable)
|
|
{
|
|
if (!isDisabled) AddErrorStart(sb);
|
|
sb.AppendLine("- Requires Brio to be installed.");
|
|
isDisabled = true;
|
|
}
|
|
|
|
using (ImRaii.Group())
|
|
{
|
|
using var dis = ImRaii.Disabled(isDisabled);
|
|
poseActionDraw.Invoke();
|
|
}
|
|
if (sb.Length > 0)
|
|
{
|
|
UiSharedService.AttachToolTip(sb.ToString());
|
|
}
|
|
}
|
|
|
|
private void SetWindowSizeConstraints(bool? inGposeTab = null)
|
|
{
|
|
SizeConstraints = new()
|
|
{
|
|
MinimumSize = new((inGposeTab ?? false) ? 400 : 1000, 500),
|
|
MaximumSize = new((inGposeTab ?? false) ? 400 : 1000, 2000)
|
|
};
|
|
}
|
|
|
|
private void UpdateFilteredFavorites()
|
|
{
|
|
_ = Task.Run(async () =>
|
|
{
|
|
if (_charaDataManager.DownloadMetaInfoTask != null)
|
|
{
|
|
await _charaDataManager.DownloadMetaInfoTask.ConfigureAwait(false);
|
|
}
|
|
Dictionary<string, (CharaDataFavorite, CharaDataMetaInfoExtendedDto?, bool)> newFiltered = [];
|
|
foreach (var favorite in _configService.Current.FavoriteCodes)
|
|
{
|
|
var uid = favorite.Key.Split(":")[0];
|
|
var note = _serverConfigurationManager.GetNoteForUid(uid) ?? string.Empty;
|
|
bool hasMetaInfo = _charaDataManager.TryGetMetaInfo(favorite.Key, out var metaInfo);
|
|
bool addFavorite =
|
|
(string.IsNullOrEmpty(_filterCodeNote)
|
|
|| (note.Contains(_filterCodeNote, StringComparison.OrdinalIgnoreCase)
|
|
|| uid.Contains(_filterCodeNote, StringComparison.OrdinalIgnoreCase)))
|
|
&& (string.IsNullOrEmpty(_filterDescription)
|
|
|| (favorite.Value.CustomDescription.Contains(_filterDescription, StringComparison.OrdinalIgnoreCase)
|
|
|| (metaInfo != null && metaInfo!.Description.Contains(_filterDescription, StringComparison.OrdinalIgnoreCase))))
|
|
&& (!_filterPoseOnly
|
|
|| (metaInfo != null && metaInfo!.HasPoses))
|
|
&& (!_filterWorldOnly
|
|
|| (metaInfo != null && metaInfo!.HasWorldData));
|
|
if (addFavorite)
|
|
{
|
|
newFiltered[favorite.Key] = (favorite.Value, metaInfo, hasMetaInfo);
|
|
}
|
|
}
|
|
|
|
_filteredFavorites = newFiltered;
|
|
});
|
|
}
|
|
|
|
private void UpdateFilteredItems()
|
|
{
|
|
if (_charaDataManager.GetSharedWithYouTask == null)
|
|
{
|
|
_filteredDict = _charaDataManager.SharedWithYouData
|
|
.SelectMany(k => k.Value)
|
|
.Where(k =>
|
|
(!_sharedWithYouDownloadableFilter || k.CanBeDownloaded)
|
|
&& (string.IsNullOrEmpty(_sharedWithYouDescriptionFilter) || k.Description.Contains(_sharedWithYouDescriptionFilter, StringComparison.OrdinalIgnoreCase)))
|
|
.GroupBy(k => k.Uploader)
|
|
.ToDictionary(k =>
|
|
{
|
|
var note = _serverConfigurationManager.GetNoteForUid(k.Key.UID);
|
|
if (note == null) return k.Key.AliasOrUID;
|
|
return $"{note} ({k.Key.AliasOrUID})";
|
|
}, k => k.ToList(), StringComparer.OrdinalIgnoreCase)
|
|
.Where(k => (string.IsNullOrEmpty(_sharedWithYouOwnerFilter) || k.Key.Contains(_sharedWithYouOwnerFilter, StringComparison.OrdinalIgnoreCase)))
|
|
.OrderBy(k => k.Key, StringComparer.OrdinalIgnoreCase).ToDictionary();
|
|
}
|
|
}
|
|
}
|