1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-14 17:14:07 +01:00

Define and use the UIHandle and TrackPanelCell protocols, but...

...no actions reimplemented to them yet.

Later commits will move special cases one at a time from TrackPanel, preserving
all click and drag capabilities at each step.  With a few exceptions, but those
lost abilities are restored in yet later commits.  (Ctrl+Click on the Label
track being one.)
This commit is contained in:
Paul Licameli
2015-07-06 23:12:16 -04:00
committed by Paul Licameli
parent 07b53b4e83
commit 14d45eda33
48 changed files with 2144 additions and 161 deletions

View File

@@ -0,0 +1,34 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "LabelTrackControls.h"
#include "../../../HitTestResult.h"
LabelTrackControls::LabelTrackControls()
{
}
LabelTrackControls &LabelTrackControls::Instance()
{
static LabelTrackControls instance;
return instance;
}
LabelTrackControls::~LabelTrackControls()
{
}
HitTestResult LabelTrackControls::HitTest
(const TrackPanelMouseEvent & event,
const AudacityProject *pProject)
{
return TrackControls::HitTest(event, pProject);
}

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_LABEL_TRACK_CONTROLS__
#define __AUDACITY_LABEL_TRACK_CONTROLS__
#include "../../ui/TrackControls.h"
class LabelTrackControls final : public TrackControls
{
LabelTrackControls();
LabelTrackControls(const LabelTrackControls&) = delete;
LabelTrackControls &operator=(const LabelTrackControls&) = delete;
public:
static LabelTrackControls &Instance();
~LabelTrackControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
};
#endif

View File

@@ -0,0 +1,32 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackUI.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../LabelTrack.h"
#include "LabelTrackControls.h"
#include "LabelTrackVRulerControls.h"
#include "../../../HitTestResult.h"
HitTestResult LabelTrack::HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject)
{
return Track::HitTest(event, pProject);
}
TrackControls *LabelTrack::GetControls()
{
return &LabelTrackControls::Instance();
}
TrackVRulerControls *LabelTrack::GetVRulerControls()
{
return &LabelTrackVRulerControls::Instance();
}

View File

@@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackVRulerControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "LabelTrackVRulerControls.h"
#include "../../../HitTestResult.h"
LabelTrackVRulerControls::LabelTrackVRulerControls()
: TrackVRulerControls()
{
}
LabelTrackVRulerControls &LabelTrackVRulerControls::Instance()
{
static LabelTrackVRulerControls instance;
return instance;
}
LabelTrackVRulerControls::~LabelTrackVRulerControls()
{
}

View File

@@ -0,0 +1,30 @@
/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackVRulerControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_LABEL_TRACK_VRULER_CONTROLS__
#define __AUDACITY_LABEL_TRACK_VRULER_CONTROLS__
#include "../../ui/TrackVRulerControls.h"
// This class is here for completeness, by analogy with other track
// types, but it does nothing.
class LabelTrackVRulerControls final : public TrackVRulerControls
{
LabelTrackVRulerControls();
LabelTrackVRulerControls(const LabelTrackVRulerControls&) = delete;
LabelTrackVRulerControls &operator=(const LabelTrackVRulerControls&)
= delete;
public:
static LabelTrackVRulerControls &Instance();
~LabelTrackVRulerControls();
};
#endif

View File

@@ -0,0 +1,39 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#ifdef USE_MIDI
#include "NoteTrackControls.h"
#include "../../../../HitTestResult.h"
NoteTrackControls::NoteTrackControls()
{
}
NoteTrackControls &NoteTrackControls::Instance()
{
static NoteTrackControls instance;
return instance;
}
NoteTrackControls::~NoteTrackControls()
{
}
HitTestResult NoteTrackControls::HitTest
(const TrackPanelMouseEvent & event,
const AudacityProject *pProject)
{
return TrackControls::HitTest(event, pProject);
}
#endif

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_NOTE_TRACK_CONTROLS__
#define __AUDACITY_NOTE_TRACK_CONTROLS__
#include "../../../ui/TrackControls.h"
class NoteTrackControls : public TrackControls
{
NoteTrackControls();
NoteTrackControls(const NoteTrackControls&) = delete;
NoteTrackControls &operator=(const NoteTrackControls&) = delete;
public:
static NoteTrackControls &Instance();
~NoteTrackControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
};
#endif

