1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-23 09:20:16 +01:00

Move functions handling label keystrokes to class LabelTrackView

This commit is contained in:
Paul Licameli
2019-06-16 11:12:06 -04:00
parent 9d26eb7a41
commit e0b8bd78eb
3 changed files with 52 additions and 31 deletions

View File

@@ -33,6 +33,8 @@ for drawing different aspects of the label and its text box.
#include "Experimental.h"
#include "tracks/labeltrack/ui/LabelTrackView.h"
#include <stdio.h>
#include <algorithm>
#include <limits.h>
@@ -1736,8 +1738,11 @@ void LabelTrack::HandleTextClick(const wxMouseEvent & evt,
}
}
static bool IsGoodLabelFirstKey(const wxKeyEvent & evt);
static bool IsGoodLabelEditKey(const wxKeyEvent & evt);
// Check for keys that we will process
bool LabelTrack::DoCaptureKey(wxKeyEvent & event)
bool LabelTrackView::DoCaptureKey(wxKeyEvent & event)
{
// Check for modifiers and only allow shift
int mods = event.GetModifiers();
@@ -1747,11 +1752,13 @@ bool LabelTrack::DoCaptureKey(wxKeyEvent & event)
// Always capture the navigation keys, if we have any labels
auto code = event.GetKeyCode();
const auto pTrack = FindLabelTrack();
const auto &mLabels = pTrack->GetLabels();
if ((code == WXK_TAB || code == WXK_NUMPAD_TAB) &&
!mLabels.empty())
return true;
if (mSelIndex >= 0) {
if ( pTrack->mSelIndex >= 0 ) {
if (IsGoodLabelEditKey(event)) {
return true;
}
@@ -1785,7 +1792,7 @@ bool LabelTrack::DoCaptureKey(wxKeyEvent & event)
// If there's a label there already don't capture
auto &selectedRegion = ViewInfo::Get( *pProj ).selectedRegion;
if( GetLabelIndex(selectedRegion.t0(),
if( pTrack->GetLabelIndex(selectedRegion.t0(),
selectedRegion.t1()) != wxNOT_FOUND ) {
return false;
}
@@ -1799,7 +1806,7 @@ bool LabelTrack::DoCaptureKey(wxKeyEvent & event)
unsigned LabelTrack::CaptureKey(wxKeyEvent & event, ViewInfo &, wxWindow *)
{
event.Skip(!DoCaptureKey(event));
event.Skip(!LabelTrackView::Get( *this ).DoCaptureKey(event));
return RefreshCode::RefreshNone;
}
@@ -1812,7 +1819,8 @@ unsigned LabelTrack::KeyDown(wxKeyEvent & event, ViewInfo &viewInfo, wxWindow *W
// Pass keystroke to labeltrack's handler and add to history if any
// updates were done
if (OnKeyDown(viewInfo.selectedRegion, event)) {
auto &view = LabelTrackView::Get( *this );
if (view.DoKeyDown(viewInfo.selectedRegion, event)) {
ProjectHistory::Get( *pProj ).PushState(_("Modified Label"),
_("Label Edit"),
UndoPush::CONSOLIDATE);
@@ -1844,7 +1852,7 @@ unsigned LabelTrack::Char(wxKeyEvent & event, ViewInfo &viewInfo, wxWindow *)
AudacityProject *const pProj = GetActiveProject();
if (OnChar(viewInfo.selectedRegion, event))
if (LabelTrackView::Get( *this ).DoChar(viewInfo.selectedRegion, event))
ProjectHistory::Get( *pProj ).PushState(_("Modified Label"),
_("Label Edit"),
UndoPush::CONSOLIDATE);
@@ -1861,7 +1869,7 @@ unsigned LabelTrack::Char(wxKeyEvent & event, ViewInfo &viewInfo, wxWindow *)
}
/// KeyEvent is called for every keypress when over the label track.
bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
bool LabelTrackView::DoKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
{
// Only track true changes to the label
bool updated = false;
@@ -1877,7 +1885,13 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
}
// All editing keys are only active if we're currently editing a label
if (mSelIndex >= 0) {
const auto pTrack = FindLabelTrack();
auto &mLabels = pTrack->mLabels;
auto &mSelIndex = pTrack->mSelIndex;
auto &mInitialCursorPos = pTrack->mInitialCursorPos;
auto &mCurrentCursorPos = pTrack->mCurrentCursorPos;
auto &mRestoreFocus = pTrack->mRestoreFocus;
if ( pTrack->mSelIndex >= 0 ) {
auto &labelStruct = mLabels[mSelIndex];
auto &title = labelStruct.title;
switch (keyCode) {
@@ -1891,7 +1905,7 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
{
// IF there are some highlighted letters, THEN DELETE them
if (mInitialCursorPos != mCurrentCursorPos)
RemoveSelectedText();
pTrack->RemoveSelectedText();
else
{
// DELETE one letter
@@ -1904,7 +1918,7 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
else
{
// ELSE no text in text box, so DELETE whole label.
DeleteLabel( mSelIndex );
pTrack->DeleteLabel( mSelIndex );
}
mInitialCursorPos = mCurrentCursorPos;
updated = true;
@@ -1921,7 +1935,7 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
{
// if there are some highlighted letters, DELETE them
if (mInitialCursorPos != mCurrentCursorPos)
RemoveSelectedText();
pTrack->RemoveSelectedText();
else
{
// DELETE one letter
@@ -1933,7 +1947,7 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
else
{
// DELETE whole label if no text in text box
DeleteLabel( mSelIndex );
pTrack->DeleteLabel( mSelIndex );
}
mInitialCursorPos = mCurrentCursorPos;
updated = true;
@@ -2021,7 +2035,7 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
case '\x10': // OSX
case WXK_MENU:
case WXK_WINDOWS_MENU:
ShowContextMenu();
pTrack->ShowContextMenu();
break;
default:
@@ -2079,14 +2093,14 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event)
}
// Make sure the caret is visible
mDrawCursor = true;
pTrack->mDrawCursor = true;
return updated;
}
/// OnChar is called for incoming characters -- that's any keypress not handled
/// by OnKeyDown.
bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
bool LabelTrackView::DoChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
{
// Check for modifiers and only allow shift.
//
@@ -2111,7 +2125,8 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
}
// If we've reached this point and aren't currently editing, add NEW label
if (mSelIndex < 0) {
const auto pTrack = FindLabelTrack();
if ( pTrack->mSelIndex < 0 ) {
// Don't create a NEW label for a space
if (wxIsspace(charCode)) {
event.Skip();
@@ -2123,19 +2138,19 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
auto &selectedRegion = ViewInfo::Get( *p ).selectedRegion;
if (useDialog) {
wxString title;
if (DialogForLabelName(
if (pTrack->DialogForLabelName(
*p, selectedRegion, charCode, title) ==
wxID_CANCEL) {
return false;
}
SetSelected(true);
AddLabel(selectedRegion, title, -2);
pTrack->SetSelected(true);
pTrack->AddLabel(selectedRegion, title, -2);
ProjectHistory::Get( *p ).PushState(_("Added label"), _("Label"));
return false;
}
else {
SetSelected(true);
AddLabel(selectedRegion);
pTrack->SetSelected(true);
pTrack->AddLabel(selectedRegion);
ProjectHistory::Get( *p ).PushState(_("Added label"), _("Label"));
}
}
@@ -2144,12 +2159,16 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
// Now we are definitely in a label; append the incoming character
//
auto &mLabels = pTrack->mLabels;
auto &mSelIndex = pTrack->mSelIndex;
auto &mInitialCursorPos = pTrack->mInitialCursorPos;
auto &mCurrentCursorPos = pTrack->mCurrentCursorPos;
auto &labelStruct = mLabels[mSelIndex];
auto &title = labelStruct.title;
// Test if cursor is in the end of string or not
if (mInitialCursorPos != mCurrentCursorPos)
RemoveSelectedText();
pTrack->RemoveSelectedText();
if (mCurrentCursorPos < (int)title.length()) {
// Get substring on the righthand side of cursor
@@ -2170,7 +2189,7 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event)
updated = true;
// Make sure the caret is visible
mDrawCursor = true;
pTrack->mDrawCursor = true;
return updated;
}
@@ -2917,7 +2936,7 @@ void LabelTrack::CreateCustomGlyphs()
}
/// Returns true for keys we capture to start a label.
bool LabelTrack::IsGoodLabelFirstKey(const wxKeyEvent & evt)
static bool IsGoodLabelFirstKey(const wxKeyEvent & evt)
{
int keyCode = evt.GetKeyCode();
return (keyCode < WXK_START
@@ -2931,7 +2950,7 @@ bool LabelTrack::IsGoodLabelFirstKey(const wxKeyEvent & evt)
}
/// This returns true for keys we capture for label editing.
bool LabelTrack::IsGoodLabelEditKey(const wxKeyEvent & evt)
static bool IsGoodLabelEditKey(const wxKeyEvent & evt)
{
int keyCode = evt.GetKeyCode();