diff --git a/src/HistoryWindow.cpp b/src/HistoryWindow.cpp index ec37b3850..e6c824e60 100644 --- a/src/HistoryWindow.cpp +++ b/src/HistoryWindow.cpp @@ -43,6 +43,8 @@ undo memory so as to free up space. #include "ProjectFileIO.h" #include "ProjectHistory.h" #include "ShuttleGui.h" +#include "widgets/AudacityMessageBox.h" +#include "widgets/HelpSystem.h" enum { ID_AVAIL = 1000, @@ -50,7 +52,8 @@ enum { ID_TOTAL, ID_LEVELS, ID_DISCARD, - ID_DISCARD_CLIPBOARD + ID_DISCARD_CLIPBOARD, + ID_COMPACT }; BEGIN_EVENT_TABLE(HistoryDialog, wxDialogWrapper) @@ -59,6 +62,8 @@ BEGIN_EVENT_TABLE(HistoryDialog, wxDialogWrapper) EVT_LIST_ITEM_SELECTED(wxID_ANY, HistoryDialog::OnItemSelected) EVT_BUTTON(ID_DISCARD, HistoryDialog::OnDiscard) EVT_BUTTON(ID_DISCARD_CLIPBOARD, HistoryDialog::OnDiscardClipboard) + EVT_BUTTON(ID_COMPACT, HistoryDialog::OnCompact) + EVT_BUTTON(wxID_HELP, HistoryDialog::OnGetURL) END_EVENT_TABLE() HistoryDialog::HistoryDialog(AudacityProject *parent, UndoManager *manager): @@ -126,19 +131,15 @@ HistoryDialog::HistoryDialog(AudacityProject *parent, UndoManager *manager): mClipboard = S .ConnectRoot(wxEVT_KEY_DOWN, &HistoryDialog::OnChar) - .AddTextBox(XXO("Clipboard space used"), wxT("0"), 10); - S.Id(ID_DISCARD_CLIPBOARD).AddButton(XXO("Discard")); + .AddTextBox(XXO("Clip&board space used"), wxT("0"), 10); + S.Id(ID_DISCARD_CLIPBOARD).AddButton(XXO("D&iscard")); } S.EndMultiColumn(); } S.EndStatic(); - S.StartHorizontalLay(wxALIGN_RIGHT, false); - { - S.SetBorder(10); - S.Id(wxID_OK).AddButton(XXO("&OK"), wxALIGN_CENTER, true); - } - S.EndHorizontalLay(); + mCompact = safenew wxButton(this, ID_COMPACT, _("&Compact")); + S.AddStandardButtons(eOkButton | eHelpButton, mCompact); } S.EndVerticalLay(); // ----------------------- End of main section -------------- @@ -179,6 +180,7 @@ void HistoryDialog::OnAudioIO(wxCommandEvent& evt) mAudioIOBusy = false; mDiscard->Enable(!mAudioIOBusy); + mCompact->Enable(!mAudioIOBusy); } void HistoryDialog::UpdateDisplay(wxEvent& e) @@ -274,6 +276,31 @@ void HistoryDialog::OnDiscardClipboard(wxCommandEvent & WXUNUSED(event)) Clipboard::Get().Clear(); } +void HistoryDialog::OnCompact(wxCommandEvent & WXUNUSED(event)) +{ + auto &projectFileIO = ProjectFileIO::Get(*mProject); + + projectFileIO.ReopenProject(); + + auto baseFile = wxFileName(projectFileIO.GetFileName()); + auto walFile = wxFileName(projectFileIO.GetFileName() + wxT("-wal")); + auto before = baseFile.GetSize() + walFile.GetSize(); + + projectFileIO.Compact(nullptr, true); + + auto after = baseFile.GetSize() + walFile.GetSize(); + + AudacityMessageBox( + XO("Compacting actually freed %s of disk space.") + .Format(Internat::FormatSize((before - after).GetValue())), + XO("History")); +} + +void HistoryDialog::OnGetURL(wxCommandEvent & WXUNUSED(event)) +{ + HelpSystem::ShowHelp(this, wxT("View_Menu#history")); +} + void HistoryDialog::OnItemSelected(wxListEvent &event) { if (mAudioIOBusy) { diff --git a/src/HistoryWindow.h b/src/HistoryWindow.h index e86eb3fc6..87b0a7481 100644 --- a/src/HistoryWindow.h +++ b/src/HistoryWindow.h @@ -42,6 +42,8 @@ class HistoryDialog final : public wxDialogWrapper { void OnItemSelected(wxListEvent & event); void OnDiscard(wxCommandEvent & event); void OnDiscardClipboard(wxCommandEvent & event); + void OnCompact(wxCommandEvent & event); + void OnGetURL(wxCommandEvent & event); AudacityProject *mProject; UndoManager *mManager; @@ -51,6 +53,7 @@ class HistoryDialog final : public wxDialogWrapper { wxTextCtrl *mAvail; wxSpinCtrl *mLevels; wxButton *mDiscard; + wxButton *mCompact; int mSelected; bool mAudioIOBusy; diff --git a/src/ProjectFileIO.cpp b/src/ProjectFileIO.cpp index 307b1c4c3..6345c55b7 100644 --- a/src/ProjectFileIO.cpp +++ b/src/ProjectFileIO.cpp @@ -1022,8 +1022,9 @@ void ProjectFileIO::Compact(const std::shared_ptr &tracks, bool force wxString backName = origName + "_compact_back"; wxString tempName = origName + "_compact_temp"; - // Copy the original database to a new database while pruning unused sample blocks - if (CopyTo(tempName, XO("Compacting project"), mTemporary, true, tracks)) + // Copy the original database to a new database. Only prune sample blocks if + // we have a tracklist. + if (CopyTo(tempName, XO("Compacting project"), mTemporary, tracks != nullptr, tracks)) { // Must close the database to rename it if (CloseConnection())