From f10b3032793e2bc88e1f531511b1a821750244d0 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 17 Jan 2020 14:04:15 -0500 Subject: [PATCH] A close box button for sub-views --- src/TrackInfo.cpp | 60 ++++++++------ src/TrackInfo.h | 5 ++ .../wavetrack/ui/WaveTrackView.cpp | 80 +++++++++++++++++++ .../wavetrack/ui/WaveTrackView.h | 1 + 4 files changed, 120 insertions(+), 26 deletions(-) diff --git a/src/TrackInfo.cpp b/src/TrackInfo.cpp index 4929d25ec..51fe11a2d 100644 --- a/src/TrackInfo.cpp +++ b/src/TrackInfo.cpp @@ -263,6 +263,39 @@ void TrackInfo::DrawItems } #include "tracks/ui/TrackButtonHandles.h" +void TrackInfo::DrawCloseButton( + TrackPanelDrawingContext &context, const wxRect &bev, + const Track *pTrack, ButtonHandle *target ) +{ + auto dc = &context.dc; + bool selected = pTrack ? pTrack->GetSelected() : true; + bool hit = target && target->GetTrack().get() == pTrack; + bool captured = hit && target->IsClicked(); + bool down = captured && bev.Contains( context.lastState.GetPosition()); + AColor::Bevel2(*dc, !down, bev, selected, hit ); + +#ifdef EXPERIMENTAL_THEMING + wxPen pen( theTheme.Colour( clrTrackPanelText )); + dc->SetPen( pen ); +#else + dc->SetPen(*wxBLACK_PEN); +#endif + bev.Inflate( -1, -1 ); + // Draw the "X" + const int s = 6; + + int ls = bev.x + ((bev.width - s) / 2); + int ts = bev.y + ((bev.height - s) / 2); + int rs = ls + s; + int bs = ts + s; + + AColor::Line(*dc, ls, ts, rs, bs); + AColor::Line(*dc, ls + 1, ts, rs + 1, bs); + AColor::Line(*dc, rs, ts, ls, bs); + AColor::Line(*dc, rs + 1, ts, ls + 1, bs); + // bev.Inflate(-1, -1); +} + void TrackInfo::CloseTitleDrawFunction ( TrackPanelDrawingContext &context, const wxRect &rect, const Track *pTrack ) @@ -273,32 +306,7 @@ void TrackInfo::CloseTitleDrawFunction wxRect bev = rect; GetCloseBoxHorizontalBounds( rect, bev ); auto target = dynamic_cast( context.target.get() ); - bool hit = target && target->GetTrack().get() == pTrack; - bool captured = hit && target->IsClicked(); - bool down = captured && bev.Contains( context.lastState.GetPosition()); - AColor::Bevel2(*dc, !down, bev, selected, hit ); - -#ifdef EXPERIMENTAL_THEMING - wxPen pen( theTheme.Colour( clrTrackPanelText )); - dc->SetPen( pen ); -#else - dc->SetPen(*wxBLACK_PEN); -#endif - bev.Inflate( -1, -1 ); - // Draw the "X" - const int s = 6; - - int ls = bev.x + ((bev.width - s) / 2); - int ts = bev.y + ((bev.height - s) / 2); - int rs = ls + s; - int bs = ts + s; - - AColor::Line(*dc, ls, ts, rs, bs); - AColor::Line(*dc, ls + 1, ts, rs + 1, bs); - AColor::Line(*dc, rs, ts, ls, bs); - AColor::Line(*dc, rs + 1, ts, ls + 1, bs); - - // bev.Inflate(-1, -1); + DrawCloseButton( context, bev, pTrack, target ); } { diff --git a/src/TrackInfo.h b/src/TrackInfo.h index 1aa58c33e..ff6fcdf92 100644 --- a/src/TrackInfo.h +++ b/src/TrackInfo.h @@ -22,6 +22,7 @@ class wxRect; class wxString; class wxWindow; +class ButtonHandle; class LWSlider; class NoteTrack; class Track; @@ -81,6 +82,10 @@ namespace TrackInfo const std::vector &topLines, const std::vector &bottomLines ); + void DrawCloseButton( + TrackPanelDrawingContext &context, const wxRect &bev, + const Track *pTrack, ButtonHandle *target ); + void CloseTitleDrawFunction ( TrackPanelDrawingContext &context, const wxRect &rect, const Track *pTrack ); diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index 2f92ceac4..2f5c17a59 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -37,6 +37,8 @@ Paul Licameli split from TrackPanel.cpp #include "../../../../prefs/TracksPrefs.h" #include "../../../ui/TimeShiftHandle.h" +#include "../../../ui/ButtonHandle.h" +#include "../../../../TrackInfo.h" namespace { @@ -603,6 +605,80 @@ private: wxCoord mViewHeight{}; // Total height of all sub-views }; +class SubViewCloseHandle : public ButtonHandle +{ + static wxRect GetButtonRect( const wxRect &rect ) + { + return { + rect.GetLeft(), + rect.GetTop(), + kTrackInfoBtnSize, + kTrackInfoBtnSize + }; + } + +public: + static UIHandlePtr HitTest( std::weak_ptr &holder, + WaveTrackView &view, WaveTrackSubView &subView, + const TrackPanelMouseState &state ) + { + SubViewAdjuster adjuster{ view }; + if ( adjuster.NVisible() < 2 ) + return {}; + + const auto rect = GetButtonRect( state.rect ); + if ( !rect.Contains( state.state.GetPosition() ) ) + return {}; + auto index = adjuster.FindIndex( subView ); + UIHandlePtr result = std::make_shared( + std::move( adjuster ), index, view.FindTrack(), rect ); + result = AssignUIHandlePtr( holder, result ); + return result; + } + + SubViewCloseHandle( + SubViewAdjuster &&adjuster, size_t index, + const std::shared_ptr &pTrack, const wxRect &rect ) + : ButtonHandle{ pTrack, rect } + , mAdjuster{ std::move( adjuster ) } + , mMySubView{ index } + { + } + + Result CommitChanges( + const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) + override + { + ProjectHistory::Get( *pProject ).ModifyState( false ); + auto &myPlacement = + mAdjuster.mNewPlacements[ mAdjuster.mPermutation[ mMySubView ] ]; + myPlacement.fraction = 0; + mAdjuster.UpdateViews( false ); + return RefreshCode::RefreshAll; + } + + TranslatableString Tip( + const wxMouseState &state, AudacityProject &project) const override + { + return XO("Close sub-view"); + } + + // TrackPanelDrawable implementation + void Draw( + TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass ) + override + { + if ( iPass == TrackArtist::PassMargins ) { // after PassTracks + TrackInfo::DrawCloseButton( + context, GetButtonRect(rect), GetTrack().get(), this ); + } + } + +private: + SubViewAdjuster mAdjuster; + size_t mMySubView{}; +}; + } std::pair< @@ -620,6 +696,10 @@ std::pair< auto pWaveTrackView = mwWaveTrackView.lock(); if ( pWaveTrackView && !state.state.HasModifiers() ) { + if ( auto pHandle = SubViewCloseHandle::HitTest( + mCloseHandle, + *pWaveTrackView, *this, state ) ) + results.second.push_back( pHandle ); if ( auto pHandle = SubViewAdjustHandle::HitTest( mAdjustHandle, *pWaveTrackView, *this, state ) ) diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index f4b221498..a60d1ed84 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -41,6 +41,7 @@ protected: const wxRect &rect ); private: + std::weak_ptr mCloseHandle; std::weak_ptr mAdjustHandle; std::weak_ptr mRearrangeHandle; std::weak_ptr mCutlineHandle;