2015-06-21 14:41:28 +00:00
|
|
|
/**********************************************************************
|
|
|
|
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
|
|
|
|
WaveformPrefs.cpp
|
|
|
|
|
|
|
|
Paul Licameli
|
|
|
|
|
|
|
|
*******************************************************************//**
|
|
|
|
|
|
|
|
\class WaveformPrefs
|
|
|
|
\brief A PrefsPanel for spectrum settings.
|
|
|
|
|
|
|
|
*//*******************************************************************/
|
|
|
|
|
2021-05-09 15:16:56 +00:00
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
#include "WaveformPrefs.h"
|
2018-11-11 02:40:37 +00:00
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
#include "GUIPrefs.h"
|
|
|
|
#include "GUISettings.h"
|
2015-06-21 14:41:28 +00:00
|
|
|
|
|
|
|
#include <wx/checkbox.h>
|
2019-01-22 11:57:30 +00:00
|
|
|
#include <wx/choice.h>
|
2015-06-21 14:41:28 +00:00
|
|
|
|
|
|
|
#include "../Project.h"
|
2015-07-08 21:17:43 +00:00
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
#include "../TrackPanel.h"
|
2015-07-28 12:27:03 +00:00
|
|
|
#include "../ShuttleGui.h"
|
2015-07-03 04:20:21 +00:00
|
|
|
#include "../WaveTrack.h"
|
2019-07-09 14:29:29 +00:00
|
|
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
|
|
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
2015-06-21 14:41:28 +00:00
|
|
|
|
2020-01-04 18:15:07 +00:00
|
|
|
WaveformPrefs::WaveformPrefs(wxWindow * parent, wxWindowID winid,
|
|
|
|
AudacityProject *pProject, WaveTrack *wt)
|
2017-11-06 15:47:08 +00:00
|
|
|
/* i18n-hint: A waveform is a visual representation of vibration */
|
2019-12-08 02:00:39 +00:00
|
|
|
: PrefsPanel(parent, winid, XO("Waveforms"))
|
2020-01-04 18:15:07 +00:00
|
|
|
, mProject{ pProject }
|
2015-06-21 14:41:28 +00:00
|
|
|
, mWt(wt)
|
|
|
|
, mPopulating(false)
|
|
|
|
{
|
|
|
|
if (mWt) {
|
|
|
|
WaveformSettings &settings = wt->GetWaveformSettings();
|
|
|
|
mDefaulted = (&WaveformSettings::defaults() == &settings);
|
|
|
|
mTempSettings = settings;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
mTempSettings = WaveformSettings::defaults();
|
|
|
|
mDefaulted = false;
|
|
|
|
}
|
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToEnumeratedDBRange();
|
2015-06-21 14:41:28 +00:00
|
|
|
Populate();
|
|
|
|
}
|
|
|
|
|
|
|
|
WaveformPrefs::~WaveformPrefs()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-04-15 12:01:24 +00:00
|
|
|
ComponentInterfaceSymbol WaveformPrefs::GetSymbol()
|
|
|
|
{
|
|
|
|
return WAVEFORM_PREFS_PLUGIN_SYMBOL;
|
|
|
|
}
|
|
|
|
|
2019-12-08 18:53:48 +00:00
|
|
|
TranslatableString WaveformPrefs::GetDescription()
|
2019-04-15 12:01:24 +00:00
|
|
|
{
|
2019-12-08 18:53:48 +00:00
|
|
|
return XO("Preferences for Waveforms");
|
2019-04-15 12:01:24 +00:00
|
|
|
}
|
|
|
|
|
2021-06-06 16:18:35 +00:00
|
|
|
ManualPageID WaveformPrefs::HelpPageName()
|
2019-04-15 12:01:24 +00:00
|
|
|
{
|
|
|
|
return "Waveform_Preferences";
|
|
|
|
}
|
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
enum {
|
|
|
|
ID_DEFAULTS = 10001,
|
2015-06-22 00:03:15 +00:00
|
|
|
|
|
|
|
ID_SCALE,
|
2015-08-15 22:07:29 +00:00
|
|
|
ID_RANGE,
|
2015-06-21 14:41:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void WaveformPrefs::Populate()
|
|
|
|
{
|
2015-08-15 22:07:29 +00:00
|
|
|
// Reuse the same choices and codes as for Interface prefs
|
2019-12-18 03:52:42 +00:00
|
|
|
GUIPrefs::GetRangeChoices(&mRangeChoices, &mRangeCodes);
|
2015-08-15 22:07:29 +00:00
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
//------------------------- Main section --------------------
|
|
|
|
// Now construct the GUI itself.
|
2017-02-12 15:13:23 +00:00
|
|
|
ShuttleGui S(this, eIsCreatingFromPrefs);
|
2015-06-21 14:41:28 +00:00
|
|
|
PopulateOrExchange(S);
|
|
|
|
// ----------------------- End of main section --------------
|
|
|
|
}
|
|
|
|
|
|
|
|
void WaveformPrefs::PopulateOrExchange(ShuttleGui & S)
|
|
|
|
{
|
|
|
|
mPopulating = true;
|
|
|
|
|
|
|
|
S.SetBorder(2);
|
2018-01-17 20:41:40 +00:00
|
|
|
S.StartScroller();
|
2015-06-21 14:41:28 +00:00
|
|
|
|
2019-12-22 19:58:36 +00:00
|
|
|
// S.StartStatic(XO("Track Settings"));
|
2015-06-21 14:41:28 +00:00
|
|
|
{
|
|
|
|
mDefaultsCheckbox = 0;
|
|
|
|
if (mWt) {
|
2015-08-01 21:04:23 +00:00
|
|
|
/* i18n-hint: use is a verb */
|
2020-05-11 15:28:14 +00:00
|
|
|
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(XXO("&Use Preferences"), mDefaulted);
|
2015-06-21 14:41:28 +00:00
|
|
|
}
|
|
|
|
|
2019-12-22 19:58:36 +00:00
|
|
|
S.StartStatic(XO("Display"));
|
2015-06-21 14:41:28 +00:00
|
|
|
{
|
|
|
|
S.StartTwoColumn();
|
|
|
|
{
|
2015-08-15 22:07:29 +00:00
|
|
|
mScaleChoice =
|
2020-05-11 15:28:14 +00:00
|
|
|
S.Id(ID_SCALE).TieChoice(XXO("S&cale:"),
|
2018-03-06 09:04:39 +00:00
|
|
|
mTempSettings.scaleType,
|
2020-02-03 19:48:17 +00:00
|
|
|
Msgids( WaveformSettings::GetScaleNames() ) );
|
2015-08-15 22:07:29 +00:00
|
|
|
|
|
|
|
mRangeChoice =
|
2020-05-11 15:28:14 +00:00
|
|
|
S.Id(ID_RANGE).TieChoice(XXO("Waveform dB &range:"),
|
2018-03-06 09:04:39 +00:00
|
|
|
mTempSettings.dBRange,
|
2018-02-02 00:23:02 +00:00
|
|
|
mRangeChoices);
|
2015-06-21 14:41:28 +00:00
|
|
|
}
|
|
|
|
S.EndTwoColumn();
|
|
|
|
}
|
|
|
|
S.EndStatic();
|
|
|
|
}
|
|
|
|
// S.EndStatic();
|
|
|
|
|
|
|
|
/*
|
2019-12-22 19:58:36 +00:00
|
|
|
S.StartStatic(XO("Global settings"));
|
2015-06-21 14:41:28 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
S.EndStatic();
|
|
|
|
*/
|
|
|
|
|
2018-01-17 20:41:40 +00:00
|
|
|
S.EndScroller();
|
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
EnableDisableRange();
|
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
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
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToActualDBRange();
|
2015-06-21 14:41:28 +00:00
|
|
|
const bool result = mTempSettings.Validate(false);
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToEnumeratedDBRange();
|
2015-06-21 14:41:28 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2017-06-25 14:57:26 +00:00
|
|
|
bool WaveformPrefs::Commit()
|
2015-06-21 14:41:28 +00:00
|
|
|
{
|
|
|
|
const bool isOpenPage = this->IsShown();
|
|
|
|
|
|
|
|
ShuttleGui S(this, eIsGettingFromDialog);
|
|
|
|
PopulateOrExchange(S);
|
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToActualDBRange();
|
2015-06-21 14:41:28 +00:00
|
|
|
WaveformSettings::Globals::Get().SavePrefs();
|
|
|
|
|
|
|
|
if (mWt) {
|
2018-09-18 16:03:37 +00:00
|
|
|
for (auto channel : TrackList::Channels(mWt)) {
|
|
|
|
if (mDefaulted)
|
|
|
|
channel->SetWaveformSettings({});
|
|
|
|
else {
|
|
|
|
WaveformSettings &settings =
|
2020-10-10 15:14:20 +00:00
|
|
|
channel->GetWaveformSettings();
|
2018-09-18 16:03:37 +00:00
|
|
|
settings = mTempSettings;
|
2015-06-21 14:41:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-17 20:46:31 +00:00
|
|
|
WaveformSettings *const pSettings = &WaveformSettings::defaults();
|
2015-06-21 14:41:28 +00:00
|
|
|
if (!mWt || mDefaulted) {
|
|
|
|
*pSettings = mTempSettings;
|
|
|
|
pSettings->SavePrefs();
|
|
|
|
}
|
2019-01-17 20:46:31 +00:00
|
|
|
pSettings->LoadPrefs(); // always; in case Globals changed
|
2015-06-21 14:41:28 +00:00
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToEnumeratedDBRange();
|
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
if (mWt && isOpenPage) {
|
2018-09-18 16:03:37 +00:00
|
|
|
for (auto channel : TrackList::Channels(mWt))
|
2019-07-09 14:29:29 +00:00
|
|
|
WaveTrackView::Get( *channel )
|
|
|
|
.SetDisplay( WaveTrackViewConstants::Waveform );
|
2015-06-21 14:41:28 +00:00
|
|
|
}
|
|
|
|
|
2015-08-20 17:24:55 +00:00
|
|
|
if (isOpenPage) {
|
2020-01-04 18:15:07 +00:00
|
|
|
if ( mProject ) {
|
|
|
|
auto &tp = TrackPanel::Get( *mProject );
|
2020-01-04 17:11:32 +00:00
|
|
|
tp.UpdateVRulers();
|
|
|
|
tp.Refresh(false);
|
|
|
|
}
|
2015-08-20 17:24:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-06-25 14:54:06 +00:00
|
|
|
bool WaveformPrefs::ShowsPreviewButton()
|
2015-08-20 17:24:55 +00:00
|
|
|
{
|
2015-06-21 14:41:28 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
void WaveformPrefs::OnScale(wxCommandEvent &e)
|
|
|
|
{
|
|
|
|
EnableDisableRange();
|
|
|
|
|
|
|
|
// do the common part
|
|
|
|
OnControl(e);
|
|
|
|
}
|
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
void WaveformPrefs::OnDefaults(wxCommandEvent &)
|
|
|
|
{
|
|
|
|
if (mDefaultsCheckbox->IsChecked()) {
|
|
|
|
mTempSettings = WaveformSettings::defaults();
|
2015-08-15 22:07:29 +00:00
|
|
|
mTempSettings.ConvertToEnumeratedDBRange();
|
2015-06-21 14:41:28 +00:00
|
|
|
mDefaulted = true;
|
|
|
|
ShuttleGui S(this, eIsSettingToDialog);
|
|
|
|
PopulateOrExchange(S);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
void WaveformPrefs::EnableDisableRange()
|
|
|
|
{
|
2015-08-17 12:37:59 +00:00
|
|
|
mRangeChoice->Enable
|
|
|
|
(mScaleChoice->GetSelection() == WaveformSettings::stLogarithmic);
|
2015-08-15 22:07:29 +00:00
|
|
|
}
|
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
BEGIN_EVENT_TABLE(WaveformPrefs, PrefsPanel)
|
2015-06-22 00:03:15 +00:00
|
|
|
|
2015-08-15 22:07:29 +00:00
|
|
|
EVT_CHOICE(ID_SCALE, WaveformPrefs::OnScale)
|
|
|
|
EVT_CHOICE(ID_RANGE, WaveformPrefs::OnControl)
|
2015-06-22 00:03:15 +00:00
|
|
|
|
2015-06-21 14:41:28 +00:00
|
|
|
EVT_CHECKBOX(ID_DEFAULTS, WaveformPrefs::OnDefaults)
|
|
|
|
END_EVENT_TABLE()
|
|
|
|
|
2019-01-14 01:55:52 +00:00
|
|
|
PrefsPanel::Factory
|
|
|
|
WaveformPrefsFactory(WaveTrack *wt)
|
2015-06-21 14:41:28 +00:00
|
|
|
{
|
2020-01-04 18:15:07 +00:00
|
|
|
return [=](wxWindow *parent, wxWindowID winid, AudacityProject *pProject)
|
2019-01-14 01:55:52 +00:00
|
|
|
{
|
|
|
|
wxASSERT(parent); // to justify safenew
|
2020-01-04 18:15:07 +00:00
|
|
|
return safenew WaveformPrefs(parent, winid, pProject, wt);
|
2019-01-14 01:55:52 +00:00
|
|
|
};
|
2015-06-21 14:41:28 +00:00
|
|
|
}
|
2020-01-20 01:53:03 +00:00
|
|
|
#if 0
|
|
|
|
namespace{
|
2019-01-16 17:18:40 +00:00
|
|
|
PrefsPanel::Registration sAttachment{ "Waveform",
|
2020-01-20 01:53:03 +00:00
|
|
|
WaveformPrefsFactory( nullptr ),
|
2019-01-16 17:18:40 +00:00
|
|
|
false,
|
|
|
|
// Register with an explicit ordering hint because this one is
|
|
|
|
// only conditionally compiled; and place it at a lower tree level
|
|
|
|
{ "Tracks", { Registry::OrderingHint::Before, "Spectrum" } }
|
2020-01-20 01:53:03 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|