1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-22 00:47:13 +01:00

A close box button for sub-views

This commit is contained in:
Paul Licameli
2020-01-17 14:04:15 -05:00
parent 0f3f13502c
commit f10b303279
4 changed files with 120 additions and 26 deletions

View File

@@ -263,6 +263,39 @@ void TrackInfo::DrawItems
} }
#include "tracks/ui/TrackButtonHandles.h" #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 void TrackInfo::CloseTitleDrawFunction
( TrackPanelDrawingContext &context, ( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack ) const wxRect &rect, const Track *pTrack )
@@ -273,32 +306,7 @@ void TrackInfo::CloseTitleDrawFunction
wxRect bev = rect; wxRect bev = rect;
GetCloseBoxHorizontalBounds( rect, bev ); GetCloseBoxHorizontalBounds( rect, bev );
auto target = dynamic_cast<CloseButtonHandle*>( context.target.get() ); auto target = dynamic_cast<CloseButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack; DrawCloseButton( context, bev, pTrack, target );
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);
} }
{ {

View File

@@ -22,6 +22,7 @@ class wxRect;
class wxString; class wxString;
class wxWindow; class wxWindow;
class ButtonHandle;
class LWSlider; class LWSlider;
class NoteTrack; class NoteTrack;
class Track; class Track;
@@ -81,6 +82,10 @@ namespace TrackInfo
const std::vector<TCPLine> &topLines, const std::vector<TCPLine> &topLines,
const std::vector<TCPLine> &bottomLines ); const std::vector<TCPLine> &bottomLines );
void DrawCloseButton(
TrackPanelDrawingContext &context, const wxRect &bev,
const Track *pTrack, ButtonHandle *target );
void CloseTitleDrawFunction void CloseTitleDrawFunction
( TrackPanelDrawingContext &context, ( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack ); const wxRect &rect, const Track *pTrack );

View File

@@ -37,6 +37,8 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../prefs/TracksPrefs.h" #include "../../../../prefs/TracksPrefs.h"
#include "../../../ui/TimeShiftHandle.h" #include "../../../ui/TimeShiftHandle.h"
#include "../../../ui/ButtonHandle.h"
#include "../../../../TrackInfo.h"
namespace { namespace {
@@ -603,6 +605,80 @@ private:
wxCoord mViewHeight{}; // Total height of all sub-views 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<UIHandle> &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<SubViewCloseHandle>(
std::move( adjuster ), index, view.FindTrack(), rect );
result = AssignUIHandlePtr( holder, result );
return result;
}
SubViewCloseHandle(
SubViewAdjuster &&adjuster, size_t index,
const std::shared_ptr<Track> &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< std::pair<
@@ -620,6 +696,10 @@ std::pair<
auto pWaveTrackView = mwWaveTrackView.lock(); auto pWaveTrackView = mwWaveTrackView.lock();
if ( pWaveTrackView && !state.state.HasModifiers() ) { if ( pWaveTrackView && !state.state.HasModifiers() ) {
if ( auto pHandle = SubViewCloseHandle::HitTest(
mCloseHandle,
*pWaveTrackView, *this, state ) )
results.second.push_back( pHandle );
if ( auto pHandle = SubViewAdjustHandle::HitTest( if ( auto pHandle = SubViewAdjustHandle::HitTest(
mAdjustHandle, mAdjustHandle,
*pWaveTrackView, *this, state ) ) *pWaveTrackView, *this, state ) )

View File

@@ -41,6 +41,7 @@ protected:
const wxRect &rect ); const wxRect &rect );
private: private:
std::weak_ptr<UIHandle> mCloseHandle;
std::weak_ptr<UIHandle> mAdjustHandle; std::weak_ptr<UIHandle> mAdjustHandle;
std::weak_ptr<UIHandle> mRearrangeHandle; std::weak_ptr<UIHandle> mRearrangeHandle;
std::weak_ptr<CutlineHandle> mCutlineHandle; std::weak_ptr<CutlineHandle> mCutlineHandle;