mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-01 16:19:43 +02:00
Move functions handling label keystrokes to class LabelTrackView
This commit is contained in:
parent
9d26eb7a41
commit
e0b8bd78eb
@ -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();
|
||||
|
||||
|
@ -106,6 +106,7 @@ class LabelTextHandle;
|
||||
|
||||
class AUDACITY_DLL_API LabelTrack final : public Track
|
||||
{
|
||||
friend class LabelTrackView;
|
||||
friend class LabelStruct;
|
||||
|
||||
public:
|
||||
@ -115,8 +116,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track
|
||||
AudacityProject &project, const SelectedRegion& region,
|
||||
const wxString& initialValue, wxString& value);
|
||||
|
||||
bool IsGoodLabelFirstKey(const wxKeyEvent & evt);
|
||||
bool IsGoodLabelEditKey(const wxKeyEvent & evt);
|
||||
bool IsTextSelected() const;
|
||||
|
||||
void CreateCustomGlyphs();
|
||||
@ -130,7 +129,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track
|
||||
const AudacityProject *pProject, int currentTool, bool bMultiTool)
|
||||
override;
|
||||
|
||||
bool DoCaptureKey(wxKeyEvent &event);
|
||||
unsigned CaptureKey
|
||||
(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent) override;
|
||||
|
||||
@ -218,9 +216,6 @@ public:
|
||||
SelectedRegion *newSel);
|
||||
void HandleTextDragRelease(const wxMouseEvent & evt);
|
||||
|
||||
bool OnKeyDown(SelectedRegion &sel, wxKeyEvent & event);
|
||||
bool OnChar(SelectedRegion &sel, wxKeyEvent & event);
|
||||
|
||||
void Import(wxTextFile & f);
|
||||
void Export(wxTextFile & f) const;
|
||||
|
||||
|
@ -14,6 +14,9 @@ Paul Licameli split from class LabelTrack
|
||||
#include "../../ui/CommonTrackView.h"
|
||||
|
||||
class LabelTrack;
|
||||
class SelectedRegion;
|
||||
|
||||
class wxKeyEvent;
|
||||
|
||||
class LabelTrackView final : public CommonTrackView
|
||||
{
|
||||
@ -29,6 +32,10 @@ public:
|
||||
static LabelTrackView &Get( LabelTrack& );
|
||||
static const LabelTrackView &Get( const LabelTrack& );
|
||||
|
||||
bool DoCaptureKey(wxKeyEvent &event);
|
||||
bool DoKeyDown(SelectedRegion &sel, wxKeyEvent & event);
|
||||
bool DoChar(SelectedRegion &sel, wxKeyEvent & event);
|
||||
|
||||
private:
|
||||
std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user