110 lines
2.9 KiB
C++
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;
|
|
}
|