1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-17 16:50:26 +02:00

Boilerplate for empty waveform preferences, analogous to Spectra

This commit is contained in:
Paul Licameli 2015-06-21 10:41:28 -04:00
parent a0cb584178
commit 0c4418af22
11 changed files with 473 additions and 0 deletions

View File

@ -488,6 +488,10 @@ audacity_SOURCES = \
prefs/TracksPrefs.h \
prefs/WarningsPrefs.cpp \
prefs/WarningsPrefs.h \
prefs/WaveformPrefs.cpp \
prefs/WaveformPrefs.h \
prefs/WaveformSettings.cpp \
prefs/WaveformSettings.h \
toolbars/ControlToolBar.cpp \
toolbars/ControlToolBar.h \
toolbars/DeviceToolBar.cpp \

View File

@ -220,6 +220,7 @@ is time to refresh some aspect of the screen.
#include "prefs/PrefsDialog.h"
#include "prefs/SpectrumPrefs.h"
#include "prefs/WaveformPrefs.h"
#include "toolbars/ControlToolBar.h"
#include "toolbars/ToolManager.h"
@ -8939,11 +8940,16 @@ public:
void TrackPanel::OnViewSettings(wxCommandEvent &)
{
WaveTrack *const wt = static_cast<WaveTrack*>(mPopupMenuTarget);
WaveformPrefsFactory waveformFactory(wt);
SpectrumPrefsFactory spectrumFactory(wt);
PrefsDialog::Factories factories;
factories.push_back(&waveformFactory);
factories.push_back(&spectrumFactory);
wxString title(wt->GetName() + wxT(": "));
ViewSettingsDialog dialog(this, title, factories);
if (0 != dialog.ShowModal())
// Redraw
Refresh(false);

View File

@ -55,6 +55,7 @@ Track classes.
#include "effects/TimeWarper.h"
#include "prefs/SpectrumPrefs.h"
#include "prefs/WaveformPrefs.h"
using std::max;
@ -76,6 +77,7 @@ WaveTrack *TrackFactory::NewWaveTrack(sampleFormat format, double rate)
WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rate):
Track(projDirManager)
, mpSpectrumSettings(0)
, mpWaveformSettings(0)
{
if (format == (sampleFormat)0)
{
@ -110,6 +112,8 @@ WaveTrack::WaveTrack(WaveTrack &orig):
, mpSpectrumSettings(orig.mpSpectrumSettings
? new SpectrogramSettings(*orig.mpSpectrumSettings) : 0
)
, mpWaveformSettings(orig.mpWaveformSettings
? new WaveformSettings(*orig.mpWaveformSettings) : 0)
{
mDisplay = FindDefaultViewMode();
mLastDisplay = -1;
@ -150,6 +154,8 @@ void WaveTrack::Merge(const Track &orig)
mPan = wt.mPan;
SetSpectrogramSettings(wt.mpSpectrumSettings
? new SpectrogramSettings(*wt.mpSpectrumSettings) : 0);
SetWaveformSettings
(wt.mpWaveformSettings ? new WaveformSettings(*wt.mpWaveformSettings) : 0);
}
Track::Merge(orig);
}
@ -168,6 +174,7 @@ WaveTrack::~WaveTrack()
delete [] mDisplayLocations;
delete mpSpectrumSettings;
delete mpWaveformSettings;
}
double WaveTrack::GetOffset() const
@ -682,6 +689,37 @@ void WaveTrack::SetSpectrogramSettings(SpectrogramSettings *pSettings)
}
}
const WaveformSettings &WaveTrack::GetWaveformSettings() const
{
if (mpWaveformSettings)
return *mpWaveformSettings;
else
return WaveformSettings::defaults();
}
WaveformSettings &WaveTrack::GetWaveformSettings()
{
if (mpWaveformSettings)
return *mpWaveformSettings;
else
return WaveformSettings::defaults();
}
WaveformSettings &WaveTrack::GetIndependentWaveformSettings()
{
if (!mpWaveformSettings)
mpWaveformSettings = new WaveformSettings(WaveformSettings::defaults());
return *mpWaveformSettings;
}
void WaveTrack::SetWaveformSettings(WaveformSettings *pSettings)
{
if (mpWaveformSettings != pSettings) {
delete mpWaveformSettings;
mpWaveformSettings = pSettings;
}
}
//
// ClearAndPaste() is a specialized version of HandleClear()
// followed by Paste() and is used mostly by effects that

