1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-04 14:39:08 +02:00
audacity/src/tracks/labeltrack/ui/LabelTextHandle.cpp
Paul Licameli 0fa0d480e4 build fix
2017-07-09 13:37:20 -04:00

195 lines
5.4 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
LabelTextHandle.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "LabelTextHandle.h"
#include "../../../HitTestResult.h"
#include "../../../LabelTrack.h"
#include "../../../Project.h"
#include "../../../RefreshCode.h"
#include "../../../TrackPanelMouseEvent.h"
#include "../../../ViewInfo.h"
#include "../../../images/Cursors.h"
LabelTextHandle::LabelTextHandle
( const std::shared_ptr<LabelTrack> &pLT, int labelNum )
: mpLT{ pLT }
, mLabelNum{ labelNum }
{}
HitTestPreview LabelTextHandle::HitPreview()
{
static auto ibeamCursor =
::MakeCursor(wxCURSOR_IBEAM, IBeamCursorXpm, 17, 16);
return {
_("Click to edit label text"),
ibeamCursor.get()
};
}
UIHandlePtr LabelTextHandle::HitTest
(std::weak_ptr<LabelTextHandle> &holder,
const wxMouseState &state, const std::shared_ptr<LabelTrack> &pLT)
{
// If Control is down, let the select handle be hit instead
int labelNum;
if (!state.ControlDown() &&
(labelNum = pLT->OverATextBox(state.m_x, state.m_y) ) >= 0) {
auto result = std::make_shared<LabelTextHandle>( pLT, labelNum );
result = AssignUIHandlePtr(holder, result);
return result;
}
return {};
}
LabelTextHandle::~LabelTextHandle()
{
}
UIHandle::Result LabelTextHandle::Click
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
auto pLT = mpLT.lock();
if (!pLT)
return RefreshCode::Cancelled;
auto result = LabelDefaultClickHandle::Click( evt, pProject );
auto &selectionState = pProject->GetSelectionState();
TrackList *const tracks = pProject->GetTracks();
mChanger =
std::make_shared< SelectionStateChanger >( selectionState, *tracks );
const wxMouseEvent &event = evt.event;
ViewInfo &viewInfo = pProject->GetViewInfo();
mSelectedRegion = viewInfo.selectedRegion;
pLT->HandleTextClick( event, evt.rect, viewInfo, &viewInfo.selectedRegion );
wxASSERT(pLT->IsSelected());
{
// IF the user clicked a label, THEN select all other tracks by Label
TrackListIterator iter(tracks);
Track *t = iter.First();
//do nothing if at least one other track is selected
bool done = false;
while (!done && t) {
if (t->GetSelected() && t != pLT.get())
done = true;
t = iter.Next();
}
if (!done) {
//otherwise, select all tracks
t = iter.First();
while (t)
{
selectionState.SelectTrack
( *pProject->GetTracks(), *t, true, true,
pProject->GetMixerBoard() );
t = iter.Next();
}
}
// Do this after, for its effect on TrackPanel's memory of last selected
// track (which affects shift-click actions)
selectionState.SelectTrack
( *pProject->GetTracks(), *pLT, true, true,
pProject->GetMixerBoard() );
}
// PRL: bug1659 -- make selection change undo correctly
const bool unsafe = pProject->IsAudioActive();
if (!unsafe)
pProject->ModifyState(false);
return result | RefreshCode::RefreshCell | RefreshCode::UpdateSelection;
}
UIHandle::Result LabelTextHandle::Drag
(const TrackPanelMouseEvent &evt, AudacityProject *pProject)
{
using namespace RefreshCode;
auto result = LabelDefaultClickHandle::Drag( evt, pProject );
const wxMouseEvent &event = evt.event;
auto pLT = pProject->GetTracks()->Lock(mpLT);
if(pLT)
pLT->HandleTextDragRelease(event);
// locate the initial mouse position
if (event.LeftIsDown()) {
if (mLabelTrackStartXPos == -1) {
mLabelTrackStartXPos = event.m_x;
mLabelTrackStartYPos = event.m_y;
if (pLT &&
(pLT->getSelectedIndex() != -1) &&
pLT->OverTextBox(
pLT->GetLabel(pLT->getSelectedIndex()),
mLabelTrackStartXPos,
mLabelTrackStartYPos))
mLabelTrackStartYPos = -1;
}
// if initial mouse position in the text box
// then only drag text
if (mLabelTrackStartYPos == -1)
result |= RefreshCell;
}
return result;
}
HitTestPreview LabelTextHandle::Preview
(const TrackPanelMouseState &, const AudacityProject *)
{
return HitPreview();
}
UIHandle::Result LabelTextHandle::Release
(const TrackPanelMouseEvent &evt, AudacityProject *pProject,
wxWindow *pParent)
{
auto result = LabelDefaultClickHandle::Release( evt, pProject, pParent );
// Only selected a part of a text string and changed track selectedness.
// No undoable effects.
if (mChanger) {
mChanger->Commit();
mChanger.reset();
}
const wxMouseEvent &event = evt.event;
auto pLT = pProject->GetTracks()->Lock(mpLT);
if (pLT)
pLT->HandleTextDragRelease(event);
// handle mouse left button up
if (event.LeftUp())
mLabelTrackStartXPos = -1;
return result | RefreshCode::RefreshNone;
}
UIHandle::Result LabelTextHandle::Cancel( AudacityProject *pProject )
{
// Restore the selection states of tracks
// Note that we are also relying on LabelDefaultClickHandle::Cancel
// to restore the selection state of the labels in the tracks.
ViewInfo &viewInfo = pProject->GetViewInfo();
viewInfo.selectedRegion = mSelectedRegion;
auto result = LabelDefaultClickHandle::Cancel( pProject );
return result | RefreshCode::RefreshAll;
}