mirror of
https://github.com/cookiengineer/audacity
synced 2025-10-10 08:33:36 +02:00
Define a base class that will be useful for several track control buttons
This commit is contained in:
committed by
Paul Licameli
parent
f89cbefc7b
commit
d28b8f072b
@@ -1208,6 +1208,7 @@
|
||||
5E7396441DAFD8C600BA0A4D /* TimeShiftHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396421DAFD8C600BA0A4D /* TimeShiftHandle.cpp */; };
|
||||
5E7396471DAFD8F200BA0A4D /* EnvelopeHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396451DAFD8F200BA0A4D /* EnvelopeHandle.cpp */; };
|
||||
5E73964A1DAFD91D00BA0A4D /* CutlineHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */; };
|
||||
5E73964D1DAFD95B00BA0A4D /* ButtonHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */; };
|
||||
5E02BFF21D1164DF00EB7578 /* Distortion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E02BFF01D1164DF00EB7578 /* Distortion.cpp */; };
|
||||
5E07842E1DEE6B8600CA76EA /* FileException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E07842C1DEE6B8600CA76EA /* FileException.cpp */; };
|
||||
5E0784311DF1E4F400CA76EA /* UserException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E07842F1DF1E4F400CA76EA /* UserException.cpp */; };
|
||||
@@ -3013,6 +3014,8 @@
|
||||
5E7396461DAFD8F200BA0A4D /* EnvelopeHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnvelopeHandle.h; sourceTree = "<group>"; };
|
||||
5E7396481DAFD91D00BA0A4D /* CutlineHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CutlineHandle.cpp; sourceTree = "<group>"; };
|
||||
5E7396491DAFD91D00BA0A4D /* CutlineHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CutlineHandle.h; sourceTree = "<group>"; };
|
||||
5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ButtonHandle.cpp; sourceTree = "<group>"; };
|
||||
5E73964C1DAFD95B00BA0A4D /* ButtonHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonHandle.h; sourceTree = "<group>"; };
|
||||
5E02BFF01D1164DF00EB7578 /* Distortion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Distortion.cpp; sourceTree = "<group>"; };
|
||||
5E02BFF11D1164DF00EB7578 /* Distortion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Distortion.h; sourceTree = "<group>"; };
|
||||
5E07842C1DEE6B8600CA76EA /* FileException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileException.cpp; sourceTree = "<group>"; };
|
||||
@@ -5737,6 +5740,7 @@
|
||||
5E74D2DC1CC4429700D88B0B /* ui */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */,
|
||||
5E1512661DB0010C00702E29 /* CommonTrackPanelCell.cpp */,
|
||||
5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */,
|
||||
5E7396451DAFD8F200BA0A4D /* EnvelopeHandle.cpp */,
|
||||
@@ -5747,6 +5751,7 @@
|
||||
5E15126A1DB0010C00702E29 /* TrackUI.cpp */,
|
||||
5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */,
|
||||
5E73963C1DAFD86000BA0A4D /* ZoomHandle.cpp */,
|
||||
5E73964C1DAFD95B00BA0A4D /* ButtonHandle.h */,
|
||||
5E1512671DB0010C00702E29 /* CommonTrackPanelCell.h */,
|
||||
5E74D2DE1CC4429700D88B0B /* EditCursorOverlay.h */,
|
||||
5E7396461DAFD8F200BA0A4D /* EnvelopeHandle.h */,
|
||||
@@ -7661,6 +7666,7 @@
|
||||
5E73964A1DAFD91D00BA0A4D /* CutlineHandle.cpp in Sources */,
|
||||
1790B1A309883BFD008A330A /* Meter.cpp in Sources */,
|
||||
1790B1A409883BFD008A330A /* MultiDialog.cpp in Sources */,
|
||||
5E73964D1DAFD95B00BA0A4D /* ButtonHandle.cpp in Sources */,
|
||||
1790B1A509883BFD008A330A /* Ruler.cpp in Sources */,
|
||||
1790B1A709883BFD008A330A /* Warning.cpp in Sources */,
|
||||
1790B1A909883BFD008A330A /* XMLFileReader.cpp in Sources */,
|
||||
|
@@ -573,6 +573,8 @@ audacity_SOURCES = \
|
||||
tracks/timetrack/ui/TimeTrackUI.cpp \
|
||||
tracks/timetrack/ui/TimeTrackVRulerControls.cpp \
|
||||
tracks/timetrack/ui/TimeTrackVRulerControls.h \
|
||||
tracks/ui/ButtonHandle.h \
|
||||
tracks/ui/ButtonHandle.cpp \
|
||||
tracks/ui/CommonTrackPanelCell.cpp \
|
||||
tracks/ui/CommonTrackPanelCell.h \
|
||||
tracks/ui/EditCursorOverlay.cpp \
|
||||
|
111
src/tracks/ui/ButtonHandle.cpp
Normal file
111
src/tracks/ui/ButtonHandle.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
|
||||
ButtonHandle.cpp
|
||||
|
||||
Paul Licameli
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "ButtonHandle.h"
|
||||
#include "../../HitTestResult.h"
|
||||
#include "../../Project.h"
|
||||
#include "../../RefreshCode.h"
|
||||
#include "../../Track.h"
|
||||
#include "../../TrackPanelMouseEvent.h"
|
||||
#include "../ui/TrackControls.h"
|
||||
|
||||
ButtonHandle::ButtonHandle(int dragCode)
|
||||
: mDragCode(dragCode)
|
||||
{
|
||||
}
|
||||
|
||||
ButtonHandle::~ButtonHandle()
|
||||
{
|
||||
}
|
||||
|
||||
HitTestPreview ButtonHandle::HitPreview()
|
||||
{
|
||||
// No special message or cursor
|
||||
return {};
|
||||
}
|
||||
|
||||
UIHandle::Result ButtonHandle::Click
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *)
|
||||
{
|
||||
const wxMouseEvent &event = evt.event;
|
||||
using namespace RefreshCode;
|
||||
if (!event.Button(wxMOUSE_BTN_LEFT))
|
||||
return Cancelled;
|
||||
|
||||
// Come here for left click or double click
|
||||
if (mRect.Contains(event.m_x, event.m_y)) {
|
||||
mpTrack = static_cast<TrackControls*>(evt.pCell)->GetTrack();
|
||||
TrackControls::gCaptureState = mDragCode;
|
||||
// Toggle visible button state
|
||||
return RefreshCell;
|
||||
}
|
||||
else
|
||||
return Cancelled;
|
||||
}
|
||||
|
||||
UIHandle::Result ButtonHandle::Drag
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *)
|
||||
{
|
||||
const wxMouseEvent &event = evt.event;
|
||||
using namespace RefreshCode;
|
||||
const int newState =
|
||||
mRect.Contains(event.m_x, event.m_y) ? mDragCode : 0;
|
||||
if (TrackControls::gCaptureState == newState)
|
||||
return RefreshNone;
|
||||
else {
|
||||
TrackControls::gCaptureState = newState;
|
||||
return RefreshCell;
|
||||
}
|
||||
}
|
||||
|
||||
HitTestPreview ButtonHandle::Preview
|
||||
(const TrackPanelMouseEvent &, const AudacityProject *)
|
||||
{
|
||||
// No special message or cursor
|
||||
return {};
|
||||
}
|
||||
|
||||
UIHandle::Result ButtonHandle::Release
|
||||
(const TrackPanelMouseEvent &evt, AudacityProject *pProject,
|
||||
wxWindow *pParent)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
Result result = RefreshNone;
|
||||
const wxMouseEvent &event = evt.event;
|
||||
if (TrackControls::gCaptureState) {
|
||||
TrackControls::gCaptureState = 0;
|
||||
result = RefreshCell;
|
||||
}
|
||||
if (mpTrack && mRect.Contains(event.m_x, event.m_y))
|
||||
result |= CommitChanges(event, pProject, pParent);
|
||||
return result;
|
||||
}
|
||||
|
||||
UIHandle::Result ButtonHandle::Cancel(AudacityProject *pProject)
|
||||
{
|
||||
using namespace RefreshCode;
|
||||
if (TrackControls::gCaptureState) {
|
||||
TrackControls::gCaptureState = 0;
|
||||
return RefreshCell;
|
||||
}
|
||||
else
|
||||
return RefreshNone;
|
||||
}
|
||||
|
||||
void ButtonHandle::OnProjectChange(AudacityProject *pProject)
|
||||
{
|
||||
if (! pProject->GetTracks()->Contains(mpTrack)) {
|
||||
mpTrack = nullptr;
|
||||
mRect = {};
|
||||
}
|
||||
|
||||
UIHandle::OnProjectChange(pProject);
|
||||
}
|
||||
|
63
src/tracks/ui/ButtonHandle.h
Normal file
63
src/tracks/ui/ButtonHandle.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
|
||||
ButtonHandle.h
|
||||
|
||||
Paul Licameli
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __AUDACITY_BUTTON_HANDLE__
|
||||
#define __AUDACITY_BUTTON_HANDLE__
|
||||
|
||||
#include "../../UIHandle.h"
|
||||
|
||||
class wxMouseEvent;
|
||||
#include <wx/gdicmn.h>
|
||||
|
||||
class Track;
|
||||
|
||||
class ButtonHandle /* not final */ : public UIHandle
|
||||
{
|
||||
ButtonHandle(const ButtonHandle&) = delete;
|
||||
ButtonHandle &operator=(const ButtonHandle&) = delete;
|
||||
|
||||
protected:
|
||||
explicit ButtonHandle(int dragCode);
|
||||
virtual ~ButtonHandle();
|
||||
|
||||
// This new abstract virtual simplifies the duties of further subclasses.
|
||||
// This class will decide whether to refresh the clicked cell for button state
|
||||
// change.
|
||||
// Subclass can decide to refresh other things and the results will be ORed.
|
||||
virtual Result CommitChanges
|
||||
(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) = 0;
|
||||
|
||||
// For derived class to define hit tests
|
||||
static HitTestPreview HitPreview();
|
||||
|
||||
Result Click
|
||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||
|
||||
Result Drag
|
||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject) override;
|
||||
|
||||
HitTestPreview Preview
|
||||
(const TrackPanelMouseEvent &event, const AudacityProject *pProject)
|
||||
override;
|
||||
|
||||
Result Release
|
||||
(const TrackPanelMouseEvent &event, AudacityProject *pProject,
|
||||
wxWindow *pParent) override;
|
||||
|
||||
Result Cancel(AudacityProject *pProject) override;
|
||||
|
||||
void OnProjectChange(AudacityProject *pProject) override;
|
||||
|
||||
wxRect mRect {};
|
||||
Track *mpTrack {};
|
||||
const int mDragCode;
|
||||
};
|
||||
|
||||
#endif
|
@@ -238,6 +238,7 @@
|
||||
<ClCompile Include="..\..\..\src\tracks\timetrack\ui\TimeTrackControls.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\timetrack\ui\TimeTrackUI.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\timetrack\ui\TimeTrackVRulerControls.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\ui\ButtonHandle.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\ui\CommonTrackPanelCell.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\ui\EditCursorOverlay.cpp" />
|
||||
<ClCompile Include="..\..\..\src\tracks\ui\EnvelopeHandle.cpp" />
|
||||
@@ -502,6 +503,7 @@
|
||||
<ClInclude Include="..\..\..\src\tracks\labeltrack\ui\LabelTrackControls.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\labeltrack\ui\LabelTrackVRulerControls.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\timetrack\ui\TimeTrackControls.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\ui\ButtonHandle.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\ui\EditCursorOverlay.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\ui\EnvelopeHandle.h" />
|
||||
<ClInclude Include="..\..\..\src\tracks\ui\PlayIndicatorOverlay.h" />
|
||||
@@ -1181,4 +1183,4 @@
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="..\..\ny.targets" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
@@ -1004,6 +1004,9 @@
|
||||
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.cpp">
|
||||
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\src\tracks\ui\ButtonHandle.cpp">
|
||||
<Filter>src\tracks\ui</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\src\AboutDialog.h">
|
||||
@@ -2002,6 +2005,9 @@
|
||||
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.h">
|
||||
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\src\tracks\ui\ButtonHandle.h">
|
||||
<Filter>src\tracks\ui</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="..\..\audacity.ico">
|
||||
@@ -2225,4 +2231,4 @@
|
||||
<Filter>plug-ins</Filter>
|
||||
</copy>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
Reference in New Issue
Block a user