From 0b6d5bc7f6ab3e7262bdec2518648921e16fdec2 Mon Sep 17 00:00:00 2001 From: Vitaly Sverchinsky Date: Thu, 15 Jul 2021 14:33:39 +0300 Subject: [PATCH] Adding affordances to TrackPanel and TrackView --- src/TrackPanel.cpp | 72 +++++++++++++++++++++++++++++++++++-- src/tracks/ui/TrackView.cpp | 12 +++++++ src/tracks/ui/TrackView.h | 6 ++++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index f5f1452ef..077981274 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1270,7 +1270,61 @@ struct VRulersAndChannels final : TrackPanelGroup { wxCoord mLeftOffset; }; -// n channels with vertical rulers, alternating with n - 1 resizers; +//Simply fills area using specified brush and outlines borders +class EmptyPanelRect final : public CommonTrackPanelCell +{ + int mFillBrushName; +public: + explicit EmptyPanelRect(int fillBrushName) + : mFillBrushName(fillBrushName) + { + } + + ~EmptyPanelRect() { } + + void Draw(TrackPanelDrawingContext& context, const wxRect& rect, unsigned iPass) + { + if (iPass == TrackArtist::PassBackground) + { + context.dc.SetPen(*wxTRANSPARENT_PEN); + AColor::UseThemeColour(&context.dc, mFillBrushName); + context.dc.DrawRectangle(rect); + wxRect bevel(rect.x, rect.y, rect.width - 1, rect.height - 1); + AColor::BevelTrackInfo(context.dc, true, bevel, false); + } + } + + std::shared_ptr DoFindTrack() override + { + return {}; + } + + std::vector HitTest(const TrackPanelMouseState& state, const AudacityProject* pProject) + { + return {}; + } +}; + +//Simply place children one after another horizontally, without any specific logic +struct HorizontalGroup final : TrackPanelGroup { + + Refinement mRefinement; + + HorizontalGroup(Refinement refinement) + : mRefinement(std::move(refinement)) + { + } + + Subdivision Children(const wxRect& /*rect*/) override + { + return { Axis::X, mRefinement }; + } + +}; + + +// optional affordance area, and n channels with vertical rulers, +// alternating with n - 1 resizers; // each channel-ruler pair might be divided into multiple views struct ChannelGroup final : TrackPanelGroup { ChannelGroup( const std::shared_ptr< Track > &pTrack, wxCoord leftOffset ) @@ -1283,8 +1337,19 @@ struct ChannelGroup final : TrackPanelGroup { const auto channels = TrackList::Channels( mpTrack.get() ); const auto pLast = *channels.rbegin(); wxCoord yy = rect.GetTop(); - for ( auto channel : channels ) { + for ( auto channel : channels ) + { auto &view = TrackView::Get( *channel ); + if (auto affordance = view.GetAffordanceControls()) + { + Refinement hgroup { + std::make_pair(rect.GetLeft() + 1, std::make_shared(channel->GetSelected() ? clrTrackInfoSelected : clrTrackInfo)), + std::make_pair(mLeftOffset, affordance) + }; + refinement.emplace_back(yy, std::make_shared(hgroup)); + yy += kAffordancesAreaHeight; + } + auto height = view.GetHeight(); rect.SetTop( yy ); rect.SetHeight( height - kSeparatorThickness ); @@ -1444,6 +1509,9 @@ struct Subgroup final : TrackPanelGroup { for ( auto channel : TrackList::Channels( leader ) ) { auto &view = TrackView::Get( *channel ); height += view.GetHeight(); + + if (view.GetAffordanceControls()) + height += kAffordancesAreaHeight; } refinement.emplace_back( yy, std::make_shared< ResizingChannelGroup >( diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index d68f6b67f..0107eaf04 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -141,6 +141,13 @@ std::shared_ptr TrackView::GetVRulerControls() const return const_cast< TrackView* >( this )->GetVRulerControls(); } +std::shared_ptr TrackView::GetAffordanceControls() +{ + if (!mpAffordanceCellControl) + mpAffordanceCellControl = DoGetAffordanceControls(); + return mpAffordanceCellControl; +} + void TrackView::DoSetY(int y) { mY = y; @@ -165,6 +172,11 @@ void TrackView::DoSetHeight(int h) mHeight = h; } +std::shared_ptr TrackView::DoGetAffordanceControls() +{ + return {}; +} + namespace { // Attach an object to each project. It receives track list events and updates diff --git a/src/tracks/ui/TrackView.h b/src/tracks/ui/TrackView.h index d230b7b0c..bfe0b35d0 100644 --- a/src/tracks/ui/TrackView.h +++ b/src/tracks/ui/TrackView.h @@ -62,6 +62,9 @@ public: std::shared_ptr GetVRulerControls(); std::shared_ptr GetVRulerControls() const; + // by default returns nullptr, meaning that track has no drag controls area + std::shared_ptr GetAffordanceControls(); + void WriteXMLAttributes( XMLWriter & ) const override; bool HandleXMLAttribute( const wxChar *attr, const wxChar *value ) override; @@ -88,8 +91,11 @@ protected: // Private factory to make appropriate object; class TrackView handles // memory management thereafter virtual std::shared_ptr DoGetVRulerControls() = 0; + // May return nullptr (which is default) if track does not need affordance area + virtual std::shared_ptr DoGetAffordanceControls(); std::shared_ptr mpVRulerControls; + std::shared_ptr mpAffordanceCellControl; private: bool mMinimized{ false };