Skip to content

Commit 225af45

Browse files
committed
3.0.3
1 parent 5f397f3 commit 225af45

13 files changed

Lines changed: 208 additions & 79 deletions

File tree

Snowcloak/Configuration/Configurations/SnowcloakConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class SnowcloakConfig : ISnowcloakConfiguration
6464
public bool ShowVisibleUsersSeparately { get; set; } = true;
6565
public bool ShowSyncshellBudgetDashboard { get; set; } = false;
6666
public bool ShowCompactUiPerformanceTab { get; set; } = false;
67+
public bool CompactUiSidebarCollapsed { get; set; } = false;
6768
public int TimeSpanBetweenScansInSeconds { get; set; } = 30;
6869
public int TransferBarsHeight { get; set; } = 12;
6970
public bool TransferBarsShowText { get; set; } = true;

Snowcloak/PlayerData/Handlers/PairVisibilityTracker.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal sealed class PairVisibilityTracker
2626
private readonly GameObjectHandlerFactory _gameObjectHandlerFactory;
2727
private readonly NotesStore _notesStore;
2828
private readonly IpcManager _ipcManager;
29+
private int _initLookupMisses;
2930

3031
public PairVisibilityTracker(PairHandler handler, ILogger logger, SnowMediator mediator, Pair pair,
3132
PairAppliedState appliedState, BackgroundTaskTracker backgroundTasks, SingleFlightCts downloadFlight,
@@ -77,11 +78,21 @@ public void UpdateVisibility(bool nowVisible, bool invalidate = false)
7778
var pc = _dalamudUtil.FindPlayerByNameHash(Pair.Ident);
7879
if (pc.EntityId == 0)
7980
{
80-
Logger.LogDebug("Visibility update skipped for {this}, player not found yet; rearming tracking", _handler);
81+
_initLookupMisses++;
82+
if (_initLookupMisses >= 5)
83+
{
84+
Logger.LogWarning("Visibility update skipped for {this}, player not found yet after {misses} consecutive attempts; rearming tracking",
85+
_handler, _initLookupMisses);
86+
}
87+
else
88+
{
89+
Logger.LogDebug("Visibility update skipped for {this}, player not found yet; rearming tracking", _handler);
90+
}
8191
_visibilityService.StopTracking(Pair.Ident);
8292
_visibilityService.StartTracking(Pair.Ident);
8393
return;
8494
}
95+
_initLookupMisses = 0;
8596
Logger.LogDebug("One-Time Initializing {this}", _handler);
8697
Initialize(pc.Name);
8798
Logger.LogDebug("One-Time Initialized {this}", _handler);

Snowcloak/Services/Mediator/Messages/Messages.Lifecycle.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public record GposeStartMessage : SameThreadMessage;
2020
public record GposeEndMessage : MessageBase;
2121
public record CutsceneEndMessage : MessageBase;
2222
public record ConnectedMessage(ConnectionDto Connection) : MessageBase;
23+
public record FileServerInfoReceivedMessage(ConnectionDto Connection) : MessageBase;
2324
public record ServerNewsMessage(string News) : MessageBase;
2425

2526
public record DisconnectedMessage : SameThreadMessage;

Snowcloak/Services/Mediator/WindowMediatorSubscriberBase.cs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Numerics;
2-
using Dalamud.Interface.Utility;
32
using Dalamud.Interface.Windowing;
43
using Microsoft.Extensions.Logging;
54
using Snowcloak.UI.Components;
@@ -11,7 +10,6 @@ public abstract class WindowMediatorSubscriberBase : Window, IMediatorSubscriber
1110
protected readonly ILogger _logger;
1211
private readonly PerformanceCollectorService _performanceCollectorService;
1312
private bool _windowStylePushed;
14-
private WindowSizeConstraints? _unscaledConstraints;
1513

1614
protected WindowMediatorSubscriberBase(ILogger logger, SnowMediator mediator, string name,
1715
PerformanceCollectorService performanceCollectorService) : base(name)
@@ -40,30 +38,17 @@ public void Dispose()
4038

4139
protected void SetScaledSizeConstraints(Vector2 minimumSize, Vector2? maximumSize = null)
4240
{
43-
_unscaledConstraints = new WindowSizeConstraints
41+
// Dalamud's Window.SizeConstraints is already scaled by ImGuiHelpers.GlobalScale
42+
// internally
43+
SizeConstraints = new WindowSizeConstraints
4444
{
4545
MinimumSize = minimumSize,
4646
MaximumSize = maximumSize ?? new Vector2(float.MaxValue),
4747
};
48-
ApplyScaledConstraints();
49-
}
50-
51-
private void ApplyScaledConstraints()
52-
{
53-
if (_unscaledConstraints is not { } constraints)
54-
return;
55-
56-
var scale = ImGuiHelpers.GlobalScale;
57-
SizeConstraints = new WindowSizeConstraints
58-
{
59-
MinimumSize = constraints.MinimumSize * scale,
60-
MaximumSize = constraints.MaximumSize * scale,
61-
};
6248
}
6349

6450
public override void PreDraw()
6551
{
66-
ApplyScaledConstraints();
6752
ModernWindowStyle.PushTitleBar();
6853
_windowStylePushed = true;
6954
base.PreDraw();

Snowcloak/Services/VisibilityService.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,30 +48,38 @@ public void StopTracking(string ident)
4848

4949
private void FrameworkUpdate()
5050
{
51+
List<(string Ident, bool Visible)>? toPublish = null;
52+
5153
foreach (var player in _trackedPlayerVisibility)
5254
{
5355
string ident = player.Key;
5456
var findResult = _dalamudUtil.FindPlayerByNameHash(ident);
5557
var isVisible = findResult.EntityId != 0;
56-
58+
5759
if (player.Value == TrackedPlayerStatus.NotVisible && isVisible)
5860
{
5961
if (_makeVisibleNextFrame.Contains(ident))
6062
{
6163
if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.Visible, comparisonValue: TrackedPlayerStatus.NotVisible))
62-
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: true));
64+
(toPublish ??= new()).Add((ident, true));
6365
}
6466
else
6567
_makeVisibleNextFrame.Add(ident);
6668
}
6769
else if (player.Value == TrackedPlayerStatus.Visible && !isVisible)
6870
{
6971
if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.NotVisible, comparisonValue: TrackedPlayerStatus.Visible))
70-
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: false, Invalidate: false));
72+
(toPublish ??= new()).Add((ident, false));
7173
}
7274

