270 lines
7.2 KiB
C++
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
|
|
}
|