Fix UI & BubbleType position
This commit is contained in:
@@ -86,6 +86,7 @@ public class MareConfig : IMareConfiguration
|
|||||||
public bool ExtraChatTags { get; set; } = false;
|
public bool ExtraChatTags { get; set; } = false;
|
||||||
public bool TypingIndicatorShowOnNameplates { get; set; } = true;
|
public bool TypingIndicatorShowOnNameplates { get; set; } = true;
|
||||||
public bool TypingIndicatorShowOnPartyList { get; set; } = true;
|
public bool TypingIndicatorShowOnPartyList { get; set; } = true;
|
||||||
|
public TypingIndicatorBubbleSize TypingIndicatorBubbleSize { get; set; } = TypingIndicatorBubbleSize.Large;
|
||||||
|
|
||||||
public bool MareAPI { get; set; } = true;
|
public bool MareAPI { get; set; } = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MareSynchronos.MareConfiguration.Models;
|
||||||
|
|
||||||
|
public enum TypingIndicatorBubbleSize
|
||||||
|
{
|
||||||
|
Small,
|
||||||
|
Medium,
|
||||||
|
Large
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AssemblyName>UmbraSync</AssemblyName>
|
<AssemblyName>UmbraSync</AssemblyName>
|
||||||
<RootNamespace>UmbraSync</RootNamespace>
|
<RootNamespace>UmbraSync</RootNamespace>
|
||||||
<Version>0.1.9.2</Version>
|
<Version>0.1.9.4</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ using Microsoft.Extensions.Logging;
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;
|
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;
|
||||||
using DalamudGameObject = Dalamud.Game.ClientState.Objects.Types.IGameObject;
|
using DalamudGameObject = Dalamud.Game.ClientState.Objects.Types.IGameObject;
|
||||||
|
|
||||||
@@ -52,6 +54,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
private readonly ILogger<DalamudUtilService> _logger;
|
private readonly ILogger<DalamudUtilService> _logger;
|
||||||
private readonly IObjectTable _objectTable;
|
private readonly IObjectTable _objectTable;
|
||||||
private readonly PerformanceCollectorService _performanceCollector;
|
private readonly PerformanceCollectorService _performanceCollector;
|
||||||
|
private readonly Dictionary<string, ConditionFlag> _conditionLookup = new(StringComparer.OrdinalIgnoreCase);
|
||||||
private uint? _classJobId = 0;
|
private uint? _classJobId = 0;
|
||||||
private DateTime _delayedFrameworkUpdateCheck = DateTime.UtcNow;
|
private DateTime _delayedFrameworkUpdateCheck = DateTime.UtcNow;
|
||||||
private string _lastGlobalBlockPlayer = string.Empty;
|
private string _lastGlobalBlockPlayer = string.Empty;
|
||||||
@@ -172,6 +175,20 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
public bool IsInCombatOrPerforming { get; private set; } = false;
|
public bool IsInCombatOrPerforming { get; private set; } = false;
|
||||||
public bool HasModifiedGameFiles => _gameData.HasModifiedGameDataFiles;
|
public bool HasModifiedGameFiles => _gameData.HasModifiedGameDataFiles;
|
||||||
|
|
||||||
|
public bool IsConditionActive(string flagName)
|
||||||
|
{
|
||||||
|
if (_conditionLookup.TryGetValue(flagName, out var cachedFlag))
|
||||||
|
return _condition[cachedFlag];
|
||||||
|
|
||||||
|
if (Enum.TryParse<ConditionFlag>(flagName, true, out var flag))
|
||||||
|
{
|
||||||
|
_conditionLookup[flagName] = flag;
|
||||||
|
return _condition[flag];
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public Lazy<Dictionary<ushort, string>> WorldData { get; private set; }
|
public Lazy<Dictionary<ushort, string>> WorldData { get; private set; }
|
||||||
public Lazy<Dictionary<int, Lumina.Excel.Sheets.UIColor>> UiColors { get; private set; }
|
public Lazy<Dictionary<int, Lumina.Excel.Sheets.UIColor>> UiColors { get; private set; }
|
||||||
public Lazy<Dictionary<uint, string>> TerritoryData { get; private set; }
|
public Lazy<Dictionary<uint, string>> TerritoryData { get; private set; }
|
||||||
|
|||||||
@@ -169,6 +169,10 @@ public sealed class ChangelogUi : WindowMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
return new List<ChangelogEntry>
|
return new List<ChangelogEntry>
|
||||||
{
|
{
|
||||||
|
new(new Version(0, 1, 9, 3), "0.1.9.3", new List<ChangelogLine>
|
||||||
|
{
|
||||||
|
new("Correctif de l'affichage de la bulle de frappe quand l'interface est à + de 100%."),
|
||||||
|
}),
|
||||||
new(new Version(0, 1, 9, 2), "0.1.9.2", new List<ChangelogLine>
|
new(new Version(0, 1, 9, 2), "0.1.9.2", new List<ChangelogLine>
|
||||||
{
|
{
|
||||||
new("Correctif de l'affichage de la bulle de frappe."),
|
new("Correctif de l'affichage de la bulle de frappe."),
|
||||||
|
|||||||
@@ -15,14 +15,14 @@ internal sealed partial class CharaDataHubUi
|
|||||||
if (!_charaDataManager.BrioAvailable)
|
if (!_charaDataManager.BrioAvailable)
|
||||||
{
|
{
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
UiSharedService.DrawGroupedCenteredColorText("BRIO IS MANDATORY FOR GPOSE TOGETHER.", ImGuiColors.DalamudRed);
|
UiSharedService.DrawGroupedCenteredColorText("BRIO IS MANDATORY FOR GPOSE TOGETHER.", UiSharedService.AccentColor);
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_uiSharedService.ApiController.IsConnected)
|
if (!_uiSharedService.ApiController.IsConnected)
|
||||||
{
|
{
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
UiSharedService.DrawGroupedCenteredColorText("CANNOT USE GPOSE TOGETHER WHILE DISCONNECTED FROM THE SERVER.", ImGuiColors.DalamudRed);
|
UiSharedService.DrawGroupedCenteredColorText("CANNOT USE GPOSE TOGETHER WHILE DISCONNECTED FROM THE SERVER.", UiSharedService.AccentColor);
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
UiSharedService.AttachToolTip(user.WorldDataDescriptor + UiSharedService.TooltipSeparator);
|
UiSharedService.AttachToolTip(user.WorldDataDescriptor + UiSharedService.TooltipSeparator);
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Map, sameMapAndServer.SameMap ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed);
|
_uiSharedService.IconText(FontAwesomeIcon.Map, sameMapAndServer.SameMap ? ImGuiColors.ParsedGreen : UiSharedService.AccentColor);
|
||||||
if (ImGui.IsItemClicked(ImGuiMouseButton.Left) && user.WorldData != null)
|
if (ImGui.IsItemClicked(ImGuiMouseButton.Left) && user.WorldData != null)
|
||||||
{
|
{
|
||||||
_dalamudUtilService.SetMarkerAndOpenMap(new(user.WorldData.Value.PositionX, user.WorldData.Value.PositionY, user.WorldData.Value.PositionZ), user.Map);
|
_dalamudUtilService.SetMarkerAndOpenMap(new(user.WorldData.Value.PositionX, user.WorldData.Value.PositionY, user.WorldData.Value.PositionZ), user.Map);
|
||||||
@@ -175,12 +175,12 @@ internal sealed partial class CharaDataHubUi
|
|||||||
+ "Note: For GPose synchronization to work properly, you must be on the same map.");
|
+ "Note: For GPose synchronization to work properly, you must be on the same map.");
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Globe, sameMapAndServer.SameServer ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed);
|
_uiSharedService.IconText(FontAwesomeIcon.Globe, sameMapAndServer.SameServer ? ImGuiColors.ParsedGreen : UiSharedService.AccentColor);
|
||||||
UiSharedService.AttachToolTip((sameMapAndServer.SameMap ? "You are on the same server." : "You are not on the same server.") + UiSharedService.TooltipSeparator
|
UiSharedService.AttachToolTip((sameMapAndServer.SameMap ? "You are on the same server." : "You are not on the same server.") + UiSharedService.TooltipSeparator
|
||||||
+ "Note: GPose synchronization is not dependent on the current server, but you will have to spawn a character for the other lobby users.");
|
+ "Note: GPose synchronization is not dependent on the current server, but you will have to spawn a character for the other lobby users.");
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Running, sameMapAndServer.SameEverything ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed);
|
_uiSharedService.IconText(FontAwesomeIcon.Running, sameMapAndServer.SameEverything ? ImGuiColors.ParsedGreen : UiSharedService.AccentColor);
|
||||||
UiSharedService.AttachToolTip(sameMapAndServer.SameEverything ? "You are in the same instanced area." : "You are not the same instanced area." + UiSharedService.TooltipSeparator +
|
UiSharedService.AttachToolTip(sameMapAndServer.SameEverything ? "You are in the same instanced area." : "You are not the same instanced area." + UiSharedService.TooltipSeparator +
|
||||||
"Note: Users not in your instance, but on the same map, will be drawn as floating wisps." + Environment.NewLine
|
"Note: Users not in your instance, but on the same map, will be drawn as floating wisps." + Environment.NewLine
|
||||||
+ "Note: GPose synchronization is not dependent on the current instance, but you will have to spawn a character for the other lobby users.");
|
+ "Note: GPose synchronization is not dependent on the current instance, but you will have to spawn a character for the other lobby users.");
|
||||||
@@ -217,7 +217,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
if (_uiSharedService.IsInGpose && user.Address == nint.Zero)
|
if (_uiSharedService.IsInGpose && user.Address == nint.Zero)
|
||||||
{
|
{
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.ExclamationTriangle, ImGuiColors.DalamudRed);
|
_uiSharedService.IconText(FontAwesomeIcon.ExclamationTriangle, UiSharedService.AccentColor);
|
||||||
UiSharedService.AttachToolTip("No valid character assigned for this user. Pose data will not be applied.");
|
UiSharedService.AttachToolTip("No valid character assigned for this user. Pose data will not be applied.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
if (canUpdate)
|
if (canUpdate)
|
||||||
{
|
{
|
||||||
ImGui.AlignTextToFramePadding();
|
ImGui.AlignTextToFramePadding();
|
||||||
UiSharedService.ColorTextWrapped("Warning: You have unsaved changes!", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Warning: You have unsaved changes!", UiSharedService.AccentColor);
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
using (ImRaii.Disabled(_charaDataManager.CharaUpdateTask != null && !_charaDataManager.CharaUpdateTask.IsCompleted))
|
using (ImRaii.Disabled(_charaDataManager.CharaUpdateTask != null && !_charaDataManager.CharaUpdateTask.IsCompleted))
|
||||||
{
|
{
|
||||||
@@ -216,7 +216,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped($"{dataDto.MissingFiles.DistinctBy(k => k.HashOrFileSwap).Count()} files to download this character data are missing on the server", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped($"{dataDto.MissingFiles.DistinctBy(k => k.HashOrFileSwap).Count()} files to download this character data are missing on the server", UiSharedService.AccentColor);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
ImGui.SameLine(pos);
|
ImGui.SameLine(pos);
|
||||||
if (_uiSharedService.IconTextButton(FontAwesomeIcon.ArrowCircleUp, "Attempt to upload missing files and restore Character Data"))
|
if (_uiSharedService.IconTextButton(FontAwesomeIcon.ArrowCircleUp, "Attempt to upload missing files and restore Character Data"))
|
||||||
@@ -401,7 +401,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
else if (!_charaDataManager.BrioAvailable)
|
else if (!_charaDataManager.BrioAvailable)
|
||||||
{
|
{
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
UiSharedService.DrawGroupedCenteredColorText("To attach pose and world data Brio requires to be installed.", ImGuiColors.DalamudRed);
|
UiSharedService.DrawGroupedCenteredColorText("To attach pose and world data Brio requires to be installed.", UiSharedService.AccentColor);
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,7 +685,7 @@ internal sealed partial class CharaDataHubUi
|
|||||||
}
|
}
|
||||||
else if (_charaDataManager.DataCreationTask != null && _charaDataManager.DataCreationTask.IsCompleted)
|
else if (_charaDataManager.DataCreationTask != null && _charaDataManager.DataCreationTask.IsCompleted)
|
||||||
{
|
{
|
||||||
var color = _charaDataManager.DataCreationTask.Result.Success ? ImGuiColors.HealerGreen : ImGuiColors.DalamudRed;
|
var color = _charaDataManager.DataCreationTask.Result.Success ? ImGuiColors.HealerGreen : UiSharedService.AccentColor;
|
||||||
UiSharedService.ColorTextWrapped(_charaDataManager.DataCreationTask.Result.Output, color);
|
UiSharedService.ColorTextWrapped(_charaDataManager.DataCreationTask.Result.Output, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ internal sealed partial class CharaDataHubUi : WindowMediatorSubscriberBase
|
|||||||
if (!_charaDataManager.BrioAvailable)
|
if (!_charaDataManager.BrioAvailable)
|
||||||
{
|
{
|
||||||
ImGuiHelpers.ScaledDummy(3);
|
ImGuiHelpers.ScaledDummy(3);
|
||||||
UiSharedService.DrawGroupedCenteredColorText("To utilize any features related to posing or spawning characters you require to have Brio installed.", ImGuiColors.DalamudRed);
|
UiSharedService.DrawGroupedCenteredColorText("To utilize any features related to posing or spawning characters you require to have Brio installed.", UiSharedService.AccentColor);
|
||||||
UiSharedService.DistanceSeparator();
|
UiSharedService.DistanceSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ internal sealed partial class CharaDataHubUi : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
if (_charaDataManager.DataApplicationTask != null)
|
if (_charaDataManager.DataApplicationTask != null)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("WARNING: During the data application avoid interacting with this actor to prevent potential crashes.", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("WARNING: During the data application avoid interacting with this actor to prevent potential crashes.", UiSharedService.AccentColor);
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
}
|
}
|
||||||
@@ -648,7 +648,7 @@ internal sealed partial class CharaDataHubUi : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
if ((_charaDataManager.DownloadMetaInfoTask?.IsCompleted ?? false) && !_charaDataManager.DownloadMetaInfoTask.Result.Success)
|
if ((_charaDataManager.DownloadMetaInfoTask?.IsCompleted ?? false) && !_charaDataManager.DownloadMetaInfoTask.Result.Success)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped(_charaDataManager.DownloadMetaInfoTask.Result.Result, ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped(_charaDataManager.DownloadMetaInfoTask.Result.Result, UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
using (ImRaii.Disabled(_charaDataManager.LastDownloadedMetaInfo == null))
|
using (ImRaii.Disabled(_charaDataManager.LastDownloadedMetaInfo == null))
|
||||||
@@ -848,7 +848,7 @@ internal sealed partial class CharaDataHubUi : WindowMediatorSubscriberBase
|
|||||||
if ((_charaDataManager.LoadedMcdfHeader?.IsFaulted ?? false) || (_charaDataManager.McdfApplicationTask?.IsFaulted ?? false))
|
if ((_charaDataManager.LoadedMcdfHeader?.IsFaulted ?? false) || (_charaDataManager.McdfApplicationTask?.IsFaulted ?? false))
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("Failure to read MCDF file. MCDF file is possibly corrupt. Re-export the MCDF file and try again.",
|
UiSharedService.ColorTextWrapped("Failure to read MCDF file. MCDF file is possibly corrupt. Re-export the MCDF file and try again.",
|
||||||
ImGuiColors.DalamudRed);
|
UiSharedService.AccentColor);
|
||||||
UiSharedService.ColorTextWrapped("Note: if this is your MCDF, try redrawing yourself, wait and re-export the file. " +
|
UiSharedService.ColorTextWrapped("Note: if this is your MCDF, try redrawing yourself, wait and re-export the file. " +
|
||||||
"If you received it from someone else have them do the same.", ImGuiColors.DalamudYellow);
|
"If you received it from someone else have them do the same.", ImGuiColors.DalamudYellow);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Dalamud.Bindings.ImGui;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
@@ -130,7 +130,15 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
|
|
||||||
protected override void DrawInternal()
|
protected override void DrawInternal()
|
||||||
{
|
{
|
||||||
UiSharedService.AccentColor = new Vector4(0.63f, 0.25f, 1f, 1f);
|
UiSharedService.AccentColor = new Vector4(0x8D / 255f, 0x37 / 255f, 0xC0 / 255f, 1f);
|
||||||
|
UiSharedService.AccentHoverColor = new Vector4(0x3A / 255f, 0x15 / 255f, 0x50 / 255f, 1f);
|
||||||
|
UiSharedService.AccentActiveColor = UiSharedService.AccentHoverColor;
|
||||||
|
var accent = UiSharedService.AccentColor;
|
||||||
|
using var titleBg = ImRaii.PushColor(ImGuiCol.TitleBg, accent);
|
||||||
|
using var titleBgActive = ImRaii.PushColor(ImGuiCol.TitleBgActive, accent);
|
||||||
|
using var titleBgCollapsed = ImRaii.PushColor(ImGuiCol.TitleBgCollapsed, accent);
|
||||||
|
using var buttonHover = ImRaii.PushColor(ImGuiCol.ButtonHovered, UiSharedService.AccentHoverColor);
|
||||||
|
using var buttonActive = ImRaii.PushColor(ImGuiCol.ButtonActive, UiSharedService.AccentActiveColor);
|
||||||
ImGui.SetCursorPosY(ImGui.GetCursorPosY() - ImGui.GetStyle().WindowPadding.Y - 1f * ImGuiHelpers.GlobalScale + ImGui.GetStyle().ItemSpacing.Y);
|
ImGui.SetCursorPosY(ImGui.GetCursorPosY() - ImGui.GetStyle().WindowPadding.Y - 1f * ImGuiHelpers.GlobalScale + ImGui.GetStyle().ItemSpacing.Y);
|
||||||
WindowContentWidth = UiSharedService.GetWindowContentRegionWidth();
|
WindowContentWidth = UiSharedService.GetWindowContentRegionWidth();
|
||||||
if (!_apiController.IsCurrentVersion)
|
if (!_apiController.IsCurrentVersion)
|
||||||
@@ -142,10 +150,10 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
var uidTextSize = ImGui.CalcTextSize(unsupported);
|
var uidTextSize = ImGui.CalcTextSize(unsupported);
|
||||||
ImGui.SetCursorPosX((ImGui.GetWindowContentRegionMax().X + ImGui.GetWindowContentRegionMin().X) / 2 - uidTextSize.X / 2);
|
ImGui.SetCursorPosX((ImGui.GetWindowContentRegionMax().X + ImGui.GetWindowContentRegionMin().X) / 2 - uidTextSize.X / 2);
|
||||||
ImGui.AlignTextToFramePadding();
|
ImGui.AlignTextToFramePadding();
|
||||||
ImGui.TextColored(ImGuiColors.DalamudRed, unsupported);
|
ImGui.TextColored(UiSharedService.AccentColor, unsupported);
|
||||||
}
|
}
|
||||||
UiSharedService.ColorTextWrapped($"Your UmbraSync installation is out of date, the current version is {ver.Major}.{ver.Minor}.{ver.Build}. " +
|
UiSharedService.ColorTextWrapped($"Your UmbraSync installation is out of date, the current version is {ver.Major}.{ver.Minor}.{ver.Build}. " +
|
||||||
$"It is highly recommended to keep UmbraSync up to date. Open /xlplugins and update the plugin.", ImGuiColors.DalamudRed);
|
$"It is highly recommended to keep UmbraSync up to date. Open /xlplugins and update the plugin.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
using (ImRaii.PushId("header")) DrawUIDHeader();
|
using (ImRaii.PushId("header")) DrawUIDHeader();
|
||||||
@@ -156,40 +164,59 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
var hasShownSyncShells = _showSyncShells;
|
var hasShownSyncShells = _showSyncShells;
|
||||||
|
|
||||||
ImGui.PushFont(UiBuilder.IconFont);
|
using (var hoverColor = ImRaii.PushColor(ImGuiCol.ButtonHovered, UiSharedService.AccentHoverColor))
|
||||||
|
using (var activeColor = ImRaii.PushColor(ImGuiCol.ButtonActive, UiSharedService.AccentActiveColor))
|
||||||
|
{
|
||||||
if (!hasShownSyncShells)
|
if (!hasShownSyncShells)
|
||||||
{
|
{
|
||||||
ImGui.PushStyleColor(ImGuiCol.Button, ImGui.GetStyle().Colors[(int)ImGuiCol.ButtonHovered]);
|
using var selectedColor = ImRaii.PushColor(ImGuiCol.Button, accent);
|
||||||
|
using (ImRaii.PushFont(UiBuilder.IconFont))
|
||||||
|
{
|
||||||
|
if (ImGui.Button(FontAwesomeIcon.User.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
||||||
|
{
|
||||||
|
_showSyncShells = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ImGui.Button(FontAwesomeIcon.User.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
else
|
||||||
{
|
{
|
||||||
_showSyncShells = false;
|
using (ImRaii.PushFont(UiBuilder.IconFont))
|
||||||
|
{
|
||||||
|
if (ImGui.Button(FontAwesomeIcon.User.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
||||||
|
{
|
||||||
|
_showSyncShells = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!hasShownSyncShells)
|
|
||||||
{
|
|
||||||
ImGui.PopStyleColor();
|
|
||||||
}
|
|
||||||
ImGui.PopFont();
|
|
||||||
UiSharedService.AttachToolTip("Individual pairs");
|
UiSharedService.AttachToolTip("Individual pairs");
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
|
|
||||||
ImGui.PushFont(UiBuilder.IconFont);
|
|
||||||
if (hasShownSyncShells)
|
if (hasShownSyncShells)
|
||||||
{
|
{
|
||||||
ImGui.PushStyleColor(ImGuiCol.Button, ImGui.GetStyle().Colors[(int)ImGuiCol.ButtonHovered]);
|
using var selectedColor = ImRaii.PushColor(ImGuiCol.Button, accent);
|
||||||
|
using (ImRaii.PushFont(UiBuilder.IconFont))
|
||||||
|
{
|
||||||
|
if (ImGui.Button(FontAwesomeIcon.UserFriends.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
||||||
|
{
|
||||||
|
_showSyncShells = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ImGui.Button(FontAwesomeIcon.UserFriends.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
else
|
||||||
{
|
{
|
||||||
_showSyncShells = true;
|
using (ImRaii.PushFont(UiBuilder.IconFont))
|
||||||
|
{
|
||||||
|
if (ImGui.Button(FontAwesomeIcon.UserFriends.ToIconString(), new Vector2((UiSharedService.GetWindowContentRegionWidth() - ImGui.GetWindowContentRegionMin().X) / 2, 30 * ImGuiHelpers.GlobalScale)))
|
||||||
|
{
|
||||||
|
_showSyncShells = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (hasShownSyncShells)
|
|
||||||
{
|
|
||||||
ImGui.PopStyleColor();
|
|
||||||
}
|
|
||||||
ImGui.PopFont();
|
|
||||||
|
|
||||||
UiSharedService.AttachToolTip("Syncshells");
|
UiSharedService.AttachToolTip("Syncshells");
|
||||||
|
}
|
||||||
|
|
||||||
DrawDefaultSyncSettings();
|
DrawDefaultSyncSettings();
|
||||||
if (!hasShownSyncShells)
|
if (!hasShownSyncShells)
|
||||||
@@ -271,9 +298,9 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
bool vfxDisabled = _configService.Current.DefaultDisableVfx;
|
bool vfxDisabled = _configService.Current.DefaultDisableVfx;
|
||||||
bool showNearby = _configService.Current.EnableAutoDetectDiscovery;
|
bool showNearby = _configService.Current.EnableAutoDetectDiscovery;
|
||||||
|
|
||||||
var soundIcon = soundsDisabled ? FontAwesomeIcon.VolumeUp : FontAwesomeIcon.VolumeMute;
|
var soundIcon = soundsDisabled ? FontAwesomeIcon.VolumeMute : FontAwesomeIcon.VolumeUp;
|
||||||
var animIcon = animsDisabled ? FontAwesomeIcon.Running : FontAwesomeIcon.Stop;
|
var animIcon = animsDisabled ? FontAwesomeIcon.WindowClose : FontAwesomeIcon.Running;
|
||||||
var vfxIcon = vfxDisabled ? FontAwesomeIcon.Sun : FontAwesomeIcon.Circle;
|
var vfxIcon = vfxDisabled ? FontAwesomeIcon.TimesCircle : FontAwesomeIcon.Sun;
|
||||||
|
|
||||||
float spacing = ImGui.GetStyle().ItemSpacing.X;
|
float spacing = ImGui.GetStyle().ItemSpacing.X;
|
||||||
float audioWidth = _uiSharedService.GetIconTextButtonSize(soundIcon, soundLabel);
|
float audioWidth = _uiSharedService.GetIconTextButtonSize(soundIcon, soundLabel);
|
||||||
@@ -337,12 +364,24 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
ImGui.SameLine(0, spacingOverride);
|
ImGui.SameLine(0, spacingOverride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var colorsPushed = 0;
|
||||||
|
if (currentState)
|
||||||
|
{
|
||||||
|
ImGui.PushStyleColor(ImGuiCol.Text, new Vector4(0.95f, 0.35f, 0.35f, 1f));
|
||||||
|
colorsPushed++;
|
||||||
|
}
|
||||||
|
|
||||||
if (_uiSharedService.IconTextButton(icon, label, width))
|
if (_uiSharedService.IconTextButton(icon, label, width))
|
||||||
{
|
{
|
||||||
var newState = !currentState;
|
var newState = !currentState;
|
||||||
onToggle(newState);
|
onToggle(newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (colorsPushed > 0)
|
||||||
|
{
|
||||||
|
ImGui.PopStyleColor(colorsPushed);
|
||||||
|
}
|
||||||
|
|
||||||
UiSharedService.AttachToolTip(tooltipProvider());
|
UiSharedService.AttachToolTip(tooltipProvider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,7 +687,7 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ImGui.AlignTextToFramePadding();
|
ImGui.AlignTextToFramePadding();
|
||||||
ImGui.TextColored(ImGuiColors.DalamudRed, "Not connected to any server");
|
ImGui.TextColored(UiSharedService.AccentColor, "Not connected to any server");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printShard)
|
if (printShard)
|
||||||
@@ -845,17 +884,17 @@ public class CompactUi : WindowMediatorSubscriberBase
|
|||||||
return _apiController.ServerState switch
|
return _apiController.ServerState switch
|
||||||
{
|
{
|
||||||
ServerState.Connecting => ImGuiColors.DalamudYellow,
|
ServerState.Connecting => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Reconnecting => ImGuiColors.DalamudRed,
|
ServerState.Reconnecting => UiSharedService.AccentColor,
|
||||||
ServerState.Connected => new Vector4(0.63f, 0.25f, 1f, 1f),
|
ServerState.Connected => UiSharedService.AccentColor,
|
||||||
ServerState.Disconnected => ImGuiColors.DalamudYellow,
|
ServerState.Disconnected => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Disconnecting => ImGuiColors.DalamudYellow,
|
ServerState.Disconnecting => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Unauthorized => ImGuiColors.DalamudRed,
|
ServerState.Unauthorized => UiSharedService.AccentColor,
|
||||||
ServerState.VersionMisMatch => ImGuiColors.DalamudRed,
|
ServerState.VersionMisMatch => UiSharedService.AccentColor,
|
||||||
ServerState.Offline => ImGuiColors.DalamudRed,
|
ServerState.Offline => UiSharedService.AccentColor,
|
||||||
ServerState.RateLimited => ImGuiColors.DalamudYellow,
|
ServerState.RateLimited => ImGuiColors.DalamudYellow,
|
||||||
ServerState.NoSecretKey => ImGuiColors.DalamudYellow,
|
ServerState.NoSecretKey => ImGuiColors.DalamudYellow,
|
||||||
ServerState.MultiChara => ImGuiColors.DalamudYellow,
|
ServerState.MultiChara => ImGuiColors.DalamudYellow,
|
||||||
_ => ImGuiColors.DalamudRed
|
_ => UiSharedService.AccentColor
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (individualSoundsDisabled)
|
if (individualSoundsDisabled)
|
||||||
{
|
{
|
||||||
var userSoundsText = "Sound sync disabled with " + _pair.UserData.AliasOrUID;
|
var userSoundsText = "Sound sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.VolumeOff);
|
_uiSharedService.IconText(FontAwesomeIcon.VolumeMute);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userSoundsText);
|
ImGui.TextUnformatted(userSoundsText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -212,7 +212,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (individualAnimDisabled)
|
if (individualAnimDisabled)
|
||||||
{
|
{
|
||||||
var userAnimText = "Animation sync disabled with " + _pair.UserData.AliasOrUID;
|
var userAnimText = "Animation sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Stop);
|
_uiSharedService.IconText(FontAwesomeIcon.WindowClose);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userAnimText);
|
ImGui.TextUnformatted(userAnimText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -223,7 +223,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (individualVFXDisabled)
|
if (individualVFXDisabled)
|
||||||
{
|
{
|
||||||
var userVFXText = "VFX sync disabled with " + _pair.UserData.AliasOrUID;
|
var userVFXText = "VFX sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Circle);
|
_uiSharedService.IconText(FontAwesomeIcon.TimesCircle);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userVFXText);
|
ImGui.TextUnformatted(userVFXText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -248,7 +248,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (soundsDisabled)
|
if (soundsDisabled)
|
||||||
{
|
{
|
||||||
var userSoundsText = "Sound sync disabled by " + _pair.UserData.AliasOrUID;
|
var userSoundsText = "Sound sync disabled by " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.VolumeOff);
|
_uiSharedService.IconText(FontAwesomeIcon.VolumeMute);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userSoundsText);
|
ImGui.TextUnformatted(userSoundsText);
|
||||||
}
|
}
|
||||||
@@ -256,7 +256,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (animDisabled)
|
if (animDisabled)
|
||||||
{
|
{
|
||||||
var userAnimText = "Animation sync disabled by " + _pair.UserData.AliasOrUID;
|
var userAnimText = "Animation sync disabled by " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Stop);
|
_uiSharedService.IconText(FontAwesomeIcon.WindowClose);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userAnimText);
|
ImGui.TextUnformatted(userAnimText);
|
||||||
}
|
}
|
||||||
@@ -264,7 +264,7 @@ public class DrawGroupPair : DrawPairBase
|
|||||||
if (vfxDisabled)
|
if (vfxDisabled)
|
||||||
{
|
{
|
||||||
var userVFXText = "VFX sync disabled by " + _pair.UserData.AliasOrUID;
|
var userVFXText = "VFX sync disabled by " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Circle);
|
_uiSharedService.IconText(FontAwesomeIcon.TimesCircle);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userVFXText);
|
ImGui.TextUnformatted(userVFXText);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
ImGui.SetCursorPosY(textPosY);
|
ImGui.SetCursorPosY(textPosY);
|
||||||
ImGui.PushFont(UiBuilder.IconFont);
|
ImGui.PushFont(UiBuilder.IconFont);
|
||||||
UiSharedService.ColorText(FontAwesomeIcon.ArrowUp.ToIconString(), ImGuiColors.DalamudRed);
|
UiSharedService.ColorText(FontAwesomeIcon.ArrowUp.ToIconString(), UiSharedService.AccentColor);
|
||||||
ImGui.PopFont();
|
ImGui.PopFont();
|
||||||
UiSharedService.AttachToolTip(_pair.UserData.AliasOrUID + " has not added you back");
|
UiSharedService.AttachToolTip(_pair.UserData.AliasOrUID + " has not added you back");
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
if (individualSoundsDisabled)
|
if (individualSoundsDisabled)
|
||||||
{
|
{
|
||||||
var userSoundsText = "Sound sync disabled with " + _pair.UserData.AliasOrUID;
|
var userSoundsText = "Sound sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.VolumeOff);
|
_uiSharedService.IconText(FontAwesomeIcon.VolumeMute);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userSoundsText);
|
ImGui.TextUnformatted(userSoundsText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -174,7 +174,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
if (individualAnimDisabled)
|
if (individualAnimDisabled)
|
||||||
{
|
{
|
||||||
var userAnimText = "Animation sync disabled with " + _pair.UserData.AliasOrUID;
|
var userAnimText = "Animation sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Stop);
|
_uiSharedService.IconText(FontAwesomeIcon.WindowClose);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userAnimText);
|
ImGui.TextUnformatted(userAnimText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -185,7 +185,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
if (individualVFXDisabled)
|
if (individualVFXDisabled)
|
||||||
{
|
{
|
||||||
var userVFXText = "VFX sync disabled with " + _pair.UserData.AliasOrUID;
|
var userVFXText = "VFX sync disabled with " + _pair.UserData.AliasOrUID;
|
||||||
_uiSharedService.IconText(FontAwesomeIcon.Circle);
|
_uiSharedService.IconText(FontAwesomeIcon.TimesCircle);
|
||||||
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
ImGui.SameLine(40 * ImGuiHelpers.GlobalScale);
|
||||||
ImGui.TextUnformatted(userVFXText);
|
ImGui.TextUnformatted(userVFXText);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
@@ -267,7 +267,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
|
|
||||||
var isDisableSounds = entry.UserPair!.OwnPermissions.IsDisableSounds();
|
var isDisableSounds = entry.UserPair!.OwnPermissions.IsDisableSounds();
|
||||||
string disableSoundsText = isDisableSounds ? "Enable sound sync" : "Disable sound sync";
|
string disableSoundsText = isDisableSounds ? "Enable sound sync" : "Disable sound sync";
|
||||||
var disableSoundsIcon = isDisableSounds ? FontAwesomeIcon.VolumeUp : FontAwesomeIcon.VolumeMute;
|
var disableSoundsIcon = isDisableSounds ? FontAwesomeIcon.VolumeMute : FontAwesomeIcon.VolumeUp;
|
||||||
if (_uiSharedService.IconTextButton(disableSoundsIcon, disableSoundsText))
|
if (_uiSharedService.IconTextButton(disableSoundsIcon, disableSoundsText))
|
||||||
{
|
{
|
||||||
var permissions = entry.UserPair.OwnPermissions;
|
var permissions = entry.UserPair.OwnPermissions;
|
||||||
@@ -278,7 +278,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
|
|
||||||
var isDisableAnims = entry.UserPair!.OwnPermissions.IsDisableAnimations();
|
var isDisableAnims = entry.UserPair!.OwnPermissions.IsDisableAnimations();
|
||||||
string disableAnimsText = isDisableAnims ? "Enable animation sync" : "Disable animation sync";
|
string disableAnimsText = isDisableAnims ? "Enable animation sync" : "Disable animation sync";
|
||||||
var disableAnimsIcon = isDisableAnims ? FontAwesomeIcon.Running : FontAwesomeIcon.Stop;
|
var disableAnimsIcon = isDisableAnims ? FontAwesomeIcon.WindowClose : FontAwesomeIcon.Running;
|
||||||
if (_uiSharedService.IconTextButton(disableAnimsIcon, disableAnimsText))
|
if (_uiSharedService.IconTextButton(disableAnimsIcon, disableAnimsText))
|
||||||
{
|
{
|
||||||
var permissions = entry.UserPair.OwnPermissions;
|
var permissions = entry.UserPair.OwnPermissions;
|
||||||
@@ -289,7 +289,7 @@ public class DrawUserPair : DrawPairBase
|
|||||||
|
|
||||||
var isDisableVFX = entry.UserPair!.OwnPermissions.IsDisableVFX();
|
var isDisableVFX = entry.UserPair!.OwnPermissions.IsDisableVFX();
|
||||||
string disableVFXText = isDisableVFX ? "Enable VFX sync" : "Disable VFX sync";
|
string disableVFXText = isDisableVFX ? "Enable VFX sync" : "Disable VFX sync";
|
||||||
var disableVFXIcon = isDisableVFX ? FontAwesomeIcon.Sun : FontAwesomeIcon.Circle;
|
var disableVFXIcon = isDisableVFX ? FontAwesomeIcon.TimesCircle : FontAwesomeIcon.Sun;
|
||||||
if (_uiSharedService.IconTextButton(disableVFXIcon, disableVFXText))
|
if (_uiSharedService.IconTextButton(disableVFXIcon, disableVFXText))
|
||||||
{
|
{
|
||||||
var permissions = entry.UserPair.OwnPermissions;
|
var permissions = entry.UserPair.OwnPermissions;
|
||||||
|
|||||||
@@ -627,12 +627,12 @@ internal sealed class GroupPanel
|
|||||||
bool showInfoIcon = !invitesEnabled || soundsDisabled || animDisabled || vfxDisabled || userSoundsDisabled || userAnimDisabled || userVFXDisabled;
|
bool showInfoIcon = !invitesEnabled || soundsDisabled || animDisabled || vfxDisabled || userSoundsDisabled || userAnimDisabled || userVFXDisabled;
|
||||||
|
|
||||||
var lockedIcon = invitesEnabled ? FontAwesomeIcon.LockOpen : FontAwesomeIcon.Lock;
|
var lockedIcon = invitesEnabled ? FontAwesomeIcon.LockOpen : FontAwesomeIcon.Lock;
|
||||||
var animIcon = animDisabled ? FontAwesomeIcon.Stop : FontAwesomeIcon.Running;
|
var animIcon = animDisabled ? FontAwesomeIcon.WindowClose : FontAwesomeIcon.Running;
|
||||||
var soundsIcon = soundsDisabled ? FontAwesomeIcon.VolumeOff : FontAwesomeIcon.VolumeUp;
|
var soundsIcon = soundsDisabled ? FontAwesomeIcon.VolumeMute : FontAwesomeIcon.VolumeUp;
|
||||||
var vfxIcon = vfxDisabled ? FontAwesomeIcon.Circle : FontAwesomeIcon.Sun;
|
var vfxIcon = vfxDisabled ? FontAwesomeIcon.TimesCircle : FontAwesomeIcon.Sun;
|
||||||
var userAnimIcon = userAnimDisabled ? FontAwesomeIcon.Stop : FontAwesomeIcon.Running;
|
var userAnimIcon = userAnimDisabled ? FontAwesomeIcon.WindowClose : FontAwesomeIcon.Running;
|
||||||
var userSoundsIcon = userSoundsDisabled ? FontAwesomeIcon.VolumeOff : FontAwesomeIcon.VolumeUp;
|
var userSoundsIcon = userSoundsDisabled ? FontAwesomeIcon.VolumeMute : FontAwesomeIcon.VolumeUp;
|
||||||
var userVFXIcon = userVFXDisabled ? FontAwesomeIcon.Circle : FontAwesomeIcon.Sun;
|
var userVFXIcon = userVFXDisabled ? FontAwesomeIcon.TimesCircle : FontAwesomeIcon.Sun;
|
||||||
|
|
||||||
var iconSize = UiSharedService.GetIconSize(infoIcon);
|
var iconSize = UiSharedService.GetIconSize(infoIcon);
|
||||||
var barbuttonSize = _uiShared.GetIconButtonSize(FontAwesomeIcon.Bars);
|
var barbuttonSize = _uiShared.GetIconButtonSize(FontAwesomeIcon.Bars);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ internal class ReportPopupHandler : IPopupHandler
|
|||||||
UiSharedService.TextWrapped($"Note: Sending a report will disable the offending profile globally.{Environment.NewLine}" +
|
UiSharedService.TextWrapped($"Note: Sending a report will disable the offending profile globally.{Environment.NewLine}" +
|
||||||
$"The report will be sent to the team of your currently connected server.{Environment.NewLine}" +
|
$"The report will be sent to the team of your currently connected server.{Environment.NewLine}" +
|
||||||
$"Depending on the severity of the offense the users profile or account can be permanently disabled or banned.");
|
$"Depending on the severity of the offense the users profile or account can be permanently disabled or banned.");
|
||||||
UiSharedService.ColorTextWrapped("Report spam and wrong reports will not be tolerated and can lead to permanent account suspension.", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Report spam and wrong reports will not be tolerated and can lead to permanent account suspension.", UiSharedService.AccentColor);
|
||||||
UiSharedService.ColorTextWrapped("This is not for reporting misbehavior but solely for the actual profile. " +
|
UiSharedService.ColorTextWrapped("This is not for reporting misbehavior but solely for the actual profile. " +
|
||||||
"Reports that are not solely for the profile will be ignored.", ImGuiColors.DalamudYellow);
|
"Reports that are not solely for the profile will be ignored.", ImGuiColors.DalamudYellow);
|
||||||
|
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ public class DataAnalysisUi : WindowMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
UiSharedService.ColorText("WARNING BC7 CONVERSION:", ImGuiColors.DalamudYellow);
|
UiSharedService.ColorText("WARNING BC7 CONVERSION:", ImGuiColors.DalamudYellow);
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
UiSharedService.ColorText("Converting textures to BC7 is irreversible!", ImGuiColors.DalamudRed);
|
UiSharedService.ColorText("Converting textures to BC7 is irreversible!", UiSharedService.AccentColor);
|
||||||
UiSharedService.ColorTextWrapped("- Converting textures to BC7 will reduce their size (compressed and uncompressed) drastically. It is recommended to be used for large (4k+) textures." +
|
UiSharedService.ColorTextWrapped("- Converting textures to BC7 will reduce their size (compressed and uncompressed) drastically. It is recommended to be used for large (4k+) textures." +
|
||||||
Environment.NewLine + "- Some textures, especially ones utilizing colorsets, might not be suited for BC7 conversion and might produce visual artifacts." +
|
Environment.NewLine + "- Some textures, especially ones utilizing colorsets, might not be suited for BC7 conversion and might produce visual artifacts." +
|
||||||
Environment.NewLine + "- Before converting textures, make sure to have the original files of the mod you are converting so you can reimport it in case of issues." +
|
Environment.NewLine + "- Before converting textures, make sure to have the original files of the mod you are converting so you can reimport it in case of issues." +
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ using MareSynchronos.Services.ServerConfiguration;
|
|||||||
using MareSynchronos.Utils;
|
using MareSynchronos.Utils;
|
||||||
using MareSynchronos.WebAPI;
|
using MareSynchronos.WebAPI;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace MareSynchronos.UI;
|
namespace MareSynchronos.UI;
|
||||||
|
|
||||||
@@ -65,12 +66,13 @@ public class EditProfileUi : WindowMediatorSubscriberBase
|
|||||||
protected override void DrawInternal()
|
protected override void DrawInternal()
|
||||||
{
|
{
|
||||||
_uiSharedService.BigText("Current Profile (as saved on server)");
|
_uiSharedService.BigText("Current Profile (as saved on server)");
|
||||||
|
ImGuiHelpers.ScaledDummy(new Vector2(0f, ImGui.GetStyle().ItemSpacing.Y / 2));
|
||||||
|
|
||||||
var profile = _mareProfileManager.GetMareProfile(new UserData(_apiController.UID));
|
var profile = _mareProfileManager.GetMareProfile(new UserData(_apiController.UID));
|
||||||
|
|
||||||
if (profile.IsFlagged)
|
if (profile.IsFlagged)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped(profile.Description, ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped(profile.Description, UiSharedService.AccentColor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,13 +89,12 @@ public class EditProfileUi : WindowMediatorSubscriberBase
|
|||||||
_descriptionText = _profileDescription;
|
_descriptionText = _profileDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
||||||
if (_pfpTextureWrap != null)
|
if (_pfpTextureWrap != null)
|
||||||
{
|
{
|
||||||
ImGui.Image(_pfpTextureWrap.Handle, ImGuiHelpers.ScaledVector2(_pfpTextureWrap.Width, _pfpTextureWrap.Height));
|
ImGui.Image(_pfpTextureWrap.Handle, ImGuiHelpers.ScaledVector2(_pfpTextureWrap.Width, _pfpTextureWrap.Height));
|
||||||
|
ImGuiHelpers.ScaledRelativeSameLine(256, spacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
|
||||||
ImGuiHelpers.ScaledRelativeSameLine(256, spacing);
|
|
||||||
using (_uiSharedService.GameFont.Push())
|
using (_uiSharedService.GameFont.Push())
|
||||||
{
|
{
|
||||||
var descriptionTextSize = ImGui.CalcTextSize(profile.Description, hideTextAfterDoubleHash: false, 256f);
|
var descriptionTextSize = ImGui.CalcTextSize(profile.Description, hideTextAfterDoubleHash: false, 256f);
|
||||||
@@ -157,7 +158,7 @@ public class EditProfileUi : WindowMediatorSubscriberBase
|
|||||||
UiSharedService.AttachToolTip("Clear your currently uploaded profile picture");
|
UiSharedService.AttachToolTip("Clear your currently uploaded profile picture");
|
||||||
if (_showFileDialogError)
|
if (_showFileDialogError)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("The profile picture must be a PNG file with a maximum height and width of 256px and 250KiB size", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("The profile picture must be a PNG file with a maximum height and width of 256px and 250KiB size", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
var isNsfw = profile.IsNSFW;
|
var isNsfw = profile.IsNSFW;
|
||||||
if (ImGui.Checkbox("Profile is NSFW", ref isNsfw))
|
if (ImGui.Checkbox("Profile is NSFW", ref isNsfw))
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ internal class EventViewerUI : WindowMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
EventSeverity.Informational => new Vector4(),
|
EventSeverity.Informational => new Vector4(),
|
||||||
EventSeverity.Warning => ImGuiColors.DalamudYellow,
|
EventSeverity.Warning => ImGuiColors.DalamudYellow,
|
||||||
EventSeverity.Error => ImGuiColors.DalamudRed,
|
EventSeverity.Error => UiSharedService.AccentColor,
|
||||||
_ => new Vector4()
|
_ => new Vector4()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -69,17 +69,17 @@ public partial class IntroUi : WindowMediatorSubscriberBase
|
|||||||
return _uiShared.ApiController.ServerState switch
|
return _uiShared.ApiController.ServerState switch
|
||||||
{
|
{
|
||||||
ServerState.Connecting => ImGuiColors.DalamudYellow,
|
ServerState.Connecting => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Reconnecting => ImGuiColors.DalamudRed,
|
ServerState.Reconnecting => UiSharedService.AccentColor,
|
||||||
ServerState.Connected => ImGuiColors.HealerGreen,
|
ServerState.Connected => ImGuiColors.HealerGreen,
|
||||||
ServerState.Disconnected => ImGuiColors.DalamudYellow,
|
ServerState.Disconnected => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Disconnecting => ImGuiColors.DalamudYellow,
|
ServerState.Disconnecting => ImGuiColors.DalamudYellow,
|
||||||
ServerState.Unauthorized => ImGuiColors.DalamudRed,
|
ServerState.Unauthorized => UiSharedService.AccentColor,
|
||||||
ServerState.VersionMisMatch => ImGuiColors.DalamudRed,
|
ServerState.VersionMisMatch => UiSharedService.AccentColor,
|
||||||
ServerState.Offline => ImGuiColors.DalamudRed,
|
ServerState.Offline => UiSharedService.AccentColor,
|
||||||
ServerState.RateLimited => ImGuiColors.DalamudYellow,
|
ServerState.RateLimited => ImGuiColors.DalamudYellow,
|
||||||
ServerState.NoSecretKey => ImGuiColors.DalamudYellow,
|
ServerState.NoSecretKey => ImGuiColors.DalamudYellow,
|
||||||
ServerState.MultiChara => ImGuiColors.DalamudYellow,
|
ServerState.MultiChara => ImGuiColors.DalamudYellow,
|
||||||
_ => ImGuiColors.DalamudRed
|
_ => UiSharedService.AccentColor
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,46 +140,46 @@ public partial class IntroUi : WindowMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
using (_uiShared.UidFont.Push())
|
using (_uiShared.UidFont.Push())
|
||||||
{
|
{
|
||||||
ImGui.TextUnformatted("Agreement of Usage of Service");
|
ImGui.TextUnformatted("Conditions d'utilisation");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.SetWindowFontScale(1.5f);
|
ImGui.SetWindowFontScale(1.5f);
|
||||||
string readThis = "READ THIS CAREFULLY";
|
string readThis = "MERCI DE LIRE ATTENTIVEMENT";
|
||||||
Vector2 textSize = ImGui.CalcTextSize(readThis);
|
Vector2 textSize = ImGui.CalcTextSize(readThis);
|
||||||
ImGui.SetCursorPosX(ImGui.GetWindowSize().X / 2 - textSize.X / 2);
|
ImGui.SetCursorPosX(ImGui.GetWindowSize().X / 2 - textSize.X / 2);
|
||||||
UiSharedService.ColorText(readThis, ImGuiColors.DalamudRed);
|
UiSharedService.ColorText(readThis, UiSharedService.AccentColor);
|
||||||
ImGui.SetWindowFontScale(1.0f);
|
ImGui.SetWindowFontScale(1.0f);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
To use Umbra, you must be over the age of 18, or 21 in some jurisdictions.
|
Pour utiliser les services UmbraSync, vous devez être âgé de plus de 18 ans, où plus de 21 ans dans certaines juridictions.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
All of the mod files currently active on your character as well as your current character state will be uploaded to the service you registered yourself at automatically. The plugin will exclusively upload the necessary mod files and not the whole mod.
|
Tout les mods actuellement actifs sur votre personnage et ses états associés seront automatiquement téléchargés vers le serveur UmbraSync auquel vous vous êtes inscrit.Il sera téléchargé exclusivement les fichiers nécessaires à la synchronisation et non l'intégralité du mod.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
If you are on a data capped internet connection, higher fees due to data usage depending on the amount of downloaded and uploaded mod files might occur. Mod files will be compressed on up- and download to save on bandwidth usage. Due to varying up- and download speeds, changes in characters might not be visible immediately. Files present on the service that already represent your active mod files will not be uploaded again.
|
Si vous disposez d'une connexion Internet limitée, des frais supplémentaires peuvent s'appliquer en fonction du nombre de fichiers envoyés et reçus. Les fichiers seront compressés afin d'économiser la bande passante. En raison des variations de vitesse de débit, les sychronisations peuvent ne pas être visible immédiatement.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
The mod files you are uploading are confidential and will not be distributed to parties other than the ones who are requesting the exact same mod files. Please think about who you are going to pair since it is unavoidable that they will receive and locally cache the necessary mod files that you have currently in use. Locally cached mod files will have arbitrary file names to discourage attempts at replicating the original mod.
|
Les fichiers téléchargés sont confidentiels et ne seront pas distribués à des solutions tierces où autres personnes. Uniquement les personnes avec qui vous êtes appairés demandent exactement les mêmes fichiers. Réfléchissez donc bien avec qui vous allez vous appairer.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
The plugin creator tried their best to keep you secure. However, there is no guarantee for 100% security. Do not blindly pair your client with everyone.
|
Le gentil dev' a fait de son mieux pour assurer votre sécurité. Cependant le risque 0 n'existe pas. Ne vous appairez pas aveuglément avec n'importe qui.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
Mod files that are saved on the service will remain on the service as long as there are requests for the files from clients. After a period of not being used, the mod files will be automatically deleted.
|
Après une periode d'inactivité, les mods enregistrés sur le serveur UmbraSync seront automatiquement supprimés.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
Accounts that are inactive for ninety (90) days will be deleted for privacy reasons.
|
Les comptes inactifs pendant 90 jours seront supprimés pour des raisons de stockage et de confidentialité.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
Umbra is operated from servers located in the European Union. You agree not to upload any content to the service that violates EU law; and more specifically, German law.
|
L'infrastructure Umbrasync est hebergé dans l'Union Européenne (Allemagne) et en Suisse. Vous acceptez alors de ne pas télécharger de contenu qui pourrait aller à l'encontre des législations de ces deux pays.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
You may delete your account at any time from within the Settings panel of the plugin. Any mods unique to you will then be removed from the server within 14 days.
|
Vous pouvez supprimer votre compte à tout moment. Votre compte et toutes les données associées seront supprimés dans un délai de 14 jours.
|
||||||
""");
|
""");
|
||||||
UiSharedService.TextWrapped("""
|
UiSharedService.TextWrapped("""
|
||||||
This service is provided as-is.
|
Ce service est fourni tel quel.
|
||||||
""");
|
""");
|
||||||
|
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
@@ -208,7 +208,7 @@ public partial class IntroUi : WindowMediatorSubscriberBase
|
|||||||
|
|
||||||
if (!_uiShared.HasValidPenumbraModPath)
|
if (!_uiShared.HasValidPenumbraModPath)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("You do not have a valid Penumbra path set. Open Penumbra and set up a valid path for the mod directory.", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("You do not have a valid Penumbra path set. Open Penumbra and set up a valid path for the mod directory.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -330,11 +330,11 @@ public partial class IntroUi : WindowMediatorSubscriberBase
|
|||||||
ImGui.InputText("", ref _secretKey, 64);
|
ImGui.InputText("", ref _secretKey, 64);
|
||||||
if (_secretKey.Length > 0 && _secretKey.Length != 64)
|
if (_secretKey.Length > 0 && _secretKey.Length != 64)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("Your secret key must be exactly 64 characters long.", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Your secret key must be exactly 64 characters long.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (_secretKey.Length == 64 && !HexRegex().IsMatch(_secretKey))
|
else if (_secretKey.Length == 64 && !HexRegex().IsMatch(_secretKey))
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("Your secret key can only contain ABCDEF and the numbers 0-9.", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Your secret key can only contain ABCDEF and the numbers 0-9.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (_secretKey.Length == 64)
|
else if (_secretKey.Length == 64)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public class PopoutProfileUi : WindowMediatorSubscriberBase
|
|||||||
UiSharedService.ColorText(note, ImGuiColors.DalamudGrey);
|
UiSharedService.ColorText(note, ImGuiColors.DalamudGrey);
|
||||||
}
|
}
|
||||||
string status = _pair.IsVisible ? "Visible" : (_pair.IsOnline ? "Online" : "Offline");
|
string status = _pair.IsVisible ? "Visible" : (_pair.IsOnline ? "Online" : "Offline");
|
||||||
UiSharedService.ColorText(status, (_pair.IsVisible || _pair.IsOnline) ? ImGuiColors.HealerGreen : ImGuiColors.DalamudRed);
|
UiSharedService.ColorText(status, (_pair.IsVisible || _pair.IsOnline) ? ImGuiColors.HealerGreen : UiSharedService.AccentColor);
|
||||||
if (_pair.IsVisible)
|
if (_pair.IsVisible)
|
||||||
{
|
{
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
|
|||||||
@@ -657,7 +657,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
else if (_ipcProvider.MarePluginEnabled)
|
else if (_ipcProvider.MarePluginEnabled)
|
||||||
UiSharedService.ColorTextWrapped("Umbra API inactive: Umbra plugin is loaded", ImGuiColors.DalamudYellow);
|
UiSharedService.ColorTextWrapped("Umbra API inactive: Umbra plugin is loaded", ImGuiColors.DalamudYellow);
|
||||||
else
|
else
|
||||||
UiSharedService.ColorTextWrapped("Umbra API inactive: Unknown reason", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Umbra API inactive: Unknown reason", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -991,7 +991,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
else if (_notesSuccessfullyApplied.HasValue && !_notesSuccessfullyApplied.Value)
|
else if (_notesSuccessfullyApplied.HasValue && !_notesSuccessfullyApplied.Value)
|
||||||
{
|
{
|
||||||
UiSharedService.ColorTextWrapped("Attempt to import notes from clipboard failed. Check formatting and try again", ImGuiColors.DalamudRed);
|
UiSharedService.ColorTextWrapped("Attempt to import notes from clipboard failed. Check formatting and try again", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var openPopupOnAddition = _configService.Current.OpenPopupOnAdd;
|
var openPopupOnAddition = _configService.Current.OpenPopupOnAdd;
|
||||||
@@ -1122,6 +1122,29 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
_uiShared.DrawHelpText("Ajoute une bulle '...' sur la plaque des paires en train d'écrire.");
|
_uiShared.DrawHelpText("Ajoute une bulle '...' sur la plaque des paires en train d'écrire.");
|
||||||
|
|
||||||
|
using (ImRaii.Disabled(!typingIndicatorNameplates))
|
||||||
|
{
|
||||||
|
using var indentTyping = ImRaii.PushIndent();
|
||||||
|
var bubbleSize = _configService.Current.TypingIndicatorBubbleSize;
|
||||||
|
TypingIndicatorBubbleSize? selectedBubbleSize = _uiShared.DrawCombo("Taille de la bulle de frappe##typingBubbleSize",
|
||||||
|
Enum.GetValues<TypingIndicatorBubbleSize>(),
|
||||||
|
size => size switch
|
||||||
|
{
|
||||||
|
TypingIndicatorBubbleSize.Small => "Petite",
|
||||||
|
TypingIndicatorBubbleSize.Medium => "Moyenne",
|
||||||
|
TypingIndicatorBubbleSize.Large => "Grande",
|
||||||
|
_ => size.ToString()
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
bubbleSize);
|
||||||
|
|
||||||
|
if (selectedBubbleSize.HasValue && selectedBubbleSize.Value != bubbleSize)
|
||||||
|
{
|
||||||
|
_configService.Current.TypingIndicatorBubbleSize = selectedBubbleSize.Value;
|
||||||
|
_configService.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ImGui.Checkbox("Tracer la frappe dans la liste de groupe", ref typingIndicatorPartyList))
|
if (ImGui.Checkbox("Tracer la frappe dans la liste de groupe", ref typingIndicatorPartyList))
|
||||||
{
|
{
|
||||||
_configService.Current.TypingIndicatorShowOnPartyList = typingIndicatorPartyList;
|
_configService.Current.TypingIndicatorShowOnPartyList = typingIndicatorPartyList;
|
||||||
@@ -1318,7 +1341,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
using (ImRaii.PushColor(ImGuiCol.Text, UiSharedService.AccentColor, totalVramBytes < 2.0 * 1024.0 * 1024.0 * 1024.0))
|
using (ImRaii.PushColor(ImGuiCol.Text, UiSharedService.AccentColor, totalVramBytes < 2.0 * 1024.0 * 1024.0 * 1024.0))
|
||||||
using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudYellow, totalVramBytes >= 4.0 * 1024.0 * 1024.0 * 1024.0))
|
using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudYellow, totalVramBytes >= 4.0 * 1024.0 * 1024.0 * 1024.0))
|
||||||
using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudRed, totalVramBytes >= 6.0 * 1024.0 * 1024.0 * 1024.0))
|
using (ImRaii.PushColor(ImGuiCol.Text, UiSharedService.AccentColor, totalVramBytes >= 6.0 * 1024.0 * 1024.0 * 1024.0))
|
||||||
ImGui.TextUnformatted($"{totalVramBytes / 1024.0 / 1024.0 / 1024.0:0.00} GiB");
|
ImGui.TextUnformatted($"{totalVramBytes / 1024.0 / 1024.0 / 1024.0:0.00} GiB");
|
||||||
|
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
@@ -1920,6 +1943,11 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
if (ImGui.BeginTabBar("mainTabBar"))
|
if (ImGui.BeginTabBar("mainTabBar"))
|
||||||
{
|
{
|
||||||
|
var accent = UiSharedService.AccentColor;
|
||||||
|
var accentColor = ImGui.ColorConvertFloat4ToU32(accent);
|
||||||
|
ImGui.PushStyleColor(ImGuiCol.TabActive, accentColor);
|
||||||
|
ImGui.PushStyleColor(ImGuiCol.TabHovered, accentColor);
|
||||||
|
|
||||||
if (ImGui.BeginTabItem("General"))
|
if (ImGui.BeginTabItem("General"))
|
||||||
{
|
{
|
||||||
DrawGeneral();
|
DrawGeneral();
|
||||||
@@ -1957,6 +1985,7 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
DrawAdvanced();
|
DrawAdvanced();
|
||||||
ImGui.EndTabItem();
|
ImGui.EndTabItem();
|
||||||
}
|
}
|
||||||
|
ImGui.PopStyleColor(2);
|
||||||
|
|
||||||
ImGui.EndTabBar();
|
ImGui.EndTabBar();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public class StandaloneProfileUi : WindowMediatorSubscriberBase
|
|||||||
UiSharedService.ColorText(note, ImGuiColors.DalamudGrey);
|
UiSharedService.ColorText(note, ImGuiColors.DalamudGrey);
|
||||||
}
|
}
|
||||||
string status = Pair.IsVisible ? "Visible" : (Pair.IsOnline ? "Online" : "Offline");
|
string status = Pair.IsVisible ? "Visible" : (Pair.IsOnline ? "Online" : "Offline");
|
||||||
UiSharedService.ColorText(status, (Pair.IsVisible || Pair.IsOnline) ? ImGuiColors.HealerGreen : ImGuiColors.DalamudRed);
|
UiSharedService.ColorText(status, (Pair.IsVisible || Pair.IsOnline) ? ImGuiColors.HealerGreen : UiSharedService.AccentColor);
|
||||||
if (Pair.IsVisible)
|
if (Pair.IsVisible)
|
||||||
{
|
{
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase
|
|||||||
ImGui.TextUnformatted("Sound Sync");
|
ImGui.TextUnformatted("Sound Sync");
|
||||||
_uiSharedService.BooleanToColoredIcon(!isDisableSounds);
|
_uiSharedService.BooleanToColoredIcon(!isDisableSounds);
|
||||||
ImGui.SameLine(230);
|
ImGui.SameLine(230);
|
||||||
if (_uiSharedService.IconTextButton(isDisableSounds ? FontAwesomeIcon.VolumeUp : FontAwesomeIcon.VolumeMute,
|
if (_uiSharedService.IconTextButton(isDisableSounds ? FontAwesomeIcon.VolumeMute : FontAwesomeIcon.VolumeUp,
|
||||||
isDisableSounds ? "Enable sound sync" : "Disable sound sync"))
|
isDisableSounds ? "Enable sound sync" : "Disable sound sync"))
|
||||||
{
|
{
|
||||||
perm.SetDisableSounds(!perm.IsDisableSounds());
|
perm.SetDisableSounds(!perm.IsDisableSounds());
|
||||||
@@ -385,7 +385,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase
|
|||||||
ImGui.TextUnformatted("Animation Sync");
|
ImGui.TextUnformatted("Animation Sync");
|
||||||
_uiSharedService.BooleanToColoredIcon(!isDisableAnimations);
|
_uiSharedService.BooleanToColoredIcon(!isDisableAnimations);
|
||||||
ImGui.SameLine(230);
|
ImGui.SameLine(230);
|
||||||
if (_uiSharedService.IconTextButton(isDisableAnimations ? FontAwesomeIcon.Running : FontAwesomeIcon.Stop,
|
if (_uiSharedService.IconTextButton(isDisableAnimations ? FontAwesomeIcon.WindowClose : FontAwesomeIcon.Running,
|
||||||
isDisableAnimations ? "Enable animation sync" : "Disable animation sync"))
|
isDisableAnimations ? "Enable animation sync" : "Disable animation sync"))
|
||||||
{
|
{
|
||||||
perm.SetDisableAnimations(!perm.IsDisableAnimations());
|
perm.SetDisableAnimations(!perm.IsDisableAnimations());
|
||||||
@@ -396,7 +396,7 @@ public class SyncshellAdminUI : WindowMediatorSubscriberBase
|
|||||||
ImGui.TextUnformatted("VFX Sync");
|
ImGui.TextUnformatted("VFX Sync");
|
||||||
_uiSharedService.BooleanToColoredIcon(!isDisableVfx);
|
_uiSharedService.BooleanToColoredIcon(!isDisableVfx);
|
||||||
ImGui.SameLine(230);
|
ImGui.SameLine(230);
|
||||||
if (_uiSharedService.IconTextButton(isDisableVfx ? FontAwesomeIcon.Sun : FontAwesomeIcon.Circle,
|
if (_uiSharedService.IconTextButton(isDisableVfx ? FontAwesomeIcon.TimesCircle : FontAwesomeIcon.Sun,
|
||||||
isDisableVfx ? "Enable VFX sync" : "Disable VFX sync"))
|
isDisableVfx ? "Enable VFX sync" : "Disable VFX sync"))
|
||||||
{
|
{
|
||||||
perm.SetDisableVFX(!perm.IsDisableVFX());
|
perm.SetDisableVFX(!perm.IsDisableVFX());
|
||||||
|
|||||||
@@ -1,16 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Dalamud.Bindings.ImGui;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
|
using MareSynchronos.API.Data;
|
||||||
using MareSynchronos.MareConfiguration;
|
using MareSynchronos.MareConfiguration;
|
||||||
|
using MareSynchronos.MareConfiguration.Models;
|
||||||
using MareSynchronos.PlayerData.Pairs;
|
using MareSynchronos.PlayerData.Pairs;
|
||||||
using MareSynchronos.Services;
|
using MareSynchronos.Services;
|
||||||
using MareSynchronos.Services.Mediator;
|
using MareSynchronos.Services.Mediator;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using MareSynchronos.WebAPI;
|
using MareSynchronos.WebAPI;
|
||||||
using MareSynchronos.API.Data;
|
using Microsoft.Extensions.Logging;
|
||||||
using FFXIVClientStructs.Interop;
|
|
||||||
using Dalamud.Interface.Textures.TextureWraps;
|
using Dalamud.Interface.Textures.TextureWraps;
|
||||||
|
using FFXIVClientStructs.Interop;
|
||||||
using FFXIVClientStructs.FFXIV.Client.System.Framework;
|
using FFXIVClientStructs.FFXIV.Client.System.Framework;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||||
@@ -72,22 +75,23 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
|
|
||||||
var showParty = _configService.Current.TypingIndicatorShowOnPartyList;
|
var showParty = _configService.Current.TypingIndicatorShowOnPartyList;
|
||||||
var showNameplates = _configService.Current.TypingIndicatorShowOnNameplates;
|
var showNameplates = _configService.Current.TypingIndicatorShowOnNameplates;
|
||||||
|
|
||||||
if (!showParty && !showNameplates)
|
if (!showParty && !showNameplates)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var drawList = ImGui.GetWindowDrawList();
|
var overlayDrawList = ImGui.GetWindowDrawList();
|
||||||
var activeTypers = _typingStateService.GetActiveTypers(TypingDisplayTime);
|
var activeTypers = _typingStateService.GetActiveTypers(TypingDisplayTime);
|
||||||
var hasSelf = _typingStateService.TryGetSelfTyping(TypingDisplayTime, out var selfStart, out var selfLast);
|
var hasSelf = _typingStateService.TryGetSelfTyping(TypingDisplayTime, out var selfStart, out var selfLast);
|
||||||
var now = DateTime.UtcNow;
|
var now = DateTime.UtcNow;
|
||||||
|
|
||||||
if (showParty)
|
if (showParty)
|
||||||
{
|
{
|
||||||
DrawPartyIndicators(drawList, activeTypers, hasSelf, now, selfStart, selfLast);
|
DrawPartyIndicators(overlayDrawList, activeTypers, hasSelf, now, selfStart, selfLast);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showNameplates)
|
if (showNameplates)
|
||||||
{
|
{
|
||||||
DrawNameplateIndicators(drawList, activeTypers, hasSelf, now, selfStart, selfLast);
|
DrawNameplateIndicators(ImGui.GetWindowDrawList(), activeTypers, hasSelf, now, selfStart, selfLast);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +173,7 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
bool selfActive, DateTime now, DateTime selfStart, DateTime selfLast)
|
bool selfActive, DateTime now, DateTime selfStart, DateTime selfLast)
|
||||||
{
|
{
|
||||||
var iconWrap = _textureProvider.GetFromGameIcon(NameplateIconId).GetWrapOrEmpty();
|
var iconWrap = _textureProvider.GetFromGameIcon(NameplateIconId).GetWrapOrEmpty();
|
||||||
if (iconWrap == null)
|
if (iconWrap == null || iconWrap.Handle == IntPtr.Zero)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (selfActive
|
if (selfActive
|
||||||
@@ -178,12 +182,9 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
&& (now - selfLast) <= TypingDisplayFade)
|
&& (now - selfLast) <= TypingDisplayFade)
|
||||||
{
|
{
|
||||||
var selfId = GetEntityId(_clientState.LocalPlayer.Address);
|
var selfId = GetEntityId(_clientState.LocalPlayer.Address);
|
||||||
if (selfId != 0)
|
if (selfId != 0 && !TryDrawNameplateBubble(drawList, iconWrap, selfId))
|
||||||
{
|
{
|
||||||
if (!DrawNameplateIcon(drawList, iconWrap, selfId))
|
DrawWorldFallbackIcon(drawList, iconWrap, _clientState.LocalPlayer.Position);
|
||||||
{
|
|
||||||
DrawWorldFallbackIcon(drawList, iconWrap, _clientState.LocalPlayer.Position);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,11 +203,9 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
_logger.LogInformation("TypingIndicator: no pair found for {uid}, attempting fallback", uid);
|
_logger.LogInformation("TypingIndicator: no pair found for {uid}, attempting fallback", uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
var drawnOnNameplate = objectId != uint.MaxValue && objectId != 0 && DrawNameplateIcon(drawList, iconWrap, objectId);
|
if (objectId != uint.MaxValue && objectId != 0 && TryDrawNameplateBubble(drawList, iconWrap, objectId))
|
||||||
|
|
||||||
if (drawnOnNameplate)
|
|
||||||
{
|
{
|
||||||
_logger.LogTrace("TypingIndicator: drew nameplate icon for {uid} (objectId={objectId})", uid, objectId);
|
_logger.LogTrace("TypingIndicator: drew nameplate bubble for {uid} (objectId={objectId})", uid, objectId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,8 +227,28 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe bool DrawNameplateIcon(ImDrawListPtr drawList, IDalamudTextureWrap textureWrap, uint objectId)
|
private Vector2 GetConfiguredBubbleSize(float scaleX, float scaleY, bool isNameplateVisible, TypingIndicatorBubbleSize? overrideSize = null)
|
||||||
{
|
{
|
||||||
|
var sizeSetting = overrideSize ?? _configService.Current.TypingIndicatorBubbleSize;
|
||||||
|
var baseSize = sizeSetting switch
|
||||||
|
{
|
||||||
|
TypingIndicatorBubbleSize.Small when isNameplateVisible => 32f,
|
||||||
|
TypingIndicatorBubbleSize.Medium when isNameplateVisible => 44f,
|
||||||
|
TypingIndicatorBubbleSize.Large when isNameplateVisible => 56f,
|
||||||
|
TypingIndicatorBubbleSize.Small => 15f,
|
||||||
|
TypingIndicatorBubbleSize.Medium => 25f,
|
||||||
|
TypingIndicatorBubbleSize.Large => 35f,
|
||||||
|
_ => 35f,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Vector2(baseSize * scaleX, baseSize * scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
private unsafe bool TryDrawNameplateBubble(ImDrawListPtr drawList, IDalamudTextureWrap textureWrap, uint objectId)
|
||||||
|
{
|
||||||
|
if (textureWrap == null || textureWrap.Handle == IntPtr.Zero)
|
||||||
|
return false;
|
||||||
|
|
||||||
var framework = Framework.Instance();
|
var framework = Framework.Instance();
|
||||||
if (framework == null)
|
if (framework == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -238,6 +257,13 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
if (ui3D == null)
|
if (ui3D == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
var addonNamePlate = (AddonNamePlate*)_gameGui.GetAddonByName("NamePlate", 1).Address;
|
||||||
|
if (addonNamePlate == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
AddonNamePlate.NamePlateObject* namePlate = null;
|
||||||
|
float distance = 0f;
|
||||||
|
|
||||||
for (var i = 0; i < ui3D->NamePlateObjectInfoCount; i++)
|
for (var i = 0; i < ui3D->NamePlateObjectInfoCount; i++)
|
||||||
{
|
{
|
||||||
var objectInfo = ui3D->NamePlateObjectInfoPointers[i];
|
var objectInfo = ui3D->NamePlateObjectInfoPointers[i];
|
||||||
@@ -247,47 +273,71 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
if (objectInfo.Value->GameObject->EntityId != objectId)
|
if (objectInfo.Value->GameObject->EntityId != objectId)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var addonNamePlate = (AddonNamePlate*)_gameGui.GetAddonByName("NamePlate", 1).Address;
|
if (objectInfo.Value->GameObject->YalmDistanceFromPlayerX > 35f)
|
||||||
if (addonNamePlate == null)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var npObject = &addonNamePlate->NamePlateObjectArray[objectInfo.Value->NamePlateIndex];
|
namePlate = &addonNamePlate->NamePlateObjectArray[objectInfo.Value->NamePlateIndex];
|
||||||
if (npObject == null || npObject->RootComponentNode == null)
|
distance = objectInfo.Value->GameObject->YalmDistanceFromPlayerX;
|
||||||
return false;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
var iconNode = npObject->RootComponentNode->Component->UldManager.NodeList[0];
|
if (namePlate == null || namePlate->RootComponentNode == null)
|
||||||
if (iconNode == null)
|
return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
var distance = objectInfo.Value->GameObject->YalmDistanceFromPlayerX;
|
var iconNode = namePlate->RootComponentNode->Component->UldManager.NodeList[0];
|
||||||
var scaleX = npObject->RootComponentNode->AtkResNode.ScaleX;
|
if (iconNode == null)
|
||||||
var scaleY = npObject->RootComponentNode->AtkResNode.ScaleY;
|
return false;
|
||||||
var iconSize = new Vector2(40f * scaleX, 40f * scaleY);
|
|
||||||
|
|
||||||
var iconPos = new Vector2(
|
var scaleX = namePlate->RootComponentNode->AtkResNode.ScaleX;
|
||||||
npObject->RootComponentNode->AtkResNode.X + iconNode->X + iconNode->Width,
|
var scaleY = namePlate->RootComponentNode->AtkResNode.ScaleY;
|
||||||
npObject->RootComponentNode->AtkResNode.Y + iconNode->Y);
|
var iconVisible = iconNode->IsVisible();
|
||||||
|
var sizeScaleFactor = 1f;
|
||||||
|
var scaleVector = new Vector2(scaleX, scaleY);
|
||||||
|
var rootPosition = new Vector2(namePlate->RootComponentNode->AtkResNode.X, namePlate->RootComponentNode->AtkResNode.Y);
|
||||||
|
var iconLocalPosition = new Vector2(iconNode->X, iconNode->Y) * scaleVector;
|
||||||
|
var iconDimensions = new Vector2(iconNode->Width, iconNode->Height) * scaleVector;
|
||||||
|
|
||||||
var iconOffset = new Vector2(distance / 1.5f, distance / 3f);
|
if (!iconVisible)
|
||||||
|
{
|
||||||
|
sizeScaleFactor = 2.5f;
|
||||||
|
var anchor = rootPosition + iconLocalPosition + new Vector2(iconDimensions.X * 0.5f, 0f);
|
||||||
|
|
||||||
|
var distanceOffset = new Vector2(0f, -16f + distance) * scaleVector;
|
||||||
if (iconNode->Height == 24)
|
if (iconNode->Height == 24)
|
||||||
{
|
{
|
||||||
iconOffset.Y -= 8f;
|
distanceOffset.Y += 16f * scaleY;
|
||||||
}
|
}
|
||||||
|
distanceOffset.Y += 64f * scaleY;
|
||||||
|
|
||||||
iconPos += iconOffset;
|
var referenceSize = GetConfiguredBubbleSize(scaleX * sizeScaleFactor, scaleY * sizeScaleFactor, false, TypingIndicatorBubbleSize.Small);
|
||||||
var extraScaleX = Math.Max(scaleX - 1f, 0f);
|
var manualOffset = new Vector2(referenceSize.X * 2.00f, referenceSize.Y * 2.00f);
|
||||||
var extraScaleY = Math.Max(scaleY - 1f, 0f);
|
|
||||||
if (extraScaleX > 0f || extraScaleY > 0f)
|
|
||||||
{
|
|
||||||
iconPos -= new Vector2(extraScaleX * 14f, extraScaleY * 14f);
|
|
||||||
}
|
|
||||||
|
|
||||||
drawList.AddImage(textureWrap.Handle, iconPos, iconPos + iconSize, Vector2.Zero, Vector2.One,
|
var iconSizeHidden = GetConfiguredBubbleSize(scaleX * sizeScaleFactor, scaleY * sizeScaleFactor, false);
|
||||||
|
var center = anchor + distanceOffset + manualOffset;
|
||||||
|
var topLeft = center - (iconSizeHidden / 2f);
|
||||||
|
|
||||||
|
drawList.AddImage(textureWrap.Handle, topLeft, topLeft + iconSizeHidden, Vector2.Zero, Vector2.One,
|
||||||
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 1f, 1f, 0.95f)));
|
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 1f, 1f, 0.95f)));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
var iconPos = rootPosition + iconLocalPosition + new Vector2(iconDimensions.X, 0f);
|
||||||
|
|
||||||
|
var iconOffset = new Vector2(distance / 1.5f, distance / 3.5f) * scaleVector;
|
||||||
|
if (iconNode->Height == 24)
|
||||||
|
{
|
||||||
|
iconOffset.Y -= 8f * scaleY;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconPos += iconOffset;
|
||||||
|
|
||||||
|
var iconSize = GetConfiguredBubbleSize(scaleX * sizeScaleFactor, scaleY * sizeScaleFactor, true);
|
||||||
|
|
||||||
|
drawList.AddImage(textureWrap.Handle, iconPos, iconPos + iconSize, Vector2.Zero, Vector2.One,
|
||||||
|
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 1f, 1f, 0.95f)));
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawWorldFallbackIcon(ImDrawListPtr drawList, IDalamudTextureWrap textureWrap, Vector3 worldPosition)
|
private void DrawWorldFallbackIcon(ImDrawListPtr drawList, IDalamudTextureWrap textureWrap, Vector3 worldPosition)
|
||||||
@@ -296,7 +346,7 @@ public sealed class TypingIndicatorOverlay : WindowMediatorSubscriberBase
|
|||||||
if (!_gameGui.WorldToScreen(offsetPosition, out var screenPos))
|
if (!_gameGui.WorldToScreen(offsetPosition, out var screenPos))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var iconSize = new Vector2(36f, 36f) * ImGuiHelpers.GlobalScale;
|
var iconSize = GetConfiguredBubbleSize(ImGuiHelpers.GlobalScale, ImGuiHelpers.GlobalScale, false);
|
||||||
var iconPos = screenPos - (iconSize / 2f) - new Vector2(0f, iconSize.Y * 0.6f);
|
var iconPos = screenPos - (iconSize / 2f) - new Vector2(0f, iconSize.Y * 0.6f);
|
||||||
drawList.AddImage(textureWrap.Handle, iconPos, iconPos + iconSize, Vector2.Zero, Vector2.One,
|
drawList.AddImage(textureWrap.Handle, iconPos, iconPos + iconSize, Vector2.Zero, Vector2.One,
|
||||||
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 1f, 1f, 0.95f)));
|
ImGui.ColorConvertFloat4ToU32(new Vector4(1f, 1f, 1f, 0.95f)));
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
ImGuiWindowFlags.NoScrollWithMouse;
|
ImGuiWindowFlags.NoScrollWithMouse;
|
||||||
|
|
||||||
public static Vector4 AccentColor { get; set; } = ImGuiColors.DalamudViolet;
|
public static Vector4 AccentColor { get; set; } = ImGuiColors.DalamudViolet;
|
||||||
|
public static Vector4 AccentHoverColor { get; set; } = new Vector4(0x3A / 255f, 0x15 / 255f, 0x50 / 255f, 1f);
|
||||||
|
public static Vector4 AccentActiveColor { get; set; } = AccentHoverColor;
|
||||||
|
|
||||||
public readonly FileDialogManager FileDialogManager;
|
public readonly FileDialogManager FileDialogManager;
|
||||||
|
|
||||||
@@ -311,7 +313,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector4 GetBoolColor(bool input) => input ? AccentColor : ImGuiColors.DalamudRed;
|
public static Vector4 GetBoolColor(bool input) => input ? AccentColor : UiSharedService.AccentColor;
|
||||||
|
|
||||||
public float GetIconTextButtonSize(FontAwesomeIcon icon, string text)
|
public float GetIconTextButtonSize(FontAwesomeIcon icon, string text)
|
||||||
{
|
{
|
||||||
@@ -369,6 +371,8 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
Vector2 cursorScreenPos = ImGui.GetCursorScreenPos();
|
Vector2 cursorScreenPos = ImGui.GetCursorScreenPos();
|
||||||
float x = vector.X + ImGui.GetStyle().FramePadding.X * 2f;
|
float x = vector.X + ImGui.GetStyle().FramePadding.X * 2f;
|
||||||
float frameHeight = height ?? ImGui.GetFrameHeight();
|
float frameHeight = height ?? ImGui.GetFrameHeight();
|
||||||
|
using var hoverColor = ImRaii.PushColor(ImGuiCol.ButtonHovered, AccentHoverColor);
|
||||||
|
using var activeColor = ImRaii.PushColor(ImGuiCol.ButtonActive, AccentActiveColor);
|
||||||
bool result = ImGui.Button(string.Empty, new Vector2(x, frameHeight));
|
bool result = ImGui.Button(string.Empty, new Vector2(x, frameHeight));
|
||||||
Vector2 pos = new Vector2(cursorScreenPos.X + ImGui.GetStyle().FramePadding.X,
|
Vector2 pos = new Vector2(cursorScreenPos.X + ImGui.GetStyle().FramePadding.X,
|
||||||
cursorScreenPos.Y + (height ?? ImGui.GetFrameHeight()) / 2f - (vector.Y / 2f));
|
cursorScreenPos.Y + (height ?? ImGui.GetFrameHeight()) / 2f - (vector.Y / 2f));
|
||||||
@@ -379,13 +383,19 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IconTextButtonInternal(FontAwesomeIcon icon, string text, Vector4? defaultColor = null, float? width = null)
|
private bool IconTextButtonInternal(FontAwesomeIcon icon, string text, Vector4? defaultColor = null, float? width = null, bool useAccentHover = true)
|
||||||
{
|
{
|
||||||
int num = 0;
|
int colorsPushed = 0;
|
||||||
if (defaultColor.HasValue)
|
if (defaultColor.HasValue)
|
||||||
{
|
{
|
||||||
ImGui.PushStyleColor(ImGuiCol.Button, defaultColor.Value);
|
ImGui.PushStyleColor(ImGuiCol.Button, defaultColor.Value);
|
||||||
num++;
|
colorsPushed++;
|
||||||
|
}
|
||||||
|
if (useAccentHover)
|
||||||
|
{
|
||||||
|
ImGui.PushStyleColor(ImGuiCol.ButtonHovered, AccentHoverColor);
|
||||||
|
ImGui.PushStyleColor(ImGuiCol.ButtonActive, AccentActiveColor);
|
||||||
|
colorsPushed += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.PushID(text);
|
ImGui.PushID(text);
|
||||||
@@ -405,9 +415,9 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
Vector2 pos2 = new Vector2(pos.X + vector.X + num2, cursorScreenPos.Y + ImGui.GetStyle().FramePadding.Y);
|
Vector2 pos2 = new Vector2(pos.X + vector.X + num2, cursorScreenPos.Y + ImGui.GetStyle().FramePadding.Y);
|
||||||
windowDrawList.AddText(pos2, ImGui.GetColorU32(ImGuiCol.Text), text);
|
windowDrawList.AddText(pos2, ImGui.GetColorU32(ImGuiCol.Text), text);
|
||||||
ImGui.PopID();
|
ImGui.PopID();
|
||||||
if (num > 0)
|
if (colorsPushed > 0)
|
||||||
{
|
{
|
||||||
ImGui.PopStyleColor(num);
|
ImGui.PopStyleColor(colorsPushed);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -417,7 +427,8 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
{
|
{
|
||||||
return IconTextButtonInternal(icon, text,
|
return IconTextButtonInternal(icon, text,
|
||||||
isInPopup ? ColorHelpers.RgbaUintToVector4(ImGui.GetColorU32(ImGuiCol.PopupBg)) : null,
|
isInPopup ? ColorHelpers.RgbaUintToVector4(ImGui.GetColorU32(ImGuiCol.PopupBg)) : null,
|
||||||
width <= 0 ? null : width);
|
width <= 0 ? null : width,
|
||||||
|
!isInPopup);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsDirectoryWritable(string dirPath, bool throwIfFails = false)
|
public static bool IsDirectoryWritable(string dirPath, bool throwIfFails = false)
|
||||||
@@ -519,7 +530,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
public void BooleanToColoredIcon(bool value, bool inline = true)
|
public void BooleanToColoredIcon(bool value, bool inline = true)
|
||||||
{
|
{
|
||||||
using var colorgreen = ImRaii.PushColor(ImGuiCol.Text, AccentColor, value);
|
using var colorgreen = ImRaii.PushColor(ImGuiCol.Text, AccentColor, value);
|
||||||
using var colorred = ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudRed, !value);
|
using var colorred = ImRaii.PushColor(ImGuiCol.Text, UiSharedService.AccentColor, !value);
|
||||||
|
|
||||||
if (inline) ImGui.SameLine();
|
if (inline) ImGui.SameLine();
|
||||||
|
|
||||||
@@ -593,24 +604,24 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
|
|
||||||
if (_isPenumbraDirectory)
|
if (_isPenumbraDirectory)
|
||||||
{
|
{
|
||||||
ColorTextWrapped("Do not point the storage path directly to the Penumbra directory. If necessary, make a subfolder in it.", ImGuiColors.DalamudRed);
|
ColorTextWrapped("Do not point the storage path directly to the Penumbra directory. If necessary, make a subfolder in it.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (_isOneDrive)
|
else if (_isOneDrive)
|
||||||
{
|
{
|
||||||
ColorTextWrapped("Do not point the storage path to a folder in OneDrive. Do not use OneDrive folders for any Mod related functionality.", ImGuiColors.DalamudRed);
|
ColorTextWrapped("Do not point the storage path to a folder in OneDrive. Do not use OneDrive folders for any Mod related functionality.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (!_isDirectoryWritable)
|
else if (!_isDirectoryWritable)
|
||||||
{
|
{
|
||||||
ColorTextWrapped("The folder you selected does not exist or cannot be written to. Please provide a valid path.", ImGuiColors.DalamudRed);
|
ColorTextWrapped("The folder you selected does not exist or cannot be written to. Please provide a valid path.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (_cacheDirectoryHasOtherFilesThanCache)
|
else if (_cacheDirectoryHasOtherFilesThanCache)
|
||||||
{
|
{
|
||||||
ColorTextWrapped("Your selected directory has files or directories inside that are not Umbra related. Use an empty directory or a previous storage directory only.", ImGuiColors.DalamudRed);
|
ColorTextWrapped("Your selected directory has files or directories inside that are not Umbra related. Use an empty directory or a previous storage directory only.", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
else if (!_cacheDirectoryIsValidPath)
|
else if (!_cacheDirectoryIsValidPath)
|
||||||
{
|
{
|
||||||
ColorTextWrapped("Your selected directory contains illegal characters unreadable by FFXIV. " +
|
ColorTextWrapped("Your selected directory contains illegal characters unreadable by FFXIV. " +
|
||||||
"Restrict yourself to latin letters (A-Z), underscores (_), dashes (-) and arabic numbers (0-9).", ImGuiColors.DalamudRed);
|
"Restrict yourself to latin letters (A-Z), underscores (_), dashes (-) and arabic numbers (0-9).", UiSharedService.AccentColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
float maxCacheSize = (float)_configService.Current.MaxLocalCacheInGiB;
|
float maxCacheSize = (float)_configService.Current.MaxLocalCacheInGiB;
|
||||||
@@ -849,7 +860,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase
|
|||||||
|
|
||||||
if (!_penumbraExists || !_glamourerExists)
|
if (!_penumbraExists || !_glamourerExists)
|
||||||
{
|
{
|
||||||
ImGui.TextColored(ImGuiColors.DalamudRed, "You need to install both Penumbra and Glamourer and keep them up to date to use Umbra.");
|
ImGui.TextColored(UiSharedService.AccentColor, "You need to install both Penumbra and Glamourer and keep them up to date to use Umbra.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user