167 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Dalamud.Interface;
 | |
| using ImGuiNET;
 | |
| using MareSynchronos.PlayerData.Pairs;
 | |
| using MareSynchronos.Services.ServerConfiguration;
 | |
| using MareSynchronos.MareConfiguration;
 | |
| using ImGuiScene;
 | |
| using MareSynchronos.Services.Mediator;
 | |
| 
 | |
| namespace MareSynchronos.UI.Handlers;
 | |
| 
 | |
| public class UidDisplayHandler
 | |
| {
 | |
|     private readonly MareConfigService _mareConfigService;
 | |
|     private readonly MareMediator _mediator;
 | |
|     private readonly PairManager _pairManager;
 | |
|     private readonly ServerConfigurationManager _serverManager;
 | |
|     private readonly Dictionary<string, bool> _showUidForEntry = new(StringComparer.Ordinal);
 | |
|     private string _editNickEntry = string.Empty;
 | |
|     private string _editUserComment = string.Empty;
 | |
|     private string _lastMouseOverUid = string.Empty;
 | |
|     private bool _popupShown = false;
 | |
|     private DateTime? _popupTime;
 | |
|     private TextureWrap? _textureWrap;
 | |
| 
 | |
|     public UidDisplayHandler(MareMediator mediator, PairManager pairManager,
 | |
|         ServerConfigurationManager serverManager, MareConfigService mareConfigService)
 | |
|     {
 | |
|         _mediator = mediator;
 | |
|         _pairManager = pairManager;
 | |
|         _serverManager = serverManager;
 | |
|         _mareConfigService = mareConfigService;
 | |
|     }
 | |
| 
 | |
|     public void DrawPairText(string id, Pair pair, float textPosX, float originalY, Func<float> editBoxWidth)
 | |
|     {
 | |
|         ImGui.SameLine(textPosX);
 | |
|         (bool textIsUid, string playerText) = GetPlayerText(pair);
 | |
|         if (!string.Equals(_editNickEntry, pair.UserData.UID, StringComparison.Ordinal))
 | |
|         {
 | |
|             ImGui.SetCursorPosY(originalY);
 | |
|             if (textIsUid) ImGui.PushFont(UiBuilder.MonoFont);
 | |
|             ImGui.TextUnformatted(playerText);
 | |
|             if (textIsUid) ImGui.PopFont();
 | |
|             if (ImGui.IsItemHovered())
 | |
|             {
 | |
|                 if (!string.Equals(_lastMouseOverUid, id))
 | |
|                 {
 | |
|                     _popupTime = DateTime.UtcNow.AddSeconds(_mareConfigService.Current.ProfileDelay);
 | |
|                 }
 | |
| 
 | |
|                 _lastMouseOverUid = id;
 | |
| 
 | |
|                 if (_popupTime > DateTime.UtcNow || !_mareConfigService.Current.ProfilesShow)
 | |
|                 {
 | |
|                     ImGui.SetTooltip("Left click to switch between UID display and nick" + Environment.NewLine
 | |
|                         + "Right click to change nick for " + pair.UserData.AliasOrUID + Environment.NewLine
 | |
|                         + "Middle Mouse Button to open their profile in a separate window");
 | |
|                 }
 | |
|                 else if (_popupTime < DateTime.UtcNow && !_popupShown)
 | |
|                 {
 | |
|                     _popupShown = true;
 | |
|                     _mediator.Publish(new ProfilePopoutToggle(pair));
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (string.Equals(_lastMouseOverUid, id))
 | |
|                 {
 | |
|                     _mediator.Publish(new ProfilePopoutToggle(null));
 | |
|                     _lastMouseOverUid = string.Empty;
 | |
|                     _popupShown = false;
 | |
|                     _textureWrap?.Dispose();
 | |
|                     _textureWrap = null;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
 | |
|             {
 | |
|                 var prevState = textIsUid;
 | |
|                 if (_showUidForEntry.ContainsKey(pair.UserData.UID))
 | |
|                 {
 | |
|                     prevState = _showUidForEntry[pair.UserData.UID];
 | |
|                 }
 | |
|                 _showUidForEntry[pair.UserData.UID] = !prevState;
 | |
|             }
 | |
| 
 | |
|             if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
 | |
|             {
 | |
|                 var nickEntryPair = _pairManager.DirectPairs.Find(p => string.Equals(p.UserData.UID, _editNickEntry, StringComparison.Ordinal));
 | |
|                 nickEntryPair?.SetNote(_editUserComment);
 | |
|                 _editUserComment = pair.GetNote() ?? string.Empty;
 | |
|                 _editNickEntry = pair.UserData.UID;
 | |
|             }
 | |
| 
 | |
|             if (ImGui.IsItemClicked(ImGuiMouseButton.Middle))
 | |
|             {
 | |
|                 _mediator.Publish(new ProfileOpenStandaloneMessage(pair));
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             ImGui.SetCursorPosY(originalY);
 | |
| 
 | |
|             ImGui.SetNextItemWidth(editBoxWidth.Invoke());
 | |
|             if (ImGui.InputTextWithHint("", "Nick/Notes", ref _editUserComment, 255, ImGuiInputTextFlags.EnterReturnsTrue))
 | |
|             {
 | |
|                 _serverManager.SetNoteForUid(pair.UserData.UID, _editUserComment);
 | |
|                 _serverManager.SaveNotes();
 | |
|                 _editNickEntry = string.Empty;
 | |
|             }
 | |
| 
 | |
|             if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
 | |
|             {
 | |
|                 _editNickEntry = string.Empty;
 | |
|             }
 | |
|             UiSharedService.AttachToolTip("Hit ENTER to save\nRight click to cancel");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public (bool isUid, string text) GetPlayerText(Pair pair)
 | |
|     {
 | |
|         var textIsUid = true;
 | |
|         bool showUidInsteadOfName = ShowUidInsteadOfName(pair);
 | |
|         string? playerText = _serverManager.GetNoteForUid(pair.UserData.UID);
 | |
|         if (!showUidInsteadOfName && playerText != null)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(playerText))
 | |
|             {
 | |
|                 playerText = pair.UserData.AliasOrUID;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 textIsUid = false;
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             playerText = pair.UserData.AliasOrUID;
 | |
|         }
 | |
| 
 | |
|         if (_mareConfigService.Current.ShowCharacterNameInsteadOfNotesForVisible && pair.IsVisible && !showUidInsteadOfName)
 | |
|         {
 | |
|             playerText = pair.PlayerName;
 | |
|             textIsUid = false;
 | |
|         }
 | |
| 
 | |
|         return (textIsUid, playerText!);
 | |
|     }
 | |
| 
 | |
|     internal void Clear()
 | |
|     {
 | |
|         _editNickEntry = string.Empty;
 | |
|         _editUserComment = string.Empty;
 | |
|     }
 | |
| 
 | |
|     internal void OpenProfile(Pair entry)
 | |
|     {
 | |
|         _mediator.Publish(new ProfileOpenStandaloneMessage(entry));
 | |
|     }
 | |
| 
 | |
|     private bool ShowUidInsteadOfName(Pair pair)
 | |
|     {
 | |
|         _showUidForEntry.TryGetValue(pair.UserData.UID, out var showUidInsteadOfName);
 | |
| 
 | |
|         return showUidInsteadOfName;
 | |
|     }
 | |
| } | 
