audacia/src/tracks/labeltrack/ui/LabelDefaultClickHandle.cpp

110 lines
2.9 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
LabelDefaultClickHandle.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "LabelDefaultClickHandle.h"
#include "../../../HitTestResult.h"
#include "../../../LabelTrack.h"
#include "../../../Project.h"
#include "../../../RefreshCode.h"
#include "../../../TrackPanelMouseEvent.h"
#include "../../../ViewInfo.h"
LabelDefaultClickHandle::LabelDefaultClickHandle()
{
}
LabelDefaultClickHandle::~LabelDefaultClickHandle()
{
}
struct LabelDefaultClickHandle::LabelState {
std::vector< std::pair< std::weak_ptr<LabelTrack>, LabelTrack::Flags > > mPairs;
};
void LabelDefaultClickHandle::SaveState( AudacityProject *pProject )
{
mLabelState = std::make_shared<LabelState>();
auto &pairs = mLabelState->mPairs;
TrackList *const tracks = pProject->GetTracks();
TrackListIterator iter(tracks);
Track *n = iter.First();
while (n) {
if (n->GetKind() == Track::Label) {
LabelTrack *const lt = static_cast<LabelTrack*>(n);
pairs.push_back( std::make_pair(
Track::Pointer<LabelTrack>( lt ),
lt->SaveFlags() )
);
}
n = iter.Next();
}
}
void LabelDefaultClickHandle::RestoreState( AudacityProject *pProject )
{
if ( mLabelState ) {
for ( const auto &pair : mLabelState->mPairs )
if (auto pLt = pProject->GetTracks()->Lock(pair.first))
pLt->RestoreFlags( pair.second );
mLabelState.reset();
}
}
UIHandle::Result LabelDefaultClickHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
using namespace RefreshCode;
// Redraw to show the change of text box selection status
UIHandle::Result result = RefreshAll;
if (evt.event.LeftDown())
{
SaveState( pProject );
TrackList *const tracks = pProject->GetTracks();
TrackListIterator iter(tracks);
Track *n = iter.First();
while (n) {
if (n->GetKind() == Track::Label && evt.pCell.get() != n) {
LabelTrack *const lt = static_cast<LabelTrack*>(n);
lt->ResetFlags();
lt->Unselect();
}
n = iter.Next();
}
}
return result;
}
UIHandle::Result LabelDefaultClickHandle::Drag
(const TrackPanelMouseEvent &WXUNUSED(evt), AudacityProject *WXUNUSED(pProject))
{
return RefreshCode::RefreshNone;
}
UIHandle::Result LabelDefaultClickHandle::Release
(const TrackPanelMouseEvent &WXUNUSED(evt), AudacityProject *WXUNUSED(pProject),
wxWindow *WXUNUSED(pParent))
{
mLabelState.reset();
return RefreshCode::RefreshNone;
}
UIHandle::Result LabelDefaultClickHandle::Cancel(AudacityProject *pProject)
{
UIHandle::Result result = RefreshCode::RefreshNone;
RestoreState( pProject );
return result;
}