Qt: Separate window and file log timestamp options

This commit is contained in:
Stenzek 2025-07-01 18:06:58 +10:00
parent eb503c4029
commit 5b3e843b08
No known key found for this signature in database
7 changed files with 57 additions and 8 deletions

View File

@ -501,6 +501,9 @@ void Log::FileOutputLogCallback(void* pUserParam, MessageCategory cat, const cha
void Log::SetFileOutputParams(bool enabled, const char* filename, bool timestamps /* = true */) void Log::SetFileOutputParams(bool enabled, const char* filename, bool timestamps /* = true */)
{ {
std::unique_lock lock(s_state.callbacks_mutex); std::unique_lock lock(s_state.callbacks_mutex);
s_state.file_output_timestamp = timestamps;
if (s_state.file_output_enabled == enabled) if (s_state.file_output_enabled == enabled)
return; return;
@ -523,7 +526,6 @@ void Log::SetFileOutputParams(bool enabled, const char* filename, bool timestamp
} }
s_state.file_output_enabled = enabled; s_state.file_output_enabled = enabled;
s_state.file_output_timestamp = timestamps;
} }
Log::Level Log::GetLogLevel() Log::Level Log::GetLogLevel()

View File

@ -1164,6 +1164,7 @@ void Settings::SetDefaultLogConfig(SettingsInterface& si)
si.SetBoolValue("Logging", "LogToDebug", false); si.SetBoolValue("Logging", "LogToDebug", false);
si.SetBoolValue("Logging", "LogToWindow", false); si.SetBoolValue("Logging", "LogToWindow", false);
si.SetBoolValue("Logging", "LogToFile", false); si.SetBoolValue("Logging", "LogToFile", false);
si.SetBoolValue("Logging", "LogFileTimestamps", false);
for (const char* channel_name : Log::GetChannelNames()) for (const char* channel_name : Log::GetChannelNames())
si.SetBoolValue("Logging", channel_name, true); si.SetBoolValue("Logging", channel_name, true);
@ -1179,6 +1180,7 @@ void Settings::UpdateLogConfig(const SettingsInterface& si)
const bool log_to_debug = si.GetBoolValue("Logging", "LogToDebug", false); const bool log_to_debug = si.GetBoolValue("Logging", "LogToDebug", false);
const bool log_to_window = si.GetBoolValue("Logging", "LogToWindow", false); const bool log_to_window = si.GetBoolValue("Logging", "LogToWindow", false);
const bool log_to_file = si.GetBoolValue("Logging", "LogToFile", false); const bool log_to_file = si.GetBoolValue("Logging", "LogToFile", false);
const bool log_file_timestamps = si.GetBoolValue("Logging", "LogFileTimestamps", false);
const bool any_logs_enabled = (log_to_console || log_to_debug || log_to_window || log_to_file); const bool any_logs_enabled = (log_to_console || log_to_debug || log_to_window || log_to_file);
Log::SetLogLevel(any_logs_enabled ? log_level : Log::Level::None); Log::SetLogLevel(any_logs_enabled ? log_level : Log::Level::None);
@ -1189,7 +1191,7 @@ void Settings::UpdateLogConfig(const SettingsInterface& si)
if (log_to_file) if (log_to_file)
{ {
Log::SetFileOutputParams(log_to_file, Path::Combine(EmuFolders::DataRoot, "duckstation.log").c_str(), Log::SetFileOutputParams(log_to_file, Path::Combine(EmuFolders::DataRoot, "duckstation.log").c_str(),
log_timestamps); log_file_timestamps);
} }
else else
{ {

View File

@ -180,6 +180,11 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(SettingsWindow* dialog, QWidget*
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToDebug, "Logging", "LogToDebug", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToDebug, "Logging", "LogToDebug", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToWindow, "Logging", "LogToWindow", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToWindow, "Logging", "LogToWindow", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToFile, "Logging", "LogToFile", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logToFile, "Logging", "LogToFile", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logTimestamps, "Logging", "LogTimestamps", true);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.logFileTimestamps, "Logging", "LogFileTimestamps", false);
connect(m_ui.logToConsole, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
connect(m_ui.logToWindow, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
connect(m_ui.logToFile, &QCheckBox::checkStateChanged, this, &AdvancedSettingsWidget::onAnyLogSinksChanged);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showDebugMenu, "Main", "ShowDebugMenu", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showDebugMenu, "Main", "ShowDebugMenu", false);
@ -205,6 +210,10 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(SettingsWindow* dialog, QWidget*
tr("Logs messages to the window.")); tr("Logs messages to the window."));
dialog->registerWidgetHelp(m_ui.logToFile, tr("Log To File"), tr("User Preference"), dialog->registerWidgetHelp(m_ui.logToFile, tr("Log To File"), tr("User Preference"),
tr("Logs messages to duckstation.log in the user directory.")); tr("Logs messages to duckstation.log in the user directory."));
dialog->registerWidgetHelp(m_ui.logTimestamps, tr("Log Timestamps"), tr("User Preference"),
tr("Includes the elapsed time since the application start in window and console logs."));
dialog->registerWidgetHelp(m_ui.logFileTimestamps, tr("Log File Timestamps"), tr("User Preference"),
tr("Includes the elapsed time since the application start in file logs."));
dialog->registerWidgetHelp(m_ui.showDebugMenu, tr("Show Debug Menu"), tr("Unchecked"), dialog->registerWidgetHelp(m_ui.showDebugMenu, tr("Show Debug Menu"), tr("Unchecked"),
tr("Shows a debug menu bar with additional statistics and quick settings.")); tr("Shows a debug menu bar with additional statistics and quick settings."));
} }
@ -218,6 +227,16 @@ void AdvancedSettingsWidget::onLogChannelsButtonClicked()
menu.exec(QCursor::pos()); menu.exec(QCursor::pos());
} }
void AdvancedSettingsWidget::onAnyLogSinksChanged()
{
const bool log_to_console = m_dialog->getEffectiveBoolValue("Logging", "LogToConsole", false);
const bool log_to_window = m_dialog->getEffectiveBoolValue("Logging", "LogToWindow", false);
const bool log_to_file = m_dialog->getEffectiveBoolValue("Logging", "LogToFile", false);
m_ui.logTimestamps->setEnabled(log_to_console || log_to_window);
m_ui.logFileTimestamps->setEnabled(log_to_file);
}
void AdvancedSettingsWidget::onShowDebugOptionsStateChanged() void AdvancedSettingsWidget::onShowDebugOptionsStateChanged()
{ {
const bool enabled = QtHost::ShouldShowDebugOptions(); const bool enabled = QtHost::ShouldShowDebugOptions();

View File

@ -22,6 +22,7 @@ Q_SIGNALS:
private Q_SLOTS: private Q_SLOTS:
void onLogChannelsButtonClicked(); void onLogChannelsButtonClicked();
void onAnyLogSinksChanged();
void onShowDebugOptionsStateChanged(); void onShowDebugOptionsStateChanged();
private: private:

View File

@ -58,10 +58,10 @@
</item> </item>
<item row="1" column="0" colspan="3"> <item row="1" column="0" colspan="3">
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="1" column="1">
<widget class="QCheckBox" name="logToConsole"> <widget class="QCheckBox" name="logToFile">
<property name="text"> <property name="text">
<string>Log To System Console</string> <string>Log To File</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -72,6 +72,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QCheckBox" name="logToConsole">
<property name="text">
<string>Log To System Console</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QCheckBox" name="logToDebug"> <widget class="QCheckBox" name="logToDebug">
<property name="text"> <property name="text">
@ -79,10 +86,17 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="2" column="0">
<widget class="QCheckBox" name="logToFile"> <widget class="QCheckBox" name="logTimestamps">
<property name="text"> <property name="text">
<string>Log To File</string> <string>Log Timestamps</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="logFileTimestamps">
<property name="text">
<string>Log File Timestamps</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -2314,6 +2314,8 @@ void MainWindow::connectSignals()
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogToFile, "Logging", "LogToFile", false); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogToFile, "Logging", "LogToFile", false);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogToWindow, "Logging", "LogToWindow", false); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogToWindow, "Logging", "LogToWindow", false);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogTimestamps, "Logging", "LogTimestamps", true); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogTimestamps, "Logging", "LogTimestamps", true);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionLogFileTimestamps, "Logging", "LogFileTimestamps",
false);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableSafeMode, "Main", "DisableAllEnhancements", SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableSafeMode, "Main", "DisableAllEnhancements",
false); false);

View File

@ -169,6 +169,7 @@
<addaction name="actionLogToWindow"/> <addaction name="actionLogToWindow"/>
<addaction name="actionLogToFile"/> <addaction name="actionLogToFile"/>
<addaction name="actionLogTimestamps"/> <addaction name="actionLogTimestamps"/>
<addaction name="actionLogFileTimestamps"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionCPUDebugger"/> <addaction name="actionCPUDebugger"/>
<addaction name="separator"/> <addaction name="separator"/>
@ -955,6 +956,14 @@
<string>Log Timestamps</string> <string>Log Timestamps</string>
</property> </property>
</action> </action>
<action name="actionLogFileTimestamps">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Log File Timestamps</string>
</property>
</action>
<action name="actionLogToSystemConsole"> <action name="actionLogToSystemConsole">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>