1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-18 01:27:41 +02:00
audacity/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp
2018-10-01 13:42:34 -04:00

119 lines
3.0 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackButtonHandle.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#ifdef USE_MIDI
#include "NoteTrackButtonHandle.h"
#include "../../../../HitTestResult.h"
#include "../../../../TrackPanelMouseEvent.h"
#include "../../../../NoteTrack.h"
#include "../../../../Project.h"
#include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h"
NoteTrackButtonHandle::NoteTrackButtonHandle
( const std::shared_ptr<NoteTrack> &pTrack,
int channel, const wxRect &rect )
: mpTrack{ pTrack }
, mChannel{ channel }
, mRect{ rect }
{
}
void NoteTrackButtonHandle::Enter(bool)
{
mChangeHighlight = RefreshCode::RefreshCell;
}
NoteTrackButtonHandle::~NoteTrackButtonHandle()
{
}
UIHandle::Result NoteTrackButtonHandle::NeedChangeHighlight
(const NoteTrackButtonHandle &oldState, const NoteTrackButtonHandle &newState)
{
if (oldState.GetChannel() != newState.GetChannel())
// Repaint whenever the highlighted button is different
return RefreshCode::RefreshCell;
return 0;
}
UIHandlePtr NoteTrackButtonHandle::HitTest
(std::weak_ptr<NoteTrackButtonHandle> &holder,
const wxMouseState &state, const wxRect &rect,
const std::shared_ptr<NoteTrack> &pTrack)
{
wxRect midiRect;
TrackInfo::GetMidiControlsRect(rect, midiRect);
if ( TrackInfo::HideTopItem( rect, midiRect ) )
return {};
if (midiRect.Contains(state.m_x, state.m_y)) {
auto channel = pTrack->FindChannel(midiRect, state.m_x, state.m_y);
auto result = std::make_shared<NoteTrackButtonHandle>(
pTrack, channel, midiRect );
result = AssignUIHandlePtr(holder, result);
return result;
}
else
return {};
}
UIHandle::Result NoteTrackButtonHandle::Click
(const TrackPanelMouseEvent &, AudacityProject *)
{
return RefreshCode::RefreshNone;
}
UIHandle::Result NoteTrackButtonHandle::Drag
(const TrackPanelMouseEvent &, AudacityProject *)
{
return RefreshCode::RefreshNone;
}
HitTestPreview NoteTrackButtonHandle::Preview
(const TrackPanelMouseState &, const AudacityProject *)
{
// auto pTrack = pProject->GetTracks()->Lock(mpTrack);
auto pTrack = mpTrack.lock();
if ( !pTrack )
return {};
// No special message or cursor
return {};
}
UIHandle::Result NoteTrackButtonHandle::Release
(const TrackPanelMouseEvent &evt, AudacityProject *pProject, wxWindow *)
{
using namespace RefreshCode;
auto pTrack = pProject->GetTracks()->Lock(mpTrack);
if (!pTrack)
return Cancelled;
const wxMouseEvent &event = evt.event;
if (pTrack->LabelClick(mRect, event.m_x, event.m_y,
event.Button(wxMOUSE_BTN_RIGHT))) {
// No undo items needed??
pProject->ModifyState(false);
return RefreshAll;
}
return RefreshNone;
}
UIHandle::Result NoteTrackButtonHandle::Cancel(AudacityProject *)
{
return RefreshCode::RefreshNone;
}
#endif