View File

@@ -0,0 +1,37 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackUI.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#ifdef USE_MIDI
#include "../../../../NoteTrack.h"
#include "NoteTrackControls.h"
#include "NoteTrackVRulerControls.h"
#include "../../../../HitTestResult.h"
HitTestResult NoteTrack::HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject)
{
return Track::HitTest(event, pProject);
}
TrackControls *NoteTrack::GetControls()
{
return &NoteTrackControls::Instance();
}
TrackVRulerControls *NoteTrack::GetVRulerControls()
{
return &NoteTrackVRulerControls::Instance();
}
#endif

View File

@@ -0,0 +1,40 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackVRulerControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#ifdef USE_MIDI
#include "NoteTrackVRulerControls.h"
#include "../../../../HitTestResult.h"
NoteTrackVRulerControls::NoteTrackVRulerControls()
: TrackVRulerControls()
{
}
NoteTrackVRulerControls &NoteTrackVRulerControls::Instance()
{
static NoteTrackVRulerControls instance;
return instance;
}
NoteTrackVRulerControls::~NoteTrackVRulerControls()
{
}
HitTestResult NoteTrackVRulerControls::HitTest
(const TrackPanelMouseEvent &,
const AudacityProject *)
{
return {};
}
#endif

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
NoteTrackVRulerControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_NOTE_TRACK_VRULER_CONTROLS__
#define __AUDACITY_NOTE_TRACK_VRULER_CONTROLS__
#include "../../../ui/TrackVRulerControls.h"
class NoteTrackVRulerControls final : public TrackVRulerControls
{
NoteTrackVRulerControls();
NoteTrackVRulerControls(const NoteTrackVRulerControls&) = delete;
NoteTrackVRulerControls &operator=(const NoteTrackVRulerControls&) = delete;
public:
static NoteTrackVRulerControls &Instance();
~NoteTrackVRulerControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
};
#endif

View File

@@ -0,0 +1,35 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#include "WaveTrackControls.h"
#include "../../../../HitTestResult.h"
WaveTrackControls::WaveTrackControls()
{
}
WaveTrackControls &WaveTrackControls::Instance()
{
static WaveTrackControls instance;
return instance;
}
WaveTrackControls::~WaveTrackControls()
{
}
HitTestResult WaveTrackControls::HitTest
(const TrackPanelMouseEvent & event,
const AudacityProject *pProject)
{
return TrackControls::HitTest(event, pProject);
}

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WavelTrackControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_WAVE_TRACK_CONTROLS__
#define __AUDACITY_WAVE_TRACK_CONTROLS__
#include "../../../ui/TrackControls.h"
class WaveTrackControls final : public TrackControls
{
WaveTrackControls();
WaveTrackControls(const WaveTrackControls&) = delete;
WaveTrackControls &operator=(const WaveTrackControls&) = delete;
public:
static WaveTrackControls &Instance();
~WaveTrackControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
};
#endif

View File

@@ -0,0 +1,32 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackUI.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../WaveTrack.h"
#include "WaveTrackControls.h"
#include "WaveTrackVRulerControls.h"
#include "../../../../HitTestResult.h"
HitTestResult WaveTrack::HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject)
{
return Track::HitTest(event, pProject);
}
TrackControls *WaveTrack::GetControls()
{
return &WaveTrackControls::Instance();
}
TrackVRulerControls *WaveTrack::GetVRulerControls()
{
return &WaveTrackVRulerControls::Instance();
}

View File

@@ -0,0 +1,35 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackVRulerControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../../Audacity.h"
#include "WaveTrackVRulerControls.h"
#include "../../../../HitTestResult.h"
WaveTrackVRulerControls::WaveTrackVRulerControls()
: TrackVRulerControls()
{
}
WaveTrackVRulerControls &WaveTrackVRulerControls::Instance()
{
static WaveTrackVRulerControls instance;
return instance;
}
WaveTrackVRulerControls::~WaveTrackVRulerControls()
{
}
HitTestResult WaveTrackVRulerControls::HitTest
(const TrackPanelMouseEvent &,
const AudacityProject *)
{
return {};
}

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
WaveTrackVRulerControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_WAVE_TRACK_VRULER_CONTROLS__
#define __AUDACITY_WAVE_TRACK_VRULER_CONTROLS__
#include "../../../ui/TrackVRulerControls.h"
class WaveTrackVRulerControls final : public TrackVRulerControls
{
WaveTrackVRulerControls();
WaveTrackVRulerControls(const WaveTrackVRulerControls&) = delete;
WaveTrackVRulerControls &operator=(const WaveTrackVRulerControls&) = delete;
public:
static WaveTrackVRulerControls &Instance();
~WaveTrackVRulerControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *) override;
};
#endif

