mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 08:09:32 +02:00
(more on bug 113 and related issues)
Added a "Show Log for Details" button to MultiDialog so it does what the comments say, i.e., allows the user to look in the log to see which files are problematic (e.g., orphaned blockfiles. Tightened up ProjectFSCK messages. Added comments about remaining (long-standing!) problems in ProjectFSCK.
This commit is contained in:
parent
6fb4ed63f3
commit
71e102e473
@ -548,7 +548,7 @@ bool ShowDependencyDialogIfNeeded(AudacityProject *project,
|
||||
{
|
||||
wxString msg =
|
||||
_("Your project is currently self-contained; it does not depend on any external audio files. \
|
||||
\n\nIf you change the project to a state where it has external dependencies on imported \
|
||||
\n\nIf you change the project to a state that has external dependencies on imported \
|
||||
files, it will no longer be self-contained. If you then Save without copying those files in, \
|
||||
you may lose data.");
|
||||
wxMessageBox(msg,
|
||||
|
@ -106,7 +106,7 @@ wxString DirManager::globaltemp;
|
||||
|
||||
DirManager::DirManager()
|
||||
{
|
||||
wxLogDebug(wxT("DirManager: Created new instance"));
|
||||
wxLogDebug(wxT("DirManager: Created new instance."));
|
||||
|
||||
mRef = 1; // MM: Initial refcount is 1 by convention
|
||||
|
||||
@ -572,7 +572,7 @@ bool DirManager::AssignFile(wxFileName &fileName,
|
||||
wxString collision;
|
||||
checkit.GetFirst(&collision,filespec);
|
||||
|
||||
wxLogWarning(_("Audacity found an orphaned blockfile %s! \nPlease consider saving and reloading the project to perform a complete project check.\n"),
|
||||
wxLogWarning(_("Audacity found an orphaned blockfile: %s. \nPlease consider saving and reloading the project to perform a complete project check.\n"),
|
||||
collision.c_str());
|
||||
|
||||
return FALSE;
|
||||
@ -881,7 +881,7 @@ BlockFile *DirManager::NewODDecodeBlockFile(
|
||||
|
||||
mBlockFileHash[fileName.GetName()]=newBlockFile;
|
||||
aliasList.Add(aliasedFile); //OD TODO: check to see if we need to remove this when done decoding.
|
||||
//I don't immediately see a place where alias files remove when a file is closed.
|
||||
//I don't immediately see a place where aliased files remove when a file is closed.
|
||||
|
||||
return newBlockFile;
|
||||
}
|
||||
@ -1218,7 +1218,7 @@ bool DirManager::EnsureSafeFilename(wxFileName fName)
|
||||
|
||||
wxFile testFile(renamedFileName.GetFullPath(), wxFile::write);
|
||||
if (!testFile.IsOpened()) {
|
||||
wxLogSysError(_("Unable to open/create test file"),
|
||||
wxLogSysError(_("Unable to open/create test file."),
|
||||
renamedFileName.GetFullPath().c_str());
|
||||
return false;
|
||||
}
|
||||
@ -1227,7 +1227,7 @@ bool DirManager::EnsureSafeFilename(wxFileName fName)
|
||||
testFile.Close();
|
||||
|
||||
if (!wxRemoveFile(renamedFileName.GetFullPath())) {
|
||||
wxLogSysError(_("Unable to remove '%s'"),
|
||||
wxLogSysError(_("Unable to remove '%s'."),
|
||||
renamedFileName.GetFullPath().c_str());
|
||||
return false;
|
||||
}
|
||||
@ -1296,7 +1296,7 @@ bool DirManager::EnsureSafeFilename(wxFileName fName)
|
||||
}
|
||||
|
||||
// Print error message and cancel the export
|
||||
wxLogSysError(_("Unable to rename '%s' to '%s'"),
|
||||
wxLogSysError(_("Unable to rename '%s' to '%s'."),
|
||||
fName.GetFullPath().c_str(),
|
||||
renamedFileName.GetFullPath().c_str());
|
||||
return false;
|
||||
@ -1349,10 +1349,7 @@ void DirManager::Deref()
|
||||
|
||||
// MM: Automatically delete if refcount reaches zero
|
||||
if (mRef == 0)
|
||||
{
|
||||
// wxLogDebug(wxT("DirManager::Deref: Automatically deleting 'this'"));
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
// check the Blockfiles against the disk state. Missing Blockfile
|
||||
@ -1402,12 +1399,12 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
// the blockfile on disk is orphaned
|
||||
orphanList.Add(fullname.GetFullPath());
|
||||
if (!silentlycorrect)
|
||||
wxLogWarning(_("Orphaned blockfile: (%s)"),
|
||||
wxLogWarning(_("Orphaned blockfile: %s"),
|
||||
fullname.GetFullPath().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// enumerate missing alias files
|
||||
// enumerate missing aliased files
|
||||
BlockHash::iterator i = mBlockFileHash.begin();
|
||||
while(i != mBlockFileHash.end()) {
|
||||
wxString key=i->first;
|
||||
@ -1427,7 +1424,7 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
i=missingAliasFiles.begin();
|
||||
while(i != missingAliasFiles.end()) {
|
||||
wxString key=i->first;
|
||||
wxLogWarning(_("Missing alias file: (%s)"),key.c_str());
|
||||
wxLogWarning(_("Missing aliased file: %s"),key.c_str());
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@ -1447,7 +1444,7 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
if(!wxFileExists(file.GetFullPath().c_str())){
|
||||
missingSummaryList[key]=b;
|
||||
if (!silentlycorrect)
|
||||
wxLogWarning(_("Missing summary file: (%s.auf)"),
|
||||
wxLogWarning(_("Missing summary file: %s.auf"),
|
||||
key.c_str());
|
||||
}
|
||||
}
|
||||
@ -1467,7 +1464,7 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
if(!wxFileExists(file.GetFullPath().c_str())){
|
||||
missingDataList[key]=b;
|
||||
if (!silentlycorrect)
|
||||
wxLogWarning(_("Missing data file: (%s.au)"),
|
||||
wxLogWarning(_("Missing data file: %s.au"),
|
||||
key.c_str());
|
||||
}
|
||||
}
|
||||
@ -1481,7 +1478,7 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
!missingDataList.empty() ||
|
||||
!missingSummaryList.empty()) && !silentlycorrect)){
|
||||
|
||||
wxLogWarning(_("Project check found inconsistencies inspecting the loaded project data;\nclick 'Details' for a complete list of errors, or 'OK' to proceed to more options."));
|
||||
wxLogWarning(_("Project check found inconsistencies inspecting the loaded project data."));
|
||||
|
||||
wxLog::GetActiveTarget()->Flush(); // Flush is both modal
|
||||
// (desired) and will clear the log (desired)
|
||||
@ -1492,22 +1489,25 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
// (they will be deleted when project is saved the first time)
|
||||
if(!orphanList.IsEmpty() && !silentlycorrect){
|
||||
|
||||
wxString promptA =
|
||||
_("Project check found %d orphaned blockfile(s). These files are\nunused and probably left over from a crash or some other bug.\nThey should be deleted to avoid disk contention.");
|
||||
wxString prompt;
|
||||
wxString msgA =
|
||||
_("Project check found %d orphaned blockfile(s). These files are \
|
||||
\nunused and probably left over from a crash or some other bug. \
|
||||
\n\nThey should be deleted to avoid disk contention.");
|
||||
wxString msg;
|
||||
|
||||
prompt.Printf(promptA,(int)orphanList.GetCount());
|
||||
msg.Printf(msgA, (int)orphanList.GetCount());
|
||||
|
||||
const wxChar *buttons[]={_("Delete orphaned files (safe and recommended)"),
|
||||
_("Continue without deleting; ignore the extra files this session"),
|
||||
_("Close project immediately with no changes"),NULL};
|
||||
int action = ShowMultiDialog(prompt,
|
||||
_("Warning"),
|
||||
buttons);
|
||||
const wxChar *buttons[] = {_("Delete orphaned files (safe and recommended)"),
|
||||
_("Continue without deleting; ignore the extra files this session"),
|
||||
_("Close project immediately with no changes"),
|
||||
NULL};
|
||||
int action = ShowMultiDialog(msg, _("Warning - Orphaned Blockfile(s)"), buttons);
|
||||
|
||||
if(action==2)return (ret | FSCKstatus_CLOSEREQ);
|
||||
|
||||
if(action==0){
|
||||
//vvvvv Note FSCKstatus_CHANGED is bogus. See AudacityProject::OpenFile().
|
||||
// The files are already deleted and "Undo Project Repair" will do nothing.
|
||||
ret |= FSCKstatus_CHANGED;
|
||||
for(ndx=0;ndx<(int)orphanList.GetCount();ndx++){
|
||||
wxRemoveFile(orphanList[ndx]);
|
||||
@ -1524,24 +1524,24 @@ int DirManager::ProjectFSCK(bool forceerror, bool silentlycorrect, bool bIgnoreN
|
||||
{
|
||||
// In "silently correct" mode, we always create silent blocks. This
|
||||
// makes sure the project is complete even if we open it again.
|
||||
action = 1;
|
||||
} else
|
||||
action = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
wxString msgA =
|
||||
_("Project check detected %d external audio file(s) ('aliased files') \
|
||||
\nare now missing. There is no way for Audacity to recover these \
|
||||
\nfiles automatically. \
|
||||
\n\nIf you choose the second or third option below, you can try to \
|
||||
\n\nIf you choose the first or second option below, you can try to \
|
||||
\nfind and restore the missing files to their previous location.");
|
||||
wxString msg;
|
||||
msg.Printf(msgA, missingAliasFiles.size());
|
||||
|
||||
const wxChar *buttons[] =
|
||||
{_("Close project immediately with no further changes"),
|
||||
_("Replace missing audio with silence (permanent upon save)"),
|
||||
_("Temporarily replace missing audio with silence (this session only)"),
|
||||
NULL};
|
||||
action = ShowMultiDialog(msg, _("Warning - Missing Aliased Files"), buttons);
|
||||
const wxChar *buttons[] = {_("Close project immediately with no changes"),
|
||||
_("Temporarily replace missing audio with silence (this session only)"),
|
||||
_("Replace missing audio with silence (permanent upon save)"),
|
||||
NULL};
|
||||
action = ShowMultiDialog(msg, _("Warning - Missing Aliased File(s)"), buttons);
|
||||
|
||||
if (action == 0)
|
||||
return (ret | FSCKstatus_CLOSEREQ);
|
||||
@ -1552,7 +1552,8 @@ _("Project check detected %d external audio file(s) ('aliased files') \
|
||||
AliasBlockFile *b = (AliasBlockFile *)i->second; //this is
|
||||
//safe, we checked that it's an alias block file earlier
|
||||
|
||||
if (action == 1) {
|
||||
if (action == 2)
|
||||
{
|
||||
//vvvvv This is incorrect in several ways.
|
||||
// It returns FSCKstatus_CHANGED, and that makes AudacityProject::OpenFile
|
||||
// do a PushState, but the tracks lower on the stack are identical to
|
||||
@ -1596,18 +1597,19 @@ _("Project check detected %d external audio file(s) ('aliased files') \
|
||||
action = 0;
|
||||
} else
|
||||
{
|
||||
wxString promptA =
|
||||
_("Project check detected %d missing summary file(s) (.auf).\nAudacity can fully regenerate these summary files from the\noriginal audio in the project.");
|
||||
wxString prompt;
|
||||
wxString msgA =
|
||||
_("Project check detected %d missing summary (.auf) file(s). \
|
||||
\nAudacity can fully regenerate these summary files from the \
|
||||
\noriginal audio in the project.");
|
||||
wxString msg;
|
||||
|
||||
prompt.Printf(promptA,missingSummaryList.size());
|
||||
msg.Printf(msgA,missingSummaryList.size());
|
||||
|
||||
const wxChar *buttons[]={_("Regenerate summary files (safe and recommended)"),
|
||||
_("Fill in silence for missing display data (this session only"),
|
||||
_("Close project immediately with no further changes"),NULL};
|
||||
action = ShowMultiDialog(prompt,
|
||||
_("Warning"),
|
||||
buttons);
|
||||
const wxChar *buttons[] = {_("Regenerate summary files (safe and recommended)"),
|
||||
_("Fill in silence for missing display data (this session only"),
|
||||
_("Close project immediately with no changes"),
|
||||
NULL};
|
||||
action = ShowMultiDialog(msg, _("Warning - Missing Summary File(s)"), buttons);
|
||||
|
||||
if(action==2)return (ret | FSCKstatus_CLOSEREQ);
|
||||
}
|
||||
@ -1616,6 +1618,7 @@ _("Project check detected %d external audio file(s) ('aliased files') \
|
||||
while(i != missingSummaryList.end()) {
|
||||
BlockFile *b = i->second;
|
||||
if(action==0){
|
||||
//vvvvv This is probably bogus as for Missing Aliased File(s).
|
||||
//regenerate from data
|
||||
b->Recover();
|
||||
ret |= FSCKstatus_CHANGED;
|
||||
@ -1635,33 +1638,42 @@ _("Project check detected %d external audio file(s) ('aliased files') \
|
||||
{
|
||||
// In "silently correct" mode, we always create silent blocks. This
|
||||
// makes sure the project is complete even if we open it again.
|
||||
action = 0;
|
||||
action = 2;
|
||||
} else
|
||||
{
|
||||
wxString promptA =
|
||||
_("Project check detected %d missing audio data blockfile(s) (.au), \nprobably due to a bug, system crash or accidental deletion.\nThere is no way for Audacity to recover this lost data\nautomatically; you may choose to permanently fill in silence\nfor the missing data, temporarily fill in silence for this\nsession only, or close the project now and try to restore the\nmissing data by hand.");
|
||||
wxString prompt;
|
||||
wxString msgA =
|
||||
_("Project check detected %d missing audio data blockfile(s) (.au), \
|
||||
\nprobably due to a bug, system crash, or accidental deletion. \
|
||||
\n\nThere is no way for Audacity to recover these missing files \
|
||||
\nautomatically. \
|
||||
\n\nIf you choose the first or second option below, you can try to \
|
||||
\nfind and restore the missing files to their previous location.");
|
||||
wxString msg;
|
||||
msg.Printf(msgA,missingDataList.size());
|
||||
|
||||
prompt.Printf(promptA,missingDataList.size());
|
||||
const wxChar *buttons[] = {_("Close project immediately with no changes"),
|
||||
_("Temporarily replace missing audio with silence (this session only)"),
|
||||
_("Replace missing audio with silence (permanent immediately)"),
|
||||
NULL};
|
||||
action = ShowMultiDialog(msg, _("Warning - Missing Audio Data Blockfile(s)"), buttons);
|
||||
|
||||
const wxChar *buttons[]={_("Replace missing data with silence (permanent immediately)"),
|
||||
_("Temporarily replace missing data with silence (this session only)"),
|
||||
_("Close project immediately with no further changes"),NULL};
|
||||
action = ShowMultiDialog(prompt,
|
||||
_("Warning"),
|
||||
buttons);
|
||||
|
||||
if(action==2)return (ret | FSCKstatus_CLOSEREQ);
|
||||
if (action == 0)
|
||||
return (ret | FSCKstatus_CLOSEREQ);
|
||||
}
|
||||
|
||||
BlockHash::iterator i=missingDataList.begin();
|
||||
while(i != missingDataList.end()) {
|
||||
BlockFile *b = i->second;
|
||||
if(action==0){
|
||||
if (action == 2)
|
||||
{
|
||||
//vvvvv This is probably bogus as for Missing Aliased File(s).
|
||||
//regenerate with zeroes
|
||||
b->Recover();
|
||||
ret |= FSCKstatus_CHANGED;
|
||||
}else if(action==1){
|
||||
}
|
||||
else if (action == 1)
|
||||
{
|
||||
//vvvvv This is probably bogus as for Missing Aliased File(s).
|
||||
b->SilenceLog();
|
||||
}
|
||||
i++;
|
||||
|
@ -1,10 +1,13 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity(R) is copyright (c) 1999-2010 Audacity Team.
|
||||
License: GPL v2. See License.txt.
|
||||
|
||||
MultiDialog.cpp
|
||||
MultiDialog.h
|
||||
|
||||
Monty
|
||||
Monty
|
||||
Vaughan Johnson
|
||||
|
||||
*******************************************************************//**
|
||||
|
||||
@ -32,95 +35,106 @@ for each problem encountered, since there can be many orphans.
|
||||
class MultiDialog : public wxDialog
|
||||
{
|
||||
public:
|
||||
// constructors and destructors
|
||||
MultiDialog(wxString prompt,
|
||||
MultiDialog(wxString message,
|
||||
wxString title,
|
||||
const wxChar **buttons);
|
||||
~MultiDialog() {};
|
||||
|
||||
private:
|
||||
void OnOK( wxCommandEvent &event );
|
||||
wxRadioBox *mBox;
|
||||
void OnShowLog(wxCommandEvent& event);
|
||||
|
||||
wxRadioBox* mRadioBox;
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#define ID_SHOW_LOG_BUTTON 3333
|
||||
|
||||
BEGIN_EVENT_TABLE(MultiDialog, wxDialog)
|
||||
EVT_BUTTON( wxID_OK, MultiDialog::OnOK )
|
||||
EVT_BUTTON(ID_SHOW_LOG_BUTTON, MultiDialog::OnShowLog)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
MultiDialog::MultiDialog(wxString prompt,
|
||||
MultiDialog::MultiDialog(wxString message,
|
||||
wxString title,
|
||||
const wxChar **buttons):
|
||||
wxDialog(NULL, (wxWindowID)-1, title)
|
||||
{
|
||||
wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
|
||||
wxBoxSizer *vSizer = new wxBoxSizer(wxVERTICAL);
|
||||
wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL );
|
||||
wxBoxSizer *iconAndTextSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxBitmap bitmap = wxArtProvider::GetIcon(wxART_WARNING,
|
||||
wxART_MESSAGE_BOX);
|
||||
wxStaticBitmap *icon = new wxStaticBitmap(this, -1, bitmap);
|
||||
icon_text->Add( icon, 0, wxCENTER );
|
||||
iconAndTextSizer->Add( icon, 0, wxCENTER );
|
||||
|
||||
wxStaticText *statText = new wxStaticText(this, -1, message);
|
||||
iconAndTextSizer->Add(statText, 1, wxCENTER|wxLEFT,15 );
|
||||
|
||||
vSizer->Add(iconAndTextSizer, 0, wxALIGN_LEFT|wxALL, 5);
|
||||
|
||||
wxStaticText *statText = new wxStaticText(this, -1, prompt);
|
||||
icon_text->Add(statText, 1, wxCENTER|wxLEFT,15 );
|
||||
|
||||
vSizer->Add(icon_text, 0, wxALIGN_LEFT|wxALL, 5);
|
||||
|
||||
int count=0;
|
||||
while(buttons[count])count++;
|
||||
wxString *prompts= new wxString[count];
|
||||
wxString *buttonLabels = new wxString[count];
|
||||
|
||||
count=0;
|
||||
while(buttons[count]){
|
||||
prompts[count]=buttons[count];
|
||||
buttonLabels[count] = buttons[count];
|
||||
count++;
|
||||
}
|
||||
|
||||
mBox = new wxRadioBox(this,-1,
|
||||
mRadioBox = new wxRadioBox(this,-1,
|
||||
_(" Please select an action "),
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
count, prompts,
|
||||
count, buttonLabels,
|
||||
1, wxRA_SPECIFY_COLS);
|
||||
mBox->SetName(_("Please select an action"));
|
||||
mBox->SetSelection(0);
|
||||
mRadioBox->SetName(_("Please select an action"));
|
||||
mRadioBox->SetSelection(0);
|
||||
vSizer->Add(mRadioBox, 1, wxEXPAND | wxALIGN_CENTER | wxALL, 5);
|
||||
|
||||
|
||||
wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxButton* pButton = new wxButton(this, ID_SHOW_LOG_BUTTON, _("Show Log for Details"));
|
||||
buttonSizer->Add(pButton, 0, wxALIGN_LEFT | wxALL, 5);
|
||||
pButton->SetDefault(); // Encourage user to look at files.
|
||||
|
||||
buttonSizer->AddSpacer(40);
|
||||
|
||||
pButton = new wxButton(this, wxID_OK, _("OK"));
|
||||
buttonSizer->Add(pButton, 0, wxALIGN_RIGHT | wxALL, 5);
|
||||
|
||||
vSizer->Add(buttonSizer, 0, wxALIGN_CENTER | wxALL, 5);
|
||||
|
||||
wxButton *ok = new wxButton(this, wxID_OK, _("OK"));
|
||||
|
||||
vSizer->Add(mBox, 1, wxGROW|wxALIGN_CENTER|wxALL, 5);
|
||||
vSizer->Add(ok, 0, wxALIGN_CENTER|wxALL, 5);
|
||||
|
||||
mainSizer->Add(vSizer, 0, wxALL, 5);
|
||||
SetAutoLayout(true);
|
||||
SetSizer(mainSizer);
|
||||
mainSizer->Fit(this);
|
||||
mainSizer->SetSizeHints(this);
|
||||
delete[] prompts;
|
||||
delete[] buttonLabels;
|
||||
}
|
||||
|
||||
void MultiDialog::OnOK(wxCommandEvent &event)
|
||||
{
|
||||
EndModal(mBox->GetSelection());
|
||||
EndModal(mRadioBox->GetSelection());
|
||||
}
|
||||
|
||||
int ShowMultiDialog(wxString prompt,
|
||||
void MultiDialog::OnShowLog(wxCommandEvent &event)
|
||||
{
|
||||
wxGetApp().mLogger->Show();
|
||||
}
|
||||
|
||||
|
||||
int ShowMultiDialog(wxString message,
|
||||
wxString title,
|
||||
const wxChar **buttons)
|
||||
{
|
||||
MultiDialog dlog(prompt,title,buttons);
|
||||
MultiDialog dlog(message, title, buttons);
|
||||
dlog.CentreOnParent();
|
||||
return dlog.ShowModal();
|
||||
}
|
||||
|
||||
// Indentation settings for Vim and Emacs and unique identifier for Arch, a
|
||||
// version control system. Please do not modify past this point.
|
||||
//
|
||||
// Local Variables:
|
||||
// c-basic-offset: 3
|
||||
// indent-tabs-mode: nil
|
||||
// End:
|
||||
//
|
||||
// vim: et sts=3 sw=3
|
||||
// arch-tag: b84d77e0-4375-43f0-868e-3130e18c14c8
|
||||
|
||||
|
@ -1,36 +1,26 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity(R) is copyright (c) 1999-2010 Audacity Team.
|
||||
License: GPL v2. See License.txt.
|
||||
|
||||
ListWarning.h
|
||||
MultiDialog.h
|
||||
|
||||
Monty
|
||||
Monty
|
||||
Vaughan Johnson
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __AUDACITY_MULTIDIALOG__
|
||||
#define __AUDACITY_MULTIDIALOG__
|
||||
|
||||
#include "../Audacity.h"
|
||||
#include <wx/defs.h>
|
||||
#include <wx/window.h>
|
||||
|
||||
/// Displays a MessageBox-like warning dialog with a scrolling list
|
||||
/// window
|
||||
int ShowMultiDialog(wxString prompt,
|
||||
// Display a dialog with radio buttons.
|
||||
// Return the zero-based index of the chosen button.
|
||||
int ShowMultiDialog(wxString message,
|
||||
wxString title,
|
||||
const wxChar **buttons);
|
||||
|
||||
#endif // __AUDACITY_MULTIDIALOG__
|
||||
|
||||
// Indentation settings for Vim and Emacs and unique identifier for Arch, a
|
||||
// version control system. Please do not modify past this point.
|
||||
//
|
||||
// Local Variables:
|
||||
// c-basic-offset: 3
|
||||
// indent-tabs-mode: nil
|
||||
// End:
|
||||
//
|
||||
// vim: et sts=3 sw=3
|
||||
// arch-tag: 2b69f33b-2dc8-4b9f-99a1-65d57f554133
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user