diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index 837bf717c..2ebf4d666 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -49,6 +49,7 @@ for drawing different aspects of the label and its text box. wxDEFINE_EVENT(EVT_LABELTRACK_ADDITION, LabelTrackEvent); wxDEFINE_EVENT(EVT_LABELTRACK_DELETION, LabelTrackEvent); wxDEFINE_EVENT(EVT_LABELTRACK_PERMUTED, LabelTrackEvent); +wxDEFINE_EVENT(EVT_LABELTRACK_SELECTION, LabelTrackEvent); static ProjectFileIORegistry::Entry registerFactory{ wxT( "labeltrack" ), @@ -249,6 +250,18 @@ LabelStruct::LabelStruct(const SelectedRegion ®ion, y = 0; } +void LabelTrack::SetSelected( bool s ) +{ + bool selected = GetSelected(); + Track::SetSelected( s ); + if ( selected != GetSelected() ) { + LabelTrackEvent evt{ + EVT_LABELTRACK_SELECTION, SharedPointer(), {}, -1, -1 + }; + ProcessEvent( evt ); + } +} + double LabelTrack::GetOffset() const { return mOffset; diff --git a/src/LabelTrack.h b/src/LabelTrack.h index b1a037017..c4b99940f 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -97,6 +97,8 @@ class AUDACITY_DLL_API LabelTrack final void SetOffset(double dOffset) override; + void SetSelected(bool s) override; + double GetOffset() const override; double GetStartTime() const override; double GetEndTime() const override; @@ -192,12 +194,13 @@ struct LabelTrackEvent : TrackListEvent // wxWidgets will own the event object return safenew LabelTrackEvent(*this); } + // invalid for selection events wxString mTitle; - // invalid for addition event + // invalid for addition and selection events int mFormerPosition{ -1 }; - // invalid for deletion event + // invalid for deletion and selection events int mPresentPosition{ -1 }; }; @@ -212,4 +215,8 @@ wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API, // Posted when a label is repositioned in the sequence of labels. wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API, EVT_LABELTRACK_PERMUTED, LabelTrackEvent); + +// Posted when the track is selected or unselected. +wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API, + EVT_LABELTRACK_SELECTION, LabelTrackEvent); #endif diff --git a/src/Track.h b/src/Track.h index 6227d33c9..ecff6f58b 100644 --- a/src/Track.h +++ b/src/Track.h @@ -341,7 +341,7 @@ private: bool GetSelected() const { return mSelected; } - void SetSelected(bool s); + virtual void SetSelected(bool s); // The argument tells whether the last undo history state should be // updated for the appearance change diff --git a/src/tracks/labeltrack/ui/LabelTrackView.cpp b/src/tracks/labeltrack/ui/LabelTrackView.cpp index b089d5a18..2e76f4ff5 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackView.cpp @@ -78,6 +78,8 @@ void LabelTrackView::BindTo( LabelTrack *pParent ) EVT_LABELTRACK_DELETION, &LabelTrackView::OnLabelDeleted, this ); pParent->Bind( EVT_LABELTRACK_PERMUTED, &LabelTrackView::OnLabelPermuted, this ); + pParent->Bind( + EVT_LABELTRACK_SELECTION, &LabelTrackView::OnSelectionChange, this ); } void LabelTrackView::UnbindFrom( LabelTrack *pParent ) @@ -1912,6 +1914,16 @@ void LabelTrackView::OnLabelPermuted( LabelTrackEvent &e ) ++ mSelIndex; } +void LabelTrackView::OnSelectionChange( LabelTrackEvent &e ) +{ + e.Skip(); + if ( e.mpTrack.lock() != FindTrack() ) + return; + + if ( !FindTrack()->GetSelected() ) + mSelIndex = -1; +} + wxBitmap & LabelTrackView::GetGlyph( int i) { return theTheme.Bitmap( i + bmpLabelGlyph0); diff --git a/src/tracks/labeltrack/ui/LabelTrackView.h b/src/tracks/labeltrack/ui/LabelTrackView.h index 75c90217d..29420fad7 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.h +++ b/src/tracks/labeltrack/ui/LabelTrackView.h @@ -222,6 +222,7 @@ private: void OnLabelAdded( LabelTrackEvent& ); void OnLabelDeleted( LabelTrackEvent& ); void OnLabelPermuted( LabelTrackEvent& ); + void OnSelectionChange( LabelTrackEvent& ); std::shared_ptr FindLabelTrack(); std::shared_ptr FindLabelTrack() const;