7375
if (!isVisible)
7476
_makeVisibleNextFrame.Remove(ident);
7577
}
78+
79+
if (toPublish == null)
80+
return;
81+
82+
foreach (var (ident, visible) in toPublish)
83+
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: visible, Invalidate: false));
7684
}
7785
}

Snowcloak/Snowcloak.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
33
<PropertyGroup>
44
<AssemblyName>Snowcloak</AssemblyName>
5-
<Version>3.0.2.0</Version>
5+
<Version>3.0.3.0</Version>
66
<PackageProjectUrl>https://github.com/Eauldane/SnowcloakClient/</PackageProjectUrl>
77
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
88
<Configurations>Release;Debug</Configurations>

Snowcloak/UI/CompactUI.Sidebar.cs

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace Snowcloak.UI;
3737
public partial class CompactUi
3838
{
3939
private const float ExpandedSidebarWidth = ModernSidebar.ExpandedWidth;
40+
private const float CollapsedSidebarWidth = 28f;
41+
private const float CollapseToggleRowHeight = 26f;
4042

4143
private static void DrawSidebarSeparator() => ModernSidebar.DrawSeparator();
4244

@@ -69,12 +71,19 @@ private string GetFrostbrandSidebarLabel()
6971
}
7072
private void DrawSidebar()
7173
{
72-
var sidebarWidth = ExpandedSidebarWidth * ImGuiHelpers.GlobalScale;
74+
bool collapsed = _configService.Current.CompactUiSidebarCollapsed;
75+
var sidebarWidth = (collapsed ? CollapsedSidebarWidth : ExpandedSidebarWidth) * ImGuiHelpers.GlobalScale;
7376

7477
using var childBg = ImRaii.PushColor(ImGuiCol.ChildBg, SnowcloakColours.CompactPanel);
7578
using var childPadding = ImRaii.PushStyle(ImGuiStyleVar.WindowPadding, new Vector2(14f, 12f) * ImGuiHelpers.GlobalScale);
7679
using (var child = ImRaii.Child("Sidebar", new Vector2(sidebarWidth, -1), false))
7780
{
81+
if (collapsed)
82+
{
83+
DrawCollapsedSidebar();
84+
return;
85+
}
86+
7887
using var sidebarPadding = ImRaii.PushStyle(ImGuiStyleVar.FramePadding, new Vector2(10f, 9f) * ImGuiHelpers.GlobalScale);
7988
using var sidebarSpacing = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, new Vector2(ImGui.GetStyle().ItemSpacing.X, 8f * ImGuiHelpers.GlobalScale));
8089
ImGuiHelpers.ScaledDummy(9);
@@ -114,20 +123,69 @@ private void DrawSidebar()
114123

115124
DrawSidebarAction(FontAwesomeIcon.Book, "User Guide",
116125
() => Util.OpenLink("https://docs.snowcloak-sync.com"));
117-
float bottomElementsHeight = 108f * ImGuiHelpers.GlobalScale;
126+
127+
float bottomElementsHeight = 108f * ImGuiHelpers.GlobalScale
128+
+ CollapseToggleRowHeight * ImGuiHelpers.GlobalScale + ImGui.GetStyle().ItemSpacing.Y;
118129
var availableSpace = ImGui.GetContentRegionAvail().Y;
119130
if (availableSpace > bottomElementsHeight)
120131
{
121132
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + availableSpace - bottomElementsHeight);
122133
}
123134

