Missing alias file tracking out of AudacityApp, into new files...

... which reduces the need for including AudacityApp.h
This commit is contained in:
Paul Licameli 2019-04-25 16:34:07 -04:00
parent 0ab29d21e9
commit a047fa6e7a
19 changed files with 249 additions and 175 deletions

View File

@ -127,6 +127,8 @@ src/MemoryX.h
src/Menus.cpp
src/Menus.h
src/MenusMac.cpp
src/MissingAliasFileDialog.cpp
src/MissingAliasFileDialog.h
src/Mix.cpp
src/Mix.h
src/MixerBoard.cpp

View File

@ -1274,6 +1274,7 @@
5EBD243D1F74C50800132E0A /* eu_ES.po in Sources */ = {isa = PBXBuildFile; fileRef = 5EBD243C1F74C50800132E0A /* eu_ES.po */; };
5EBD35861F78D37A0084D13F /* pt_PT.po in Sources */ = {isa = PBXBuildFile; fileRef = 5EBD35851F78D37A0084D13F /* pt_PT.po */; };
5EC7ED061E101C5C0052CAE2 /* NotYetAvailableException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */; };
5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */; };
5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */; };
5ED1D0AE1CDE55BD00471E3C /* OverlayPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */; };
5ED1D0B11CDE560C00471E3C /* BackedPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */; };
@ -3285,6 +3286,8 @@
5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotYetAvailableException.cpp; sourceTree = "<group>"; };
5EC7ED051E101C5C0052CAE2 /* NotYetAvailableException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotYetAvailableException.h; sourceTree = "<group>"; };
5ECCE7651DE49834009900E9 /* AudacityException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityException.h; sourceTree = "<group>"; };
5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MissingAliasFileDialog.cpp; sourceTree = "<group>"; };
5ECF728922887B3B007F2A35 /* MissingAliasFileDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissingAliasFileDialog.h; sourceTree = "<group>"; };
5ED18DB61CC16B1E00FAFE95 /* Reverb_libSoX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reverb_libSoX.h; sourceTree = "<group>"; };
5ED18DB71CC290AB00FAFE95 /* wxFileNameWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wxFileNameWrapper.h; sourceTree = "<group>"; };
5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Overlay.cpp; sourceTree = "<group>"; };
@ -4319,6 +4322,7 @@
1865A9B61004490500946EE6 /* LyricsWindow.cpp */,
28EBA7FF0A78FAF800C8BB1F /* Matrix.cpp */,
1790B0A709883BFD008A330A /* Menus.cpp */,
5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */,
1790B0AB09883BFD008A330A /* Mix.cpp */,
289E75081006D0BD00CEF79B /* MixerBoard.cpp */,
280A8B4519F4403B0091DE70 /* ModuleManager.cpp */,
@ -4425,6 +4429,7 @@
28EBA8000A78FAF800C8BB1F /* Matrix.h */,
5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */,
1790B0A809883BFD008A330A /* Menus.h */,
5ECF728922887B3B007F2A35 /* MissingAliasFileDialog.h */,
1790B0AC09883BFD008A330A /* Mix.h */,
289E75091006D0BD00CEF79B /* MixerBoard.h */,
280A8B4619F4403B0091DE70 /* ModuleManager.h */,
@ -8528,6 +8533,7 @@
28884949131B6CF600B59735 /* ca.po in Sources */,
2888494A131B6CF600B59735 /* ca_ES@valencia.po in Sources */,
2888494B131B6CF600B59735 /* cs.po in Sources */,
5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */,
2888494C131B6CF600B59735 /* cy.po in Sources */,
2888494D131B6CF600B59735 /* da.po in Sources */,
2888494E131B6CF600B59735 /* de.po in Sources */,

View File

