diff --git a/src/Menus.cpp b/src/Menus.cpp index a6244ad0d..8b643b865 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -4298,6 +4298,7 @@ bool AudacityProject::OnEffect(const PluginID & ID, int flags) wxGetApp().SetMissingAliasedFileWarningShouldShow(true); + int nTracksOriginally = GetTrackCount(); TrackListIterator iter(GetTracks()); Track *t = iter.First(); WaveTrack *newTrack{}; @@ -4389,9 +4390,18 @@ bool AudacityProject::OnEffect(const PluginID & ID, int flags) if (focus != nullptr) { focus->SetFocus(); } - mTrackPanel->EnsureVisible(mTrackPanel->GetFirstSelectedTrack()); - mTrackPanel->Refresh(false); + // A fix for Bug 63 + // New tracks added? Scroll them into view so that user sees them. + // Don't care what track type. An analyser might just have added a + // Label track and we want to see it. + if( GetTrackCount() > nTracksOriginally ){ + // 0.0 is min scroll position, 1.0 is max scroll position. + GetTrackPanel()->VerticalScroll( 1.0 ); + } else { + mTrackPanel->EnsureVisible(mTrackPanel->GetFirstSelectedTrack()); + mTrackPanel->Refresh(false); + } return true; } diff --git a/src/Project.h b/src/Project.h index 3683bb928..cecd9227e 100644 --- a/src/Project.h +++ b/src/Project.h @@ -176,6 +176,7 @@ class AUDACITY_DLL_API AudacityProject final : public wxFrame, TrackList *GetTracks() { return mTracks.get(); } const TrackList *GetTracks() const { return mTracks.get(); } + const int GetTrackCount(){ return GetTracks()->GetCount(); } UndoManager *GetUndoManager() { return mUndoManager.get(); } sampleFormat GetDefaultFormat() { return mDefaultFormat; } diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 3c97027fe..0c62bfa65 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2749,6 +2749,50 @@ void TrackPanel::EnsureVisible(Track * t) Refresh(false); } +// 0.0 scrolls to top +// 1.0 scrolls to bottom. +void TrackPanel::VerticalScroll( float fracPosition){ + TrackListIterator iter(GetTracks()); + Track *it = NULL; + Track *nt = NULL; + + // Compute trackHeight + int trackTop = 0; + int trackHeight =0; + + for (it = iter.First(); it; it = iter.Next()) { + trackTop += trackHeight; + trackHeight = it->GetHeight(); + + //find the second track if this is stereo + if (it->GetLinked()) { + nt = iter.Next(); + trackHeight += nt->GetHeight(); + } +#ifdef EXPERIMENTAL_OUTPUT_DISPLAY + else if(MONO_WAVE_PAN(it)){ + trackHeight += it->GetHeight(true); + } +#endif + else { + nt = it; + } + } + + int delta; + + //Get the size of the trackpanel. + int width, height; + GetSize(&width, &height); + + delta = (fracPosition * (trackTop + trackHeight - height)) - mViewInfo->vpos + mViewInfo->scrollStep; + //wxLogDebug( "Scroll down by %i pixels", delta ); + delta /= mViewInfo->scrollStep; + mListener->TP_ScrollUpDown(delta); + Refresh(false); +} + + // Given rectangle excludes the insets left, right, and top // Draw a rectangular border and also a vertical separator of track controls // from the rest (ruler and proper track area) diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 7eab87961..638823116 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -332,6 +332,7 @@ class AUDACITY_DLL_API TrackPanel final : public OverlayPanel { bool IsMouseCaptured(); void EnsureVisible(Track * t); + void VerticalScroll( float fracPosition); Track *GetFocusedTrack(); void SetFocusedTrack(Track *t);