View File

@ -23,6 +23,7 @@
#include <wx/thread.h>
class SpectrogramSettings;
class WaveformSettings;
class TimeWarper;
//
@ -151,6 +152,11 @@ class AUDACITY_DLL_API WaveTrack: public Track {
SpectrogramSettings &GetIndependentSpectrogramSettings();
void SetSpectrogramSettings(SpectrogramSettings *pSettings);
const WaveformSettings &GetWaveformSettings() const;
WaveformSettings &GetWaveformSettings();
WaveformSettings &GetIndependentWaveformSettings();
void SetWaveformSettings(WaveformSettings *pSettings);
//
// High-level editing
//
@ -495,6 +501,7 @@ class AUDACITY_DLL_API WaveTrack: public Track {
int mAutoSaveIdent;
SpectrogramSettings *mpSpectrumSettings;
WaveformSettings *mpWaveformSettings;
};
// This is meant to be a short-lived object, during whose lifetime,

View File

@ -64,6 +64,7 @@
#include "ThemePrefs.h"
#include "TracksPrefs.h"
#include "WarningsPrefs.h"
#include "WaveformPrefs.h"
#include "ExtImportPrefs.h"
#ifdef EXPERIMENTAL_MIDI_OUT
@ -131,6 +132,7 @@ PrefsDialog::Factories
#if !defined(DISABLE_DYNAMIC_LOADING_FFMPEG) || !defined(DISABLE_DYNAMIC_LOADING_LAME)
static LibraryPrefsFactory libraryPrefsFactory;
#endif
static WaveformPrefsFactory waveformPrefsFactory;
static SpectrumPrefsFactory spectrumPrefsFactory;
static DirectoriesPrefsFactory directoriesPrefsFactory;
static WarningsPrefsFactory warningsPrefsFactory;
@ -161,6 +163,7 @@ PrefsDialog::Factories
#if !defined(DISABLE_DYNAMIC_LOADING_FFMPEG) || !defined(DISABLE_DYNAMIC_LOADING_LAME)
&libraryPrefsFactory,
#endif
&waveformPrefsFactory,
&spectrumPrefsFactory,
&directoriesPrefsFactory,
&warningsPrefsFactory,

209
src/prefs/WaveformPrefs.cpp Normal file
View File

@ -0,0 +1,209 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformPrefs.cpp
Paul Licameli
*******************************************************************//**
\class WaveformPrefs
\brief A PrefsPanel for spectrum settings.
*//*******************************************************************/
#include "../Audacity.h"
#include "WaveformPrefs.h"
#include <wx/checkbox.h>
#include "../Project.h"
#include "../TrackPanel.h"
#include "../ShuttleGUI.h"
WaveformPrefs::WaveformPrefs(wxWindow * parent, WaveTrack *wt)
: PrefsPanel(parent, _("Waveforms"))
, mWt(wt)
, mPopulating(false)
{
if (mWt) {
WaveformSettings &settings = wt->GetWaveformSettings();
mDefaulted = (&WaveformSettings::defaults() == &settings);
mTempSettings = settings;
}
else {
mTempSettings = WaveformSettings::defaults();
mDefaulted = false;
}
Populate();
}
WaveformPrefs::~WaveformPrefs()
{
}
enum {
ID_DEFAULTS = 10001,
ID_APPLY,
};
void WaveformPrefs::Populate()
{
// Create control objects
//------------------------- Main section --------------------
// Now construct the GUI itself.
ShuttleGui S(this, eIsCreating);
PopulateOrExchange(S);
// ----------------------- End of main section --------------
}
void WaveformPrefs::PopulateOrExchange(ShuttleGui & S)
{
mPopulating = true;
S.SetBorder(2);
// S.StartStatic(_("Track Settings"));
{
mDefaultsCheckbox = 0;
if (mWt) {
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(_("Defaults"), mDefaulted);
}
S.StartStatic(_("Display"));
{
S.StartTwoColumn();
{
}
S.EndTwoColumn();
}
S.EndStatic();
}
// S.EndStatic();
/*
S.StartStatic(_("Global settings"));
{
}
S.EndStatic();
*/
S.StartMultiColumn(2, wxALIGN_RIGHT);
{
S.Id(ID_APPLY).AddButton(_("Appl&y"));
}
S.EndMultiColumn();
mPopulating = false;
}
bool WaveformPrefs::Validate()
{
// Do checking for whole numbers
// ToDo: use wxIntegerValidator<unsigned> when available
ShuttleGui S(this, eIsGettingFromDialog);
PopulateOrExchange(S);
// Delegate range checking to WaveformSettings class
const bool result = mTempSettings.Validate(false);
return result;
}
bool WaveformPrefs::Apply()
{
const bool isOpenPage = this->IsShown();
WaveTrack *const partner =
mWt ? static_cast<WaveTrack*>(mWt->GetLink()) : 0;
ShuttleGui S(this, eIsGettingFromDialog);
PopulateOrExchange(S);
WaveformSettings::Globals::Get().SavePrefs();
if (mWt) {
if (mDefaulted) {
mWt->SetWaveformSettings(NULL);
if (partner)
partner->SetWaveformSettings(NULL);
}
else {
WaveformSettings *pSettings =
&mWt->GetIndependentWaveformSettings();
*pSettings = mTempSettings;
if (partner) {
pSettings = &partner->GetIndependentWaveformSettings();
*pSettings = mTempSettings;
}
}
}
if (!mWt || mDefaulted) {
WaveformSettings *const pSettings =
&WaveformSettings::defaults();
*pSettings = mTempSettings;
pSettings->SavePrefs();
}
if (mWt && isOpenPage) {
// Future: open page will determine view type
/*
mWt->SetDisplay(WaveTrack::Waveform);
if (partner)
partner->SetDisplay(WaveTrack::Waveform);
*/
}
return true;
}
void WaveformPrefs::OnControl(wxCommandEvent&)
{
// Common routine for most controls
// If any per-track setting is changed, break the association with defaults
// Skip this, and View Settings... will be able to change defaults instead
// when the checkbox is on, as in the original design.
if (mDefaultsCheckbox && !mPopulating) {
mDefaulted = false;
mDefaultsCheckbox->SetValue(false);
}
}
void WaveformPrefs::OnDefaults(wxCommandEvent &)
{
if (mDefaultsCheckbox->IsChecked()) {
mTempSettings = WaveformSettings::defaults();
mDefaulted = true;
ShuttleGui S(this, eIsSettingToDialog);
PopulateOrExchange(S);
}
}
void WaveformPrefs::OnApply(wxCommandEvent &)
{
if (Validate()) {
Apply();
::GetActiveProject()->GetTrackPanel()->Refresh(false);
}
}
BEGIN_EVENT_TABLE(WaveformPrefs, PrefsPanel)
EVT_CHECKBOX(ID_DEFAULTS, WaveformPrefs::OnDefaults)
EVT_BUTTON(ID_APPLY, WaveformPrefs::OnApply)
END_EVENT_TABLE()
WaveformPrefsFactory::WaveformPrefsFactory(WaveTrack *wt)
: mWt(wt)
{
}
PrefsPanel *WaveformPrefsFactory::Create(wxWindow *parent)
{
return new WaveformPrefs(parent, mWt);
}

58
src/prefs/WaveformPrefs.h Normal file
View File

@ -0,0 +1,58 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformPrefs.h
Paul Licameli
**********************************************************************/
#ifndef __AUDACITY_WAVEFORM_PREFS__
#define __AUDACITY_WAVEFORM_PREFS__
#include "PrefsPanel.h"
#include "WaveformSettings.h"
class ShuttleGui;
class WaveTrack;
class wxCheckBox;
class WaveformPrefs :public PrefsPanel
{
public:
WaveformPrefs(wxWindow * parent, WaveTrack *wt);
virtual ~WaveformPrefs();
virtual bool Apply();
virtual bool Validate();
private:
void Populate();
void PopulateOrExchange(ShuttleGui & S);
void OnControl(wxCommandEvent&);
void OnDefaults(wxCommandEvent&);
void OnApply(wxCommandEvent &);
DECLARE_EVENT_TABLE()
WaveTrack *const mWt;
bool mDefaulted;
wxCheckBox *mDefaultsCheckbox;
WaveformSettings mTempSettings;
bool mPopulating;
};
class WaveformPrefsFactory : public PrefsPanelFactory
{
public:
explicit WaveformPrefsFactory(WaveTrack *wt = 0);
virtual PrefsPanel *Create(wxWindow *parent);
private:
WaveTrack *const mWt;
};
#endif

View File

@ -0,0 +1,86 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformSettings.cpp
Paul Licameli
*******************************************************************//**
\class WaveformSettings
\brief Waveform settings, either for one track or as defaults.
*//*******************************************************************/
#include "../Audacity.h"
#include "WaveformSettings.h"
WaveformSettings::Globals::Globals()
{
LoadPrefs();
}
void WaveformSettings::Globals::SavePrefs()
{
}
void WaveformSettings::Globals::LoadPrefs()
{
}
WaveformSettings::Globals
&WaveformSettings::Globals::Get()
{
static Globals instance;
return instance;
}
WaveformSettings::WaveformSettings()
{
LoadPrefs();
}
WaveformSettings::WaveformSettings(const WaveformSettings &other)
{
}
WaveformSettings &WaveformSettings::operator= (const WaveformSettings &other)
{
if (this != &other) {
}
return *this;
}
WaveformSettings& WaveformSettings::defaults()
{
static WaveformSettings instance;
return instance;
}
bool WaveformSettings::Validate(bool quiet)
{
quiet;
return true;
}
void WaveformSettings::LoadPrefs()
{
// Enforce legal values
Validate(true);
Update();
}
void WaveformSettings::SavePrefs()
{
}
void WaveformSettings::Update()
{
}
WaveformSettings::~WaveformSettings()
{
}

View File

@ -0,0 +1,46 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveformSettings.h
Paul Licameli
**********************************************************************/
#ifndef __AUDACITY_WAVEFORM_SETTINGS__
#define __AUDACITY_WAVEFORM_SETTINGS__
class WaveformSettings
{
public:
// Singleton for settings that are not per-track
class Globals
{
public:
static Globals &Get();
void SavePrefs();
private:
Globals();
void LoadPrefs();
};
static WaveformSettings &defaults();
WaveformSettings();
WaveformSettings(const WaveformSettings &other);
WaveformSettings& operator= (const WaveformSettings &other);
~WaveformSettings();
bool IsDefault() const
{
return this == &defaults();
}
bool Validate(bool quiet);
void LoadPrefs();
void SavePrefs();
void Update();
};
#endif

View File

@ -287,6 +287,8 @@
<ClCompile Include="..\..\..\src\PluginManager.cpp" />
<ClCompile Include="..\..\..\src\Prefs.cpp" />
<ClCompile Include="..\..\..\src\prefs\SpectrogramSettings.cpp" />
<ClCompile Include="..\..\..\src\prefs\WaveformPrefs.cpp" />
<ClCompile Include="..\..\..\src\prefs\WaveformSettings.cpp" />
<ClCompile Include="..\..\..\src\Printing.cpp" />
<ClCompile Include="..\..\..\src\Profiler.cpp" />
<ClCompile Include="..\..\..\src\Project.cpp" />
@ -535,6 +537,8 @@
<ClInclude Include="..\..\..\src\ModuleManager.h" />
<ClInclude Include="..\..\..\src\NumberScale.h" />
<ClInclude Include="..\..\..\src\prefs\SpectrogramSettings.h" />
<ClInclude Include="..\..\..\src\prefs\WaveformPrefs.h" />
<ClInclude Include="..\..\..\src\prefs\WaveformSettings.h" />
<ClInclude Include="..\..\..\src\RevisionIdent.h" />
<ClInclude Include="..\..\..\src\SelectedRegion.h" />
<ClInclude Include="..\..\..\src\SseMathFuncs.h" />

View File

@ -843,6 +843,12 @@
<ClCompile Include="..\..\..\src\prefs\SpectrogramSettings.cpp">
<Filter>src/prefs</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\prefs\WaveformPrefs.cpp">
<Filter>src/prefs</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\prefs\WaveformSettings.cpp">
<Filter>src/prefs</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\AboutDialog.h">
@ -1688,6 +1694,12 @@
<ClInclude Include="..\..\..\src\NumberScale.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\prefs\WaveformPrefs.h">
<Filter>src/prefs</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\prefs\WaveformSettings.h">
<Filter>src/prefs</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\..\audacity.ico">