@ -83,6 +83,7 @@ It handles initialization and termination by subclassing wxApp.
#include "LangChoice.h"
#include "Languages.h"
#include "Menus.h"
#include "MissingAliasFileDialog.h"
#include "PluginManager.h"
#include "Project.h"
#include "Screenshot.h"
@ -881,18 +882,13 @@ void AudacityApp::OnTimer(wxTimerEvent& WXUNUSED(event))
}
// Check if a warning for missing aliased files should be displayed
if (ShouldShowMissingAliasFilesWarning()) {
if (MissingAliasFilesDialog::ShouldShow()) {
// find which project owns the blockfile
// note: there may be more than 1, but just go with the first one.
//size_t numProjects = gAudacityProjects.size();
AProjectHolder offendingProject;
wxString missingFileName;
{
ODLocker locker { &m_LastMissingBlockFileLock };
offendingProject = m_LastMissingBlockFileProject.lock();
missingFileName = m_LastMissingBlockFilePath;
}
auto marked = MissingAliasFilesDialog::Marked();
AProjectHolder offendingProject = marked.second;
wxString missingFileName = marked.first;
// if there are no projects open, don't show the warning (user has closed it)
if (offendingProject) {
@ -914,57 +910,15 @@ locations of the missing files."), missingFileName);
if (offendingProject->GetMissingAliasFileDialog()) {
offendingProject->GetMissingAliasFileDialog()->Raise();
} else {
ShowMissingAliasFilesDialog(offendingProject.get(), _("Files Missing"),
MissingAliasFilesDialog::Show(offendingProject.get(), _("Files Missing"),
errorMessage, wxT(""), true);
}
}
// Only show this warning once per event (playback/menu item/etc).
SetMissingAliasFilesWarningShouldShow(false);
MissingAliasFilesDialog::SetShouldShow(false);
}
}
void AudacityApp::MarkMissingAliasFilesWarning(const AliasBlockFile *b)
{
ODLocker locker { &m_LastMissingBlockFileLock };
if (b) {
size_t numProjects = gAudacityProjects.size();
for (size_t ii = 0; ii < numProjects; ++ii) {
// search each project for the blockfile
if (gAudacityProjects[ii]->GetDirManager()->ContainsBlockFile(b)) {
m_LastMissingBlockFileProject = gAudacityProjects[ii];
break;
}
}
}
else
m_LastMissingBlockFileProject = {};
if (b)
m_LastMissingBlockFilePath = b->GetAliasedFileName().GetFullPath();
else
m_LastMissingBlockFilePath = wxString{};
}
void AudacityApp::SetMissingAliasFilesWarningShouldShow(bool b)
{
// Note that this is can be called by both the main thread and other threads.
// I don't believe we need a mutex because we are checking zero vs non-zero,
// and the setting from other threads will always be non-zero (true), and the
// setting from the main thread is always false.
m_missingAliasFilesWarningShouldShow = b;
// reset the warnings as they were probably marked by a previous run
if (m_missingAliasFilesWarningShouldShow) {
MarkMissingAliasFilesWarning( nullptr );
}
}
bool AudacityApp::ShouldShowMissingAliasFilesWarning()
{
ODLocker locker { &m_LastMissingBlockFileLock };
auto ptr = m_LastMissingBlockFileProject.lock();
return ptr && m_missingAliasFilesWarningShouldShow;
}
AudacityLogger *AudacityApp::GetLogger()
{
// Use dynamic_cast so that we get a NULL ptr if we haven't yet
@ -1284,8 +1238,6 @@ bool AudacityApp::OnInit()
mLocale = NULL;
m_missingAliasFilesWarningShouldShow = true;
#if defined(__WXMAC__)
// Disable window animation
wxSystemOptions::SetOption(wxMAC_WINDOW_PLAIN_TRANSITION, 1);

View File

@ -23,12 +23,12 @@
#include <wx/dir.h> // for wxDIR_FILES
#include <wx/timer.h> // member variable
#include "ondemand/ODTaskThread.h"
#if defined(EXPERIMENTAL_CRASH_REPORT)
#include <wx/debugrpt.h> // for wxDebugReport::Context
#endif
#include "MemoryX.h"
class wxSingleInstanceChecker;
class wxSocketEvent;
class wxSocketServer;
@ -47,7 +47,6 @@ void QuitAudacity();
extern bool gIsQuitting;
class BlockFile;
class AliasBlockFile;
class AudacityApp final : public wxApp {
@ -103,22 +102,6 @@ class AudacityApp final : public wxApp {
void OnServerEvent(wxSocketEvent & evt);
void OnSocketEvent(wxSocketEvent & evt);
/** \brief Mark playback as having missing aliased blockfiles
*
* Playback will continue, but the missing files will be silenced
* ShouldShowMissingAliasFilesWarning can be called to determine
* if the user should be notified
*/
void MarkMissingAliasFilesWarning(const AliasBlockFile *b);
/** \brief Changes the behavior of missing aliased blockfiles warnings
*/
void SetMissingAliasFilesWarningShouldShow(bool b);
/** \brief Returns true if the user should be notified of missing alias warnings
*/
bool ShouldShowMissingAliasFilesWarning();
#ifdef __WXMAC__
// In response to Apple Events
void MacOpenFile(const wxString &fileName) override;
@ -185,12 +168,6 @@ class AudacityApp final : public wxApp {
wxTimer mTimer;
bool m_missingAliasFilesWarningShouldShow;
std::weak_ptr< AudacityProject > m_LastMissingBlockFileProject;
wxString m_LastMissingBlockFilePath;
ODLock m_LastMissingBlockFileLock;
void InitCommandHandler();
bool InitTempDir();

View File

@ -438,6 +438,7 @@ TimeTrack and AudioIOListener and whether the playback is looped.
#include "portmixer.h"
#endif
#include <wx/app.h>
#include <wx/wxcrtvararg.h>
#include <wx/log.h>
#include <wx/textctrl.h>
@ -447,7 +448,7 @@ TimeTrack and AudioIOListener and whether the playback is looped.
#include <wx/sstream.h>
#include <wx/txtstrm.h>
#include "AudacityApp.h"
#include "MissingAliasFileDialog.h"
#include "Mix.h"
#include "Resample.h"
#include "RingBuffer.h"
@ -2058,7 +2059,7 @@ int AudioIO::StartStream(const TransportTracks &tracks,
}
// Enable warning popups for unfound aliased blockfiles.
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
commit = true;
return mStreamToken;

View File

@ -53,7 +53,7 @@ out.
#include "sndfile.h"
#include "FileException.h"
#include "FileFormats.h"
#include "AudacityApp.h"
#include "MissingAliasFileDialog.h"
// msmeyer: Define this to add debug output via wxPrintf()
//#define DEBUG_BLOCKFILE
@ -537,8 +537,8 @@ size_t BlockFile::CommonReadData(
if (pAliasFile) {
// Set a marker to display an error message for the silence
if (!wxGetApp().ShouldShowMissingAliasFilesWarning())
wxGetApp().MarkMissingAliasFilesWarning(pAliasFile);
if (!MissingAliasFilesDialog::ShouldShow())
MissingAliasFilesDialog::Mark(pAliasFile);
}
}
}

View File

@ -68,7 +68,6 @@
#include <wx/wxcrtvararg.h>
#include <wx/defs.h>
#include <wx/app.h>
#include <wx/dir.h>
#include <wx/log.h>
#include <wx/filefn.h>
@ -86,7 +85,6 @@
#include <sys/stat.h>
#endif
#include "AudacityApp.h"
#include "Clipboard.h"
#include "FileNames.h"
#include "blockfile/LegacyBlockFile.h"
@ -95,6 +93,7 @@
#include "blockfile/ODPCMAliasBlockFile.h"
#include "blockfile/ODDecodeBlockFile.h"
#include "InconsistencyException.h"
#include "MissingAliasFileDialog.h"
#include "Project.h"
#include "Prefs.h"
#include "Sequence.h"
@ -1702,7 +1701,7 @@ int DirManager::ProjectFSCK(const bool bForceError, const bool bAutoRecoverMode)
//
// MISSING ALIASED AUDIO FILES
//
wxGetApp().SetMissingAliasFilesWarningShouldShow(false);
MissingAliasFilesDialog::SetShouldShow(false);
BlockHash missingAliasFilesAUFHash; // (.auf) AliasBlockFiles whose aliased files are missing
BlockHash missingAliasFilesPathHash; // full paths of missing aliased files
this->FindMissingAliasFiles(missingAliasFilesAUFHash, missingAliasFilesPathHash);
@ -2006,7 +2005,7 @@ other projects. \
wxOK | wxICON_EXCLAMATION);
}
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
return nResult;
}

View File

@ -182,6 +182,8 @@ audacity_SOURCES = \
MemoryX.h \
Menus.cpp \
Menus.h \
MissingAliasFileDialog.cpp \
MissingAliasFileDialog.h \
Mix.cpp \
Mix.h \
MixerBoard.cpp \

View File

@ -312,7 +312,8 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \
LangChoice.h Languages.cpp Languages.h Legacy.cpp Legacy.h \
Lyrics.cpp Lyrics.h LyricsWindow.cpp LyricsWindow.h \
MacroMagic.h Matrix.cpp Matrix.h MemoryX.h Menus.cpp Menus.h \
Mix.cpp Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \
Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \
PlatformCompatibility.cpp PlatformCompatibility.h \
PluginManager.cpp PluginManager.h Printing.cpp Printing.h \
@ -648,9 +649,10 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \
audacity-LangChoice.$(OBJEXT) audacity-Languages.$(OBJEXT) \
audacity-Legacy.$(OBJEXT) audacity-Lyrics.$(OBJEXT) \
audacity-LyricsWindow.$(OBJEXT) audacity-Matrix.$(OBJEXT) \
audacity-Menus.$(OBJEXT) audacity-Mix.$(OBJEXT) \
audacity-MixerBoard.$(OBJEXT) audacity-ModuleManager.$(OBJEXT) \
audacity-PitchName.$(OBJEXT) \
audacity-Menus.$(OBJEXT) \
audacity-MissingAliasFileDialog.$(OBJEXT) \
audacity-Mix.$(OBJEXT) audacity-MixerBoard.$(OBJEXT) \
audacity-ModuleManager.$(OBJEXT) audacity-PitchName.$(OBJEXT) \
audacity-PlatformCompatibility.$(OBJEXT) \
audacity-PluginManager.$(OBJEXT) audacity-Printing.$(OBJEXT) \
audacity-Profiler.$(OBJEXT) audacity-Project.$(OBJEXT) \
@ -1243,7 +1245,6 @@ pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
@ -1362,7 +1363,8 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \
LangChoice.h Languages.cpp Languages.h Legacy.cpp Legacy.h \
Lyrics.cpp Lyrics.h LyricsWindow.cpp LyricsWindow.h \
MacroMagic.h Matrix.cpp Matrix.h MemoryX.h Menus.cpp Menus.h \
Mix.cpp Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \
Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \
PlatformCompatibility.cpp PlatformCompatibility.h \
PluginManager.cpp PluginManager.h Printing.cpp Printing.h \
@ -2522,6 +2524,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-LyricsWindow.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Matrix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Menus.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-MissingAliasFileDialog.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Mix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-MixerBoard.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ModuleManager.Po@am__quote@
@ -3764,6 +3767,20 @@ audacity-Menus.obj: Menus.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-Menus.obj `if test -f 'Menus.cpp'; then $(CYGPATH_W) 'Menus.cpp'; else $(CYGPATH_W) '$(srcdir)/Menus.cpp'; fi`
audacity-MissingAliasFileDialog.o: MissingAliasFileDialog.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-MissingAliasFileDialog.o -MD -MP -MF $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo -c -o audacity-MissingAliasFileDialog.o `test -f 'MissingAliasFileDialog.cpp' || echo '$(srcdir)/'`MissingAliasFileDialog.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo $(DEPDIR)/audacity-MissingAliasFileDialog.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MissingAliasFileDialog.cpp' object='audacity-MissingAliasFileDialog.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-MissingAliasFileDialog.o `test -f 'MissingAliasFileDialog.cpp' || echo '$(srcdir)/'`MissingAliasFileDialog.cpp
audacity-MissingAliasFileDialog.obj: MissingAliasFileDialog.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-MissingAliasFileDialog.obj -MD -MP -MF $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo -c -o audacity-MissingAliasFileDialog.obj `if test -f 'MissingAliasFileDialog.cpp'; then $(CYGPATH_W) 'MissingAliasFileDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/MissingAliasFileDialog.cpp'; fi`
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo $(DEPDIR)/audacity-MissingAliasFileDialog.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MissingAliasFileDialog.cpp' object='audacity-MissingAliasFileDialog.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-MissingAliasFileDialog.obj `if test -f 'MissingAliasFileDialog.cpp'; then $(CYGPATH_W) 'MissingAliasFileDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/MissingAliasFileDialog.cpp'; fi`
audacity-Mix.o: Mix.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-Mix.o -MD -MP -MF $(DEPDIR)/audacity-Mix.Tpo -c -o audacity-Mix.o `test -f 'Mix.cpp' || echo '$(srcdir)/'`Mix.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-Mix.Tpo $(DEPDIR)/audacity-Mix.Po

View File

@ -0,0 +1,133 @@
/*********************************************************************
\class MissingAliasFileDialog
\brief Special case of ErrorDialog for reporting missing alias files.
*//*******************************************************************/
#include "MissingAliasFileDialog.h"
#include <mutex>
#include "BlockFile.h"
#include "DirManager.h"
#include "Project.h"
#include "widgets/ErrorDialog.h"
// special case for alias missing dialog because we keep track of if it exists.
class MissingAliasFileDialog final : public ErrorDialog
{
public:
MissingAliasFileDialog(AudacityProject *parent,
const wxString & dlogTitle,
const wxString & message,
const wxString & helpURL,
const bool Close = true, const bool modal = true);
virtual ~MissingAliasFileDialog();
};
MissingAliasFileDialog::MissingAliasFileDialog(AudacityProject *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);
}
MissingAliasFileDialog::~MissingAliasFileDialog()
{
static_cast<AudacityProject *>(GetParent())
->SetMissingAliasFileDialog( nullptr );
}
namespace MissingAliasFilesDialog {
namespace{
bool m_missingAliasFilesWarningShouldShow{ true };
std::weak_ptr< AudacityProject > m_LastMissingBlockFileProject;
wxString m_LastMissingBlockFilePath;
std::mutex m_LastMissingBlockFileLock;
}
using Lock = std::unique_lock< std::mutex >;
void Show(AudacityProject *parent,
const wxString &dlogTitle,
const wxString &message,
const wxString &helpPage,
const bool Close)
{
wxASSERT(parent); // to justify safenew
ErrorDialog *dlog = safenew MissingAliasFileDialog(parent, dlogTitle, message, helpPage, Close, false);
// Don't center because in many cases (effect, export, etc) there will be a progress bar in the center that blocks this.
// instead put it just above or on the top of the project.
wxPoint point;
point.x = 0;
point.y = parent ? parent->GetPosition().y - 200 : 100;
if (point.y < 100)
point.y = 100;
dlog->SetPosition(point);
dlog->CentreOnParent(wxHORIZONTAL);
// This needs to be modeless because user may need to
// stop playback AND read dialog's instructions.
dlog->Show();
// ANSWER-ME: Vigilant Sentry flags this method as not deleting dlog, so a mem leak.
// PRL: answer is that the parent window guarantees destruction of the dialog
// but in practice Destroy() in OnOK does that
}
void Mark(const AliasBlockFile *b)
{
Lock lock{ m_LastMissingBlockFileLock };
if (b) {
size_t numProjects = gAudacityProjects.size();
for (size_t ii = 0; ii < numProjects; ++ii) {
// search each project for the blockfile
if (gAudacityProjects[ii]->GetDirManager()->ContainsBlockFile(b)) {
m_LastMissingBlockFileProject = gAudacityProjects[ii];
break;
}
}
}
else
m_LastMissingBlockFileProject = {};
if (b)
m_LastMissingBlockFilePath = b->GetAliasedFileName().GetFullPath();
else
m_LastMissingBlockFilePath = wxString{};
}
std::pair< wxString, std::shared_ptr<AudacityProject> > Marked()
{
Lock lock{ m_LastMissingBlockFileLock };
return { m_LastMissingBlockFilePath, m_LastMissingBlockFileProject.lock() };
}
bool ShouldShow()
{
Lock lock{ m_LastMissingBlockFileLock };
auto ptr = m_LastMissingBlockFileProject.lock();
return ptr && m_missingAliasFilesWarningShouldShow;
}
void SetShouldShow(bool b)
{
// Note that this is can be called by both the main thread and other threads.
// I don't believe we need a mutex because we are checking zero vs non-zero,
// and the setting from other threads will always be non-zero (true), and the
// setting from the main thread is always false.
m_missingAliasFilesWarningShouldShow = b;
// reset the warnings as they were probably marked by a previous run
if (m_missingAliasFilesWarningShouldShow) {
Mark( nullptr );
}
}
}

