diff --git a/ChatTwo/Resources/HellionStrings.Designer.cs b/ChatTwo/Resources/HellionStrings.Designer.cs
index 05d7d68..b0cef53 100644
--- a/ChatTwo/Resources/HellionStrings.Designer.cs
+++ b/ChatTwo/Resources/HellionStrings.Designer.cs
@@ -228,4 +228,9 @@ internal class HellionStrings
internal static string Settings_Chat_Behaviour_Heading => Get(nameof(Settings_Chat_Behaviour_Heading));
internal static string Settings_Chat_Preview_Heading => Get(nameof(Settings_Chat_Preview_Heading));
internal static string Settings_Chat_Emotes_Heading => Get(nameof(Settings_Chat_Emotes_Heading));
+
+ // Hellion Chat — Database-Tab section headings
+ internal static string Settings_Database_Storage_Heading => Get(nameof(Settings_Database_Storage_Heading));
+ internal static string Settings_Database_Viewer_Heading => Get(nameof(Settings_Database_Viewer_Heading));
+ internal static string Settings_Database_Stats_Heading => Get(nameof(Settings_Database_Stats_Heading));
}
diff --git a/ChatTwo/Resources/HellionStrings.de.resx b/ChatTwo/Resources/HellionStrings.de.resx
index 7228309..c0f0d2b 100644
--- a/ChatTwo/Resources/HellionStrings.de.resx
+++ b/ChatTwo/Resources/HellionStrings.de.resx
@@ -522,4 +522,15 @@
Emotes
+
+
+
+ Speicherung
+
+
+ DB-Viewer
+
+
+ Statistiken
+
diff --git a/ChatTwo/Resources/HellionStrings.resx b/ChatTwo/Resources/HellionStrings.resx
index c70b61f..e83edca 100644
--- a/ChatTwo/Resources/HellionStrings.resx
+++ b/ChatTwo/Resources/HellionStrings.resx
@@ -522,4 +522,15 @@
Emotes
+
+
+
+ Storage
+
+
+ DB Viewer
+
+
+ Statistics
+
diff --git a/ChatTwo/Ui/SettingsTabs/Database.cs b/ChatTwo/Ui/SettingsTabs/Database.cs
index e38445d..acba658 100755
--- a/ChatTwo/Ui/SettingsTabs/Database.cs
+++ b/ChatTwo/Ui/SettingsTabs/Database.cs
@@ -33,127 +33,158 @@ internal sealed class Database : ISettingsTab
public void Draw(bool changed)
{
+ // Shift-on-open keeps the Advanced tools available without a permanent
+ // toggle in the UI, mirroring upstream Chat 2 behaviour.
if (changed)
ShowAdvanced = ImGui.GetIO().KeyShift;
- ImGuiUtil.OptionCheckbox(ref Mutable.DatabaseBattleMessages, Language.Options_DatabaseBattleMessages_Name, Language.Options_DatabaseBattleMessages_Description);
+ DrawStorageSection();
ImGui.Spacing();
-
- if (ImGuiUtil.OptionCheckbox(ref Mutable.LoadPreviousSession, Language.Options_LoadPreviousSession_Name, Language.Options_LoadPreviousSession_Description))
- if (Mutable.LoadPreviousSession)
- Mutable.FilterIncludePreviousSessions = true;
-
+ DrawViewerSection();
ImGui.Spacing();
+ DrawStatsSection();
+ }
- if (ImGuiUtil.OptionCheckbox(ref Mutable.FilterIncludePreviousSessions, Language.Options_FilterIncludePreviousSessions_Name, Language.Options_FilterIncludePreviousSessions_Description))
- if (!Mutable.FilterIncludePreviousSessions)
- Mutable.LoadPreviousSession = false;
+ private void DrawStorageSection()
+ {
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Database_Storage_Heading);
+ if (!tree.Success)
+ return;
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- var old = new FileInfo(Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat.db"));
- var migratedOld = new FileInfo(Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat-litedb.db"));
- if (old.Exists || migratedOld.Exists)
- {
- ImGui.TextUnformatted(Language.Options_Database_Old_Heading);
- ImGui.Spacing();
-
- if (ImGuiUtil.CtrlShiftButton(Language.Options_Database_Old_Delete, Language.Options_Database_Old_Delete_Tooltip))
- {
- try
- {
- if (old.Exists)
- old.Delete();
- else
- migratedOld.Delete();
- WrapperUtil.AddNotification(Language.Options_Database_Old_Delete_Success, NotificationType.Success);
- }
- catch (Exception e)
- {
- Plugin.Log.Error(e, "Unable to delete old database");
- WrapperUtil.AddNotification(Language.Options_Database_Old_Delete_Error, NotificationType.Error);
- }
- }
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
- }
-
- ImGui.TextUnformatted(Language.Options_Database_Metadata_Heading);
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
- // Refresh the database size and message count every 5 seconds to avoid
- // constant stat calls and spamming the database.
- if (DatabaseLastRefreshTicks + 5 * 1000 < Environment.TickCount64)
+ ImGui.Checkbox(Language.Options_DatabaseBattleMessages_Name, ref Mutable.DatabaseBattleMessages);
+ ImGuiUtil.HelpMarker(Language.Options_DatabaseBattleMessages_Description);
+
+ if (ImGui.Checkbox(Language.Options_LoadPreviousSession_Name, ref Mutable.LoadPreviousSession))
+ if (Mutable.LoadPreviousSession)
+ Mutable.FilterIncludePreviousSessions = true;
+ ImGuiUtil.HelpMarker(Language.Options_LoadPreviousSession_Description);
+
+ if (ImGui.Checkbox(Language.Options_FilterIncludePreviousSessions_Name, ref Mutable.FilterIncludePreviousSessions))
+ if (!Mutable.FilterIncludePreviousSessions)
+ Mutable.LoadPreviousSession = false;
+ ImGuiUtil.HelpMarker(Language.Options_FilterIncludePreviousSessions_Description);
+
+ var old = new FileInfo(Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat.db"));
+ var migratedOld = new FileInfo(Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat-litedb.db"));
+ if (old.Exists || migratedOld.Exists)
{
- DatabaseSize = Plugin.MessageManager.Store.DatabaseSize();
- DatabaseLogSize = Plugin.MessageManager.Store.DatabaseLogSize();
- DatabaseMessageCount = Plugin.MessageManager.Store.MessageCount();
- DatabaseLastRefreshTicks = Environment.TickCount64;
- }
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
- // Copy the directory path instead of the file path so people can
- // paste it into their file explorer.
- ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_Path, MessageManager.DatabasePath()));
- if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
- {
- var path = Path.GetDirectoryName(MessageManager.DatabasePath());
- ImGui.SetClipboardText(path);
- WrapperUtil.AddNotification(Language.Options_Database_Metadata_CopyConfigPathNotification, NotificationType.Info);
- }
+ ImGui.TextUnformatted(Language.Options_Database_Old_Heading);
+ ImGui.Spacing();
- if (ImGui.IsItemHovered())
- {
- ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
- ImGuiUtil.Tooltip(Language.Options_Database_Metadata_CopyConfigPath);
- }
-
- ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_Size, StringUtil.BytesToString(DatabaseSize)));
- if (ImGui.IsItemHovered())
- ImGuiUtil.Tooltip(StringUtil.BytesToString(DatabaseSize));
-
- ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_LogSize, StringUtil.BytesToString(DatabaseLogSize)));
- if (ImGui.IsItemHovered())
- ImGuiUtil.Tooltip(StringUtil.BytesToString(DatabaseLogSize));
-
- ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_MessageCount, DatabaseMessageCount));
-
- if (ImGuiUtil.CtrlShiftButton(Language.Options_ClearDatabase_Button, Language.Options_ClearDatabase_Tooltip))
- {
- Plugin.Log.Warning("Clearing messages from database");
- Plugin.MessageManager.Store.ClearMessages();
- Plugin.MessageManager.ClearAllTabs();
-
- // Refresh on next draw
- DatabaseLastRefreshTicks = 0;
- WrapperUtil.AddNotification(Language.Options_ClearDatabase_Success, NotificationType.Info);
+ if (ImGuiUtil.CtrlShiftButton(Language.Options_Database_Old_Delete, Language.Options_Database_Old_Delete_Tooltip))
+ {
+ try
+ {
+ if (old.Exists)
+ old.Delete();
+ else
+ migratedOld.Delete();
+ WrapperUtil.AddNotification(Language.Options_Database_Old_Delete_Success, NotificationType.Success);
+ }
+ catch (Exception e)
+ {
+ Plugin.Log.Error(e, "Unable to delete old database");
+ WrapperUtil.AddNotification(Language.Options_Database_Old_Delete_Error, NotificationType.Error);
+ }
+ }
}
}
+ }
- ImGui.Spacing();
+ private void DrawViewerSection()
+ {
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Database_Viewer_Heading);
+ if (!tree.Success)
+ return;
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.TextUnformatted(Language.Options_Database_Metadata_Heading);
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // Refresh the database size and message count every 5 seconds to avoid
+ // constant stat calls and spamming the database.
+ if (DatabaseLastRefreshTicks + 5 * 1000 < Environment.TickCount64)
+ {
+ DatabaseSize = Plugin.MessageManager.Store.DatabaseSize();
+ DatabaseLogSize = Plugin.MessageManager.Store.DatabaseLogSize();
+ DatabaseMessageCount = Plugin.MessageManager.Store.MessageCount();
+ DatabaseLastRefreshTicks = Environment.TickCount64;
+ }
+
+ // Copy the directory path instead of the file path so people can
+ // paste it into their file explorer.
+ ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_Path, MessageManager.DatabasePath()));
+ if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
+ {
+ var path = Path.GetDirectoryName(MessageManager.DatabasePath());
+ ImGui.SetClipboardText(path);
+ WrapperUtil.AddNotification(Language.Options_Database_Metadata_CopyConfigPathNotification, NotificationType.Info);
+ }
+
+ if (ImGui.IsItemHovered())
+ {
+ ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
+ ImGuiUtil.Tooltip(Language.Options_Database_Metadata_CopyConfigPath);
+ }
+
+ ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_Size, StringUtil.BytesToString(DatabaseSize)));
+ if (ImGui.IsItemHovered())
+ ImGuiUtil.Tooltip(StringUtil.BytesToString(DatabaseSize));
+
+ ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_LogSize, StringUtil.BytesToString(DatabaseLogSize)));
+ if (ImGui.IsItemHovered())
+ ImGuiUtil.Tooltip(StringUtil.BytesToString(DatabaseLogSize));
+
+ ImGuiUtil.HelpText(string.Format(Language.Options_Database_Metadata_MessageCount, DatabaseMessageCount));
+
+ if (ImGuiUtil.CtrlShiftButton(Language.Options_ClearDatabase_Button, Language.Options_ClearDatabase_Tooltip))
+ {
+ Plugin.Log.Warning("Clearing messages from database");
+ Plugin.MessageManager.Store.ClearMessages();
+ Plugin.MessageManager.ClearAllTabs();
+
+ // Refresh on next draw
+ DatabaseLastRefreshTicks = 0;
+ WrapperUtil.AddNotification(Language.Options_ClearDatabase_Success, NotificationType.Info);
+ }
+ }
+ }
+ }
+
+ private void DrawStatsSection()
+ {
if (!ShowAdvanced)
return;
- using var treeNode = ImRaii.TreeNode(Language.Options_Database_Advanced);
- using var wrap = ImRaii.TextWrapPos(0.0f);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Database_Stats_Heading);
+ if (!tree.Success)
+ return;
- ImGuiUtil.WarningText(Language.Options_Database_Advanced_Warning);
- if (ImGuiUtil.CtrlShiftButton("Perform maintenance", "Ctrl+Shift: MessageManager.Store.PerformMaintenance()"))
- Plugin.MessageManager.Store.PerformMaintenance();
-
- if (ImGuiUtil.CtrlShiftButton("Reload messages from database", "Ctrl+Shift: MessageManager.FilterAllTabs()"))
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
- Plugin.MessageManager.ClearAllTabs();
- Plugin.MessageManager.FilterAllTabsAsync();
- }
+ using var treeNode = ImRaii.TreeNode(Language.Options_Database_Advanced);
+ using var wrap = ImRaii.TextWrapPos(0.0f);
- if (ImGuiUtil.CtrlShiftButton("Inject 10,000 messages", "Ctrl+Shift: creates 10,000 unique messages (async)"))
- new Thread(() => InsertMessages(10_000)).Start();
- ImGui.Spacing();
+ ImGuiUtil.WarningText(Language.Options_Database_Advanced_Warning);
+ if (ImGuiUtil.CtrlShiftButton("Perform maintenance", "Ctrl+Shift: MessageManager.Store.PerformMaintenance()"))
+ Plugin.MessageManager.Store.PerformMaintenance();
+
+ if (ImGuiUtil.CtrlShiftButton("Reload messages from database", "Ctrl+Shift: MessageManager.FilterAllTabs()"))
+ {
+ Plugin.MessageManager.ClearAllTabs();
+ Plugin.MessageManager.FilterAllTabsAsync();
+ }
+
+ if (ImGuiUtil.CtrlShiftButton("Inject 10,000 messages", "Ctrl+Shift: creates 10,000 unique messages (async)"))
+ new Thread(() => InsertMessages(10_000)).Start();
+ }
}
private void InsertMessages(int count)