diff --git a/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs b/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs index dc7fb55c..75f5c5b5 100644 --- a/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs +++ b/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs @@ -47,10 +47,8 @@ public class ResourceTreeViewer public void Draw() { - if (ImGui.Button("Refresh Character List") || _task == null) - _task = RefreshCharacterList(); - - DrawFilters(); + DrawControls(); + _task ??= RefreshCharacterList(); using var child = ImRaii.Child("##Data"); if (!child) @@ -73,7 +71,7 @@ public class ResourceTreeViewer foreach (var (tree, index) in _task.Result.WithIndex()) { var category = Classify(tree); - if (!_categoryFilter.HasFlag(category) || !tree.Name.Contains(_nameFilter)) + if (!_categoryFilter.HasFlag(category) || !tree.Name.Contains(_nameFilter, StringComparison.OrdinalIgnoreCase)) continue; using (var c = ImRaii.PushColor(ImGuiCol.Text, CategoryColor(category).Value())) @@ -111,8 +109,14 @@ public class ResourceTreeViewer } } - private void DrawFilters() + private void DrawControls() { + var yOffset = (ChangedItemDrawer.TypeFilterIconSize.Y - ImGui.GetFrameHeight()) / 2f; + ImGui.SetCursorPosY(ImGui.GetCursorPosY() + yOffset); + + if (ImGui.Button("Refresh Character List")) + _task = RefreshCharacterList(); + ImGui.SameLine(); ImGui.Dummy(ImGuiHelpers.ScaledVector2(20, 0)); @@ -134,7 +138,7 @@ public class ResourceTreeViewer ImGui.Dummy(ImGuiHelpers.ScaledVector2(20, 0)); ImGui.SameLine(); - _changedItemDrawer.DrawTypeFilter(ref _typeFilter); + _changedItemDrawer.DrawTypeFilter(ref _typeFilter, -yOffset); ImGui.InputTextWithHint("##TreeNameFilter", "Filter by Character/Entity Name...", ref _nameFilter, 128); } diff --git a/Penumbra/UI/ChangedItemDrawer.cs b/Penumbra/UI/ChangedItemDrawer.cs index ddd58a8a..0a1d58f9 100644 --- a/Penumbra/UI/ChangedItemDrawer.cs +++ b/Penumbra/UI/ChangedItemDrawer.cs @@ -52,6 +52,9 @@ public class ChangedItemDrawer : IDisposable private readonly Dictionary _icons = new(16); private float _smallestIconWidth; + public static Vector2 TypeFilterIconSize + => new(2 * ImGui.GetTextLineHeight()); + public ChangedItemDrawer(UiBuilder uiBuilder, IDataManager gameData, ITextureProvider textureProvider, CommunicatorService communicator, Configuration config) { @@ -146,7 +149,7 @@ public class ChangedItemDrawer : IDisposable return; var typeFilter = _config.Ephemeral.ChangedItemFilter; - if (DrawTypeFilter(ref typeFilter)) + if (DrawTypeFilter(ref typeFilter, 0.0f)) { _config.Ephemeral.ChangedItemFilter = typeFilter; _config.Ephemeral.Save(); @@ -154,11 +157,11 @@ public class ChangedItemDrawer : IDisposable } /// Draw a header line with the different icon types to filter them. - public bool DrawTypeFilter(ref ChangedItemIcon typeFilter) + public bool DrawTypeFilter(ref ChangedItemIcon typeFilter, float yOffset) { var ret = false; using var _ = ImRaii.PushId("ChangedItemIconFilter"); - var size = new Vector2(2 * ImGui.GetTextLineHeight()); + var size = TypeFilterIconSize; using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero); var order = new[] { @@ -186,6 +189,7 @@ public class ChangedItemDrawer : IDisposable var ret = false; var icon = _icons[type]; var flag = typeFilter.HasFlag(type); + ImGui.SetCursorPosY(ImGui.GetCursorPosY() + yOffset); ImGui.Image(icon.ImGuiHandle, size, Vector2.Zero, Vector2.One, flag ? Vector4.One : new Vector4(0.6f, 0.3f, 0.3f, 1f)); if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) { @@ -219,7 +223,7 @@ public class ChangedItemDrawer : IDisposable ImGui.SameLine(); } - ImGui.SetCursorPosX(ImGui.GetContentRegionMax().X - size.X); + ImGui.SetCursorPos(new(ImGui.GetContentRegionMax().X - size.X, ImGui.GetCursorPosY() + yOffset)); ImGui.Image(_icons[AllFlags].ImGuiHandle, size, Vector2.Zero, Vector2.One, typeFilter == 0 ? new Vector4(0.6f, 0.3f, 0.3f, 1f) : typeFilter == AllFlags ? new Vector4(0.75f, 0.75f, 0.75f, 1f) : new Vector4(0.5f, 0.5f, 1f, 1f));