diff --git a/HellionChat/Resources/HellionStrings.Designer.cs b/HellionChat/Resources/HellionStrings.Designer.cs index d1682c0..f72737d 100644 --- a/HellionChat/Resources/HellionStrings.Designer.cs +++ b/HellionChat/Resources/HellionStrings.Designer.cs @@ -388,6 +388,7 @@ internal class HellionStrings internal static string StatusBar_MessagesThousands => Get(nameof(StatusBar_MessagesThousands)); internal static string Settings_Preview_TitleMock => Get(nameof(Settings_Preview_TitleMock)); internal static string Settings_Preview_StatusOpen => Get(nameof(Settings_Preview_StatusOpen)); + internal static string ChannelHeader_NotLoggedIn => Get(nameof(ChannelHeader_NotLoggedIn)); internal static string Settings_Section_Links => Get(nameof(Settings_Section_Links)); internal static string Settings_Section_Behaviour => Get(nameof(Settings_Section_Behaviour)); internal static string Settings_Section_Keybinds => Get(nameof(Settings_Section_Keybinds)); diff --git a/HellionChat/Resources/HellionStrings.ca.resx b/HellionChat/Resources/HellionStrings.ca.resx index d2d0148..1cedf9c 100644 --- a/HellionChat/Resources/HellionStrings.ca.resx +++ b/HellionChat/Resources/HellionStrings.ca.resx @@ -1358,4 +1358,7 @@ obert + + Sense sessió + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.cs.resx b/HellionChat/Resources/HellionStrings.cs.resx index ea554e1..ca16c67 100644 --- a/HellionChat/Resources/HellionStrings.cs.resx +++ b/HellionChat/Resources/HellionStrings.cs.resx @@ -1357,4 +1357,7 @@ otevřeno + + Nepřihlášen + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.da.resx b/HellionChat/Resources/HellionStrings.da.resx index 29802a1..b0c3a86 100644 --- a/HellionChat/Resources/HellionStrings.da.resx +++ b/HellionChat/Resources/HellionStrings.da.resx @@ -1357,4 +1357,7 @@ åben + + Ikke logget ind + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.de.resx b/HellionChat/Resources/HellionStrings.de.resx index de48bc0..d4a2e8c 100644 --- a/HellionChat/Resources/HellionStrings.de.resx +++ b/HellionChat/Resources/HellionStrings.de.resx @@ -1352,4 +1352,7 @@ offen + + Nicht eingeloggt + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.el.resx b/HellionChat/Resources/HellionStrings.el.resx index abfe8ef..7aad3ea 100644 --- a/HellionChat/Resources/HellionStrings.el.resx +++ b/HellionChat/Resources/HellionStrings.el.resx @@ -1357,4 +1357,7 @@ ανοιχτό + + Εκτός σύνδεσης + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.es.resx b/HellionChat/Resources/HellionStrings.es.resx index dfb57c8..1a867ff 100644 --- a/HellionChat/Resources/HellionStrings.es.resx +++ b/HellionChat/Resources/HellionStrings.es.resx @@ -1358,4 +1358,7 @@ abierto + + Sin sesión + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.fi.resx b/HellionChat/Resources/HellionStrings.fi.resx index 2bdefc6..fc6cbc9 100644 --- a/HellionChat/Resources/HellionStrings.fi.resx +++ b/HellionChat/Resources/HellionStrings.fi.resx @@ -1357,4 +1357,7 @@ auki + + Ei kirjautunut sisään + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.fr.resx b/HellionChat/Resources/HellionStrings.fr.resx index 956f1e5..c1679c2 100644 --- a/HellionChat/Resources/HellionStrings.fr.resx +++ b/HellionChat/Resources/HellionStrings.fr.resx @@ -1358,4 +1358,7 @@ ouvert + + Non connecté + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.hu.resx b/HellionChat/Resources/HellionStrings.hu.resx index f47efee..edcab59 100644 --- a/HellionChat/Resources/HellionStrings.hu.resx +++ b/HellionChat/Resources/HellionStrings.hu.resx @@ -1357,4 +1357,7 @@ nyitva + + Nincs bejelentkezve + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.it.resx b/HellionChat/Resources/HellionStrings.it.resx index 7a372ef..f821293 100644 --- a/HellionChat/Resources/HellionStrings.it.resx +++ b/HellionChat/Resources/HellionStrings.it.resx @@ -1358,4 +1358,7 @@ aperto + + Non connesso + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.ja.resx b/HellionChat/Resources/HellionStrings.ja.resx index a84ed43..67029bb 100644 --- a/HellionChat/Resources/HellionStrings.ja.resx +++ b/HellionChat/Resources/HellionStrings.ja.resx @@ -1358,4 +1358,7 @@ 開いています + + 未ログイン + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.ko.resx b/HellionChat/Resources/HellionStrings.ko.resx index d6e4303..8be4681 100644 --- a/HellionChat/Resources/HellionStrings.ko.resx +++ b/HellionChat/Resources/HellionStrings.ko.resx @@ -1358,4 +1358,7 @@ 열림 + + 로그인하지 않음 + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.nb.resx b/HellionChat/Resources/HellionStrings.nb.resx index d5f6a01..bd4eba9 100644 --- a/HellionChat/Resources/HellionStrings.nb.resx +++ b/HellionChat/Resources/HellionStrings.nb.resx @@ -1357,4 +1357,7 @@ åpen + + Ikke innlogget + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.nl.resx b/HellionChat/Resources/HellionStrings.nl.resx index 08ac71a..a98ec25 100644 --- a/HellionChat/Resources/HellionStrings.nl.resx +++ b/HellionChat/Resources/HellionStrings.nl.resx @@ -1358,4 +1358,7 @@ open + + Niet ingelogd + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.pl.resx b/HellionChat/Resources/HellionStrings.pl.resx index d88313d..1002fb9 100644 --- a/HellionChat/Resources/HellionStrings.pl.resx +++ b/HellionChat/Resources/HellionStrings.pl.resx @@ -1357,4 +1357,7 @@ otwarte + + Niezalogowany + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.pt-BR.resx b/HellionChat/Resources/HellionStrings.pt-BR.resx index b37e345..3c17c35 100644 --- a/HellionChat/Resources/HellionStrings.pt-BR.resx +++ b/HellionChat/Resources/HellionStrings.pt-BR.resx @@ -1358,4 +1358,7 @@ aberto + + Não conectado + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.pt-PT.resx b/HellionChat/Resources/HellionStrings.pt-PT.resx index 1eb606a..708b673 100644 --- a/HellionChat/Resources/HellionStrings.pt-PT.resx +++ b/HellionChat/Resources/HellionStrings.pt-PT.resx @@ -1357,4 +1357,7 @@ aberto + + Sem sessão iniciada + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.resx b/HellionChat/Resources/HellionStrings.resx index d6ebc8a..c0dfed0 100644 --- a/HellionChat/Resources/HellionStrings.resx +++ b/HellionChat/Resources/HellionStrings.resx @@ -1369,4 +1369,7 @@ open + + Not logged in + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.ro.resx b/HellionChat/Resources/HellionStrings.ro.resx index d7b6900..adae878 100644 --- a/HellionChat/Resources/HellionStrings.ro.resx +++ b/HellionChat/Resources/HellionStrings.ro.resx @@ -1358,4 +1358,7 @@ deschis + + Neconectat + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.ru.resx b/HellionChat/Resources/HellionStrings.ru.resx index 365e56d..8cb69a7 100644 --- a/HellionChat/Resources/HellionStrings.ru.resx +++ b/HellionChat/Resources/HellionStrings.ru.resx @@ -1358,4 +1358,7 @@ открыт + + Не выполнен вход + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.sv.resx b/HellionChat/Resources/HellionStrings.sv.resx index 276879b..b175ce6 100644 --- a/HellionChat/Resources/HellionStrings.sv.resx +++ b/HellionChat/Resources/HellionStrings.sv.resx @@ -1358,4 +1358,7 @@ öppen + + Inte inloggad + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.tr.resx b/HellionChat/Resources/HellionStrings.tr.resx index 3b310af..b99d3e7 100644 --- a/HellionChat/Resources/HellionStrings.tr.resx +++ b/HellionChat/Resources/HellionStrings.tr.resx @@ -1357,4 +1357,7 @@ açık + + Oturum açılmadı + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.uk.resx b/HellionChat/Resources/HellionStrings.uk.resx index 23e35f6..6942e83 100644 --- a/HellionChat/Resources/HellionStrings.uk.resx +++ b/HellionChat/Resources/HellionStrings.uk.resx @@ -1357,4 +1357,7 @@ відкрито + + Вхід не виконано + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.zh-Hans.resx b/HellionChat/Resources/HellionStrings.zh-Hans.resx index 66299f2..ea43134 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hans.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hans.resx @@ -1358,4 +1358,7 @@ 打开 + + 未登录 + \ No newline at end of file diff --git a/HellionChat/Resources/HellionStrings.zh-Hant.resx b/HellionChat/Resources/HellionStrings.zh-Hant.resx index e000264..d06e35e 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hant.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hant.resx @@ -1358,4 +1358,7 @@ 開啟 + + 未登入 + \ No newline at end of file diff --git a/HellionChat/Ui/StyleEngine/Widgets/ChannelHeader.cs b/HellionChat/Ui/StyleEngine/Widgets/ChannelHeader.cs index 53c75df..935be04 100644 --- a/HellionChat/Ui/StyleEngine/Widgets/ChannelHeader.cs +++ b/HellionChat/Ui/StyleEngine/Widgets/ChannelHeader.cs @@ -131,6 +131,24 @@ internal static class ChannelHeader ImGuiP.ItemSize(new Vector2(width, height - ImGui.GetStyle().ItemSpacing.Y)); } + // Both windows need the same string, and only one of them should know how to + // get at the world. IsValid is the guard the payload handler already uses -- + // HomeWorld is a row reference that stays unresolved until a character is + // actually logged in. + internal static string CurrentDetail() + { + var world = Plugin.PlayerState.HomeWorld.IsValid + ? Plugin.PlayerState.HomeWorld.Value.Name.ExtractText() + : null; + + return ChannelHeaderDetail.Format( + world, + DateTimeOffset.Now, + Plugin.Config.Use24HourClock, + Resources.HellionStrings.ChannelHeader_NotLoggedIn + ); + } + private static float MeasureIcon(FontManager fonts, FontAwesomeIcon icon) { using (fonts.FontAwesome.Push()) diff --git a/HellionChat/Ui/StyleEngine/Widgets/ChannelHeaderDetail.cs b/HellionChat/Ui/StyleEngine/Widgets/ChannelHeaderDetail.cs new file mode 100644 index 0000000..765f1b5 --- /dev/null +++ b/HellionChat/Ui/StyleEngine/Widgets/ChannelHeaderDetail.cs @@ -0,0 +1,34 @@ +using System.Globalization; + +namespace HellionChat.Ui.StyleEngine.Widgets; + +// TEST-MIRROR: Ui/ChannelHeaderDetailTests.cs +// +// The trailing half of the channel header: where you are and what time it is. +// +// The clock follows the same Use24HourClock setting the message timestamps do. +// Two clock formats in one window would be a defect rather than a preference, and +// the header sits directly above a column of timestamps. +// +// Culture is pinned for the same reason it is pinned in the message list: a +// German machine renders "PM" as "nachm." under its own culture, and the two +// would then disagree on the same screen. +internal static class ChannelHeaderDetail +{ + internal const string Separator = " · "; + + internal static string Format( + string? world, + DateTimeOffset now, + bool use24Hour, + string fallback + ) + { + var where = string.IsNullOrWhiteSpace(world) ? fallback : world; + var clock = use24Hour + ? now.ToString("HH:mm", CultureInfo.InvariantCulture) + : now.ToString("h:mm tt", CultureInfo.InvariantCulture); + + return string.Concat(where, Separator, clock); + } +} diff --git a/HellionChat/Ui/Windows/ChannelPopoutWindow.cs b/HellionChat/Ui/Windows/ChannelPopoutWindow.cs index 8ad82cb..d0ffa97 100644 --- a/HellionChat/Ui/Windows/ChannelPopoutWindow.cs +++ b/HellionChat/Ui/Windows/ChannelPopoutWindow.cs @@ -123,14 +123,23 @@ internal sealed class ChannelPopoutWindow : Window, IFocusableChatWindow if (Bound is null) return; - // No header row at all any more. With the title bar on it repeated the - // tab name one line below itself; with the bar off, hiding it took the - // only way out of the window with it, because the title bar carries no - // close button either -- closing has to go through the pool so the slot - // is released. Pop-in lives in the input row now, where the other window - // actions already are. - if (!Plugin.Config.ShowPopOutTitleBar) - DrawTitle(Bound); + // v1.13.0: the plain title row became the channel header. The warning it + // left behind still holds and is now the rule the header follows -- with + // the title bar on, the window title already carries the tab name, so the + // header drops the name and shows only the world and the clock. + // + // Drawn before the body child on purpose, and the child's height is left + // alone: it is a negative value, which ImGui resolves against the space + // still available from the current cursor, and the header has already + // taken its share. + StyleEngine.Widgets.ChannelHeader.Draw( + Bound, + Plugin.Config.ShowPopOutTitleBar + ? StyleEngine.Widgets.ChannelHeaderMode.DetailOnly + : StyleEngine.Widgets.ChannelHeaderMode.Full, + Plugin.Instance.FontManager, + StyleEngine.Widgets.ChannelHeader.CurrentDetail() + ); // The header close button can unbind us mid-frame (CloseRequested -> // pool.TryClose -> Unbind nulls Bound). Re-check before the body so we @@ -165,9 +174,4 @@ internal sealed class ChannelPopoutWindow : Window, IFocusableChatWindow } // Name only. Shown when the window has no title bar to carry it. - private void DrawTitle(Tab tab) - { - ImGui.TextUnformatted(tab.Name); - ImGui.Separator(); - } } diff --git a/HellionChat/Ui/Windows/MainWindow.cs b/HellionChat/Ui/Windows/MainWindow.cs index 9684f62..909579f 100644 --- a/HellionChat/Ui/Windows/MainWindow.cs +++ b/HellionChat/Ui/Windows/MainWindow.cs @@ -388,6 +388,26 @@ internal sealed class MainWindow : Window, IFocusableChatWindow ? Plugin.InputPreview.PreviewHeight : 0f; + // Before the child, so it does not scroll away with the log. The child's + // height is left alone on purpose: it is given as a negative value, and + // ImGui resolves those against the space still available from the current + // cursor -- which the header has already reduced. Subtracting it a second + // time would open a gap of exactly the header's height above the input row. + if (_activeTab is { } headerTab) + { + var mode = + Plugin.Config.MainWindowLayoutMode == MainWindowLayoutMode.TopTabs + ? StyleEngine.Widgets.ChannelHeaderMode.DetailOnly + : StyleEngine.Widgets.ChannelHeaderMode.Full; + + StyleEngine.Widgets.ChannelHeader.Draw( + headerTab, + mode, + Plugin.Instance.FontManager, + StyleEngine.Widgets.ChannelHeader.CurrentDetail() + ); + } + using ( var messages = ImRaii.Child( "##hellion-main-area",