Improve tri-state checkboxes.

This commit is contained in:
Ottermandias 2023-11-15 18:38:42 +01:00
parent 2afa5734f7
commit f55d25b088
3 changed files with 30 additions and 20 deletions

View file

@ -25,6 +25,9 @@ public enum ColorId
QuickDesignButton, QuickDesignButton,
QuickDesignFrame, QuickDesignFrame,
QuickDesignBg, QuickDesignBg,
TriStateCheck,
TriStateCross,
TriStateNeutral,
} }
public static class Colors public static class Colors
@ -55,6 +58,9 @@ public static class Colors
ColorId.QuickDesignButton => (0x900A0A0A, "Quick Design Bar Button Background", "The color of button frames in the quick design bar." ), ColorId.QuickDesignButton => (0x900A0A0A, "Quick Design Bar Button Background", "The color of button frames in the quick design bar." ),
ColorId.QuickDesignFrame => (0x90383838, "Quick Design Bar Combo Background", "The color of the combo background in the quick design bar." ), ColorId.QuickDesignFrame => (0x90383838, "Quick Design Bar Combo Background", "The color of the combo background in the quick design bar." ),
ColorId.QuickDesignBg => (0x00F0F0F0, "Quick Design Bar Window Background", "The color of the window background in the quick design bar." ), ColorId.QuickDesignBg => (0x00F0F0F0, "Quick Design Bar Window Background", "The color of the window background in the quick design bar." ),
ColorId.TriStateCheck => (0xFF00D000, "Checkmark in Tri-State Checkboxes", "The color of the checkmark indicating positive change in tri-state checkboxes." ),
ColorId.TriStateCross => (0xFF0000D0, "Cross in Tri-State Checkboxes", "The color of the cross indicating negative change in tri-state checkboxes." ),
ColorId.TriStateNeutral => (0xFFD0D0D0, "Dot in Tri-State Checkboxes", "The color of the dot indicating no change in tri-state checkboxes" ),
_ => (0x00000000, string.Empty, string.Empty ), _ => (0x00000000, string.Empty, string.Empty ),
// @formatter:on // @formatter:on
}; };

View file

@ -9,6 +9,7 @@ using Glamourer.Unlocks;
using ImGuiNET; using ImGuiNET;
using Lumina.Misc; using Lumina.Misc;
using OtterGui; using OtterGui;
using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -71,15 +72,26 @@ public static class UiHelpers
} }
public static DataChange DrawMetaToggle(string label, bool currentValue, bool currentApply, out bool newValue, public static DataChange DrawMetaToggle(string label, bool currentValue, bool currentApply, out bool newValue,
out bool newApply, out bool newApply, bool locked)
bool locked)
{ {
var flags = currentApply ? currentValue ? 3 : 0 : 2; var flags = (sbyte)(currentApply ? currentValue ? 1 : -1 : 0);
bool ret;
using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, ImGui.GetStyle().ItemInnerSpacing); using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, ImGui.GetStyle().ItemInnerSpacing);
using (var disabled = ImRaii.Disabled(locked)) using (var disabled = ImRaii.Disabled(locked))
{ {
ret = ImGui.CheckboxFlags("##" + label, ref flags, 3); if (new TristateCheckbox(ColorId.TriStateCross.Value(), ColorId.TriStateCheck.Value(), ColorId.TriStateNeutral.Value()).Draw("##" + label, flags, out flags))
{
(newValue, newApply) = flags switch
{
-1 => (false, true),
0 => (true, false),
_ => (true, true),
};
}
else
{
newValue = currentValue;
newApply = currentApply;
}
} }
ImGuiUtil.HoverTooltip($"This attribute will be {(currentApply ? currentValue ? "enabled." : "disabled." : "kept as is.")}"); ImGuiUtil.HoverTooltip($"This attribute will be {(currentApply ? currentValue ? "enabled." : "disabled." : "kept as is.")}");
@ -87,21 +99,13 @@ public static class UiHelpers
ImGui.SameLine(); ImGui.SameLine();
ImGui.TextUnformatted(label); ImGui.TextUnformatted(label);
if (ret) return (currentApply != newApply, currentValue != newValue) switch
{ {
(newValue, newApply, var change) = (currentValue, currentApply) switch (true, true) => DataChange.ApplyItem | DataChange.Item,
{ (true, false) => DataChange.ApplyItem,
(false, false) => (false, true, DataChange.ApplyItem), (false, true) => DataChange.Item,
(false, true) => (true, true, DataChange.Item), _ => DataChange.None,
(true, false) => (false, false, DataChange.Item), // Should not happen };
(true, true) => (false, false, DataChange.Item | DataChange.ApplyItem),
};
return change;
}
newValue = currentValue;
newApply = currentApply;
return DataChange.None;
} }
public static (EquipFlag, CustomizeFlag) ConvertKeysToFlags() public static (EquipFlag, CustomizeFlag) ConvertKeysToFlags()

@ -1 +1 @@
Subproject commit b09bbcc276363bc994d90b641871e6280898b6e5 Subproject commit f55733a96fdc9f82c9bbf8272ca6366079aa8e32