diff --git a/HellionChat/PluginHostFactory.cs b/HellionChat/PluginHostFactory.cs index 7f44af7..ad99d10 100644 --- a/HellionChat/PluginHostFactory.cs +++ b/HellionChat/PluginHostFactory.cs @@ -177,6 +177,9 @@ internal static class PluginHostFactory services.AddSingleton(sp => new Ui.Components.Settings.Tabs.WindowTab( sp.GetRequiredService() )); + services.AddSingleton(sp => new Ui.Components.Settings.Tabs.ChannelsTab( + sp.GetRequiredService() + )); services.AddSingleton(sp => new Ui.Components.StatusBar( sp.GetRequiredService(), sp.GetRequiredService() diff --git a/HellionChat/Ui/Components/Settings/Tabs/ChannelsTab.cs b/HellionChat/Ui/Components/Settings/Tabs/ChannelsTab.cs new file mode 100644 index 0000000..9096774 --- /dev/null +++ b/HellionChat/Ui/Components/Settings/Tabs/ChannelsTab.cs @@ -0,0 +1,126 @@ +using Dalamud.Bindings.ImGui; +using Dalamud.Interface.Utility.Raii; + +namespace HellionChat.Ui.Components.Settings.Tabs; + +internal sealed class ChannelsTab +{ + private readonly Plugin _plugin; + + public ChannelsTab(Plugin plugin) + { + _plugin = plugin; + } + + public void Draw() + { + if (ImGui.CollapsingHeader("Tab management", ImGuiTreeNodeFlags.DefaultOpen)) + { + DrawSliderInt( + "Auto-tell tabs limit", + () => Plugin.Config.AutoTellTabsLimit, + v => Plugin.Config.AutoTellTabsLimit = v, + 1, + 32 + ); + DrawToggle( + "Compact display", + () => Plugin.Config.AutoTellTabsCompactDisplay, + v => Plugin.Config.AutoTellTabsCompactDisplay = v + ); + DrawSliderInt( + "History preload", + () => Plugin.Config.AutoTellTabsHistoryPreload, + v => Plugin.Config.AutoTellTabsHistoryPreload = v, + 0, + 200 + ); + DrawToggle( + "Show greeted toggle", + () => Plugin.Config.AutoTellTabsShowGreetedToggle, + v => Plugin.Config.AutoTellTabsShowGreetedToggle = v + ); + // Popout is a v1.8.0 teaser — render disabled, do NOT persist. + using (ImRaii.Disabled(true)) + { + var openAsPopout = Plugin.Config.AutoTellTabsOpenAsPopout; + ImGui.Checkbox("Open as popout (lands in v1.8.0)", ref openAsPopout); + } + } + + if (ImGui.CollapsingHeader("Tell auto-open mode", ImGuiTreeNodeFlags.DefaultOpen)) + { + DrawTellAutoOpenModeCombo(); + } + + if (ImGui.CollapsingHeader("Sidebar")) + { + DrawToggle( + "Show sidebar tabs", + () => Plugin.Config.SidebarTabView, + v => Plugin.Config.SidebarTabView = v + ); + // Range covers the on-disk default (44) plus Master-Spec §4.1 reference + // (38px icon-only, 150px expanded). An earlier 120-400 range would clamp + // the default 44 up to 120 silently. 30 leaves headroom for a future + // ultra-tight icon-only mode; 300 stays above the 150 expanded reference + // without giving the slider an absurd ceiling. + DrawSliderInt( + "Sidebar width", + () => Plugin.Config.SidebarWidth, + v => Plugin.Config.SidebarWidth = v, + 30, + 300 + ); + } + } + + private void DrawTellAutoOpenModeCombo() + { + var labels = new[] { "Off", "Sidebar", "Top tab", "Popout (lands in v1.8.0)" }; + var values = Enum.GetValues(); + var current = Plugin.Config.TellAutoOpenMode; + var selected = 0; + for (var i = 0; i < values.Length; i++) + { + if (values[i] == current) + { + selected = i; + break; + } + } + + ImGui.SetNextItemWidth(220); + if (ImGui.Combo("Tell auto-open mode", ref selected, labels, labels.Length)) + { + // Popout (index 3) is a v1.8.0 teaser — revert to previous value + // and skip SaveConfig. + if (selected >= 0 && selected < values.Length && selected != 3) + { + Plugin.Config.TellAutoOpenMode = values[selected]; + _plugin.SaveConfig(); + } + } + } + + private void DrawToggle(string label, Func get, Action set) + { + var current = get(); + if (ImGui.Checkbox(label, ref current)) + { + set(current); + _plugin.SaveConfig(); + } + } + + private void DrawSliderInt(string label, Func get, Action set, int min, int max) + { + var current = get(); + ImGui.SetNextItemWidth(200); + if (ImGui.SliderInt(label, ref current, min, max, "%d")) + { + set(current); + _plugin.SaveConfig(); + } + } +} diff --git a/HellionChat/Ui/Windows/SettingsWindow.cs b/HellionChat/Ui/Windows/SettingsWindow.cs index b6e4a8e..a2021e9 100644 --- a/HellionChat/Ui/Windows/SettingsWindow.cs +++ b/HellionChat/Ui/Windows/SettingsWindow.cs @@ -23,6 +23,7 @@ internal sealed class SettingsWindow : Window private readonly GeneralTab _general; private readonly ChatTab _chat; private readonly WindowTab _window; + private readonly ChannelsTab _channels; public SettingsWindow( Plugin plugin, @@ -35,6 +36,7 @@ internal sealed class SettingsWindow : Window GeneralTab general, ChatTab chat, WindowTab window, + ChannelsTab channels, ILoggerFactory loggerFactory ) : base($"{Language.Settings_Title.Format(Plugin.PluginName)}###chat2-settings") @@ -49,6 +51,7 @@ internal sealed class SettingsWindow : Window _general = general; _chat = chat; _window = window; + _channels = channels; _ = loggerFactory; Size = new Vector2(720, 540); @@ -86,6 +89,9 @@ internal sealed class SettingsWindow : Window case "window": _window.Draw(); break; + case "channels": + _channels.Draw(); + break; case "appearance": _appearance.Draw(); break;