mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 00:20:06 +02:00
Wave track view type stored in the views not the tracks...
... and some latent support added for multiple views. Still unsettled is what Nyquist should do with tracks with multiple view types; for now only pass one of them.
This commit is contained in:
commit
f4b370d1e2
@ -97,15 +97,6 @@ WaveTrack::WaveTrack(const std::shared_ptr<DirManager> &projDirManager, sampleFo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force creation always:
|
|
||||||
WaveformSettings &settings = GetIndependentWaveformSettings();
|
|
||||||
|
|
||||||
mDisplay = TracksPrefs::ViewModeChoice();
|
|
||||||
if (mDisplay == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
|
|
||||||
mDisplay = WaveTrackViewConstants::Waveform;
|
|
||||||
settings.scaleType = WaveformSettings::stLogarithmic;
|
|
||||||
}
|
|
||||||
|
|
||||||
mLegacyProjectFileOffset = 0;
|
mLegacyProjectFileOffset = 0;
|
||||||
|
|
||||||
mFormat = format;
|
mFormat = format;
|
||||||
@ -161,7 +152,6 @@ void WaveTrack::Init(const WaveTrack &orig)
|
|||||||
mOldGain[1] = 0.0;
|
mOldGain[1] = 0.0;
|
||||||
SetDefaultName(orig.GetDefaultName());
|
SetDefaultName(orig.GetDefaultName());
|
||||||
SetName(orig.GetName());
|
SetName(orig.GetName());
|
||||||
mDisplay = orig.mDisplay;
|
|
||||||
mDisplayMin = orig.mDisplayMin;
|
mDisplayMin = orig.mDisplayMin;
|
||||||
mDisplayMax = orig.mDisplayMax;
|
mDisplayMax = orig.mDisplayMax;
|
||||||
mSpectrumMin = orig.mSpectrumMin;
|
mSpectrumMin = orig.mSpectrumMin;
|
||||||
@ -196,7 +186,6 @@ void WaveTrack::Merge(const Track &orig)
|
|||||||
{
|
{
|
||||||
orig.TypeSwitch( [&](const WaveTrack *pwt) {
|
orig.TypeSwitch( [&](const WaveTrack *pwt) {
|
||||||
const WaveTrack &wt = *pwt;
|
const WaveTrack &wt = *pwt;
|
||||||
mDisplay = wt.mDisplay;
|
|
||||||
mGain = wt.mGain;
|
mGain = wt.mGain;
|
||||||
mPan = wt.mPan;
|
mPan = wt.mPan;
|
||||||
mDisplayMin = wt.mDisplayMin;
|
mDisplayMin = wt.mDisplayMin;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include <wx/longlong.h>
|
#include <wx/longlong.h>
|
||||||
|
|
||||||
#include "WaveTrackLocation.h"
|
#include "WaveTrackLocation.h"
|
||||||
#include "tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
|
||||||
|
|
||||||
class ProgressDialog;
|
class ProgressDialog;
|
||||||
|
|
||||||
@ -523,17 +522,12 @@ private:
|
|||||||
// Set the unique autosave ID
|
// Set the unique autosave ID
|
||||||
void SetAutoSaveIdent(int id);
|
void SetAutoSaveIdent(int id);
|
||||||
|
|
||||||
using WaveTrackDisplay = WaveTrackViewConstants::Display;
|
|
||||||
|
|
||||||
int GetLastScaleType() const { return mLastScaleType; }
|
int GetLastScaleType() const { return mLastScaleType; }
|
||||||
void SetLastScaleType() const;
|
void SetLastScaleType() const;
|
||||||
|
|
||||||
int GetLastdBRange() const { return mLastdBRange; }
|
int GetLastdBRange() const { return mLastdBRange; }
|
||||||
void SetLastdBRange() const;
|
void SetLastdBRange() const;
|
||||||
|
|
||||||
WaveTrackDisplay GetDisplay() const { return mDisplay; }
|
|
||||||
void SetDisplay(WaveTrackDisplay display) { mDisplay = display; }
|
|
||||||
|
|
||||||
void GetDisplayBounds(float *min, float *max) const;
|
void GetDisplayBounds(float *min, float *max) const;
|
||||||
void SetDisplayBounds(float min, float max) const;
|
void SetDisplayBounds(float min, float max) const;
|
||||||
void GetSpectrumBounds(float *min, float *max) const;
|
void GetSpectrumBounds(float *min, float *max) const;
|
||||||
@ -568,7 +562,6 @@ private:
|
|||||||
mutable float mSpectrumMin;
|
mutable float mSpectrumMin;
|
||||||
mutable float mSpectrumMax;
|
mutable float mSpectrumMax;
|
||||||
|
|
||||||
WaveTrackDisplay mDisplay;
|
|
||||||
mutable int mLastScaleType; // last scale type choice
|
mutable int mLastScaleType; // last scale type choice
|
||||||
mutable int mLastdBRange;
|
mutable int mLastdBRange;
|
||||||
mutable std::vector <Location> mDisplayLocationsCache;
|
mutable std::vector <Location> mDisplayLocationsCache;
|
||||||
|
@ -44,7 +44,8 @@ SetTrackAudioCommand and SetTrackVisualsCommand.
|
|||||||
#include "../prefs/SpectrogramSettings.h"
|
#include "../prefs/SpectrogramSettings.h"
|
||||||
#include "../Shuttle.h"
|
#include "../Shuttle.h"
|
||||||
#include "../ShuttleGui.h"
|
#include "../ShuttleGui.h"
|
||||||
#include "../tracks/ui/TrackView.h"
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
#include "CommandContext.h"
|
#include "CommandContext.h"
|
||||||
|
|
||||||
SetTrackBase::SetTrackBase(){
|
SetTrackBase::SetTrackBase(){
|
||||||
@ -353,7 +354,7 @@ bool SetTrackVisualsCommand::ApplyInner(const CommandContext & context, Track *
|
|||||||
TrackView::Get( *t ).SetHeight( mHeight );
|
TrackView::Get( *t ).SetHeight( mHeight );
|
||||||
|
|
||||||
if( wt && bHasDisplayType )
|
if( wt && bHasDisplayType )
|
||||||
wt->SetDisplay(
|
WaveTrackView::Get( *wt ).SetDisplay(
|
||||||
(mDisplayType == kWaveform) ?
|
(mDisplayType == kWaveform) ?
|
||||||
WaveTrackViewConstants::Waveform
|
WaveTrackViewConstants::Waveform
|
||||||
: WaveTrackViewConstants::Spectrum
|
: WaveTrackViewConstants::Spectrum
|
||||||
|
@ -68,6 +68,8 @@ greater use in future.
|
|||||||
#include "../widgets/ProgressDialog.h"
|
#include "../widgets/ProgressDialog.h"
|
||||||
#include "../ondemand/ODManager.h"
|
#include "../ondemand/ODManager.h"
|
||||||
#include "TimeWarper.h"
|
#include "TimeWarper.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
#include "../widgets/HelpSystem.h"
|
#include "../widgets/HelpSystem.h"
|
||||||
#include "../widgets/NumericTextCtrl.h"
|
#include "../widgets/NumericTextCtrl.h"
|
||||||
#include "../widgets/AudacityMessageBox.h"
|
#include "../widgets/AudacityMessageBox.h"
|
||||||
@ -2360,7 +2362,8 @@ void Effect::Preview(bool dryOnly)
|
|||||||
|
|
||||||
mixLeft->Offset(-mixLeft->GetStartTime());
|
mixLeft->Offset(-mixLeft->GetStartTime());
|
||||||
mixLeft->SetSelected(true);
|
mixLeft->SetSelected(true);
|
||||||
mixLeft->SetDisplay(WaveTrackViewConstants::NoDisplay);
|
WaveTrackView::Get( *mixLeft )
|
||||||
|
.SetDisplay(WaveTrackViewConstants::NoDisplay);
|
||||||
auto pLeft = mTracks->Add( mixLeft );
|
auto pLeft = mTracks->Add( mixLeft );
|
||||||
Track *pRight{};
|
Track *pRight{};
|
||||||
if (mixRight) {
|
if (mixRight) {
|
||||||
@ -2375,8 +2378,8 @@ void Effect::Preview(bool dryOnly)
|
|||||||
if (src->GetSelected() || mPreviewWithNotSelected) {
|
if (src->GetSelected() || mPreviewWithNotSelected) {
|
||||||
auto dest = src->Copy(mT0, t1);
|
auto dest = src->Copy(mT0, t1);
|
||||||
dest->SetSelected(src->GetSelected());
|
dest->SetSelected(src->GetSelected());
|
||||||
static_cast<WaveTrack*>(dest.get())
|
WaveTrackView::Get( *static_cast<WaveTrack*>(dest.get()) )
|
||||||
->SetDisplay(WaveTrackViewConstants::NoDisplay);
|
.SetDisplay(WaveTrackViewConstants::NoDisplay);
|
||||||
mTracks->Add( dest );
|
mTracks->Add( dest );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,8 @@ effects from this one class.
|
|||||||
#include "../../wxFileNameWrapper.h"
|
#include "../../wxFileNameWrapper.h"
|
||||||
#include "../../prefs/GUIPrefs.h"
|
#include "../../prefs/GUIPrefs.h"
|
||||||
#include "../../prefs/WaveformSettings.h"
|
#include "../../prefs/WaveformSettings.h"
|
||||||
|
#include "../../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
#include "../../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
#include "../../widgets/NumericTextCtrl.h"
|
#include "../../widgets/NumericTextCtrl.h"
|
||||||
#include "../../widgets/ProgressDialog.h"
|
#include "../../widgets/ProgressDialog.h"
|
||||||
|
|
||||||
@ -542,7 +544,11 @@ bool NyquistEffect::Init()
|
|||||||
|
|
||||||
for ( auto t :
|
for ( auto t :
|
||||||
TrackList::Get( *project ).Selected< const WaveTrack >() ) {
|
TrackList::Get( *project ).Selected< const WaveTrack >() ) {
|
||||||
if (t->GetDisplay() != WaveTrackViewConstants::Spectrum ||
|
const auto displays = WaveTrackView::Get(*t).GetDisplays();
|
||||||
|
bool hasSpectral =
|
||||||
|
make_iterator_range( displays.begin(), displays.end())
|
||||||
|
.contains( WaveTrackViewConstants::Spectrum );
|
||||||
|
if ( !hasSpectral ||
|
||||||
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
|
!(t->GetSpectrogramSettings().SpectralSelectionEnabled())) {
|
||||||
bAllowSpectralEditing = false;
|
bAllowSpectralEditing = false;
|
||||||
break;
|
break;
|
||||||
@ -1066,7 +1072,12 @@ bool NyquistEffect::ProcessOne()
|
|||||||
[&](const WaveTrack *wt) {
|
[&](const WaveTrack *wt) {
|
||||||
type = wxT("wave");
|
type = wxT("wave");
|
||||||
spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL");
|
spectralEditp = mCurTrack[0]->GetSpectrogramSettings().SpectralSelectionEnabled()? wxT("T") : wxT("NIL");
|
||||||
switch (wt->GetDisplay())
|
// To do: accommodate split views
|
||||||
|
auto viewType = WaveTrackViewConstants::NoDisplay;
|
||||||
|
auto displays = WaveTrackView::Get( *wt ).GetDisplays();
|
||||||
|
if (!displays.empty())
|
||||||
|
viewType = displays[0];
|
||||||
|
switch ( viewType )
|
||||||
{
|
{
|
||||||
case Waveform:
|
case Waveform:
|
||||||
view = (mCurTrack[0]->GetWaveformSettings().scaleType == 0) ? wxT("\"Waveform\"") : wxT("\"Waveform (dB)\"");
|
view = (mCurTrack[0]->GetWaveformSettings().scaleType == 0) ? wxT("\"Waveform\"") : wxT("\"Waveform (dB)\"");
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include "../commands/CommandManager.h"
|
#include "../commands/CommandManager.h"
|
||||||
#include "../toolbars/ControlToolBar.h"
|
#include "../toolbars/ControlToolBar.h"
|
||||||
#include "../tracks/ui/SelectHandle.h"
|
#include "../tracks/ui/SelectHandle.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
|
|
||||||
// private helper classes and functions
|
// private helper classes and functions
|
||||||
namespace {
|
namespace {
|
||||||
@ -33,8 +35,9 @@ void DoNextPeakFrequency(AudacityProject &project, bool up)
|
|||||||
// Find the first selected wave track that is in a spectrogram view.
|
// Find the first selected wave track that is in a spectrogram view.
|
||||||
const WaveTrack *pTrack {};
|
const WaveTrack *pTrack {};
|
||||||
for ( auto wt : tracks.Selected< const WaveTrack >() ) {
|
for ( auto wt : tracks.Selected< const WaveTrack >() ) {
|
||||||
const int display = wt->GetDisplay();
|
const auto displays = WaveTrackView::Get( *wt ).GetDisplays();
|
||||||
if (display == WaveTrackViewConstants::Spectrum) {
|
if ( make_iterator_range( displays.begin(), displays.end() )
|
||||||
|
.contains( WaveTrackViewConstants::Spectrum) ) {
|
||||||
pTrack = wt;
|
pTrack = wt;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "../TrackPanel.h"
|
#include "../TrackPanel.h"
|
||||||
#include "../WaveTrack.h"
|
#include "../WaveTrack.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
@ -48,7 +49,7 @@ SpectrumPrefs::SpectrumPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt)
|
|||||||
wt->GetSpectrumBounds(&mOrigMin, &mOrigMax);
|
wt->GetSpectrumBounds(&mOrigMin, &mOrigMax);
|
||||||
mTempSettings.maxFreq = mOrigMax;
|
mTempSettings.maxFreq = mOrigMax;
|
||||||
mTempSettings.minFreq = mOrigMin;
|
mTempSettings.minFreq = mOrigMin;
|
||||||
mOrigDisplay = mWt->GetDisplay();
|
mOrigPlacements = WaveTrackView::Get( *mWt ).SavePlacements();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mTempSettings = mOrigSettings = SpectrogramSettings::defaults();
|
mTempSettings = mOrigSettings = SpectrogramSettings::defaults();
|
||||||
@ -423,7 +424,7 @@ void SpectrumPrefs::Rollback()
|
|||||||
if (mWt && isOpenPage) {
|
if (mWt && isOpenPage) {
|
||||||
auto channels = TrackList::Channels(mWt);
|
auto channels = TrackList::Channels(mWt);
|
||||||
for (auto channel : channels)
|
for (auto channel : channels)
|
||||||
channel->SetDisplay(mOrigDisplay);
|
WaveTrackView::Get( *channel ).RestorePlacements( mOrigPlacements );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isOpenPage) {
|
if (isOpenPage) {
|
||||||
@ -470,7 +471,8 @@ void SpectrumPrefs::Preview()
|
|||||||
|
|
||||||
if (mWt && isOpenPage) {
|
if (mWt && isOpenPage) {
|
||||||
for (auto channel : TrackList::Channels(mWt))
|
for (auto channel : TrackList::Channels(mWt))
|
||||||
channel->SetDisplay(WaveTrackViewConstants::Spectrum);
|
WaveTrackView::Get( *channel )
|
||||||
|
.SetDisplay( WaveTrackViewConstants::Spectrum );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isOpenPage) {
|
if (isOpenPage) {
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "../Experimental.h"
|
#include "../Experimental.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include <wx/defs.h>
|
#include <wx/defs.h>
|
||||||
|
|
||||||
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
@ -38,6 +39,7 @@ struct FFTParam;
|
|||||||
class ShuttleGui;
|
class ShuttleGui;
|
||||||
class SpectrogramSettings;
|
class SpectrogramSettings;
|
||||||
class WaveTrack;
|
class WaveTrack;
|
||||||
|
struct WaveTrackSubViewPlacement;
|
||||||
|
|
||||||
#define SPECTRUM_PREFS_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Spectrum") }
|
#define SPECTRUM_PREFS_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Spectrum") }
|
||||||
|
|
||||||
@ -98,7 +100,7 @@ class SpectrumPrefs final : public PrefsPanel
|
|||||||
|
|
||||||
SpectrogramSettings mTempSettings, mOrigSettings;
|
SpectrogramSettings mTempSettings, mOrigSettings;
|
||||||
|
|
||||||
WaveTrackViewConstants::Display mOrigDisplay;
|
std::vector<WaveTrackSubViewPlacement> mOrigPlacements;
|
||||||
float mOrigMin, mOrigMax;
|
float mOrigMin, mOrigMax;
|
||||||
|
|
||||||
bool mPopulating;
|
bool mPopulating;
|
||||||
|
@ -27,6 +27,8 @@ Paul Licameli
|
|||||||
#include "../TrackPanel.h"
|
#include "../TrackPanel.h"
|
||||||
#include "../ShuttleGui.h"
|
#include "../ShuttleGui.h"
|
||||||
#include "../WaveTrack.h"
|
#include "../WaveTrack.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
|
||||||
|
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackViewConstants.h"
|
||||||
|
|
||||||
WaveformPrefs::WaveformPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt)
|
WaveformPrefs::WaveformPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt)
|
||||||
/* i18n-hint: A waveform is a visual representation of vibration */
|
/* i18n-hint: A waveform is a visual representation of vibration */
|
||||||
@ -184,7 +186,8 @@ bool WaveformPrefs::Commit()
|
|||||||
|
|
||||||
if (mWt && isOpenPage) {
|
if (mWt && isOpenPage) {
|
||||||
for (auto channel : TrackList::Channels(mWt))
|
for (auto channel : TrackList::Channels(mWt))
|
||||||
channel->SetDisplay(WaveTrackViewConstants::Waveform);
|
WaveTrackView::Get( *channel )
|
||||||
|
.SetDisplay( WaveTrackViewConstants::Waveform );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isOpenPage) {
|
if (isOpenPage) {
|
||||||
|
@ -120,10 +120,6 @@ UIHandlePtr SampleHandle::HitTest
|
|||||||
/// editable sample
|
/// editable sample
|
||||||
const auto wavetrack = pTrack.get();
|
const auto wavetrack = pTrack.get();
|
||||||
|
|
||||||
const int displayType = wavetrack->GetDisplay();
|
|
||||||
if (WaveTrackViewConstants::Waveform != displayType)
|
|
||||||
return {}; // Not a wave, so return.
|
|
||||||
|
|
||||||
const double tt =
|
const double tt =
|
||||||
adjustTime(wavetrack, viewInfo.PositionToTime(state.m_x, rect.x));
|
adjustTime(wavetrack, viewInfo.PositionToTime(state.m_x, rect.x));
|
||||||
if (!SampleResolutionTest(viewInfo, wavetrack, tt, rect.width))
|
if (!SampleResolutionTest(viewInfo, wavetrack, tt, rect.width))
|
||||||
@ -178,17 +174,6 @@ namespace {
|
|||||||
(const wxMouseEvent &event,
|
(const wxMouseEvent &event,
|
||||||
const wxRect &rect, const ViewInfo &viewInfo, WaveTrack *wt, int width)
|
const wxRect &rect, const ViewInfo &viewInfo, WaveTrack *wt, int width)
|
||||||
{
|
{
|
||||||
//Get out of here if we shouldn't be drawing right now:
|
|
||||||
//If we aren't displaying the waveform, Display a message dialog
|
|
||||||
const int display = wt->GetDisplay();
|
|
||||||
if (WaveTrackViewConstants::Waveform != display)
|
|
||||||
{
|
|
||||||
AudacityMessageBox(_(
|
|
||||||
"To use Draw, choose 'Waveform' or 'Waveform (dB)' in the Track Dropdown Menu."),
|
|
||||||
_("Draw Tool"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//If we aren't zoomed in far enough, show a message dialog.
|
//If we aren't zoomed in far enough, show a message dialog.
|
||||||
const double time = adjustTime(wt, viewInfo.PositionToTime(event.m_x, rect.x));
|
const double time = adjustTime(wt, viewInfo.PositionToTime(event.m_x, rect.x));
|
||||||
if (!SampleResolutionTest(viewInfo, wt, time, width))
|
if (!SampleResolutionTest(viewInfo, wt, time, width))
|
||||||
|
@ -15,6 +15,7 @@ Paul Licameli split from WaveTrackView.cpp
|
|||||||
|
|
||||||
#include "SpectrumVRulerControls.h"
|
#include "SpectrumVRulerControls.h"
|
||||||
#include "WaveTrackView.h"
|
#include "WaveTrackView.h"
|
||||||
|
#include "WaveTrackViewConstants.h"
|
||||||
|
|
||||||
#include "../../../../AColor.h"
|
#include "../../../../AColor.h"
|
||||||
#include "../../../../Prefs.h"
|
#include "../../../../Prefs.h"
|
||||||
@ -31,6 +32,11 @@ Paul Licameli split from WaveTrackView.cpp
|
|||||||
|
|
||||||
SpectrumView::~SpectrumView() = default;
|
SpectrumView::~SpectrumView() = default;
|
||||||
|
|
||||||
|
bool SpectrumView::IsSpectral() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<UIHandlePtr> SpectrumView::DetailedHitTest(
|
std::vector<UIHandlePtr> SpectrumView::DetailedHitTest(
|
||||||
const TrackPanelMouseState &state,
|
const TrackPanelMouseState &state,
|
||||||
const AudacityProject *pProject, int currentTool, bool bMultiTool )
|
const AudacityProject *pProject, int currentTool, bool bMultiTool )
|
||||||
|
@ -28,6 +28,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
|
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
|
||||||
|
|
||||||
|
bool IsSpectral() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// TrackPanelDrawable implementation
|
// TrackPanelDrawable implementation
|
||||||
|
@ -16,7 +16,7 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "../../ui/PlayableTrackButtonHandles.h"
|
#include "../../ui/PlayableTrackButtonHandles.h"
|
||||||
#include "WaveTrackSliderHandles.h"
|
#include "WaveTrackSliderHandles.h"
|
||||||
|
|
||||||
#include "../../../ui/TrackView.h"
|
#include "WaveTrackView.h"
|
||||||
#include "../../../../AudioIOBase.h"
|
#include "../../../../AudioIOBase.h"
|
||||||
#include "../../../../CellularPanel.h"
|
#include "../../../../CellularPanel.h"
|
||||||
#include "../../../../Menus.h"
|
#include "../../../../Menus.h"
|
||||||
@ -599,19 +599,23 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
|
|||||||
|
|
||||||
std::vector<int> checkedIds;
|
std::vector<int> checkedIds;
|
||||||
|
|
||||||
const int display = pTrack->GetDisplay();
|
const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
|
||||||
checkedIds.push_back(
|
for ( auto display : displays ) {
|
||||||
display == WaveTrackViewConstants::Waveform
|
checkedIds.push_back(
|
||||||
? (pTrack->GetWaveformSettings().isLinear()
|
display == WaveTrackViewConstants::Waveform
|
||||||
? OnWaveformID : OnWaveformDBID)
|
? (pTrack->GetWaveformSettings().isLinear()
|
||||||
: OnSpectrumID);
|
? OnWaveformID : OnWaveformDBID)
|
||||||
|
: OnSpectrumID);
|
||||||
|
}
|
||||||
|
|
||||||
// Bug 1253. Shouldn't open preferences if audio is busy.
|
// Bug 1253. Shouldn't open preferences if audio is busy.
|
||||||
// We can't change them on the fly yet anyway.
|
// We can't change them on the fly yet anyway.
|
||||||
auto gAudioIO = AudioIOBase::Get();
|
auto gAudioIO = AudioIOBase::Get();
|
||||||
const bool bAudioBusy = gAudioIO->IsBusy();
|
const bool bAudioBusy = gAudioIO->IsBusy();
|
||||||
pMenu->Enable(OnSpectrogramSettingsID,
|
bool hasSpectrum =
|
||||||
(display == WaveTrackViewConstants::Spectrum) && !bAudioBusy);
|
make_iterator_range( displays.begin(), displays.end() )
|
||||||
|
.contains( WaveTrackViewConstants::Spectrum );
|
||||||
|
pMenu->Enable(OnSpectrogramSettingsID, hasSpectrum && !bAudioBusy);
|
||||||
|
|
||||||
AudacityProject *const project = ::GetActiveProject();
|
AudacityProject *const project = ::GetActiveProject();
|
||||||
auto &tracks = TrackList::Get( *project );
|
auto &tracks = TrackList::Get( *project );
|
||||||
@ -683,9 +687,9 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
|
|||||||
BEGIN_POPUP_MENU(WaveTrackMenuTable)
|
BEGIN_POPUP_MENU(WaveTrackMenuTable)
|
||||||
POPUP_MENU_SEPARATOR()
|
POPUP_MENU_SEPARATOR()
|
||||||
|
|
||||||
POPUP_MENU_RADIO_ITEM(OnWaveformID, _("Wa&veform"), OnSetDisplay)
|
POPUP_MENU_CHECK_ITEM(OnWaveformID, _("Wa&veform"), OnSetDisplay)
|
||||||
POPUP_MENU_RADIO_ITEM(OnWaveformDBID, _("&Waveform (dB)"), OnSetDisplay)
|
POPUP_MENU_CHECK_ITEM(OnWaveformDBID, _("&Waveform (dB)"), OnSetDisplay)
|
||||||
POPUP_MENU_RADIO_ITEM(OnSpectrumID, _("&Spectrogram"), OnSetDisplay)
|
POPUP_MENU_CHECK_ITEM(OnSpectrumID, _("&Spectrogram"), OnSetDisplay)
|
||||||
POPUP_MENU_ITEM(OnSpectrogramSettingsID, _("S&pectrogram Settings..."), OnSpectrogramSettings)
|
POPUP_MENU_ITEM(OnSpectrogramSettingsID, _("S&pectrogram Settings..."), OnSpectrogramSettings)
|
||||||
POPUP_MENU_SEPARATOR()
|
POPUP_MENU_SEPARATOR()
|
||||||
|
|
||||||
@ -702,9 +706,15 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpTrack);
|
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpTrack);
|
||||||
if( pTrack && pTrack->GetDisplay() != WaveTrackViewConstants::Spectrum ){
|
if ( pTrack ) {
|
||||||
POPUP_MENU_SEPARATOR()
|
const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
|
||||||
POPUP_MENU_SUB_MENU(OnWaveColorID, _("&Wave Color"), WaveColorMenuTable)
|
bool hasWaveform =
|
||||||
|
make_iterator_range( displays.begin(), displays.end() )
|
||||||
|
.contains( WaveTrackViewConstants::Waveform );
|
||||||
|
if( hasWaveform ){
|
||||||
|
POPUP_MENU_SEPARATOR()
|
||||||
|
POPUP_MENU_SUB_MENU(OnWaveColorID, _("&Wave Color"), WaveColorMenuTable)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
POPUP_MENU_SEPARATOR()
|
POPUP_MENU_SEPARATOR()
|
||||||
@ -723,7 +733,7 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event)
|
|||||||
const auto pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
const auto pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||||
|
|
||||||
bool linear = false;
|
bool linear = false;
|
||||||
WaveTrack::WaveTrackDisplay id;
|
WaveTrackView::WaveTrackDisplay id;
|
||||||
switch (idInt) {
|
switch (idInt) {
|
||||||
default:
|
default:
|
||||||
case OnWaveformID:
|
case OnWaveformID:
|
||||||
@ -734,14 +744,16 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event)
|
|||||||
id = Spectrum; break;
|
id = Spectrum; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool wrongType = pTrack->GetDisplay() != id;
|
const auto displays = WaveTrackView::Get( *pTrack ).GetDisplays();
|
||||||
|
const bool wrongType = !(displays.size() == 1 && displays[0] == id);
|
||||||
const bool wrongScale =
|
const bool wrongScale =
|
||||||
(id == Waveform &&
|
(id == Waveform &&
|
||||||
pTrack->GetWaveformSettings().isLinear() != linear);
|
pTrack->GetWaveformSettings().isLinear() != linear);
|
||||||
if (wrongType || wrongScale) {
|
if (wrongType || wrongScale) {
|
||||||
for (auto channel : TrackList::Channels(pTrack)) {
|
for (auto channel : TrackList::Channels(pTrack)) {
|
||||||
channel->SetLastScaleType();
|
channel->SetLastScaleType();
|
||||||
channel->SetDisplay(WaveTrack::WaveTrackDisplay(id));
|
WaveTrackView::Get( *channel )
|
||||||
|
.SetDisplay(WaveTrackView::WaveTrackDisplay(id));
|
||||||
if (wrongScale)
|
if (wrongScale)
|
||||||
channel->GetIndependentWaveformSettings().scaleType = linear
|
channel->GetIndependentWaveformSettings().scaleType = linear
|
||||||
? WaveformSettings::stLinear
|
? WaveformSettings::stLinear
|
||||||
@ -876,8 +888,8 @@ void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
|||||||
|
|
||||||
// Set NEW track heights and minimized state
|
// Set NEW track heights and minimized state
|
||||||
auto
|
auto
|
||||||
&view = TrackView::Get( *pTrack ),
|
&view = WaveTrackView::Get( *pTrack ),
|
||||||
&partnerView = TrackView::Get( *partner );
|
&partnerView = WaveTrackView::Get( *partner );
|
||||||
view.SetMinimized(false);
|
view.SetMinimized(false);
|
||||||
partnerView.SetMinimized(false);
|
partnerView.SetMinimized(false);
|
||||||
int AverageHeight = (view.GetHeight() + partnerView.GetHeight()) / 2;
|
int AverageHeight = (view.GetHeight() + partnerView.GetHeight()) / 2;
|
||||||
@ -886,6 +898,8 @@ void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
|||||||
view.SetMinimized(bBothMinimizedp);
|
view.SetMinimized(bBothMinimizedp);
|
||||||
partnerView.SetMinimized(bBothMinimizedp);
|
partnerView.SetMinimized(bBothMinimizedp);
|
||||||
|
|
||||||
|
partnerView.RestorePlacements( view.SavePlacements() );
|
||||||
|
|
||||||
//On Demand - join the queues together.
|
//On Demand - join the queues together.
|
||||||
if (ODManager::IsInstanceCreated())
|
if (ODManager::IsInstanceCreated())
|
||||||
if (!ODManager::Instance()
|
if (!ODManager::Instance()
|
||||||
|
@ -22,19 +22,57 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "../../../../TrackPanelMouseEvent.h"
|
#include "../../../../TrackPanelMouseEvent.h"
|
||||||
#include "../../../../ViewInfo.h"
|
#include "../../../../ViewInfo.h"
|
||||||
#include "../../../../prefs/SpectrogramSettings.h"
|
#include "../../../../prefs/SpectrogramSettings.h"
|
||||||
|
#include "../../../../prefs/WaveformSettings.h"
|
||||||
|
#include "../../../../prefs/TracksPrefs.h"
|
||||||
|
|
||||||
#include "../../../ui/TimeShiftHandle.h"
|
#include "../../../ui/TimeShiftHandle.h"
|
||||||
|
|
||||||
|
WaveTrackView &WaveTrackView::Get( WaveTrack &track )
|
||||||
|
{
|
||||||
|
return static_cast< WaveTrackView& >( TrackView::Get( track ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
const WaveTrackView &WaveTrackView::Get( const WaveTrack &track )
|
||||||
|
{
|
||||||
|
return Get( const_cast<WaveTrack&>( track ) );
|
||||||
|
}
|
||||||
|
|
||||||
WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
|
WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
|
||||||
: CommonTrackView{ pTrack }
|
: CommonTrackView{ pTrack }
|
||||||
{
|
{
|
||||||
WaveTrackSubViews::BuildAll();
|
WaveTrackSubViews::BuildAll();
|
||||||
|
|
||||||
|
auto display = TracksPrefs::ViewModeChoice();
|
||||||
|
|
||||||
|
// Force creation always:
|
||||||
|
WaveformSettings &settings = static_cast< WaveTrack* >( pTrack.get() )
|
||||||
|
->GetIndependentWaveformSettings();
|
||||||
|
|
||||||
|
if (display == WaveTrackViewConstants::obsoleteWaveformDBDisplay) {
|
||||||
|
display = WaveTrackViewConstants::Waveform;
|
||||||
|
settings.scaleType = WaveformSettings::stLogarithmic;
|
||||||
|
}
|
||||||
|
|
||||||
|
mPlacements.resize( WaveTrackSubViews::size() );
|
||||||
|
|
||||||
|
SetDisplay( display );
|
||||||
}
|
}
|
||||||
|
|
||||||
WaveTrackView::~WaveTrackView()
|
WaveTrackView::~WaveTrackView()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WaveTrackView::CopyTo( Track &track ) const
|
||||||
|
{
|
||||||
|
TrackView::CopyTo( track );
|
||||||
|
auto &other = TrackView::Get( track );
|
||||||
|
|
||||||
|
if ( const auto pOther = dynamic_cast< WaveTrackView* >( &other ) ) {
|
||||||
|
// only one field is important to preserve in undo/redo history
|
||||||
|
pOther->RestorePlacements( SavePlacements() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<UIHandlePtr> WaveTrackView::DetailedHitTest
|
std::vector<UIHandlePtr> WaveTrackView::DetailedHitTest
|
||||||
(const TrackPanelMouseState &st,
|
(const TrackPanelMouseState &st,
|
||||||
const AudacityProject *pProject, int currentTool, bool bMultiTool)
|
const AudacityProject *pProject, int currentTool, bool bMultiTool)
|
||||||
@ -75,23 +113,72 @@ WaveTrackView::DoDetailedHitTest
|
|||||||
return { false, results };
|
return { false, results };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement
|
auto WaveTrackView::GetDisplays() const -> std::vector<WaveTrackDisplay>
|
||||||
{
|
{
|
||||||
auto wt = static_cast<WaveTrack*>( FindTrack().get() );
|
// Collect the display types of visible views and sort them by position
|
||||||
auto display = wt->GetDisplay();
|
using Pair = std::pair< int, WaveTrackDisplay >;
|
||||||
std::shared_ptr<TrackView> pSubView;
|
std::vector< Pair > pairs;
|
||||||
|
size_t ii = 0;
|
||||||
|
WaveTrackSubViews::ForEach( [&]( const WaveTrackSubView &subView ){
|
||||||
|
auto &placement = mPlacements[ii];
|
||||||
|
if ( placement.fraction > 0 )
|
||||||
|
pairs.emplace_back( placement.index, subView.SubViewType() );
|
||||||
|
++ii;
|
||||||
|
} );
|
||||||
|
std::sort( pairs.begin(), pairs.end() );
|
||||||
|
std::vector<WaveTrackDisplay> results;
|
||||||
|
for ( const auto &pair : pairs )
|
||||||
|
results.push_back( pair.second );
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaveTrackView::SetDisplay(WaveTrackDisplay display)
|
||||||
|
{
|
||||||
|
size_t ii = 0;
|
||||||
WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){
|
WaveTrackSubViews::ForEach( [&,display]( WaveTrackSubView &subView ){
|
||||||
if ( subView.SubViewType() == display )
|
if ( subView.SubViewType() == display )
|
||||||
pSubView = subView.shared_from_this();
|
mPlacements[ii] = { 0, 1.0 };
|
||||||
|
else
|
||||||
|
mPlacements[ii] = { -1, 0.0 };
|
||||||
|
++ii;
|
||||||
} );
|
} );
|
||||||
if ( !pSubView )
|
}
|
||||||
return {};
|
|
||||||
return {
|
auto WaveTrackView::GetSubViews( const wxRect &rect ) -> Refinement
|
||||||
{
|
{
|
||||||
rect.GetTop(),
|
// Collect the visible views
|
||||||
pSubView
|
using Pair = std::pair< float, std::shared_ptr< TrackView > >;
|
||||||
}
|
std::vector< Pair > pairs( mPlacements.size() );
|
||||||
};
|
size_t ii = 0;
|
||||||
|
float total = 0;
|
||||||
|
WaveTrackSubViews::ForEach( [&]( WaveTrackSubView &subView ){
|
||||||
|
const auto &placement = mPlacements[ii];
|
||||||
|
auto index = placement.index;
|
||||||
|
auto fraction = placement.fraction;
|
||||||
|
if ( index >= 0 && fraction > 0.0 )
|
||||||
|
total += fraction,
|
||||||
|
pairs[ index ] = { fraction, subView.shared_from_this() };
|
||||||
|
++ii;
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Remove views we don't need
|
||||||
|
auto begin = pairs.begin(), end = pairs.end(),
|
||||||
|
newEnd = std::remove_if( begin, end,
|
||||||
|
[]( const Pair &item ){ return !item.second; } );
|
||||||
|
pairs.erase( newEnd, end );
|
||||||
|
|
||||||
|
// Assign coordinates
|
||||||
|
Refinement results;
|
||||||
|
results.reserve( pairs.size() );
|
||||||
|
float partial = 0;
|
||||||
|
const auto top = rect.GetTop();
|
||||||
|
const auto height = rect.GetHeight();
|
||||||
|
for ( const auto &pair : pairs ) {
|
||||||
|
results.emplace_back( top + (partial / total) * height, pair.second );
|
||||||
|
partial += pair.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaveTrackView::DoSetMinimized( bool minimized )
|
void WaveTrackView::DoSetMinimized( bool minimized )
|
||||||
|
@ -24,6 +24,12 @@ public:
|
|||||||
virtual WaveTrackViewConstants::Display SubViewType() const = 0;
|
virtual WaveTrackViewConstants::Display SubViewType() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WaveTrackSubViewPlacement {
|
||||||
|
int index;
|
||||||
|
float fraction;
|
||||||
|
};
|
||||||
|
using WaveTrackSubViewPlacements = std::vector< WaveTrackSubViewPlacement >;
|
||||||
|
|
||||||
class WaveTrackView;
|
class WaveTrackView;
|
||||||
using WaveTrackSubViews = ClientData::Site<
|
using WaveTrackSubViews = ClientData::Site<
|
||||||
WaveTrackView, WaveTrackSubView, ClientData::SkipCopying, std::shared_ptr
|
WaveTrackView, WaveTrackSubView, ClientData::SkipCopying, std::shared_ptr
|
||||||
@ -37,10 +43,16 @@ class WaveTrackView final
|
|||||||
WaveTrackView &operator=( const WaveTrackView& ) = delete;
|
WaveTrackView &operator=( const WaveTrackView& ) = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static WaveTrackView &Get( WaveTrack &track );
|
||||||
|
static const WaveTrackView &Get( const WaveTrack &track );
|
||||||
|
|
||||||
explicit
|
explicit
|
||||||
WaveTrackView( const std::shared_ptr<Track> &pTrack );
|
WaveTrackView( const std::shared_ptr<Track> &pTrack );
|
||||||
~WaveTrackView() override;
|
~WaveTrackView() override;
|
||||||
|
|
||||||
|
// Preserve some view state too for undo/redo purposes
|
||||||
|
void CopyTo( Track &track ) const override;
|
||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
|
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
|
||||||
|
|
||||||
// CommonTrackView implementation
|
// CommonTrackView implementation
|
||||||
@ -55,6 +67,16 @@ public:
|
|||||||
const std::shared_ptr<WaveTrack> &wt,
|
const std::shared_ptr<WaveTrack> &wt,
|
||||||
CommonTrackView &view);
|
CommonTrackView &view);
|
||||||
|
|
||||||
|
using WaveTrackDisplay = WaveTrackViewConstants::Display;
|
||||||
|
|
||||||
|
std::vector<WaveTrackDisplay> GetDisplays() const;
|
||||||
|
void SetDisplay(WaveTrackDisplay display);
|
||||||
|
|
||||||
|
const WaveTrackSubViewPlacements &SavePlacements() const
|
||||||
|
{ return mPlacements; }
|
||||||
|
void RestorePlacements( const WaveTrackSubViewPlacements &placements )
|
||||||
|
{ mPlacements = placements; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// TrackPanelDrawable implementation
|
// TrackPanelDrawable implementation
|
||||||
void Draw(
|
void Draw(
|
||||||
@ -71,6 +93,8 @@ private:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void DoSetMinimized( bool minimized ) override;
|
void DoSetMinimized( bool minimized ) override;
|
||||||
|
|
||||||
|
WaveTrackSubViewPlacements mPlacements;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper for drawing routines
|
// Helper for drawing routines
|
||||||
|
@ -15,6 +15,7 @@ Paul Licameli split from WaveTrackView.cpp
|
|||||||
|
|
||||||
#include "WaveformVRulerControls.h"
|
#include "WaveformVRulerControls.h"
|
||||||
#include "WaveTrackView.h"
|
#include "WaveTrackView.h"
|
||||||
|
#include "WaveTrackViewConstants.h"
|
||||||
|
|
||||||
#include "CutlineHandle.h"
|
#include "CutlineHandle.h"
|
||||||
#include "SampleHandle.h"
|
#include "SampleHandle.h"
|
||||||
|
@ -73,7 +73,7 @@ std::vector<UIHandlePtr> CommonTrackView::HitTest
|
|||||||
// Finally, default of all is adjustment of the selection box.
|
// Finally, default of all is adjustment of the selection box.
|
||||||
if ( isMultiTool || currentTool == selectTool ) {
|
if ( isMultiTool || currentTool == selectTool ) {
|
||||||
result = SelectHandle::HitTest(
|
result = SelectHandle::HitTest(
|
||||||
mSelectHandle, st, pProject, FindTrack() );
|
mSelectHandle, st, pProject, shared_from_this() );
|
||||||
if (result)
|
if (result)
|
||||||
results.push_back(result);
|
results.push_back(result);
|
||||||
}
|
}
|
||||||
|
@ -98,12 +98,6 @@ UIHandlePtr EnvelopeHandle::WaveTrackHitTest
|
|||||||
if (!envelope)
|
if (!envelope)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const int displayType = wt->GetDisplay();
|
|
||||||
// Not an envelope hit, unless we're using a type of wavetrack display
|
|
||||||
// suitable for envelopes operations, ie one of the Wave displays.
|
|
||||||
if (displayType != WaveTrackViewConstants::Waveform)
|
|
||||||
return {}; // No envelope, not a hit, so return.
|
|
||||||
|
|
||||||
// Get envelope point, range 0.0 to 1.0
|
// Get envelope point, range 0.0 to 1.0
|
||||||
const bool dB = !wt->GetWaveformSettings().isLinear();
|
const bool dB = !wt->GetWaveformSettings().isLinear();
|
||||||
|
|
||||||
@ -188,9 +182,6 @@ UIHandle::Result EnvelopeHandle::Click
|
|||||||
if (pTrack)
|
if (pTrack)
|
||||||
result = pTrack->TypeSwitch< decltype(RefreshNone) >(
|
result = pTrack->TypeSwitch< decltype(RefreshNone) >(
|
||||||
[&](WaveTrack *wt) {
|
[&](WaveTrack *wt) {
|
||||||
if (wt->GetDisplay() != WaveTrackViewConstants::Waveform)
|
|
||||||
return Cancelled;
|
|
||||||
|
|
||||||
if (!mEnvelope)
|
if (!mEnvelope)
|
||||||
return Cancelled;
|
return Cancelled;
|
||||||
|
|
||||||
|
@ -128,13 +128,16 @@ namespace
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This returns true if we're a spectral editing track.
|
// This returns true if we're a spectral editing track.
|
||||||
inline bool isSpectralSelectionTrack(const Track *pTrack) {
|
inline bool isSpectralSelectionView(const TrackView *pTrackView) {
|
||||||
return pTrack && pTrack->TypeSwitch< bool >( [&](const WaveTrack *wt) {
|
return
|
||||||
const SpectrogramSettings &settings = wt->GetSpectrogramSettings();
|
pTrackView &&
|
||||||
const int display = wt->GetDisplay();
|
pTrackView->IsSpectral() &&
|
||||||
return (display == WaveTrackViewConstants::Spectrum) &&
|
pTrackView->FindTrack() &&
|
||||||
settings.SpectralSelectionEnabled();
|
pTrackView->FindTrack()->TypeSwitch< bool >(
|
||||||
});
|
[&](const WaveTrack *wt) {
|
||||||
|
const SpectrogramSettings &settings = wt->GetSpectrogramSettings();
|
||||||
|
return settings.SpectralSelectionEnabled();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SelectionBoundary {
|
enum SelectionBoundary {
|
||||||
@ -187,7 +190,7 @@ namespace
|
|||||||
|
|
||||||
SelectionBoundary ChooseBoundary
|
SelectionBoundary ChooseBoundary
|
||||||
(const ViewInfo &viewInfo,
|
(const ViewInfo &viewInfo,
|
||||||
wxCoord xx, wxCoord yy, const Track *pTrack, const wxRect &rect,
|
wxCoord xx, wxCoord yy, const TrackView *pTrackView, const wxRect &rect,
|
||||||
bool mayDragWidth, bool onlyWithinSnapDistance,
|
bool mayDragWidth, bool onlyWithinSnapDistance,
|
||||||
double *pPinValue = NULL)
|
double *pPinValue = NULL)
|
||||||
{
|
{
|
||||||
@ -220,9 +223,11 @@ namespace
|
|||||||
// within the time boundaries
|
// within the time boundaries
|
||||||
if (!viewInfo.selectedRegion.isPoint() &&
|
if (!viewInfo.selectedRegion.isPoint() &&
|
||||||
t0 <= selend && selend < t1 &&
|
t0 <= selend && selend < t1 &&
|
||||||
isSpectralSelectionTrack(pTrack)) {
|
isSpectralSelectionView(pTrackView)) {
|
||||||
// Spectral selection track is always wave
|
// Spectral selection track is always wave
|
||||||
const WaveTrack *const wt = static_cast<const WaveTrack*>(pTrack);
|
auto pTrack = pTrackView->FindTrack();
|
||||||
|
const WaveTrack *const wt =
|
||||||
|
static_cast<const WaveTrack*>(pTrack.get());
|
||||||
const wxInt64 bottomSel = (f0 >= 0)
|
const wxInt64 bottomSel = (f0 >= 0)
|
||||||
? FrequencyToPosition(wt, f0, rect.y, rect.height)
|
? FrequencyToPosition(wt, f0, rect.y, rect.height)
|
||||||
: rect.y + rect.height;
|
: rect.y + rect.height;
|
||||||
@ -374,7 +379,7 @@ namespace
|
|||||||
UIHandlePtr SelectHandle::HitTest
|
UIHandlePtr SelectHandle::HitTest
|
||||||
(std::weak_ptr<SelectHandle> &holder,
|
(std::weak_ptr<SelectHandle> &holder,
|
||||||
const TrackPanelMouseState &st, const AudacityProject *pProject,
|
const TrackPanelMouseState &st, const AudacityProject *pProject,
|
||||||
const std::shared_ptr<Track> &pTrack)
|
const std::shared_ptr<TrackView> &pTrackView)
|
||||||
{
|
{
|
||||||
// This handle is a little special because there may be some state to
|
// This handle is a little special because there may be some state to
|
||||||
// preserve during movement before the click.
|
// preserve during movement before the click.
|
||||||
@ -393,13 +398,14 @@ UIHandlePtr SelectHandle::HitTest
|
|||||||
|
|
||||||
const auto &viewInfo = ViewInfo::Get( *pProject );
|
const auto &viewInfo = ViewInfo::Get( *pProject );
|
||||||
auto result = std::make_shared<SelectHandle>(
|
auto result = std::make_shared<SelectHandle>(
|
||||||
pTrack, oldUseSnap, TrackList::Get( *pProject ), st, viewInfo );
|
pTrackView, oldUseSnap, TrackList::Get( *pProject ), st, viewInfo );
|
||||||
|
|
||||||
result = AssignUIHandlePtr(holder, result);
|
result = AssignUIHandlePtr(holder, result);
|
||||||
|
|
||||||
//Make sure we are within the selected track
|
//Make sure we are within the selected track
|
||||||
// Adjusting the selection edges can be turned off in
|
// Adjusting the selection edges can be turned off in
|
||||||
// the preferences...
|
// the preferences...
|
||||||
|
auto pTrack = pTrackView->FindTrack();
|
||||||
if (!pTrack->GetSelected() || !viewInfo.bAdjustSelectionEdges)
|
if (!pTrack->GetSelected() || !viewInfo.bAdjustSelectionEdges)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
@ -438,16 +444,17 @@ UIHandle::Result SelectHandle::NeedChangeHighlight
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelectHandle::SelectHandle
|
SelectHandle::SelectHandle
|
||||||
( const std::shared_ptr<Track> &pTrack, bool useSnap,
|
( const std::shared_ptr<TrackView> &pTrackView, bool useSnap,
|
||||||
const TrackList &trackList,
|
const TrackList &trackList,
|
||||||
const TrackPanelMouseState &st, const ViewInfo &viewInfo )
|
const TrackPanelMouseState &st, const ViewInfo &viewInfo )
|
||||||
: mpTrack{ pTrack }
|
: mpView{ pTrackView }
|
||||||
, mSnapManager{ std::make_shared<SnapManager>(&trackList, &viewInfo) }
|
, mSnapManager{ std::make_shared<SnapManager>(&trackList, &viewInfo) }
|
||||||
{
|
{
|
||||||
const wxMouseState &state = st.state;
|
const wxMouseState &state = st.state;
|
||||||
mRect = st.rect;
|
mRect = st.rect;
|
||||||
|
|
||||||
auto time = std::max(0.0, viewInfo.PositionToTime(state.m_x, mRect.x));
|
auto time = std::max(0.0, viewInfo.PositionToTime(state.m_x, mRect.x));
|
||||||
|
auto pTrack = pTrackView->FindTrack();
|
||||||
mSnapStart = mSnapManager->Snap(pTrack.get(), time, false);
|
mSnapStart = mSnapManager->Snap(pTrack.get(), time, false);
|
||||||
if (mSnapStart.snappedPoint)
|
if (mSnapStart.snappedPoint)
|
||||||
mSnapStart.outCoord += mRect.x;
|
mSnapStart.outCoord += mRect.x;
|
||||||
@ -531,8 +538,12 @@ UIHandle::Result SelectHandle::Click
|
|||||||
|
|
||||||
using namespace RefreshCode;
|
using namespace RefreshCode;
|
||||||
|
|
||||||
|
const auto pView = mpView.lock();
|
||||||
|
if ( !pView )
|
||||||
|
return Cancelled;
|
||||||
|
|
||||||
wxMouseEvent &event = evt.event;
|
wxMouseEvent &event = evt.event;
|
||||||
const auto sTrack = TrackList::Get( *pProject ).Lock(mpTrack);
|
const auto sTrack = TrackList::Get( *pProject ).Lock( FindTrack() );
|
||||||
const auto pTrack = sTrack.get();
|
const auto pTrack = sTrack.get();
|
||||||
auto &trackPanel = TrackPanel::Get( *pProject );
|
auto &trackPanel = TrackPanel::Get( *pProject );
|
||||||
auto &viewInfo = ViewInfo::Get( *pProject );
|
auto &viewInfo = ViewInfo::Get( *pProject );
|
||||||
@ -620,7 +631,8 @@ UIHandle::Result SelectHandle::Click
|
|||||||
double value;
|
double value;
|
||||||
// Shift-click, choose closest boundary
|
// Shift-click, choose closest boundary
|
||||||
SelectionBoundary boundary =
|
SelectionBoundary boundary =
|
||||||
ChooseBoundary(viewInfo, xx, event.m_y, pTrack, mRect, false, false, &value);
|
ChooseBoundary(viewInfo, xx, event.m_y,
|
||||||
|
pView.get(), mRect, false, false, &value);
|
||||||
mSelectionBoundary = boundary;
|
mSelectionBoundary = boundary;
|
||||||
switch (boundary) {
|
switch (boundary) {
|
||||||
case SBLeft:
|
case SBLeft:
|
||||||
@ -686,7 +698,7 @@ UIHandle::Result SelectHandle::Click
|
|||||||
if (viewInfo.bAdjustSelectionEdges) {
|
if (viewInfo.bAdjustSelectionEdges) {
|
||||||
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
||||||
if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER &&
|
if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER &&
|
||||||
isSpectralSelectionTrack(pTrack)) {
|
isSpectralSelectionView(pView.get())) {
|
||||||
// This code is no longer reachable, but it had a place in the
|
// This code is no longer reachable, but it had a place in the
|
||||||
// spectral selection prototype. It used to be that you could be
|
// spectral selection prototype. It used to be that you could be
|
||||||
// in a center-frequency-snapping mode that was not a mouse drag
|
// in a center-frequency-snapping mode that was not a mouse drag
|
||||||
@ -714,7 +726,8 @@ UIHandle::Result SelectHandle::Click
|
|||||||
// Not shift-down, choose boundary only within snapping
|
// Not shift-down, choose boundary only within snapping
|
||||||
double value;
|
double value;
|
||||||
SelectionBoundary boundary =
|
SelectionBoundary boundary =
|
||||||
ChooseBoundary(viewInfo, xx, event.m_y, pTrack, mRect, true, true, &value);
|
ChooseBoundary(viewInfo, xx, event.m_y,
|
||||||
|
pView.get(), mRect, true, true, &value);
|
||||||
mSelectionBoundary = boundary;
|
mSelectionBoundary = boundary;
|
||||||
switch (boundary) {
|
switch (boundary) {
|
||||||
case SBNone:
|
case SBNone:
|
||||||
@ -766,7 +779,8 @@ UIHandle::Result SelectHandle::Click
|
|||||||
// If we didn't move a selection boundary, start a NEW selection
|
// If we didn't move a selection boundary, start a NEW selection
|
||||||
selectionState.SelectNone( trackList );
|
selectionState.SelectNone( trackList );
|
||||||
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
||||||
StartFreqSelection (viewInfo, event.m_y, mRect.y, mRect.height, pTrack);
|
StartFreqSelection (viewInfo, event.m_y, mRect.y, mRect.height,
|
||||||
|
pView.get());
|
||||||
#endif
|
#endif
|
||||||
StartSelection(pProject);
|
StartSelection(pProject);
|
||||||
selectionState.SelectTrack( *pTrack, true, true );
|
selectionState.SelectTrack( *pTrack, true, true );
|
||||||
@ -791,6 +805,10 @@ UIHandle::Result SelectHandle::Drag
|
|||||||
{
|
{
|
||||||
using namespace RefreshCode;
|
using namespace RefreshCode;
|
||||||
|
|
||||||
|
const auto pView = mpView.lock();
|
||||||
|
if ( !pView )
|
||||||
|
return Cancelled;
|
||||||
|
|
||||||
auto &viewInfo = ViewInfo::Get( *pProject );
|
auto &viewInfo = ViewInfo::Get( *pProject );
|
||||||
const wxMouseEvent &event = evt.event;
|
const wxMouseEvent &event = evt.event;
|
||||||
|
|
||||||
@ -814,7 +832,7 @@ UIHandle::Result SelectHandle::Drag
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Also fuhggeddaboudit if not in a track.
|
// Also fuhggeddaboudit if not in a track.
|
||||||
auto pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
|
auto pTrack = TrackList::Get( *pProject ).Lock( FindTrack() );
|
||||||
if (!pTrack)
|
if (!pTrack)
|
||||||
return RefreshNone;
|
return RefreshNone;
|
||||||
|
|
||||||
@ -850,7 +868,7 @@ UIHandle::Result SelectHandle::Drag
|
|||||||
if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER &&
|
if (mFreqSelMode == FREQ_SEL_SNAPPING_CENTER &&
|
||||||
!viewInfo.selectedRegion.isPoint())
|
!viewInfo.selectedRegion.isPoint())
|
||||||
MoveSnappingFreqSelection
|
MoveSnappingFreqSelection
|
||||||
(pProject, viewInfo, y, mRect.y, mRect.height, pTrack.get());
|
(pProject, viewInfo, y, mRect.y, mRect.height, pView.get());
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if ( TrackList::Get( *pProject ).Lock(mFreqSelTrack) == pTrack )
|
if ( TrackList::Get( *pProject ).Lock(mFreqSelTrack) == pTrack )
|
||||||
@ -883,7 +901,11 @@ HitTestPreview SelectHandle::Preview
|
|||||||
// Moved out of snapping; revert to un-escaped state
|
// Moved out of snapping; revert to un-escaped state
|
||||||
mUseSnap = true;
|
mUseSnap = true;
|
||||||
|
|
||||||
auto pTrack = mpTrack.lock();
|
const auto pView = mpView.lock();
|
||||||
|
if ( !pView )
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto pTrack = FindTrack().lock();
|
||||||
if (!pTrack)
|
if (!pTrack)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
@ -937,7 +959,8 @@ HitTestPreview SelectHandle::Preview
|
|||||||
// choose boundaries only in snapping tolerance,
|
// choose boundaries only in snapping tolerance,
|
||||||
// and may choose center.
|
// and may choose center.
|
||||||
SelectionBoundary boundary =
|
SelectionBoundary boundary =
|
||||||
ChooseBoundary(viewInfo, xx, state.m_y, pTrack.get(), rect, !bModifierDown, !bModifierDown);
|
ChooseBoundary(viewInfo, xx, state.m_y,
|
||||||
|
pView.get(), rect, !bModifierDown, !bModifierDown);
|
||||||
|
|
||||||
SetTipAndCursorForBoundary(boundary, !bShiftDown, tip, pCursor);
|
SetTipAndCursorForBoundary(boundary, !bShiftDown, tip, pCursor);
|
||||||
}
|
}
|
||||||
@ -949,7 +972,7 @@ HitTestPreview SelectHandle::Preview
|
|||||||
// and drag width.
|
// and drag width.
|
||||||
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
#ifdef EXPERIMENTAL_SPECTRAL_EDITING
|
||||||
if ((mFreqSelMode == FREQ_SEL_SNAPPING_CENTER) &&
|
if ((mFreqSelMode == FREQ_SEL_SNAPPING_CENTER) &&
|
||||||
isSpectralSelectionTrack(pTrack)) {
|
isSpectralSelectionView(pView)) {
|
||||||
// Not shift-down, but center frequency snapping toggle is on
|
// Not shift-down, but center frequency snapping toggle is on
|
||||||
tip = _("Click and drag to set frequency bandwidth.");
|
tip = _("Click and drag to set frequency bandwidth.");
|
||||||
pCursor = &*envelopeCursor;
|
pCursor = &*envelopeCursor;
|
||||||
@ -966,7 +989,8 @@ HitTestPreview SelectHandle::Preview
|
|||||||
const bool bCtrlDown = state.ControlDown();
|
const bool bCtrlDown = state.ControlDown();
|
||||||
const bool bModifierDown = bShiftDown || bCtrlDown;
|
const bool bModifierDown = bShiftDown || bCtrlDown;
|
||||||
SelectionBoundary boundary = ChooseBoundary(
|
SelectionBoundary boundary = ChooseBoundary(
|
||||||
viewInfo, xx, state.m_y, pTrack.get(), rect, !bModifierDown, !bModifierDown);
|
viewInfo, xx, state.m_y,
|
||||||
|
pView.get(), rect, !bModifierDown, !bModifierDown);
|
||||||
SetTipAndCursorForBoundary(boundary, !bShiftDown, tip, pCursor);
|
SetTipAndCursorForBoundary(boundary, !bShiftDown, tip, pCursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1034,6 +1058,15 @@ wxRect SelectHandle::DrawingArea(
|
|||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::weak_ptr<Track> SelectHandle::FindTrack()
|
||||||
|
{
|
||||||
|
auto pView = mpView.lock();
|
||||||
|
if (!pView)
|
||||||
|
return {};
|
||||||
|
else
|
||||||
|
return pView->FindTrack();
|
||||||
|
}
|
||||||
|
|
||||||
void SelectHandle::Connect(AudacityProject *pProject)
|
void SelectHandle::Connect(AudacityProject *pProject)
|
||||||
{
|
{
|
||||||
mTimerHandler = std::make_shared<TimerHandler>( this, pProject );
|
mTimerHandler = std::make_shared<TimerHandler>( this, pProject );
|
||||||
@ -1113,7 +1146,7 @@ void SelectHandle::TimerHandler::OnTimer(wxCommandEvent &event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pTrack = mParent->mpTrack.lock(); // TrackList::Lock() ?
|
auto pTrack = mParent->FindTrack().lock(); // TrackList::Lock() ?
|
||||||
if (mParent->mAutoScrolling && pTrack) {
|
if (mParent->mAutoScrolling && pTrack) {
|
||||||
// AS: To keep the selection working properly as we scroll,
|
// AS: To keep the selection working properly as we scroll,
|
||||||
// we fake a mouse event (remember, this method is called
|
// we fake a mouse event (remember, this method is called
|
||||||
@ -1164,7 +1197,7 @@ void SelectHandle::AdjustSelection
|
|||||||
|
|
||||||
auto pTrack = Track::SharedPointer( track );
|
auto pTrack = Track::SharedPointer( track );
|
||||||
if (!pTrack)
|
if (!pTrack)
|
||||||
pTrack = TrackList::Get( *pProject ).Lock(mpTrack);
|
pTrack = TrackList::Get( *pProject ).Lock( FindTrack() );
|
||||||
|
|
||||||
if (pTrack && mSnapManager.get()) {
|
if (pTrack && mSnapManager.get()) {
|
||||||
bool rightEdge = (selend > mSelStart);
|
bool rightEdge = (selend > mSelStart);
|
||||||
@ -1216,15 +1249,15 @@ void SelectHandle::AssignSelection
|
|||||||
|
|
||||||
void SelectHandle::StartFreqSelection(ViewInfo &viewInfo,
|
void SelectHandle::StartFreqSelection(ViewInfo &viewInfo,
|
||||||
int mouseYCoordinate, int trackTopEdge,
|
int mouseYCoordinate, int trackTopEdge,
|
||||||
int trackHeight, Track *pTrack)
|
int trackHeight, TrackView *pTrackView)
|
||||||
{
|
{
|
||||||
mFreqSelTrack.reset();
|
mFreqSelTrack.reset();
|
||||||
mFreqSelMode = FREQ_SEL_INVALID;
|
mFreqSelMode = FREQ_SEL_INVALID;
|
||||||
mFreqSelPin = SelectedRegion::UndefinedFrequency;
|
mFreqSelPin = SelectedRegion::UndefinedFrequency;
|
||||||
|
|
||||||
if (isSpectralSelectionTrack(pTrack)) {
|
if (isSpectralSelectionView(pTrackView)) {
|
||||||
// Spectral selection track is always wave
|
// Spectral selection track is always wave
|
||||||
auto shTrack = pTrack->SharedPointer<const WaveTrack>();
|
auto shTrack = pTrackView->FindTrack()->SharedPointer<const WaveTrack>();
|
||||||
mFreqSelTrack = shTrack;
|
mFreqSelTrack = shTrack;
|
||||||
mFreqSelMode = FREQ_SEL_FREE;
|
mFreqSelMode = FREQ_SEL_FREE;
|
||||||
mFreqSelPin =
|
mFreqSelPin =
|
||||||
@ -1386,11 +1419,12 @@ void SelectHandle::StartSnappingFreqSelection
|
|||||||
void SelectHandle::MoveSnappingFreqSelection
|
void SelectHandle::MoveSnappingFreqSelection
|
||||||
(AudacityProject *pProject, ViewInfo &viewInfo, int mouseYCoordinate,
|
(AudacityProject *pProject, ViewInfo &viewInfo, int mouseYCoordinate,
|
||||||
int trackTopEdge,
|
int trackTopEdge,
|
||||||
int trackHeight, Track *pTrack)
|
int trackHeight, TrackView *pTrackView)
|
||||||
{
|
{
|
||||||
|
auto pTrack = pTrackView->FindTrack().get();
|
||||||
if (pTrack &&
|
if (pTrack &&
|
||||||
pTrack->GetSelected() &&
|
pTrack->GetSelected() &&
|
||||||
isSpectralSelectionTrack(pTrack)) {
|
isSpectralSelectionView(pTrackView)) {
|
||||||
// Spectral selection track is always wave
|
// Spectral selection track is always wave
|
||||||
WaveTrack *const wt = static_cast<WaveTrack*>(pTrack);
|
WaveTrack *const wt = static_cast<WaveTrack*>(pTrack);
|
||||||
// PRL:
|
// PRL:
|
||||||
|
@ -21,6 +21,7 @@ class SelectionStateChanger;
|
|||||||
class SnapManager;
|
class SnapManager;
|
||||||
class SpectrumAnalyst;
|
class SpectrumAnalyst;
|
||||||
class Track;
|
class Track;
|
||||||
|
class TrackView;
|
||||||
class TrackList;
|
class TrackList;
|
||||||
class ViewInfo;
|
class ViewInfo;
|
||||||
class WaveTrack;
|
class WaveTrack;
|
||||||
@ -32,7 +33,7 @@ class SelectHandle : public UIHandle
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SelectHandle
|
explicit SelectHandle
|
||||||
(const std::shared_ptr<Track> &pTrack, bool useSnap,
|
(const std::shared_ptr<TrackView> &pTrackView, bool useSnap,
|
||||||
const TrackList &trackList,
|
const TrackList &trackList,
|
||||||
const TrackPanelMouseState &st, const ViewInfo &viewInfo);
|
const TrackPanelMouseState &st, const ViewInfo &viewInfo);
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ public:
|
|||||||
static UIHandlePtr HitTest
|
static UIHandlePtr HitTest
|
||||||
(std::weak_ptr<SelectHandle> &holder,
|
(std::weak_ptr<SelectHandle> &holder,
|
||||||
const TrackPanelMouseState &state, const AudacityProject *pProject,
|
const TrackPanelMouseState &state, const AudacityProject *pProject,
|
||||||
const std::shared_ptr<Track> &pTrack);
|
const std::shared_ptr<TrackView> &pTrackView);
|
||||||
|
|
||||||
SelectHandle &operator=(const SelectHandle&) = default;
|
SelectHandle &operator=(const SelectHandle&) = default;
|
||||||
|
|
||||||
@ -78,6 +79,8 @@ public:
|
|||||||
const SelectHandle &newState);
|
const SelectHandle &newState);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::weak_ptr<Track> FindTrack();
|
||||||
|
|
||||||
void Connect(AudacityProject *pProject);
|
void Connect(AudacityProject *pProject);
|
||||||
|
|
||||||
void StartSelection(AudacityProject *pProject);
|
void StartSelection(AudacityProject *pProject);
|
||||||
@ -89,7 +92,7 @@ private:
|
|||||||
|
|
||||||
void StartFreqSelection
|
void StartFreqSelection
|
||||||
(ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
|
(ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
|
||||||
int trackHeight, Track *pTrack);
|
int trackHeight, TrackView *pTrackView);
|
||||||
void AdjustFreqSelection
|
void AdjustFreqSelection
|
||||||
(const WaveTrack *wt,
|
(const WaveTrack *wt,
|
||||||
ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
|
ViewInfo &viewInfo, int mouseYCoordinate, int trackTopEdge,
|
||||||
@ -104,7 +107,7 @@ private:
|
|||||||
void MoveSnappingFreqSelection
|
void MoveSnappingFreqSelection
|
||||||
(AudacityProject *pProject, ViewInfo &viewInfo, int mouseYCoordinate,
|
(AudacityProject *pProject, ViewInfo &viewInfo, int mouseYCoordinate,
|
||||||
int trackTopEdge,
|
int trackTopEdge,
|
||||||
int trackHeight, Track *pTrack);
|
int trackHeight, TrackView *pTrackView);
|
||||||
public:
|
public:
|
||||||
// This is needed to implement a command assignable to keystrokes
|
// This is needed to implement a command assignable to keystrokes
|
||||||
static void SnapCenterOnce
|
static void SnapCenterOnce
|
||||||
@ -124,7 +127,7 @@ private:
|
|||||||
// (const ViewInfo &viewInfo, double hintFrequency, bool logF);
|
// (const ViewInfo &viewInfo, double hintFrequency, bool logF);
|
||||||
|
|
||||||
|
|
||||||
std::weak_ptr<Track> mpTrack;
|
std::weak_ptr<TrackView> mpView;
|
||||||
wxRect mRect{};
|
wxRect mRect{};
|
||||||
SelectedRegion mInitialSelection{};
|
SelectedRegion mInitialSelection{};
|
||||||
|
|
||||||
|
@ -114,6 +114,11 @@ auto TrackView::GetSubViews( const wxRect &rect ) -> Refinement
|
|||||||
return { { rect.GetTop(), shared_from_this() } };
|
return { { rect.GetTop(), shared_from_this() } };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TrackView::IsSpectral() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void TrackView::DoSetMinimized(bool isMinimized)
|
void TrackView::DoSetMinimized(bool isMinimized)
|
||||||
{
|
{
|
||||||
mMinimized = isMinimized;
|
mMinimized = isMinimized;
|
||||||
|
@ -73,6 +73,9 @@ public:
|
|||||||
> >;
|
> >;
|
||||||
virtual Refinement GetSubViews( const wxRect &rect );
|
virtual Refinement GetSubViews( const wxRect &rect );
|
||||||
|
|
||||||
|
// default is false
|
||||||
|
virtual bool IsSpectral() const;
|
||||||
|
|
||||||
virtual void DoSetMinimized( bool isMinimized );
|
virtual void DoSetMinimized( bool isMinimized );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user