diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index eab26b7be..2facb0bf0 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -1005,9 +1005,9 @@ Choose Help > Diagnostics > Check Dependencies to view a list of \ locations of the missing files."), missingFileName); // if an old dialog exists, raise it if it is - if (offendingProject->GetMissingAliasFileDialog()) { - offendingProject->GetMissingAliasFileDialog()->Raise(); - } else { + if ( auto dialog = MissingAliasFilesDialog::Find( *offendingProject ) ) + dialog->Raise(); + else { MissingAliasFilesDialog::Show(offendingProject.get(), _("Files Missing"), errorMessage, wxT(""), true); } diff --git a/src/MissingAliasFileDialog.cpp b/src/MissingAliasFileDialog.cpp index d0f00ddb9..ea9924f60 100644 --- a/src/MissingAliasFileDialog.cpp +++ b/src/MissingAliasFileDialog.cpp @@ -14,11 +14,16 @@ #include "Project.h" #include "widgets/ErrorDialog.h" +namespace { + using wxDialogRef = wxWeakRef< wxDialog >; + std::vector< wxDialogRef > sDialogs; +} + // special case for alias missing dialog because we keep track of if it exists. class MissingAliasFileDialog final : public ErrorDialog { public: - MissingAliasFileDialog(AudacityProject *parent, + MissingAliasFileDialog(wxWindow *parent, const wxString & dlogTitle, const wxString & message, const wxString & helpURL, @@ -27,20 +32,23 @@ class MissingAliasFileDialog final : public ErrorDialog }; -MissingAliasFileDialog::MissingAliasFileDialog(AudacityProject *parent, +MissingAliasFileDialog::MissingAliasFileDialog(wxWindow *parent, const wxString & dlogTitle, const wxString & message, const wxString & helpURL, const bool Close, const bool modal): ErrorDialog(parent, dlogTitle, message, helpURL, Close, modal) { - parent->SetMissingAliasFileDialog(this); + sDialogs.push_back( this ); } MissingAliasFileDialog::~MissingAliasFileDialog() { - static_cast(GetParent()) - ->SetMissingAliasFileDialog( nullptr ); + auto begin = sDialogs.begin(), end = sDialogs.end(), + newEnd = std::remove_if( begin, end, + [&]( const wxDialogRef &ref ){ + return ref == this; } ); + sDialogs.erase( newEnd, end ); } namespace MissingAliasFilesDialog { @@ -82,6 +90,17 @@ namespace MissingAliasFilesDialog { // but in practice Destroy() in OnOK does that } + wxDialog *Find( const AudacityProject &project ) + { + auto begin = sDialogs.begin(), end = sDialogs.end(), + iter = std::find_if( begin, end, + [&]( const wxDialogRef &ref ){ + return ref && ref->GetParent() == &project; } ); + if (iter != end) + return *iter; + return nullptr; + } + void Mark(const AliasBlockFile *b) { Lock lock{ m_LastMissingBlockFileLock }; diff --git a/src/MissingAliasFileDialog.h b/src/MissingAliasFileDialog.h index 8c2d15e8b..d02a14180 100644 --- a/src/MissingAliasFileDialog.h +++ b/src/MissingAliasFileDialog.h @@ -37,6 +37,8 @@ void Show(AudacityProject *parent, const wxString &helpPage, const bool Close = true); +wxDialog *Find( const AudacityProject &project ); + } #endif diff --git a/src/Project.cpp b/src/Project.cpp index 0a303541f..97e27a606 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1548,16 +1548,6 @@ void AudacityProject::UpdatePrefs() } } -void AudacityProject::SetMissingAliasFileDialog(wxDialog *dialog) -{ - mMissingAliasFilesWarningDialog = dialog; -} - -wxDialog *AudacityProject::GetMissingAliasFileDialog() -{ - return mMissingAliasFilesWarningDialog; -} - void AudacityProject::RedrawProject(const bool bForceWaveTracks /*= false*/) { FixScrollbars(); diff --git a/src/Project.h b/src/Project.h index 1fdeed731..9647d7163 100644 --- a/src/Project.h +++ b/src/Project.h @@ -341,15 +341,6 @@ public: bool GetNormalizeOnLoad() { return mNormalizeOnLoad; } //lda void SetNormalizeOnLoad(bool flag) { mNormalizeOnLoad = flag; } //lda - /** \brief Sets the wxDialog that is being displayed - * Used by the custom dialog warning constructor and destructor - */ - void SetMissingAliasFileDialog(wxDialog *dialog); - - /** \brief returns a pointer to the wxDialog if it is displayed, NULL otherwise. - */ - wxDialog *GetMissingAliasFileDialog(); - // Timer Record Auto Save/Export Routines bool SaveFromTimerRecording(wxFileName fnFile); bool ExportFromTimerRecording(wxFileName fnFile, int iFormat, int iSubFormat, int iFilterIndex); @@ -645,9 +636,6 @@ private: Destroy_ptr mFreqWindow; Destroy_ptr mContrastDialog; - // dialog for missing alias warnings - wxDialog *mMissingAliasFilesWarningDialog{}; - bool mShownOnce{ false }; // Project owned meters