View File

@@ -0,0 +1,34 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "TimeTrackControls.h"
#include "../../../HitTestResult.h"
TimeTrackControls::TimeTrackControls()
{
}
TimeTrackControls &TimeTrackControls::Instance()
{
static TimeTrackControls instance;
return instance;
}
TimeTrackControls::~TimeTrackControls()
{
}
HitTestResult TimeTrackControls::HitTest
(const TrackPanelMouseEvent & event,
const AudacityProject *pProject)
{
return TrackControls::HitTest(event, pProject);
}

View File

@@ -0,0 +1,31 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TIME_TRACK_CONTROLS__
#define __AUDACITY_TIME_TRACK_CONTROLS__
#include "../../ui/TrackControls.h"
class TimeTrackControls final : public TrackControls
{
TimeTrackControls();
TimeTrackControls(const TimeTrackControls&) = delete;
TimeTrackControls &operator=(const TimeTrackControls&) = delete;
public:
static TimeTrackControls &Instance();
~TimeTrackControls();
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
};
#endif

View File

@@ -0,0 +1,32 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackUI.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../TimeTrack.h"
#include "TimeTrackControls.h"
#include "TimeTrackVRulerControls.h"
#include "../../../HitTestResult.h"
HitTestResult TimeTrack::HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject)
{
return Track::HitTest(event, pProject);
}
TrackControls *TimeTrack::GetControls()
{
return &TimeTrackControls::Instance();
}
TrackVRulerControls *TimeTrack::GetVRulerControls()
{
return &TimeTrackVRulerControls::Instance();
}

View File

@@ -0,0 +1,28 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackVRulerControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "TimeTrackVRulerControls.h"
#include "../../../HitTestResult.h"
TimeTrackVRulerControls::TimeTrackVRulerControls()
: TrackVRulerControls()
{
}
TimeTrackVRulerControls &TimeTrackVRulerControls::Instance()
{
static TimeTrackVRulerControls instance;
return instance;
}
TimeTrackVRulerControls::~TimeTrackVRulerControls()
{
}

View File

@@ -0,0 +1,29 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TimeTrackVRulerControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TIME_TRACK_VRULER_CONTROLS__
#define __AUDACITY_TIME_TRACK_VRULER_CONTROLS__
#include "../../ui/TrackVRulerControls.h"
// This class is here for completeness, by analogy with other track
// types, but it does nothing.
class TimeTrackVRulerControls final : public TrackVRulerControls
{
TimeTrackVRulerControls();
TimeTrackVRulerControls(const TimeTrackVRulerControls&) = delete;
TimeTrackVRulerControls &operator=(const TimeTrackVRulerControls&) = delete;
public:
static TimeTrackVRulerControls &Instance();
~TimeTrackVRulerControls();
};
#endif

View File

@@ -0,0 +1,17 @@
/**********************************************************************
Audacity: A Digital Audio Editor
CommonTrackPanelCell.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Audacity.h"
#include "CommonTrackPanelCell.h"
#include "../../HitTestResult.h"
CommonTrackPanelCell::~CommonTrackPanelCell()
{
}

View File

@@ -0,0 +1,32 @@
/**********************************************************************
Audacity: A Digital Audio Editor
CommonTrackPanelCell.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_COMMON_TRACK_PANEL_CELL__
#define __AUDACITY_COMMON_TRACK_PANEL_CELL__
#include "../../TrackPanelCell.h"
#include <stdlib.h>
class Track;
class AUDACITY_DLL_API CommonTrackPanelCell /* not final */
: public TrackPanelCell
{
public:
CommonTrackPanelCell() {}
virtual ~CommonTrackPanelCell() = 0;
virtual Track *FindTrack() = 0;
protected:
};
#endif

View File