View File

@ -0,0 +1,42 @@
#ifndef __AUDACITY_MISSING_ALIAS_FILES_DIALOG__
#define __AUDACITY_MISSING_ALIAS_FILES_DIALOG__
class AliasBlockFile;
class AudacityProject;
class wxDialog;
#include <memory>
#include <utility>
#include <wx/string.h>
namespace MissingAliasFilesDialog {
/** \brief Mark playback as having missing aliased blockfiles
*
* Playback will continue, but the missing files will be silenced
* ShouldShow can be called to determine
* if the user should be notified
*/
void Mark(const AliasBlockFile *b);
// Retrieve information left by Mark
std::pair< wxString, std::shared_ptr<AudacityProject> > Marked();
/** \brief Changes the behavior of missing aliased blockfiles warnings
*/
void SetShouldShow(bool b);
/** \brief Returns true if the user should be notified of missing alias warnings
*/
bool ShouldShow();
/// Displays a custom modeless error dialog for aliased file errors
void Show(AudacityProject *parent,
const wxString &dlogTitle,
const wxString &message,
const wxString &helpPage,
const bool Close = true);
}
#endif

View File

@ -113,6 +113,7 @@ scroll information. It also has some status flags.
#include "Legacy.h"
#include "LyricsWindow.h"
#include "Menus.h"
#include "MissingAliasFileDialog.h"
#include "Mix.h"
#include "NoteTrack.h"
#include "Prefs.h"
@ -1023,7 +1024,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
mStatusBar->SetName(wxT("status_line")); // not localized
mProjectNo = mProjectCounter++; // Bug 322
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
// MM: DirManager is created dynamically, freed on demand via ref-counting
// MM: We don't need to Ref() here because it start with refcount=1
@ -5278,7 +5279,7 @@ bool AudacityProject::ExportFromTimerRecording(wxFileName fnFile, int iFormat, i
{
Exporter e;
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
return e.ProcessFromTimerRecording(this, false, 0.0, mTracks->GetEndTime(), fnFile, iFormat, iSubFormat, iFilterIndex);
}

View File

@ -1,10 +1,10 @@
#include "../Audacity.h" // for USE_* macros
#include "../Experimental.h"
#include "../AudacityApp.h"
#include "../BatchCommands.h"
#include "../FileNames.h"
#include "../LabelTrack.h"
#include "../MissingAliasFileDialog.h"
#include "../NoteTrack.h"
#include "../Prefs.h"
#include "../Printing.h"
@ -33,7 +33,7 @@ void DoExport
Exporter e;
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
double t0 = 0.0;
double t1 = tracks->GetEndTime();
@ -231,7 +231,7 @@ void OnExportSelection(const CommandContext &context)
auto &selectedRegion = project.GetViewInfo().selectedRegion;
Exporter e;
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
e.SetFileDialogTitle( _("Export Selected Audio") );
e.Process(&project, true, selectedRegion.t0(),
selectedRegion.t1());
@ -303,7 +303,7 @@ void OnExportMultiple(const CommandContext &context)
auto &project = context.project;
ExportMultiple em(&project);
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
em.ShowModal();
}
@ -396,7 +396,7 @@ void OnImport(const CommandContext &context)
// An import trigger for the alias missing dialog might not be intuitive, but
// this serves to track the file if the users zooms in and such.
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
wxArrayString selectedFiles = project.ShowOpenDialog(wxT(""));
if (selectedFiles.size() == 0) {

View File

@ -1,12 +1,12 @@
#include "../Audacity.h"
#include "../Experimental.h"
#include "../AudacityApp.h"
#include "../AudioIO.h"
#include "../BatchProcessDialog.h"
#include "../Benchmark.h"
#include "../FreqWindow.h"
#include "../Menus.h"
#include "../MissingAliasFileDialog.h"
#include "../PluginManager.h"
#include "../Prefs.h"
#include "../Project.h"
@ -412,7 +412,7 @@ bool DoEffect(
project.SelectAllIfNone();
}
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
auto nTracksOriginally = project.GetTrackCount();
wxWindow *focus = wxWindow::FindFocus();

View File

@ -1,9 +1,9 @@
#include "../Audacity.h"
#include "../Experimental.h"
#include "../AudacityApp.h"
#include "../LabelTrack.h"
#include "../Menus.h"
#include "../MissingAliasFileDialog.h"
#include "../Mix.h"
#include "../Prefs.h"
@ -43,7 +43,7 @@ void DoMixAndRender
auto defaultFormat = project.GetDefaultFormat();
auto trackPanel = project.GetTrackPanel();
wxGetApp().SetMissingAliasFilesWarningShouldShow(true);
MissingAliasFilesDialog::SetShouldShow(true);
WaveTrack::Holder uNewLeft, uNewRight;
::MixAndRender(

View File

@ -12,16 +12,12 @@
\class ErrorDialog
\brief Gives an Error message with an option for help.
*//*****************************************************************//**
\class MissingAliasFileDialog
\brief Special case of ErrorDialog for reporting missing alias files.
*//********************************************************************/
#include "../Audacity.h"
#include "ErrorDialog.h"
#include <wx/app.h>
#include <wx/button.h>
#include <wx/icon.h>
#include <wx/dialog.h>
@ -37,43 +33,14 @@
#include "../AllThemeResources.h"
#include "../ShuttleGui.h"
#include "../HelpText.h"
#include "../Project.h"
#include "../Prefs.h"
#include "HelpSystem.h"
// special case for alias missing dialog because we keep track of if it exists.
class MissingAliasFileDialog final : public ErrorDialog
{
public:
MissingAliasFileDialog(AudacityProject *parent,
const wxString & dlogTitle,
const wxString & message,
const wxString & helpURL,
const bool Close = true, const bool modal = true);
virtual ~MissingAliasFileDialog();
};
BEGIN_EVENT_TABLE(ErrorDialog, wxDialogWrapper)
EVT_BUTTON( wxID_OK, ErrorDialog::OnOk)
EVT_BUTTON( wxID_HELP, ErrorDialog::OnHelp)
END_EVENT_TABLE()
MissingAliasFileDialog::MissingAliasFileDialog(AudacityProject *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);
}
MissingAliasFileDialog::~MissingAliasFileDialog()
{
((AudacityProject*)GetParent())->SetMissingAliasFileDialog(NULL);
}
ErrorDialog::ErrorDialog(
wxWindow *parent,
const wxString & dlogTitle,
@ -202,34 +169,6 @@ void ShowModelessErrorDialog(wxWindow *parent,
// but in practice Destroy() in OnOK does that
}
void ShowMissingAliasFilesDialog(AudacityProject *parent,
const wxString &dlogTitle,
const wxString &message,
const wxString &helpPage,
const bool Close)
{
wxASSERT(parent); // to justify safenew
ErrorDialog *dlog = safenew MissingAliasFileDialog(parent, dlogTitle, message, helpPage, Close, false);
// Don't center because in many cases (effect, export, etc) there will be a progress bar in the center that blocks this.
// instead put it just above or on the top of the project.
wxPoint point;
point.x = 0;
point.y = parent ? parent->GetPosition().y - 200 : 100;
if (point.y < 100)
point.y = 100;
dlog->SetPosition(point);
dlog->CentreOnParent(wxHORIZONTAL);
// This needs to be modeless because user may need to
// stop playback AND read dialog's instructions.
dlog->Show();
// ANSWER-ME: Vigilant Sentry flags this method as not deleting dlog, so a mem leak.
// PRL: answer is that the parent window guarantees destruction of the dialog
// but in practice Destroy() in OnOK does that
}
extern wxString AudacityMessageBoxCaptionStr()
{
return _("Message");

View File

@ -18,6 +18,8 @@
#include <wx/msgdlg.h> // to inherit
#include "wxPanelWrapper.h" // to inherit
class AliasBlockFile;
class AudacityProject;
class ErrorDialog /* not final */ : public wxDialogWrapper
@ -56,13 +58,6 @@ void ShowModelessErrorDialog(wxWindow *parent,
const wxString &helpPage,
bool Close = true);
/// Displays a custom modeless error dialog for aliased file errors
void ShowMissingAliasFilesDialog(AudacityProject *parent,
const wxString &dlogTitle,
const wxString &message,
const wxString &helpPage,
const bool Close = true);
extern wxString AudacityMessageBoxCaptionStr();
// Do not use wxMessageBox!! Its default window title does not translate!

View File

@ -202,6 +202,7 @@
<ClCompile Include="..\..\..\src\menus\TransportMenus.cpp" />
<ClCompile Include="..\..\..\src\menus\ViewMenus.cpp" />
<ClCompile Include="..\..\..\src\menus\WindowMenus.cpp" />
<ClCompile Include="..\..\..\src\MissingAliasFileDialog.cpp" />
<ClCompile Include="..\..\..\src\Mix.cpp" />
<ClCompile Include="..\..\..\src\MixerBoard.cpp" />
<ClCompile Include="..\..\..\lib-src\lib-widget-extra\NonGuiThread.cpp" />
@ -625,6 +626,7 @@
<ClInclude Include="..\..\..\src\MacroMagic.h" />
<ClInclude Include="..\..\..\src\Matrix.h" />
<ClInclude Include="..\..\..\src\Menus.h" />
<ClInclude Include="..\..\..\src\MissingAliasFileDialog.h" />
<ClInclude Include="..\..\..\src\Mix.h" />
<ClInclude Include="..\..\..\src\MixerBoard.h" />
<ClInclude Include="..\..\..\lib-src\lib-widget-extra\NonGuiThread.h" />

View File

@ -221,6 +221,9 @@
<ClCompile Include="..\..\..\src\Menus.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\MissingAliasFileDialog.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\Mix.cpp">
<Filter>src</Filter>
</ClCompile>
@ -1261,6 +1264,9 @@
<ClInclude Include="..\..\..\src\Menus.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\MissingAliasFileDialog.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\Mix.h">
<Filter>src</Filter>
</ClInclude>