135+
DrawSidebarCollapseToggle(collapsed: false);
136+
124137
var connectedIcon = _serverManager.CurrentServer!.FullPause ? FontAwesomeIcon.Unlink : FontAwesomeIcon.Link;
125138
var color = !_serverManager.CurrentServer!.FullPause ? SnowcloakColours.OnlineBlue : SnowcloakColours.CompactOffline;
126139

127140
DrawSidebarServerFooter(connectedIcon, color);
128141
}
129142
}
130143

144+
private void DrawCollapsedSidebar()
145+
{
146+
var availableSpace = ImGui.GetContentRegionAvail().Y;
147+
var toggleHeight = CollapseToggleRowHeight * ImGuiHelpers.GlobalScale;
148+
if (availableSpace > toggleHeight)
149+
{
150+
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + availableSpace - toggleHeight);
151+
}
152+
153+
DrawSidebarCollapseToggle(collapsed: true);
154+
}
155+
156+
private void DrawSidebarCollapseToggle(bool collapsed)
157+
{
158+
var scale = ImGuiHelpers.GlobalScale;
159+
var width = ImGui.GetContentRegionAvail().X;
160+
var height = CollapseToggleRowHeight * scale;
161+
var min = ImGui.GetCursorScreenPos();
162+
163+
ImGui.InvisibleButton("##sidebar-collapse-toggle", new Vector2(width, height));
164+
var clicked = ImGui.IsItemClicked(ImGuiMouseButton.Left);
165+
var hovered = ImGui.IsItemHovered();
166+
var drawList = ImGui.GetWindowDrawList();
167+
168+
if (hovered)
169+
{
170+
drawList.AddRectFilled(min, min + new Vector2(width, height), Colour.Vector4ToColour(new Vector4(0.090f, 0.150f, 0.220f, 0.54f)), 3f * scale);
171+
}
172+
173+
var icon = collapsed ? FontAwesomeIcon.ChevronRight : FontAwesomeIcon.ChevronLeft;
174+
var iconText = icon.ToIconString();
175+
ImGui.PushFont(UiBuilder.IconFont);
176+
var iconSize = ImGui.CalcTextSize(iconText);
177+
var iconPos = min + new Vector2((width - iconSize.X) * 0.5f, (height - iconSize.Y) * 0.5f);
178+
drawList.AddText(iconPos, Colour.Vector4ToColour(SnowcloakColours.CompactTextMuted), iconText);
179+
ImGui.PopFont();
180+
181+
if (clicked)
182+
{
183+
_configService.Update(c => c.CompactUiSidebarCollapsed = !collapsed);
184+
}
185+
186+
ElezenImgui.AttachTooltip(collapsed ? "Expand sidebar" : "Collapse sidebar");
187+
}
188+
131189
private void DrawSidebarServerFooter(FontAwesomeIcon connectedIcon, Vector4 connectionColor)
132190
{
133191
var scale = ImGuiHelpers.GlobalScale;

Snowcloak/UI/CompactUI.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ public CompactUi(ILogger<CompactUi> logger, UiFontService fontService,
180180
Click = (btn) => Util.OpenLink("https://patreon.com/elznmods")
181181
}
182182
];
183-
// changed min size
184-
SetScaledSizeConstraints(new Vector2(700, 750), new Vector2(1200, 2000));
183+
184+
SetScaledSizeConstraints(new Vector2(560, 700), new Vector2(1200, 2000));
185185
Size = new Vector2(860, 720);
186186
SizeCondition = ImGuiCond.FirstUseEver;
187187

0 commit comments

Comments
 (0)