audacia/src/ProjectSelectionManager.cpp
Paul Licameli e653b4aaf8 Eliminate Experimental.h, configure compile options instead...
... This makes it impossible to forget to include the EXPERIMENTAL definitions
(such as when cutting and pasting code) and so get unintended quiet changes of
behavior.

The EXPERIMENTAL flags are now specified instead in new file Experimental.cmake
2021-04-27 12:40:07 -04:00

270 lines
7.2 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
ProjectSelectionManager.cpp
Paul Licameli split from ProjectManager.cpp
**********************************************************************/
#include "ProjectSelectionManager.h"
#include "Project.h"
#include "ProjectHistory.h"
#include "ProjectSettings.h"
#include "ProjectWindow.h"
#include "Snap.h"
#include "TrackPanel.h"
#include "ViewInfo.h"
#include "WaveTrack.h"
#include "toolbars/SelectionBar.h"
#include "toolbars/SpectralSelectionBar.h"
#include "toolbars/TimeToolBar.h"
static AudacityProject::AttachedObjects::RegisteredFactory
sProjectSelectionManagerKey {
[]( AudacityProject &project ) {
return std::make_shared< ProjectSelectionManager >( project );
}
};
ProjectSelectionManager &ProjectSelectionManager::Get(
AudacityProject &project )
{
return project.AttachedObjects::Get< ProjectSelectionManager >(
sProjectSelectionManagerKey );
}
const ProjectSelectionManager &ProjectSelectionManager::Get(
const AudacityProject &project )
{
return Get( const_cast< AudacityProject & >( project ) );
}
ProjectSelectionManager::ProjectSelectionManager( AudacityProject &project )
: mProject{ project }
{
}
ProjectSelectionManager::~ProjectSelectionManager() = default;
bool ProjectSelectionManager::SnapSelection()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
auto &window = ProjectWindow::Get( project );
auto snapTo = settings.GetSnapTo();
if (snapTo != SNAP_OFF) {
auto &viewInfo = ViewInfo::Get( project );
auto &selectedRegion = viewInfo.selectedRegion;
NumericConverter nc(NumericConverter::TIME,
settings.GetSelectionFormat(), 0, settings.GetRate());
const bool nearest = (snapTo == SNAP_NEAREST);
const double oldt0 = selectedRegion.t0();
const double oldt1 = selectedRegion.t1();
nc.ValueToControls(oldt0, nearest);
nc.ControlsToValue();
const double t0 = nc.GetValue();
nc.ValueToControls(oldt1, nearest);
nc.ControlsToValue();
const double t1 = nc.GetValue();
if (t0 != oldt0 || t1 != oldt1) {
selectedRegion.setTimes(t0, t1);
return true;
}
}
return false;
}
double ProjectSelectionManager::AS_GetRate()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetRate();
}
void ProjectSelectionManager::AS_SetRate(double rate)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
settings.SetRate( rate );
SelectionBar::Get( project ).SetRate(rate);
}
int ProjectSelectionManager::AS_GetSnapTo()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetSnapTo();
}
void ProjectSelectionManager::AS_SetSnapTo(int snap)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
auto &window = ProjectWindow::Get( project );
settings.SetSnapTo( snap );
// LLL: TODO - what should this be changed to???
// GetCommandManager()->Check(wxT("Snap"), mSnapTo);
gPrefs->Write(wxT("/SnapTo"), snap);
gPrefs->Flush();
SnapSelection();
window.RedrawProject();
SelectionBar::Get( project ).SetSnapTo(snap);
}
const NumericFormatSymbol & ProjectSelectionManager::AS_GetSelectionFormat()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetSelectionFormat();
}
void ProjectSelectionManager::AS_SetSelectionFormat(
const NumericFormatSymbol & format)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
settings.SetSelectionFormat( format );
gPrefs->Write(wxT("/SelectionFormat"), format.Internal());
gPrefs->Flush();
if (SnapSelection())
TrackPanel::Get( project ).Refresh(false);
SelectionBar::Get( project ).SetSelectionFormat(format);
}
const NumericFormatSymbol & ProjectSelectionManager::TT_GetAudioTimeFormat()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetAudioTimeFormat();
}
void ProjectSelectionManager::TT_SetAudioTimeFormat(
const NumericFormatSymbol & format)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
settings.SetAudioTimeFormat( format );
gPrefs->Write(wxT("/AudioTimeFormat"), format.Internal());
gPrefs->Flush();
TimeToolBar::Get( project ).SetAudioTimeFormat(format);
}
void ProjectSelectionManager::AS_ModifySelection(
double &start, double &end, bool done)
{
auto &project = mProject;
auto &history = ProjectHistory::Get( project );
auto &trackPanel = TrackPanel::Get( project );
auto &viewInfo = ViewInfo::Get( project );
viewInfo.selectedRegion.setTimes(start, end);
trackPanel.Refresh(false);
if (done) {
history.ModifyState(false);
}
}
double ProjectSelectionManager::SSBL_GetRate() const
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
auto &tracks = TrackList::Get( project );
// Return maximum of project rate and all track rates.
return std::max( settings.GetRate(),
tracks.Any<const WaveTrack>().max( &WaveTrack::GetRate ) );
}
const NumericFormatSymbol &
ProjectSelectionManager::SSBL_GetFrequencySelectionFormatName()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetFrequencySelectionFormatName();
}
void ProjectSelectionManager::SSBL_SetFrequencySelectionFormatName(
const NumericFormatSymbol & formatName)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
settings.SetFrequencySelectionFormatName( formatName );
gPrefs->Write(wxT("/FrequencySelectionFormatName"),
formatName.Internal());
gPrefs->Flush();
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
SpectralSelectionBar::Get( project ).SetFrequencySelectionFormatName(formatName);
#endif
}
const NumericFormatSymbol &
ProjectSelectionManager::SSBL_GetBandwidthSelectionFormatName()
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
return settings.GetBandwidthSelectionFormatName();
}
void ProjectSelectionManager::SSBL_SetBandwidthSelectionFormatName(
const NumericFormatSymbol & formatName)
{
auto &project = mProject;
auto &settings = ProjectSettings::Get( project );
settings.SetBandwidthSelectionFormatName( formatName );
gPrefs->Write(wxT("/BandwidthSelectionFormatName"),
formatName.Internal());
gPrefs->Flush();
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
SpectralSelectionBar::Get( project ).SetBandwidthSelectionFormatName(formatName);
#endif
}
void ProjectSelectionManager::SSBL_ModifySpectralSelection(
double &bottom, double &top, bool done)
{
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
auto &project = mProject;
auto &history = ProjectHistory::Get( project );
auto &trackPanel = TrackPanel::Get( project );
auto &viewInfo = ViewInfo::Get( project );
double nyq = SSBL_GetRate() / 2.0;
if (bottom >= 0.0)
bottom = std::min(nyq, bottom);
if (top >= 0.0)
top = std::min(nyq, top);
viewInfo.selectedRegion.setFrequencies(bottom, top);
trackPanel.Refresh(false);
if (done) {
history.ModifyState(false);
}
#else
bottom; top; done;
#endif
}