1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-25 17:08:07 +02:00
audacity/src/prefs/WaveformPrefs.cpp

258 lines
6.0 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
WaveformPrefs.cpp
Paul Licameli
*******************************************************************//**
\class WaveformPrefs
\brief A PrefsPanel for spectrum settings.
*//*******************************************************************/
#include "../Audacity.h"
#include "WaveformPrefs.h"
#include "GUIPrefs.h"
#include "GUISettings.h"
#include <wx/checkbox.h>
#include "../Project.h"
#include "../TrackPanel.h"
#include "../ShuttleGui.h"
#include "../WaveTrack.h"
WaveformPrefs::WaveformPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt)
/* i18n-hint: A waveform is a visual representation of vibration */
: PrefsPanel(parent, winid, _("Waveforms"))
, mWt(wt)
, mPopulating(false)
{
if (mWt) {
WaveformSettings &settings = wt->GetWaveformSettings();
mDefaulted = (&WaveformSettings::defaults() == &settings);
mTempSettings = settings;
}
else {
mTempSettings = WaveformSettings::defaults();
mDefaulted = false;
}
mTempSettings.ConvertToEnumeratedDBRange();
Populate();
}
WaveformPrefs::~WaveformPrefs()
{
}
enum {
ID_DEFAULTS = 10001,
ID_SCALE,
ID_RANGE,
};
void WaveformPrefs::Populate()
{
mScaleChoices = WaveformSettings::GetScaleNames();
// Reuse the same choices and codes as for Interface prefs
GUIPrefs::GetRangeChoices(&mRangeChoices, &mRangeCodes);
//------------------------- Main section --------------------
// Now construct the GUI itself.
ShuttleGui S(this, eIsCreatingFromPrefs);
PopulateOrExchange(S);
// ----------------------- End of main section --------------
}
void WaveformPrefs::PopulateOrExchange(ShuttleGui & S)
{
mPopulating = true;
S.SetBorder(2);
S.StartScroller();
// S.StartStatic(_("Track Settings"));
{
mDefaultsCheckbox = 0;
if (mWt) {
/* i18n-hint: use is a verb */
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(_("&Use Preferences"), mDefaulted);
}
S.StartStatic(_("Display"));
{
S.StartTwoColumn();
{
mScaleChoice =
S.Id(ID_SCALE).TieChoice(_("S&cale") + wxString(wxT(":")),
*(int*)&mTempSettings.scaleType,
&mScaleChoices);
mRangeChoice =
S.Id(ID_RANGE).TieChoice(_("Waveform dB &range") + wxString(wxT(":")),
*(int*)&mTempSettings.dBRange,
&mRangeChoices);
S.SetSizeHints(mRangeChoices);
}
S.EndTwoColumn();
}
S.EndStatic();
}
// S.EndStatic();
/*
S.StartStatic(_("Global settings"));
{
}
S.EndStatic();
*/
S.EndScroller();
EnableDisableRange();
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
mTempSettings.ConvertToActualDBRange();
const bool result = mTempSettings.Validate(false);
mTempSettings.ConvertToEnumeratedDBRange();
return result;
}
bool WaveformPrefs::Commit()
{
const bool isOpenPage = this->IsShown();
const auto partner =
mWt ?
// Assume linked track is wave or null
static_cast<WaveTrack*>(mWt->GetLink())
: nullptr;
ShuttleGui S(this, eIsGettingFromDialog);
PopulateOrExchange(S);
mTempSettings.ConvertToActualDBRange();
WaveformSettings::Globals::Get().SavePrefs();
if (mWt) {
if (mDefaulted) {
mWt->SetWaveformSettings({});
if (partner)
partner->SetWaveformSettings({});
}
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();
}
mTempSettings.ConvertToEnumeratedDBRange();
if (mWt && isOpenPage) {
mWt->SetDisplay(WaveTrack::Waveform);
if (partner)
partner->SetDisplay(WaveTrack::Waveform);
}
if (isOpenPage) {
TrackPanel *const tp = ::GetActiveProject()->GetTrackPanel();
tp->UpdateVRulers();
tp->Refresh(false);
}
return true;
}
bool WaveformPrefs::ShowsPreviewButton()
{
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::OnScale(wxCommandEvent &e)
{
EnableDisableRange();
// do the common part
OnControl(e);
}
void WaveformPrefs::OnDefaults(wxCommandEvent &)
{
if (mDefaultsCheckbox->IsChecked()) {
mTempSettings = WaveformSettings::defaults();
mTempSettings.ConvertToEnumeratedDBRange();
mDefaulted = true;
ShuttleGui S(this, eIsSettingToDialog);
PopulateOrExchange(S);
}
}
void WaveformPrefs::EnableDisableRange()
{
mRangeChoice->Enable
(mScaleChoice->GetSelection() == WaveformSettings::stLogarithmic);
}
BEGIN_EVENT_TABLE(WaveformPrefs, PrefsPanel)
EVT_CHOICE(ID_SCALE, WaveformPrefs::OnScale)
EVT_CHOICE(ID_RANGE, WaveformPrefs::OnControl)
EVT_CHECKBOX(ID_DEFAULTS, WaveformPrefs::OnDefaults)
END_EVENT_TABLE()
WaveformPrefsFactory::WaveformPrefsFactory(WaveTrack *wt)
: mWt(wt)
{
}
PrefsPanel *WaveformPrefsFactory::operator () (wxWindow *parent, wxWindowID winid)
{
wxASSERT(parent); // to justify safenew
return safenew WaveformPrefs(parent, winid, mWt);
}