@@ -109,7 +109,7 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
for (; begin != end; ++begin)
{
TrackPanelCellIterator::value_type data(*begin);
Track *const pTrack = data.first;
Track *const pTrack = dynamic_cast<Track*>(data.first);
if (!pTrack)
continue;
if (pTrack->GetSelected() ||

View File

@@ -76,7 +76,7 @@ void PlayIndicatorOverlayBase::Draw(OverlayPanel &panel, wxDC &dc)
for (; begin != end; ++begin)
{
TrackPanelCellIterator::value_type data(*begin);
Track *const pTrack = data.first;
Track *const pTrack = dynamic_cast<Track*>(data.first);
if (!pTrack)
continue;

View File

@@ -0,0 +1,29 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Audacity.h"
#include "TrackControls.h"
#include "../../HitTestResult.h"
TrackControls::~TrackControls()
{
}
HitTestResult TrackControls::HitTest
(const TrackPanelMouseEvent &,
const AudacityProject *)
{
return {};
}
Track *TrackControls::FindTrack()
{
return GetTrack();
}

View File

@@ -0,0 +1,40 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TRACK_CONTROLS__
#define __AUDACITY_TRACK_CONTROLS__
#include "CommonTrackPanelCell.h"
class Track;
class TrackControls /* not final */ : public CommonTrackPanelCell
{
public:
TrackControls() : mpTrack(NULL) {}
virtual ~TrackControls() = 0;
Track *GetTrack() const { return mpTrack; }
protected:
// An override is supplied for derived classes to call through but it is
// still marked pure virtual
virtual HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *) override = 0;
Track *FindTrack() override;
friend class Track;
Track *mpTrack;
};
#endif

62
src/tracks/ui/TrackUI.cpp Normal file
View File

@@ -0,0 +1,62 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackUI.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Track.h"
#include "TrackControls.h"
#include "TrackVRulerControls.h"
#include "../../HitTestResult.h"
#include "../../Project.h"
#include "../../toolbars/ToolsToolBar.h"
HitTestResult Track::HitTest
(const TrackPanelMouseEvent &,
const AudacityProject *pProject)
{
const ToolsToolBar * pTtb = pProject->GetToolsToolBar();
// Unless in Multimode keep using the current tool.
const bool isMultiTool = pTtb->IsDown(multiTool);
if (!isMultiTool) {
switch (pTtb->GetCurrentTool()) {
case selectTool:
case envelopeTool:
case drawTool:
case zoomTool:
case slideTool:
default:
// cases not yet implemented
// fallthru
;
}
}
// Replicate some of the logic of TrackPanel::DetermineToolToUse
HitTestResult result;
if (isMultiTool) {
// To do: special hit tests
}
return result;
}
TrackPanelCell *Track::GetTrackControl()
{
TrackControls *const result = GetControls();
result->mpTrack = this;
return result;
}
TrackPanelCell *Track::GetVRulerControl()
{
TrackVRulerControls *const result = GetVRulerControls();
result->mpTrack = this;
return result;
}

View File

@@ -0,0 +1,33 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackVRulerControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Audacity.h"
#include "../../HitTestResult.h"
#include "TrackVRulerControls.h"
#include <wx/cursor.h>
#include <wx/translation.h>
TrackVRulerControls::~TrackVRulerControls()
{
}
Track *TrackVRulerControls::FindTrack()
{
return GetTrack();
}
HitTestResult TrackVRulerControls::HitTest
(const TrackPanelMouseEvent &event, const AudacityProject *pProject)
{
// Use a space for the tip, otherwise we get the default message.
static wxCursor arrowCursor{ wxCURSOR_ARROW };
return { { _(" "), &arrowCursor }, nullptr };
}

View File

@@ -0,0 +1,40 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackVRulerControls.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TRACK_VRULER_CONTROLS__
#define __AUDACITY_TRACK_VRULER_CONTROLS__
#include "CommonTrackPanelCell.h"
class Track;
class TrackVRulerControls /* not final */ : public CommonTrackPanelCell
{
public:
TrackVRulerControls() : mpTrack(NULL) {}
virtual ~TrackVRulerControls() = 0;
Track *GetTrack() const { return mpTrack; }
// Define a default hit test method, just for message and cursor
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
protected:
Track *FindTrack() override;
friend class Track;
Track *mpTrack;
};
#endif