diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index f9ead1ef2..ed1a299fa 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -435,6 +435,8 @@ MissingFiles.Cleared="Cleared" MissingFiles.Found="Found" MissingFiles.AutoSearch="Additional file matches found" MissingFiles.AutoSearchText="OBS has found additional matches for missing files in that directory. Would you like to add them?" +MissingFiles.NoMissing.Title="Missing Files Check" +MissingFiles.NoMissing.Text="No files appear to be missing." # update dialog UpdateAvailable="New Update Available" @@ -662,6 +664,7 @@ Basic.MainMenu.File.Remux="Re&mux Recordings" Basic.MainMenu.File.Settings="&Settings" Basic.MainMenu.File.ShowSettingsFolder="Show Settings Folder" Basic.MainMenu.File.ShowProfileFolder="Show Profile Folder" +Basic.MainMenu.File.ShowMissingFiles="Check for Missing Files" Basic.MainMenu.AlwaysOnTop="&Always On Top" Basic.MainMenu.File.Exit="E&xit" diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui index 83f350b45..aed873dcc 100644 --- a/UI/forms/OBSBasic.ui +++ b/UI/forms/OBSBasic.ui @@ -597,6 +597,8 @@ + + @@ -1778,6 +1780,11 @@ Export + + + Basic.MainMenu.File.ShowMissingFiles + + New diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 06c37d14e..fc8f5ebd4 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -4654,6 +4654,47 @@ void OBSBasic::on_action_Settings_triggered() } } +static inline void AddMissingFiles(void *data, obs_source_t *source) +{ + obs_missing_files_t *f = (obs_missing_files_t *)data; + obs_missing_files_t *sf = obs_source_get_missing_files(source); + + obs_missing_files_append(f, sf); + obs_missing_files_destroy(sf); +} + +void OBSBasic::on_actionShowMissingFiles_triggered() +{ + obs_missing_files_t *files = obs_missing_files_create(); + + auto cb_sources = [](void *data, obs_source_t *source) { + AddMissingFiles(data, source); + return true; + }; + obs_enum_sources(cb_sources, files); + + auto cb_transitions = [](void *data, obs_source_t *source) { + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_TRANSITION) + return true; + + AddMissingFiles(data, source); + return true; + }; + obs_enum_all_sources(cb_transitions, files); + + if (obs_missing_files_count(files) > 0) { + missDialog = new OBSMissingFiles(files, this); + missDialog->setAttribute(Qt::WA_DeleteOnClose, true); + missDialog->show(); + missDialog->raise(); + } else { + obs_missing_files_destroy(files); + OBSMessageBox::information( + this, QTStr("MissingFiles.NoMissing.Title"), + QTStr("MissingFiles.NoMissing.Text")); + } +} + void save_audio_source(int channel, obs_data_t *save) { obs_source_t *source = obs_get_output_source(channel); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 69c217aec..a52e30117 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -909,6 +909,7 @@ private slots: void on_actionShow_Recordings_triggered(); void on_actionRemux_triggered(); void on_action_Settings_triggered(); + void on_actionShowMissingFiles_triggered(); void on_actionAdvAudioProperties_triggered(); void AdvAudioPropsClicked(); void AdvAudioPropsDestroyed();