Move label context menu handling to label track

Application key now brings up the context menu while editing labels
as it should.  This wasn't possible with the old keyboard handling.
This commit is contained in:
Leland Lucius 2015-07-30 10:38:03 -05:00
parent a269670912
commit 7877615454
4 changed files with 109 additions and 92 deletions

View File

@ -61,6 +61,14 @@ for drawing different aspects of the label and its text box.
#include "effects/TimeWarper.h"
enum
{
OnCutSelectedTextID,
OnCopySelectedTextID,
OnPasteSelectedTextID,
OnDeleteSelectedLabelID,
};
wxFont LabelTrack::msFont;
// static member variables.
@ -1586,6 +1594,13 @@ bool LabelTrack::HandleMouse(const wxMouseEvent & evt,
}
}
if (evt.RightUp()) {
if ((mSelIndex != -1) && OverTextBox(GetLabel(mSelIndex), evt.m_x, evt.m_y)) {
// popup menu for editing
ShowContextMenu();
}
}
return false;
}
@ -1822,6 +1837,10 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
}
break;
case WXK_WINDOWS_MENU:
ShowContextMenu();
break;
default:
if (!IsGoodLabelEditKey(keyCode)) {
event.Skip();
@ -1977,6 +1996,94 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
return updated;
}
void LabelTrack::ShowContextMenu()
{
wxWindow *parent = wxWindow::FindFocus();
wxMenu *menu = new wxMenu();
menu->Bind(wxEVT_MENU, &LabelTrack::OnContextMenu, this);
menu->Append(OnCutSelectedTextID, _("Cu&t"));
menu->Append(OnCopySelectedTextID, _("&Copy"));
menu->Append(OnPasteSelectedTextID, _("&Paste"));
menu->Append(OnDeleteSelectedLabelID, _("&Delete Label"));
menu->Enable(OnCutSelectedTextID, IsTextSelected());
menu->Enable(OnCopySelectedTextID, IsTextSelected());
menu->Enable(OnPasteSelectedTextID, IsTextClipSupported());
menu->Enable(OnDeleteSelectedLabelID, true);
const LabelStruct *ls = GetLabel(mSelIndex);
wxClientDC dc(parent);
if (msFont.Ok())
{
dc.SetFont(msFont);
}
int x;
if (mMouseXPos != -1)
{
x = mMouseXPos;
}
else
{
dc.GetTextExtent(ls->title.Left(mCurrentCursorPos), &x, NULL);
x += ls->xText;
}
parent->PopupMenu(menu, x, ls->y + (mIconHeight / 2) - 1);
// it's an invalid dragging event
SetWrongDragging(true);
}
void LabelTrack::OnContextMenu(wxCommandEvent & evt)
{
AudacityProject *p = GetActiveProject();
switch (evt.GetId())
{
/// Cut selected text if cut menu item is selected
case OnCutSelectedTextID:
if (CutSelectedText())
{
p->PushState(_("Modified Label"),
_("Label Edit"),
PUSH_CONSOLIDATE);
}
break;
/// Copy selected text if copy menu item is selected
case OnCopySelectedTextID:
CopySelectedText();
break;
/// paste selected text if paste menu item is selected
case OnPasteSelectedTextID:
if (PasteSelectedText(p->GetSel0(), p->GetSel1()))
{
p->PushState(_("Modified Label"),
_("Label Edit"),
true /* consolidate */);
}
break;
/// delete selected label
case OnDeleteSelectedLabelID:
int ndx = GetLabelIndex(p->GetSel0(), p->GetSel1());
if (ndx != -1)
{
DeleteLabel(ndx);
p->PushState(_("Deleted Label"),
_("Label Edit"),
true /* consolidate */);
}
break;
}
}
void LabelTrack::RemoveSelectedText()
{
wxString left = wxT("");

View File

@ -232,6 +232,8 @@ class AUDACITY_DLL_API LabelTrack : public Track
//mOldEdge is useful for telling us when there has been a state change.
int mOldEdge;
private:
void ShowContextMenu();
void OnContextMenu(wxCommandEvent & evt);
int mSelIndex; /// Keeps track of the currently selected label
int mMouseOverLabelLeft; /// Keeps track of which left label the mouse is currently over.

View File

@ -331,10 +331,6 @@ enum {
OnSwapChannelsID,
OnSetTimeTrackRangeID,
OnCutSelectedTextID,
OnCopySelectedTextID,
OnPasteSelectedTextID,
OnDeleteSelectedLabelID,
OnTimeTrackLinID,
OnTimeTrackLogID,
@ -384,11 +380,6 @@ BEGIN_EVENT_TABLE(TrackPanel, wxWindow)
EVT_MENU(OnSplitStereoMonoID, TrackPanel::OnSplitStereoMono)
EVT_MENU(OnMergeStereoID, TrackPanel::OnMergeStereo)
EVT_MENU(OnCutSelectedTextID, TrackPanel::OnCutSelectedText)
EVT_MENU(OnCopySelectedTextID, TrackPanel::OnCopySelectedText)
EVT_MENU(OnPasteSelectedTextID, TrackPanel::OnPasteSelectedText)
EVT_MENU(OnDeleteSelectedLabelID, TrackPanel::OnDeleteSelectedLabel)
EVT_MENU(OnTimeTrackLinID, TrackPanel::OnTimeTrackLin)
EVT_MENU(OnTimeTrackLogID, TrackPanel::OnTimeTrackLog)
EVT_MENU(OnTimeTrackLogIntID, TrackPanel::OnTimeTrackLogInt)
@ -564,7 +555,6 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
mWaveTrackMenu = NULL;
mNoteTrackMenu = NULL;
mLabelTrackMenu = NULL;
mLabelTrackInfoMenu = NULL;
mTimeTrackMenu = NULL;
mRulerWaveformMenu = mRulerSpectrumMenu = NULL;
@ -776,12 +766,6 @@ void TrackPanel::BuildMenus(void)
mTimeTrackMenu->Append(OnSetTimeTrackRangeID, _("Set Ra&nge..."));
mTimeTrackMenu->AppendCheckItem(OnTimeTrackLogIntID, _("Logarithmic &Interpolation"));
mLabelTrackInfoMenu = new wxMenu();
mLabelTrackInfoMenu->Append(OnCutSelectedTextID, _("Cu&t"));
mLabelTrackInfoMenu->Append(OnCopySelectedTextID, _("&Copy"));
mLabelTrackInfoMenu->Append(OnPasteSelectedTextID, _("&Paste"));
mLabelTrackInfoMenu->Append(OnDeleteSelectedLabelID, _("&Delete Label"));
mRulerWaveformMenu = new wxMenu();
BuildVRulerMenuItems
(mRulerWaveformMenu, OnFirstWaveformScaleID,
@ -837,11 +821,6 @@ void TrackPanel::DeleteMenus(void)
mLabelTrackMenu = NULL;
}
if (mLabelTrackInfoMenu) {
delete mLabelTrackInfoMenu;
mLabelTrackInfoMenu = NULL;
}
if (mTimeTrackMenu) {
delete mTimeTrackMenu;
mTimeTrackMenu = NULL;
@ -6583,25 +6562,6 @@ bool TrackPanel::HandleLabelTrackMouseEvent(LabelTrack * lTrack, wxRect &r, wxMo
PUSH_CONSOLIDATE);
}
if (event.RightUp()) {
// popup menu for editing
RefreshTrack(lTrack);
if ((lTrack->getSelectedIndex() != -1) && lTrack->OverTextBox(lTrack->GetLabel(lTrack->getSelectedIndex()), event.m_x, event.m_y)) {
mPopupMenuTarget = lTrack;
mLabelTrackInfoMenu->Enable(OnCutSelectedTextID, lTrack->IsTextSelected());
mLabelTrackInfoMenu->Enable(OnCopySelectedTextID, lTrack->IsTextSelected());
mLabelTrackInfoMenu->Enable(OnPasteSelectedTextID, lTrack->IsTextClipSupported());
mLabelTrackInfoMenu->Enable(OnDeleteSelectedLabelID, true);
PopupMenu(mLabelTrackInfoMenu, event.m_x + 1, event.m_y + 1);
mPopupMenuTarget = NULL;
// it's an invalid dragging event
lTrack->SetWrongDragging(true);
}
return true;
}
//If we are adjusting a label on a labeltrack, do not do anything
//that follows. Instead, redraw the track.
if(mMouseCapture == IsAdjustingLabel)
@ -9451,54 +9411,6 @@ void TrackPanel::OnSetName(wxCommandEvent & WXUNUSED(event))
}
}
/// Cut selected text if cut menu item is selected
void TrackPanel::OnCutSelectedText(wxCommandEvent & WXUNUSED(event))
{
LabelTrack *lt = (LabelTrack *)mPopupMenuTarget;
if (lt->CutSelectedText()) {
MakeParentPushState(_("Modified Label"),
_("Label Edit"),
PUSH_CONSOLIDATE);
}
RefreshTrack(lt);
}
/// Copy selected text if copy menu item is selected
void TrackPanel::OnCopySelectedText(wxCommandEvent & WXUNUSED(event))
{
LabelTrack *lt = (LabelTrack *)mPopupMenuTarget;
lt->CopySelectedText();
RefreshTrack(lt);
}
/// paste selected text if paste menu item is selected
void TrackPanel::OnPasteSelectedText(wxCommandEvent & WXUNUSED(event))
{
LabelTrack *lt = (LabelTrack *)mPopupMenuTarget;
if (lt->PasteSelectedText(mViewInfo->selectedRegion.t0(),
mViewInfo->selectedRegion.t1())) {
MakeParentPushState(_("Modified Label"),
_("Label Edit"),
true /* consolidate */);
}
RefreshTrack(lt);
}
/// delete selected label
void TrackPanel::OnDeleteSelectedLabel(wxCommandEvent & WXUNUSED(event))
{
LabelTrack *lt = (LabelTrack *)mPopupMenuTarget;
int ndx = lt->GetLabelIndex(mViewInfo->selectedRegion.t0(),
mViewInfo->selectedRegion.t1());
if (ndx != -1) {
lt->DeleteLabel(ndx);
MakeParentPushState(_("Deleted Label"),
_("Label Edit"),
true /* consolidate */);
}
RefreshTrack(lt);
}
// Small helper class to enumerate all fonts in the system
// We use this because the default implementation of
// wxFontEnumerator::GetFacenames() has changed between wx2.6 and 2.8

View File

@ -486,10 +486,6 @@ protected:
virtual void OnSplitStereoMono(wxCommandEvent &event);
virtual void SplitStereo(bool stereo);
virtual void OnMergeStereo(wxCommandEvent &event);
virtual void OnCutSelectedText(wxCommandEvent &event);
virtual void OnCopySelectedText(wxCommandEvent &event);
virtual void OnPasteSelectedText(wxCommandEvent &event);
virtual void OnDeleteSelectedLabel(wxCommandEvent &event);
virtual void SetTrackPan(Track * t, LWSlider * s);
virtual void SetTrackGain(Track * t, LWSlider * s);