1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-22 23:30:07 +02:00

4 "handle" files quit the big strongly connected component...

... They are:

NoteTrackButtonHandle
NoteTrackSliderHandles
PlayableTrackButtonHandles
WaveTrackSliderHandles

Though they are now in small cycles with their respective TrackControls
subclasses.

One new file, TrackInfo, is left behind in the big s.c.c.  Another is
PlayableTrackControls.

This makes the size of the big s.c.c 32, down from 35
This commit is contained in:
Paul Licameli 2019-06-19 14:42:09 -04:00
commit 2d3f9a432a
30 changed files with 1672 additions and 1433 deletions

View File

@ -242,6 +242,8 @@ src/Track.cpp
src/Track.h src/Track.h
src/TrackArtist.cpp src/TrackArtist.cpp
src/TrackArtist.h src/TrackArtist.h
src/TrackInfo.cpp
src/TrackInfo.h
src/TrackPanel.cpp src/TrackPanel.cpp
src/TrackPanel.h src/TrackPanel.h
src/TrackPanelAx.cpp src/TrackPanelAx.cpp
@ -672,6 +674,8 @@ src/tracks/playabletrack/notetrack/ui/StretchHandle.cpp
src/tracks/playabletrack/notetrack/ui/StretchHandle.h src/tracks/playabletrack/notetrack/ui/StretchHandle.h
src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp
src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h
src/tracks/playabletrack/ui/PlayableTrackControls.cpp
src/tracks/playabletrack/ui/PlayableTrackControls.h
src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp src/tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp
src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h src/tracks/playabletrack/wavetrack/ui/CutlineHandle.h
src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp src/tracks/playabletrack/wavetrack/ui/SampleHandle.cpp

View File

@ -1291,6 +1291,7 @@
5EC4257222B92383005E8AB5 /* CommonTrackControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4256E22B92383005E8AB5 /* CommonTrackControls.cpp */; }; 5EC4257222B92383005E8AB5 /* CommonTrackControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4256E22B92383005E8AB5 /* CommonTrackControls.cpp */; };
5EC4257322B92383005E8AB5 /* CommonTrackView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4257022B92383005E8AB5 /* CommonTrackView.cpp */; }; 5EC4257322B92383005E8AB5 /* CommonTrackView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4257022B92383005E8AB5 /* CommonTrackView.cpp */; };
5EC4257922BA7CF2005E8AB5 /* ZoomInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4257722BA7CF2005E8AB5 /* ZoomInfo.cpp */; }; 5EC4257922BA7CF2005E8AB5 /* ZoomInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4257722BA7CF2005E8AB5 /* ZoomInfo.cpp */; };
5EC4257C22BAC86E005E8AB5 /* PlayableTrackControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC4257A22BAC86E005E8AB5 /* PlayableTrackControls.cpp */; };
5EC7ED061E101C5C0052CAE2 /* NotYetAvailableException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */; }; 5EC7ED061E101C5C0052CAE2 /* NotYetAvailableException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */; };
5ECF728722871A4F007F2A35 /* ShuttleGetDefinition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728522871A4F007F2A35 /* ShuttleGetDefinition.cpp */; }; 5ECF728722871A4F007F2A35 /* ShuttleGetDefinition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728522871A4F007F2A35 /* ShuttleGetDefinition.cpp */; };
5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */; }; 5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */; };
@ -1312,6 +1313,7 @@
5EF3E662203FE73C006C6882 /* DragCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF3E660203FE73C006C6882 /* DragCommand.cpp */; }; 5EF3E662203FE73C006C6882 /* DragCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF3E660203FE73C006C6882 /* DragCommand.cpp */; };
5EF5706B22AAAEDA00C4702C /* ProjectFileManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF5706922AAAEDA00C4702C /* ProjectFileManager.cpp */; }; 5EF5706B22AAAEDA00C4702C /* ProjectFileManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF5706922AAAEDA00C4702C /* ProjectFileManager.cpp */; };
5EF958851DEB121800191280 /* InconsistencyException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF958831DEB121800191280 /* InconsistencyException.cpp */; }; 5EF958851DEB121800191280 /* InconsistencyException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EF958831DEB121800191280 /* InconsistencyException.cpp */; };
5EFCC3B322B09CEC0015E2F1 /* TrackInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EFCC3B122B09CEC0015E2F1 /* TrackInfo.cpp */; };
5EFEAD9E22723E390077DFF6 /* Clipboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEAD9C22723E390077DFF6 /* Clipboard.cpp */; }; 5EFEAD9E22723E390077DFF6 /* Clipboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEAD9C22723E390077DFF6 /* Clipboard.cpp */; };
5EFEADA02273382D0077DFF6 /* AudacityApp.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEAD9F2273382D0077DFF6 /* AudacityApp.mm */; }; 5EFEADA02273382D0077DFF6 /* AudacityApp.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEAD9F2273382D0077DFF6 /* AudacityApp.mm */; };
5EFEADA322733DD30077DFF6 /* CrashReport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEADA122733DD30077DFF6 /* CrashReport.cpp */; }; 5EFEADA322733DD30077DFF6 /* CrashReport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EFEADA122733DD30077DFF6 /* CrashReport.cpp */; };
@ -3342,6 +3344,8 @@
5EC4257122B92383005E8AB5 /* CommonTrackView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTrackView.h; sourceTree = "<group>"; }; 5EC4257122B92383005E8AB5 /* CommonTrackView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonTrackView.h; sourceTree = "<group>"; };
5EC4257722BA7CF2005E8AB5 /* ZoomInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZoomInfo.cpp; sourceTree = "<group>"; }; 5EC4257722BA7CF2005E8AB5 /* ZoomInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZoomInfo.cpp; sourceTree = "<group>"; };
5EC4257822BA7CF2005E8AB5 /* ZoomInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZoomInfo.h; sourceTree = "<group>"; }; 5EC4257822BA7CF2005E8AB5 /* ZoomInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZoomInfo.h; sourceTree = "<group>"; };
5EC4257A22BAC86E005E8AB5 /* PlayableTrackControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayableTrackControls.cpp; sourceTree = "<group>"; };
5EC4257B22BAC86E005E8AB5 /* PlayableTrackControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayableTrackControls.h; sourceTree = "<group>"; };
5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotYetAvailableException.cpp; sourceTree = "<group>"; }; 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotYetAvailableException.cpp; sourceTree = "<group>"; };
5EC7ED051E101C5C0052CAE2 /* NotYetAvailableException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotYetAvailableException.h; sourceTree = "<group>"; }; 5EC7ED051E101C5C0052CAE2 /* NotYetAvailableException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotYetAvailableException.h; sourceTree = "<group>"; };
5ECCE7651DE49834009900E9 /* AudacityException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityException.h; sourceTree = "<group>"; }; 5ECCE7651DE49834009900E9 /* AudacityException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityException.h; sourceTree = "<group>"; };
@ -3387,6 +3391,8 @@
5EF5706A22AAAEDA00C4702C /* ProjectFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectFileManager.h; sourceTree = "<group>"; }; 5EF5706A22AAAEDA00C4702C /* ProjectFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectFileManager.h; sourceTree = "<group>"; };
5EF958831DEB121800191280 /* InconsistencyException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InconsistencyException.cpp; sourceTree = "<group>"; }; 5EF958831DEB121800191280 /* InconsistencyException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InconsistencyException.cpp; sourceTree = "<group>"; };
5EF958841DEB121800191280 /* InconsistencyException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InconsistencyException.h; sourceTree = "<group>"; }; 5EF958841DEB121800191280 /* InconsistencyException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InconsistencyException.h; sourceTree = "<group>"; };
5EFCC3B122B09CEC0015E2F1 /* TrackInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackInfo.cpp; sourceTree = "<group>"; };
5EFCC3B222B09CEC0015E2F1 /* TrackInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackInfo.h; sourceTree = "<group>"; };
5EFEAD9C22723E390077DFF6 /* Clipboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Clipboard.cpp; sourceTree = "<group>"; }; 5EFEAD9C22723E390077DFF6 /* Clipboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Clipboard.cpp; sourceTree = "<group>"; };
5EFEAD9D22723E390077DFF6 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = "<group>"; }; 5EFEAD9D22723E390077DFF6 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = "<group>"; };
5EFEAD9F2273382D0077DFF6 /* AudacityApp.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AudacityApp.mm; sourceTree = "<group>"; }; 5EFEAD9F2273382D0077DFF6 /* AudacityApp.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AudacityApp.mm; sourceTree = "<group>"; };
@ -4446,6 +4452,7 @@
1790B0E209883BFD008A330A /* TimeTrack.cpp */, 1790B0E209883BFD008A330A /* TimeTrack.cpp */,
1790B0E809883BFD008A330A /* Track.cpp */, 1790B0E809883BFD008A330A /* Track.cpp */,
1790B0EA09883BFD008A330A /* TrackArtist.cpp */, 1790B0EA09883BFD008A330A /* TrackArtist.cpp */,
5EFCC3B122B09CEC0015E2F1 /* TrackInfo.cpp */,
1790B0EC09883BFD008A330A /* TrackPanel.cpp */, 1790B0EC09883BFD008A330A /* TrackPanel.cpp */,
1790B0EE09883BFD008A330A /* TrackPanelAx.cpp */, 1790B0EE09883BFD008A330A /* TrackPanelAx.cpp */,
5E7396601DAFDB1E00BA0A4D /* TrackPanelResizeHandle.cpp */, 5E7396601DAFDB1E00BA0A4D /* TrackPanelResizeHandle.cpp */,
@ -4579,6 +4586,7 @@
1790B0E309883BFD008A330A /* TimeTrack.h */, 1790B0E309883BFD008A330A /* TimeTrack.h */,
1790B0E909883BFD008A330A /* Track.h */, 1790B0E909883BFD008A330A /* Track.h */,
1790B0EB09883BFD008A330A /* TrackArtist.h */, 1790B0EB09883BFD008A330A /* TrackArtist.h */,
5EFCC3B222B09CEC0015E2F1 /* TrackInfo.h */,
1790B0ED09883BFD008A330A /* TrackPanel.h */, 1790B0ED09883BFD008A330A /* TrackPanel.h */,
1790B0EF09883BFD008A330A /* TrackPanelAx.h */, 1790B0EF09883BFD008A330A /* TrackPanelAx.h */,
5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */, 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */,
@ -6177,7 +6185,9 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5E10D9041EC8F81300B3AC57 /* PlayableTrackButtonHandles.cpp */, 5E10D9041EC8F81300B3AC57 /* PlayableTrackButtonHandles.cpp */,
5EC4257A22BAC86E005E8AB5 /* PlayableTrackControls.cpp */,
5E10D9051EC8F81300B3AC57 /* PlayableTrackButtonHandles.h */, 5E10D9051EC8F81300B3AC57 /* PlayableTrackButtonHandles.h */,
5EC4257B22BAC86E005E8AB5 /* PlayableTrackControls.h */,
); );
path = ui; path = ui;
sourceTree = "<group>"; sourceTree = "<group>";
@ -8493,6 +8503,7 @@
174D9031098C78AF00D5909F /* CommandManager.cpp in Sources */, 174D9031098C78AF00D5909F /* CommandManager.cpp in Sources */,
174D9033098C78AF00D5909F /* Keyboard.cpp in Sources */, 174D9033098C78AF00D5909F /* Keyboard.cpp in Sources */,
283A11AA0A2C0E15004372C4 /* ShuttleGui.cpp in Sources */, 283A11AA0A2C0E15004372C4 /* ShuttleGui.cpp in Sources */,
5EFCC3B322B09CEC0015E2F1 /* TrackInfo.cpp in Sources */,
283A11AB0A2C0E15004372C4 /* Theme.cpp in Sources */, 283A11AB0A2C0E15004372C4 /* Theme.cpp in Sources */,
28456AC20A2C180E00C23C1E /* ThemePrefs.cpp in Sources */, 28456AC20A2C180E00C23C1E /* ThemePrefs.cpp in Sources */,
5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */, 5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */,
@ -8616,6 +8627,7 @@
28D540080FD1912A00FA7C75 /* ScriptCommandRelay.cpp in Sources */, 28D540080FD1912A00FA7C75 /* ScriptCommandRelay.cpp in Sources */,
5E73963E1DAFD86000BA0A4D /* ZoomHandle.cpp in Sources */, 5E73963E1DAFD86000BA0A4D /* ZoomHandle.cpp in Sources */,
28DB34790FDC2C5D0011F589 /* ResponseQueue.cpp in Sources */, 28DB34790FDC2C5D0011F589 /* ResponseQueue.cpp in Sources */,
5EC4257C22BAC86E005E8AB5 /* PlayableTrackControls.cpp in Sources */,
28DABFBE0FF19DB100AC7848 /* RealFFTf.cpp in Sources */, 28DABFBE0FF19DB100AC7848 /* RealFFTf.cpp in Sources */,
2800FE370FF32566005CA9E5 /* MidiIOPrefs.cpp in Sources */, 2800FE370FF32566005CA9E5 /* MidiIOPrefs.cpp in Sources */,
5EA0182B1EC7B226001F2996 /* WaveTrackControls.cpp in Sources */, 5EA0182B1EC7B226001F2996 /* WaveTrackControls.cpp in Sources */,

View File

@ -288,6 +288,8 @@ audacity_SOURCES = \
Track.h \ Track.h \
TrackArtist.cpp \ TrackArtist.cpp \
TrackArtist.h \ TrackArtist.h \
TrackInfo.cpp \
TrackInfo.h \
TrackPanel.cpp \ TrackPanel.cpp \
TrackPanel.h \ TrackPanel.h \
TrackPanelAx.cpp \ TrackPanelAx.cpp \
@ -654,6 +656,8 @@ audacity_SOURCES = \
tracks/playabletrack/notetrack/ui/StretchHandle.h \ tracks/playabletrack/notetrack/ui/StretchHandle.h \
tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \ tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \
tracks/playabletrack/ui/PlayableTrackButtonHandles.h \ tracks/playabletrack/ui/PlayableTrackButtonHandles.h \
tracks/playabletrack/ui/PlayableTrackControls.cpp \
tracks/playabletrack/ui/PlayableTrackControls.h \
tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \ tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \
tracks/playabletrack/wavetrack/ui/CutlineHandle.h \ tracks/playabletrack/wavetrack/ui/CutlineHandle.h \
tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \ tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \

View File

@ -341,13 +341,13 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \
ThemeAsCeeCode.h TimeDialog.cpp TimeDialog.h \ ThemeAsCeeCode.h TimeDialog.cpp TimeDialog.h \
TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \ TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \
TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \
TrackPanel.cpp TrackPanel.h TrackPanelAx.cpp TrackPanelAx.h \ TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \
TrackPanelCell.h TrackPanelDrawingContext.h \ TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \
TrackPanelListener.h TrackPanelMouseEvent.h \ TrackPanelDrawingContext.h TrackPanelListener.h \
TrackPanelResizeHandle.cpp TrackPanelResizeHandle.h \ TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \
TrackPanelResizerCell.cpp TrackPanelResizerCell.h \ TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \
TranslatableStringArray.h UIHandle.h UIHandle.cpp \ TrackPanelResizerCell.h TranslatableStringArray.h UIHandle.h \
UndoManager.cpp UndoManager.h UserException.cpp \ UIHandle.cpp UndoManager.cpp UndoManager.h UserException.cpp \
UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \ UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \
VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \ VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \
WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \ WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \
@ -520,6 +520,8 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \
tracks/playabletrack/notetrack/ui/StretchHandle.h \ tracks/playabletrack/notetrack/ui/StretchHandle.h \
tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \ tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \
tracks/playabletrack/ui/PlayableTrackButtonHandles.h \ tracks/playabletrack/ui/PlayableTrackButtonHandles.h \
tracks/playabletrack/ui/PlayableTrackControls.cpp \
tracks/playabletrack/ui/PlayableTrackControls.h \
tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \ tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \
tracks/playabletrack/wavetrack/ui/CutlineHandle.h \ tracks/playabletrack/wavetrack/ui/CutlineHandle.h \
tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \ tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \
@ -700,8 +702,8 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \
audacity-Theme.$(OBJEXT) audacity-TimeDialog.$(OBJEXT) \ audacity-Theme.$(OBJEXT) audacity-TimeDialog.$(OBJEXT) \
audacity-TimerRecordDialog.$(OBJEXT) \ audacity-TimerRecordDialog.$(OBJEXT) \
audacity-TimeTrack.$(OBJEXT) audacity-Track.$(OBJEXT) \ audacity-TimeTrack.$(OBJEXT) audacity-Track.$(OBJEXT) \
audacity-TrackArtist.$(OBJEXT) audacity-TrackPanel.$(OBJEXT) \ audacity-TrackArtist.$(OBJEXT) audacity-TrackInfo.$(OBJEXT) \
audacity-TrackPanelAx.$(OBJEXT) \ audacity-TrackPanel.$(OBJEXT) audacity-TrackPanelAx.$(OBJEXT) \
audacity-TrackPanelResizeHandle.$(OBJEXT) \ audacity-TrackPanelResizeHandle.$(OBJEXT) \
audacity-TrackPanelResizerCell.$(OBJEXT) \ audacity-TrackPanelResizerCell.$(OBJEXT) \
audacity-UIHandle.$(OBJEXT) audacity-UndoManager.$(OBJEXT) \ audacity-UIHandle.$(OBJEXT) audacity-UndoManager.$(OBJEXT) \
@ -879,6 +881,7 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \
tracks/playabletrack/notetrack/ui/audacity-NoteTrackVZoomHandle.$(OBJEXT) \ tracks/playabletrack/notetrack/ui/audacity-NoteTrackVZoomHandle.$(OBJEXT) \
tracks/playabletrack/notetrack/ui/audacity-StretchHandle.$(OBJEXT) \ tracks/playabletrack/notetrack/ui/audacity-StretchHandle.$(OBJEXT) \
tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.$(OBJEXT) \ tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.$(OBJEXT) \
tracks/playabletrack/ui/audacity-PlayableTrackControls.$(OBJEXT) \
tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.$(OBJEXT) \ tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.$(OBJEXT) \
tracks/playabletrack/wavetrack/ui/audacity-SampleHandle.$(OBJEXT) \ tracks/playabletrack/wavetrack/ui/audacity-SampleHandle.$(OBJEXT) \
tracks/playabletrack/wavetrack/ui/audacity-WaveTrackControls.$(OBJEXT) \ tracks/playabletrack/wavetrack/ui/audacity-WaveTrackControls.$(OBJEXT) \
@ -1431,13 +1434,13 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \
ThemeAsCeeCode.h TimeDialog.cpp TimeDialog.h \ ThemeAsCeeCode.h TimeDialog.cpp TimeDialog.h \
TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \ TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \
TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \
TrackPanel.cpp TrackPanel.h TrackPanelAx.cpp TrackPanelAx.h \ TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \
TrackPanelCell.h TrackPanelDrawingContext.h \ TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \
TrackPanelListener.h TrackPanelMouseEvent.h \ TrackPanelDrawingContext.h TrackPanelListener.h \
TrackPanelResizeHandle.cpp TrackPanelResizeHandle.h \ TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \
TrackPanelResizerCell.cpp TrackPanelResizerCell.h \ TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \
TranslatableStringArray.h UIHandle.h UIHandle.cpp \ TrackPanelResizerCell.h TranslatableStringArray.h UIHandle.h \
UndoManager.cpp UndoManager.h UserException.cpp \ UIHandle.cpp UndoManager.cpp UndoManager.h UserException.cpp \
UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \ UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \
VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \ VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \
WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \ WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \
@ -1611,6 +1614,8 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \
tracks/playabletrack/notetrack/ui/StretchHandle.h \ tracks/playabletrack/notetrack/ui/StretchHandle.h \
tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \ tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp \
tracks/playabletrack/ui/PlayableTrackButtonHandles.h \ tracks/playabletrack/ui/PlayableTrackButtonHandles.h \
tracks/playabletrack/ui/PlayableTrackControls.cpp \
tracks/playabletrack/ui/PlayableTrackControls.h \
tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \ tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp \
tracks/playabletrack/wavetrack/ui/CutlineHandle.h \ tracks/playabletrack/wavetrack/ui/CutlineHandle.h \
tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \ tracks/playabletrack/wavetrack/ui/SampleHandle.cpp \
@ -2281,6 +2286,9 @@ tracks/playabletrack/ui/$(DEPDIR)/$(am__dirstamp):
tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.$(OBJEXT): \ tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.$(OBJEXT): \
tracks/playabletrack/ui/$(am__dirstamp) \ tracks/playabletrack/ui/$(am__dirstamp) \
tracks/playabletrack/ui/$(DEPDIR)/$(am__dirstamp) tracks/playabletrack/ui/$(DEPDIR)/$(am__dirstamp)
tracks/playabletrack/ui/audacity-PlayableTrackControls.$(OBJEXT): \
tracks/playabletrack/ui/$(am__dirstamp) \
tracks/playabletrack/ui/$(DEPDIR)/$(am__dirstamp)
tracks/playabletrack/wavetrack/ui/$(am__dirstamp): tracks/playabletrack/wavetrack/ui/$(am__dirstamp):
@$(MKDIR_P) tracks/playabletrack/wavetrack/ui @$(MKDIR_P) tracks/playabletrack/wavetrack/ui
@: > tracks/playabletrack/wavetrack/ui/$(am__dirstamp) @: > tracks/playabletrack/wavetrack/ui/$(am__dirstamp)
@ -2642,6 +2650,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TimerRecordDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TimerRecordDialog.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Track.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Track.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackArtist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackArtist.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackInfo.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanel.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanelAx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanelAx.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanelResizeHandle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-TrackPanelResizeHandle.Po@am__quote@
@ -2866,6 +2875,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/notetrack/ui/$(DEPDIR)/audacity-NoteTrackView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/notetrack/ui/$(DEPDIR)/audacity-NoteTrackView.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/notetrack/ui/$(DEPDIR)/audacity-StretchHandle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/notetrack/ui/$(DEPDIR)/audacity-StretchHandle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackButtonHandles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackButtonHandles.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-SampleHandle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-SampleHandle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-WaveTrackControls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-WaveTrackControls.Po@am__quote@
@ -4554,6 +4564,20 @@ audacity-TrackArtist.obj: TrackArtist.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-TrackArtist.obj `if test -f 'TrackArtist.cpp'; then $(CYGPATH_W) 'TrackArtist.cpp'; else $(CYGPATH_W) '$(srcdir)/TrackArtist.cpp'; fi` @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-TrackArtist.obj `if test -f 'TrackArtist.cpp'; then $(CYGPATH_W) 'TrackArtist.cpp'; else $(CYGPATH_W) '$(srcdir)/TrackArtist.cpp'; fi`
audacity-TrackInfo.o: TrackInfo.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-TrackInfo.o -MD -MP -MF $(DEPDIR)/audacity-TrackInfo.Tpo -c -o audacity-TrackInfo.o `test -f 'TrackInfo.cpp' || echo '$(srcdir)/'`TrackInfo.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-TrackInfo.Tpo $(DEPDIR)/audacity-TrackInfo.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TrackInfo.cpp' object='audacity-TrackInfo.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-TrackInfo.o `test -f 'TrackInfo.cpp' || echo '$(srcdir)/'`TrackInfo.cpp
audacity-TrackInfo.obj: TrackInfo.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-TrackInfo.obj -MD -MP -MF $(DEPDIR)/audacity-TrackInfo.Tpo -c -o audacity-TrackInfo.obj `if test -f 'TrackInfo.cpp'; then $(CYGPATH_W) 'TrackInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/TrackInfo.cpp'; fi`
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-TrackInfo.Tpo $(DEPDIR)/audacity-TrackInfo.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TrackInfo.cpp' object='audacity-TrackInfo.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-TrackInfo.obj `if test -f 'TrackInfo.cpp'; then $(CYGPATH_W) 'TrackInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/TrackInfo.cpp'; fi`
audacity-TrackPanel.o: TrackPanel.cpp audacity-TrackPanel.o: TrackPanel.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-TrackPanel.o -MD -MP -MF $(DEPDIR)/audacity-TrackPanel.Tpo -c -o audacity-TrackPanel.o `test -f 'TrackPanel.cpp' || echo '$(srcdir)/'`TrackPanel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-TrackPanel.o -MD -MP -MF $(DEPDIR)/audacity-TrackPanel.Tpo -c -o audacity-TrackPanel.o `test -f 'TrackPanel.cpp' || echo '$(srcdir)/'`TrackPanel.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-TrackPanel.Tpo $(DEPDIR)/audacity-TrackPanel.Po @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-TrackPanel.Tpo $(DEPDIR)/audacity-TrackPanel.Po
@ -7116,6 +7140,20 @@ tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.obj: tracks/playable
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.obj `if test -f 'tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; then $(CYGPATH_W) 'tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; else $(CYGPATH_W) '$(srcdir)/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; fi` @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o tracks/playabletrack/ui/audacity-PlayableTrackButtonHandles.obj `if test -f 'tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; then $(CYGPATH_W) 'tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; else $(CYGPATH_W) '$(srcdir)/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp'; fi`
tracks/playabletrack/ui/audacity-PlayableTrackControls.o: tracks/playabletrack/ui/PlayableTrackControls.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT tracks/playabletrack/ui/audacity-PlayableTrackControls.o -MD -MP -MF tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Tpo -c -o tracks/playabletrack/ui/audacity-PlayableTrackControls.o `test -f 'tracks/playabletrack/ui/PlayableTrackControls.cpp' || echo '$(srcdir)/'`tracks/playabletrack/ui/PlayableTrackControls.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Tpo tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='tracks/playabletrack/ui/PlayableTrackControls.cpp' object='tracks/playabletrack/ui/audacity-PlayableTrackControls.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o tracks/playabletrack/ui/audacity-PlayableTrackControls.o `test -f 'tracks/playabletrack/ui/PlayableTrackControls.cpp' || echo '$(srcdir)/'`tracks/playabletrack/ui/PlayableTrackControls.cpp
tracks/playabletrack/ui/audacity-PlayableTrackControls.obj: tracks/playabletrack/ui/PlayableTrackControls.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT tracks/playabletrack/ui/audacity-PlayableTrackControls.obj -MD -MP -MF tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Tpo -c -o tracks/playabletrack/ui/audacity-PlayableTrackControls.obj `if test -f 'tracks/playabletrack/ui/PlayableTrackControls.cpp'; then $(CYGPATH_W) 'tracks/playabletrack/ui/PlayableTrackControls.cpp'; else $(CYGPATH_W) '$(srcdir)/tracks/playabletrack/ui/PlayableTrackControls.cpp'; fi`
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Tpo tracks/playabletrack/ui/$(DEPDIR)/audacity-PlayableTrackControls.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='tracks/playabletrack/ui/PlayableTrackControls.cpp' object='tracks/playabletrack/ui/audacity-PlayableTrackControls.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o tracks/playabletrack/ui/audacity-PlayableTrackControls.obj `if test -f 'tracks/playabletrack/ui/PlayableTrackControls.cpp'; then $(CYGPATH_W) 'tracks/playabletrack/ui/PlayableTrackControls.cpp'; else $(CYGPATH_W) '$(srcdir)/tracks/playabletrack/ui/PlayableTrackControls.cpp'; fi`
tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o: tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o: tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o -MD -MP -MF tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Tpo -c -o tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o `test -f 'tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp' || echo '$(srcdir)/'`tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o -MD -MP -MF tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Tpo -c -o tracks/playabletrack/wavetrack/ui/audacity-CutlineHandle.o `test -f 'tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp' || echo '$(srcdir)/'`tracks/playabletrack/wavetrack/ui/CutlineHandle.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Tpo tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Po @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Tpo tracks/playabletrack/wavetrack/ui/$(DEPDIR)/audacity-CutlineHandle.Po

View File

@ -859,10 +859,8 @@ END_EVENT_TABLE()
void ProjectWindow::ApplyUpdatedTheme() void ProjectWindow::ApplyUpdatedTheme()
{ {
auto &project = mProject; auto &project = mProject;
auto &trackPanel = TrackPanel::Get( project );
SetBackgroundColour(theTheme.Colour( clrMedium )); SetBackgroundColour(theTheme.Colour( clrMedium ));
ClearBackground();// For wxGTK. ClearBackground();// For wxGTK.
trackPanel.ApplyUpdatedTheme();
} }
void ProjectWindow::RedrawProject(const bool bForceWaveTracks /*= false*/) void ProjectWindow::RedrawProject(const bool bForceWaveTracks /*= false*/)

640
src/TrackInfo.cpp Normal file
View File

@ -0,0 +1,640 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackInfo.h
Paul Licameli split from TrackPanel.cpp
********************************************************************//*!
\namespace TrackInfo
\brief
Functions for drawing the track control panel, which is shown to the side
of a track
It has the menus, pan and gain controls displayed in it.
So "Info" is somewhat a misnomer. Should possibly be "TrackControls".
It maintains global slider widget instances that are reparented and
repositioned as needed for drawing and interaction with the user,
interoperating with the custom panel subdivision implemented in CellularPanel
and avoiding wxWidgets sizers
If we'd instead coded it as a wxWindow, we would have an instance
of this class for each track displayed.
**********************************************************************/
#include "Audacity.h"
#include "TrackInfo.h"
#include "Experimental.h"
#include <wx/dc.h>
#include <wx/frame.h>
#include "AColor.h"
#include "AllThemeResources.h"
#include "NoteTrack.h"
#include "Project.h"
#include "TrackPanelDrawingContext.h"
#include "ViewInfo.h"
#include "WaveTrack.h"
#include "tracks/ui/TrackView.h"
#include "widgets/ASlider.h"
static wxString gSoloPref;
bool TrackInfo::HasSoloButton()
{
return gSoloPref!=wxT("None");
}
#define RANGE(array) (array), (array) + sizeof(array)/sizeof(*(array))
using TCPLine = TrackInfo::TCPLine;
using TCPLines = TrackInfo::TCPLines;
static const TCPLines &commonTrackTCPLines()
{
static const TCPLines theLines{
#ifdef EXPERIMENTAL_DA
{ TCPLine::kItemBarButtons, kTrackInfoBtnSize, 4,
&TrackInfo::CloseTitleDrawFunction },
#else
{ TCPLine::kItemBarButtons, kTrackInfoBtnSize, 0,
&TrackInfo::CloseTitleDrawFunction },
#endif
};
return theLines;
}
#include "tracks/ui/CommonTrackControls.h"
const TCPLines &CommonTrackControls::StaticTCPLines()
{
return commonTrackTCPLines();
}
namespace {
int totalTCPLines( const TCPLines &lines, bool omitLastExtra )
{
int total = 0;
int lastExtra = 0;
for ( const auto line : lines ) {
lastExtra = line.extraSpace;
total += line.height + lastExtra;
}
if (omitLastExtra)
total -= lastExtra;
return total;
}
}
// return y value and height
std::pair< int, int >
TrackInfo::CalcItemY( const TCPLines &lines, unsigned iItem )
{
int y = 0;
auto pLines = lines.begin();
while ( pLines != lines.end() &&
0 == (pLines->items & iItem) ) {
y += pLines->height + pLines->extraSpace;
++pLines;
}
int height = 0;
if ( pLines != lines.end() )
height = pLines->height;
return { y, height };
}
namespace {
// Items for the bottom of the panel, listed bottom-upwards
// As also with the top items, the extra space is below the item
const TrackInfo::TCPLine defaultCommonTrackTCPBottomLines[] = {
// The '0' avoids impinging on bottom line of TCP
// Use -1 if you do want to do so.
{ TCPLine::kItemSyncLock | TCPLine::kItemMinimize, kTrackInfoBtnSize, 0,
&TrackInfo::MinimizeSyncLockDrawFunction },
};
TCPLines commonTrackTCPBottomLines{ RANGE(defaultCommonTrackTCPBottomLines) };
// return y value and height
std::pair< int, int > CalcBottomItemY
( const TCPLines &lines, unsigned iItem, int height )
{
int y = height;
auto pLines = lines.begin();
while ( pLines != lines.end() &&
0 == (pLines->items & iItem) ) {
y -= pLines->height + pLines->extraSpace;
++pLines;
}
if (pLines != lines.end())
y -= (pLines->height + pLines->extraSpace );
return { y, pLines->height };
}
}
const TCPLines &CommonTrackControls::GetTCPLines() const
{
return commonTrackTCPLines();
}
unsigned TrackInfo::MinimumTrackHeight()
{
unsigned height = 0;
if (!commonTrackTCPLines().empty())
height += commonTrackTCPLines().front().height;
if (!commonTrackTCPBottomLines.empty())
height += commonTrackTCPBottomLines.front().height;
// + 1 prevents the top item from disappearing for want of enough space,
// according to the rules in HideTopItem.
return height + kTopMargin + kBottomMargin + 1;
}
bool TrackInfo::HideTopItem( const wxRect &rect, const wxRect &subRect,
int allowance ) {
auto limit = CalcBottomItemY
( commonTrackTCPBottomLines, TCPLine::kHighestBottomItem, rect.height).first;
// Return true if the rectangle is even touching the limit
// without an overlap. That was the behavior as of 2.1.3.
return subRect.y + subRect.height - allowance >= rect.y + limit;
}
void TrackInfo::DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track &track )
{
auto &trackControl = static_cast<const CommonTrackControls&>(
TrackControls::Get( track ) );
const auto &topLines = trackControl.GetTCPLines();
const auto &bottomLines = commonTrackTCPBottomLines;
DrawItems
( context, rect, &track, topLines, bottomLines );
}
void TrackInfo::DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack,
const std::vector<TCPLine> &topLines, const std::vector<TCPLine> &bottomLines )
{
auto dc = &context.dc;
TrackInfo::SetTrackInfoFont(dc);
dc->SetTextForeground(theTheme.Colour(clrTrackPanelText));
{
int yy = 0;
for ( const auto &line : topLines ) {
wxRect itemRect{
rect.x, rect.y + yy,
rect.width, line.height
};
if ( !TrackInfo::HideTopItem( rect, itemRect ) &&
line.drawFunction )
line.drawFunction( context, itemRect, pTrack );
yy += line.height + line.extraSpace;
}
}
{
int yy = rect.height;
for ( const auto &line : bottomLines ) {
yy -= line.height + line.extraSpace;
if ( line.drawFunction ) {
wxRect itemRect{
rect.x, rect.y + yy,
rect.width, line.height
};
line.drawFunction( context, itemRect, pTrack );
}
}
}
}
#include "tracks/ui/TrackButtonHandles.h"
void TrackInfo::CloseTitleDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
bool selected = pTrack ? pTrack->GetSelected() : true;
{
wxRect bev = rect;
GetCloseBoxHorizontalBounds( rect, bev );
auto target = dynamic_cast<CloseButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
AColor::Bevel2(*dc, !down, bev, selected, hit );
#ifdef EXPERIMENTAL_THEMING
wxPen pen( theTheme.Colour( clrTrackPanelText ));
dc->SetPen( pen );
#else
dc->SetPen(*wxBLACK_PEN);
#endif
bev.Inflate( -1, -1 );
// Draw the "X"
const int s = 6;
int ls = bev.x + ((bev.width - s) / 2);
int ts = bev.y + ((bev.height - s) / 2);
int rs = ls + s;
int bs = ts + s;
AColor::Line(*dc, ls, ts, rs, bs);
AColor::Line(*dc, ls + 1, ts, rs + 1, bs);
AColor::Line(*dc, rs, ts, ls, bs);
AColor::Line(*dc, rs + 1, ts, ls + 1, bs);
// bev.Inflate(-1, -1);
}
{
wxRect bev = rect;
GetTitleBarHorizontalBounds( rect, bev );
auto target = dynamic_cast<MenuButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
wxString titleStr =
pTrack ? pTrack->GetName() : _("Name");
//bev.Inflate(-1, -1);
AColor::Bevel2(*dc, !down, bev, selected, hit);
// Draw title text
SetTrackInfoFont(dc);
// Bug 1660 The 'k' of 'Audio Track' was being truncated.
// Constant of 32 found by counting pixels on a windows machine.
// I believe it's the size of the X close button + the size of the
// drop down arrow.
int allowableWidth = rect.width - 32;
wxCoord textWidth, textHeight;
dc->GetTextExtent(titleStr, &textWidth, &textHeight);
while (textWidth > allowableWidth) {
titleStr = titleStr.Left(titleStr.length() - 1);
dc->GetTextExtent(titleStr, &textWidth, &textHeight);
}
// Pop-up triangle
#ifdef EXPERIMENTAL_THEMING
wxColour c = theTheme.Colour( clrTrackPanelText );
#else
wxColour c = *wxBLACK;
#endif
// wxGTK leaves little scraps (antialiasing?) of the
// characters if they are repeatedly drawn. This
// happens when holding down mouse button and moving
// in and out of the title bar. So clear it first.
// AColor::MediumTrackInfo(dc, t->GetSelected());
// dc->DrawRectangle(bev);
dc->SetTextForeground( c );
dc->SetTextBackground( wxTRANSPARENT );
dc->DrawText(titleStr, bev.x + 2, bev.y + (bev.height - textHeight) / 2);
dc->SetPen(c);
dc->SetBrush(c);
int s = 10; // Width of dropdown arrow...height is half of width
AColor::Arrow(*dc,
bev.GetRight() - s - 3, // 3 to offset from right border
bev.y + ((bev.height - (s / 2)) / 2),
s);
}
}
void TrackInfo::MinimizeSyncLockDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
bool selected = pTrack ? pTrack->GetSelected() : true;
bool syncLockSelected = pTrack ? pTrack->IsSyncLockSelected() : true;
bool minimized =
pTrack ? TrackView::Get( *pTrack ).GetMinimized() : false;
{
wxRect bev = rect;
GetMinimizeHorizontalBounds(rect, bev);
auto target = dynamic_cast<MinimizeButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
// Clear background to get rid of previous arrow
//AColor::MediumTrackInfo(dc, t->GetSelected());
//dc->DrawRectangle(bev);
AColor::Bevel2(*dc, !down, bev, selected, hit);
#ifdef EXPERIMENTAL_THEMING
wxColour c = theTheme.Colour(clrTrackPanelText);
dc->SetBrush(c);
dc->SetPen(c);
#else
AColor::Dark(dc, selected);
#endif
AColor::Arrow(*dc,
bev.x - 5 + bev.width / 2,
bev.y - 2 + bev.height / 2,
10,
minimized);
}
{
wxRect bev = rect;
GetSelectButtonHorizontalBounds(rect, bev);
auto target = dynamic_cast<SelectButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
AColor::Bevel2(*dc, !down, bev, selected, hit);
#ifdef EXPERIMENTAL_THEMING
wxColour c = theTheme.Colour(clrTrackPanelText);
dc->SetBrush(c);
dc->SetPen(c);
#else
AColor::Dark(dc, selected);
#endif
wxString str = _("Select");
wxCoord textWidth;
wxCoord textHeight;
SetTrackInfoFont(dc);
dc->GetTextExtent(str, &textWidth, &textHeight);
dc->SetTextForeground( c );
dc->SetTextBackground( wxTRANSPARENT );
dc->DrawText(str, bev.x + 2 + (bev.width-textWidth)/2, bev.y + (bev.height - textHeight) / 2);
}
// Draw the sync-lock indicator if this track is in a sync-lock selected group.
if (syncLockSelected)
{
wxRect syncLockIconRect = rect;
GetSyncLockHorizontalBounds( rect, syncLockIconRect );
wxBitmap syncLockBitmap(theTheme.Image(bmpSyncLockIcon));
// Icon is 12x12 and syncLockIconRect is 16x16.
dc->DrawBitmap(syncLockBitmap,
syncLockIconRect.x + 3,
syncLockIconRect.y + 2,
true);
}
}
namespace {
wxFont gFont;
}
void TrackInfo::GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest )
{
dest.x = rect.x;
dest.width = kTrackInfoBtnSize;
}
void TrackInfo::GetCloseBoxRect(const wxRect & rect, wxRect & dest)
{
GetCloseBoxHorizontalBounds( rect, dest );
auto results = CalcItemY( commonTrackTCPLines(), TCPLine::kItemBarButtons );
dest.y = rect.y + results.first;
dest.height = results.second;
}
void TrackInfo::GetTitleBarHorizontalBounds( const wxRect & rect, wxRect &dest )
{
// to right of CloseBoxRect, plus a little more
wxRect closeRect;
GetCloseBoxHorizontalBounds( rect, closeRect );
dest.x = rect.x + closeRect.width + 1;
dest.width = rect.x + rect.width - dest.x + TitleSoloBorderOverlap;
}
void TrackInfo::GetTitleBarRect(const wxRect & rect, wxRect & dest)
{
GetTitleBarHorizontalBounds( rect, dest );
auto results = CalcItemY( commonTrackTCPLines(), TCPLine::kItemBarButtons );
dest.y = rect.y + results.first;
dest.height = results.second;
}
void TrackInfo::GetSliderHorizontalBounds( const wxPoint &topleft, wxRect &dest )
{
dest.x = topleft.x + 6;
dest.width = kTrackInfoSliderWidth;
}
void TrackInfo::GetMinimizeHorizontalBounds( const wxRect &rect, wxRect &dest )
{
const int space = 0;// was 3.
dest.x = rect.x + space;
wxRect syncLockRect;
GetSyncLockHorizontalBounds( rect, syncLockRect );
// Width is rect.width less space on left for track select
// and on right for sync-lock icon.
dest.width = kTrackInfoBtnSize;
// rect.width - (space + syncLockRect.width);
}
void TrackInfo::GetMinimizeRect(const wxRect & rect, wxRect &dest)
{
GetMinimizeHorizontalBounds( rect, dest );
auto results = CalcBottomItemY
( commonTrackTCPBottomLines, TCPLine::kItemMinimize, rect.height);
dest.y = rect.y + results.first;
dest.height = results.second;
}
void TrackInfo::GetSelectButtonHorizontalBounds( const wxRect &rect, wxRect &dest )
{
const int space = 0;// was 3.
dest.x = rect.x + space;
wxRect syncLockRect;
GetSyncLockHorizontalBounds( rect, syncLockRect );
wxRect minimizeRect;
GetMinimizeHorizontalBounds( rect, minimizeRect );
dest.x = dest.x + space + minimizeRect.width;
// Width is rect.width less space on left for track select
// and on right for sync-lock icon.
dest.width = rect.width - (space + syncLockRect.width) - (space + minimizeRect.width);
}
void TrackInfo::GetSelectButtonRect(const wxRect & rect, wxRect &dest)
{
GetSelectButtonHorizontalBounds( rect, dest );
auto results = CalcBottomItemY
( commonTrackTCPBottomLines, TCPLine::kItemMinimize, rect.height);
dest.y = rect.y + results.first;
dest.height = results.second;
}
void TrackInfo::GetSyncLockHorizontalBounds( const wxRect &rect, wxRect &dest )
{
dest.width = kTrackInfoBtnSize;
dest.x = rect.x + rect.width - dest.width;
}
void TrackInfo::GetSyncLockIconRect(const wxRect & rect, wxRect &dest)
{
GetSyncLockHorizontalBounds( rect, dest );
auto results = CalcBottomItemY
( commonTrackTCPBottomLines, TCPLine::kItemSyncLock, rect.height);
dest.y = rect.y + results.first;
dest.height = results.second;
}
/// \todo Probably should move to 'Utils.cpp'.
void TrackInfo::SetTrackInfoFont(wxDC * dc)
{
dc->SetFont(gFont);
}
#if 0
void TrackInfo::DrawBordersWithin
( wxDC* dc, const wxRect & rect, const Track &track ) const
{
AColor::Dark(dc, false); // same color as border of toolbars (ToolBar::OnPaint())
// below close box and title bar
wxRect buttonRect;
GetTitleBarRect( rect, buttonRect );
AColor::Line
(*dc, rect.x, buttonRect.y + buttonRect.height,
rect.width - 1, buttonRect.y + buttonRect.height);
// between close box and title bar
AColor::Line
(*dc, buttonRect.x, buttonRect.y,
buttonRect.x, buttonRect.y + buttonRect.height - 1);
GetMuteSoloRect( rect, buttonRect, false, true, &track );
bool bHasMuteSolo = dynamic_cast<const PlayableTrack*>( &track ) != NULL;
if( bHasMuteSolo && !TrackInfo::HideTopItem( rect, buttonRect ) )
{
// above mute/solo
AColor::Line
(*dc, rect.x, buttonRect.y,
rect.width - 1, buttonRect.y);
// between mute/solo
// Draw this little line; if there is no solo, wide mute button will
// overpaint it later:
AColor::Line
(*dc, buttonRect.x + buttonRect.width, buttonRect.y,
buttonRect.x + buttonRect.width, buttonRect.y + buttonRect.height - 1);
// below mute/solo
AColor::Line
(*dc, rect.x, buttonRect.y + buttonRect.height,
rect.width - 1, buttonRect.y + buttonRect.height);
}
// left of and above minimize button
wxRect minimizeRect;
this->GetMinimizeRect(rect, minimizeRect);
AColor::Line
(*dc, minimizeRect.x - 1, minimizeRect.y,
minimizeRect.x - 1, minimizeRect.y + minimizeRect.height - 1);
AColor::Line
(*dc, minimizeRect.x, minimizeRect.y - 1,
minimizeRect.x + minimizeRect.width - 1, minimizeRect.y - 1);
}
#endif
//#define USE_BEVELS
// Paint the whole given rectangle some fill color
void TrackInfo::DrawBackground(
wxDC * dc, const wxRect & rect, bool bSelected, const int vrul)
{
// fill in label
wxRect fill = rect;
fill.width = vrul - kLeftMargin;
AColor::MediumTrackInfo(dc, bSelected);
dc->DrawRectangle(fill);
#ifdef USE_BEVELS
// This branch is not now used
// PRL: todo: banish magic numbers.
// PRL: vrul was the x coordinate of left edge of the vertical ruler.
// PRL: bHasMuteSolo was true iff the track was WaveTrack.
if( bHasMuteSolo )
{
int ylast = rect.height-20;
int ybutton = wxMin(32,ylast-17);
int ybuttonEnd = 67;
fill=wxRect( rect.x+1, rect.y+17, vrul-6, ybutton);
AColor::BevelTrackInfo( *dc, true, fill );
if( ybuttonEnd < ylast ){
fill=wxRect( rect.x+1, rect.y+ybuttonEnd, fill.width, ylast - ybuttonEnd);
AColor::BevelTrackInfo( *dc, true, fill );
}
}
else
{
fill=wxRect( rect.x+1, rect.y+17, vrul-6, rect.height-37);
AColor::BevelTrackInfo( *dc, true, fill );
}
#endif
}
unsigned TrackInfo::DefaultTrackHeight( const TCPLines &topLines )
{
int needed =
kTopMargin + kBottomMargin +
totalTCPLines( topLines, true ) +
totalTCPLines( commonTrackTCPBottomLines, false ) + 1;
return (unsigned) std::max( needed, (int) TrackView::DefaultHeight );
}
void TrackInfo::UpdatePrefs( wxWindow *pParent )
{
gPrefs->Read(wxT("/GUI/Solo"), &gSoloPref, wxT("Simple"));
// Calculation of best font size depends on language, so it should be redone in case
// the language preference changed.
int fontSize = 10;
gFont.Create(fontSize, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
int allowableWidth =
// PRL: was it correct to include the margin?
( kTrackInfoWidth + kLeftMargin )
- 2; // 2 to allow for left/right borders
int textWidth, textHeight;
do {
gFont.SetPointSize(fontSize);
pParent->GetTextExtent(_("Stereo, 999999Hz"),
&textWidth,
&textHeight,
NULL,
NULL,
&gFont);
fontSize--;
} while (textWidth >= allowableWidth);
}

127
src/TrackInfo.h Normal file
View File

@ -0,0 +1,127 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackInfo.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TRACK_INFO__
#define __AUDACITY_TRACK_INFO__
#include "Audacity.h"
#include "Experimental.h"
#include <vector>
class wxDC;
class wxPoint;
class wxRect;
class wxString;
class wxWindow;
class LWSlider;
class NoteTrack;
class Track;
struct TrackPanelDrawingContext;
class WaveTrack;
static const int TitleSoloBorderOverlap = 1;
namespace TrackInfo
{
unsigned MinimumTrackHeight();
struct TCPLine {
enum : unsigned {
// The sequence is not significant, just keep bits distinct
kItemBarButtons = 1 << 0,
kItemStatusInfo1 = 1 << 1,
kItemMute = 1 << 2,
kItemSolo = 1 << 3,
kItemGain = 1 << 4,
kItemPan = 1 << 5,
kItemVelocity = 1 << 6,
kItemMidiControlsRect = 1 << 7,
kItemMinimize = 1 << 8,
kItemSyncLock = 1 << 9,
kItemStatusInfo2 = 1 << 10,
kHighestBottomItem = kItemMinimize,
};
using DrawFunction = void (*)(
TrackPanelDrawingContext &context,
const wxRect &rect,
const Track *maybeNULL
);
unsigned items; // a bitwise OR of values of the enum above
int height;
int extraSpace;
DrawFunction drawFunction;
};
using TCPLines = std::vector< TCPLine >;
// return y value and height
std::pair< int, int > CalcItemY( const TCPLines &lines, unsigned iItem );
unsigned DefaultTrackHeight( const TCPLines &topLines );
void DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track &track );
void DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack,
const std::vector<TCPLine> &topLines,
const std::vector<TCPLine> &bottomLines );
void CloseTitleDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void MinimizeSyncLockDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void SetTrackInfoFont(wxDC *dc);
void DrawBackground(
wxDC * dc, const wxRect & rect, bool bSelected, const int vrul );
// void DrawBordersWithin(
// wxDC * dc, const wxRect & rect, const Track &track ) const;
void GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest );
void GetCloseBoxRect(const wxRect & rect, wxRect &dest);
void GetTitleBarHorizontalBounds( const wxRect & rect, wxRect &dest );
void GetTitleBarRect(const wxRect & rect, wxRect &dest);
void GetSliderHorizontalBounds( const wxPoint &topleft, wxRect &dest );
void GetMinimizeHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetMinimizeRect(const wxRect & rect, wxRect &dest);
void GetSelectButtonHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetSelectButtonRect(const wxRect & rect, wxRect &dest);
void GetSyncLockHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetSyncLockIconRect(const wxRect & rect, wxRect &dest);
bool HideTopItem( const wxRect &rect, const wxRect &subRect,
int allowance = 0 );
// Non-member, namespace function relying on TrackPanel to invoke it
// when it handles preference update events
void UpdatePrefs( wxWindow *pParent );
bool HasSoloButton();
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -60,160 +60,6 @@ enum {
kTimerInterval = 50, // milliseconds kTimerInterval = 50, // milliseconds
}; };
namespace TrackInfo
{
void ReCreateSliders( wxWindow *pParent );
unsigned MinimumTrackHeight();
struct TCPLine;
void DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track &track );
void DrawItems
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack,
const std::vector<TCPLine> &topLines,
const std::vector<TCPLine> &bottomLines );
void CloseTitleDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void MinimizeSyncLockDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void MidiControlsDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
template<typename TrackClass>
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const TrackClass *t, bool captured,
wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight );
void PanSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void GainSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
#ifdef EXPERIMENTAL_MIDI_OUT
void VelocitySliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
#endif
void MuteOrSoloDrawFunction
( wxDC *dc, const wxRect &rect, const Track *pTrack, bool down,
bool captured, bool solo, bool hit );
void WideMuteDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void WideSoloDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void MuteAndSoloDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void StatusDrawFunction
( const wxString &string, wxDC *dc, const wxRect &rect );
void Status1DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void Status2DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack );
void SetTrackInfoFont(wxDC *dc);
void DrawBackground(
wxDC * dc, const wxRect & rect, bool bSelected, const int vrul );
// void DrawBordersWithin(
// wxDC * dc, const wxRect & rect, const Track &track ) const;
void GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest );
void GetCloseBoxRect(const wxRect & rect, wxRect &dest);
void GetTitleBarHorizontalBounds( const wxRect & rect, wxRect &dest );
void GetTitleBarRect(const wxRect & rect, wxRect &dest);
void GetNarrowMuteHorizontalBounds
( const wxRect & rect, wxRect &dest );
void GetNarrowSoloHorizontalBounds
( const wxRect & rect, wxRect &dest );
void GetWideMuteSoloHorizontalBounds
( const wxRect & rect, wxRect &dest );
void GetMuteSoloRect
(const wxRect & rect, wxRect &dest, bool solo, bool bHasSoloButton,
const Track *pTrack);
void GetSliderHorizontalBounds( const wxPoint &topleft, wxRect &dest );
void GetGainRect(const wxPoint & topLeft, wxRect &dest);
void GetPanRect(const wxPoint & topLeft, wxRect &dest);
#ifdef EXPERIMENTAL_MIDI_OUT
void GetVelocityRect(const wxPoint & topLeft, wxRect &dest);
#endif
void GetMinimizeHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetMinimizeRect(const wxRect & rect, wxRect &dest);
void GetSelectButtonHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetSelectButtonRect(const wxRect & rect, wxRect &dest);
void GetSyncLockHorizontalBounds( const wxRect &rect, wxRect &dest );
void GetSyncLockIconRect(const wxRect & rect, wxRect &dest);
#ifdef USE_MIDI
void GetMidiControlsHorizontalBounds
( const wxRect &rect, wxRect &dest );
void GetMidiControlsRect(const wxRect & rect, wxRect &dest);
#endif
bool HideTopItem( const wxRect &rect, const wxRect &subRect,
int allowance = 0 );
unsigned DefaultNoteTrackHeight();
unsigned DefaultWaveTrackHeight();
LWSlider * GainSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured,
wxWindow *pParent);
LWSlider * PanSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured,
wxWindow *pParent);
#ifdef EXPERIMENTAL_MIDI_OUT
LWSlider * VelocitySlider
(const wxRect &sliderRect, const NoteTrack *t, bool captured,
wxWindow *pParent);
#endif
// Non-member, namespace function relying on TrackPanel to invoke it
// when it handles preference update events
void UpdatePrefs( wxWindow *pParent );
};
const int DragThreshold = 3;// Anything over 3 pixels is a drag, else a click. const int DragThreshold = 3;// Anything over 3 pixels is a drag, else a click.
class AUDACITY_DLL_API TrackPanel final class AUDACITY_DLL_API TrackPanel final
@ -238,7 +84,6 @@ class AUDACITY_DLL_API TrackPanel final
virtual ~ TrackPanel(); virtual ~ TrackPanel();
void UpdatePrefs() override; void UpdatePrefs() override;
void ApplyUpdatedTheme();
void OnPaint(wxPaintEvent & event); void OnPaint(wxPaintEvent & event);
void OnMouseEvent(wxMouseEvent & event); void OnMouseEvent(wxMouseEvent & event);
@ -371,16 +216,6 @@ public:
std::shared_ptr< TrackPanelCell > GetBackgroundCell(); std::shared_ptr< TrackPanelCell > GetBackgroundCell();
public: public:
// Accessors...
static bool HasSoloButton(){ return gSoloPref!=wxT("None");}
public:
LWSlider *GainSlider( const WaveTrack *wt );
LWSlider *PanSlider( const WaveTrack *wt );
#ifdef EXPERIMENTAL_MIDI_OUT
LWSlider *VelocitySlider( const NoteTrack *nt );
#endif
protected: protected:
TrackPanelListener *mListener; TrackPanelListener *mListener;
@ -432,8 +267,6 @@ public:
protected: protected:
static wxString gSoloPref;
// The screenshot class needs to access internals // The screenshot class needs to access internals
friend class ScreenshotCommand; friend class ScreenshotCommand;

View File

@ -3124,3 +3124,4 @@ void WaveTrack::DoZoom
if( pProject ) if( pProject )
ProjectHistory::Get( *pProject ).ModifyState(true); ProjectHistory::Get( *pProject ).ModifyState(true);
} }

View File

@ -24,6 +24,7 @@
#include "../commands/CommandContext.h" #include "../commands/CommandContext.h"
#include "../commands/CommandManager.h" #include "../commands/CommandManager.h"
#include "../effects/EffectManager.h" #include "../effects/EffectManager.h"
#include "../tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
#include "../widgets/ASlider.h" #include "../widgets/ASlider.h"
#include "../widgets/AudacityMessageBox.h" #include "../widgets/AudacityMessageBox.h"
#include "../widgets/ProgressDialog.h" #include "../widgets/ProgressDialog.h"
@ -1310,7 +1311,7 @@ void OnTrackPan(const CommandContext &context)
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.PanSlider(wt); LWSlider *slider = WaveTrackControls::PanSlider( trackPanel, *wt );
if (slider->ShowDialog()) if (slider->ShowDialog())
SetTrackPan(project, wt, slider); SetTrackPan(project, wt, slider);
}); });
@ -1323,7 +1324,7 @@ void OnTrackPanLeft(const CommandContext &context)
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.PanSlider(wt); LWSlider *slider = WaveTrackControls::PanSlider( trackPanel, *wt );
slider->Decrease(1); slider->Decrease(1);
SetTrackPan(project, wt, slider); SetTrackPan(project, wt, slider);
}); });
@ -1336,7 +1337,7 @@ void OnTrackPanRight(const CommandContext &context)
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.PanSlider(wt); LWSlider *slider = WaveTrackControls::PanSlider( trackPanel, *wt );
slider->Increase(1); slider->Increase(1);
SetTrackPan(project, wt, slider); SetTrackPan(project, wt, slider);
}); });
@ -1350,7 +1351,7 @@ void OnTrackGain(const CommandContext &context)
/// This will pop up the track gain dialog for specified track /// This will pop up the track gain dialog for specified track
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.GainSlider(wt); LWSlider *slider = WaveTrackControls::GainSlider( trackPanel, *wt );
if (slider->ShowDialog()) if (slider->ShowDialog())
SetTrackGain(project, wt, slider); SetTrackGain(project, wt, slider);
}); });
@ -1363,7 +1364,7 @@ void OnTrackGainInc(const CommandContext &context)
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.GainSlider(wt); LWSlider *slider = WaveTrackControls::GainSlider( trackPanel, *wt );
slider->Increase(1); slider->Increase(1);
SetTrackGain(project, wt, slider); SetTrackGain(project, wt, slider);
}); });
@ -1376,7 +1377,7 @@ void OnTrackGainDec(const CommandContext &context)
Track *const track = trackPanel.GetFocusedTrack(); Track *const track = trackPanel.GetFocusedTrack();
if (track) track->TypeSwitch( [&](WaveTrack *wt) { if (track) track->TypeSwitch( [&](WaveTrack *wt) {
LWSlider *slider = trackPanel.GainSlider(wt); LWSlider *slider = WaveTrackControls::GainSlider( trackPanel, *wt );
slider->Decrease(1); slider->Decrease(1);
SetTrackGain(project, wt, slider); SetTrackGain(project, wt, slider);
}); });

View File

@ -11,6 +11,7 @@
#include "../ProjectHistory.h" #include "../ProjectHistory.h"
#include "../ProjectSettings.h" #include "../ProjectSettings.h"
#include "../ProjectWindow.h" #include "../ProjectWindow.h"
#include "../TrackInfo.h"
#include "../TrackPanel.h" #include "../TrackPanel.h"
#include "../UndoManager.h" #include "../UndoManager.h"
#include "../ViewInfo.h" #include "../ViewInfo.h"

View File

@ -13,10 +13,12 @@ Paul Licameli split from TrackPanel.cpp
#ifdef USE_MIDI #ifdef USE_MIDI
#include "NoteTrackButtonHandle.h" #include "NoteTrackButtonHandle.h"
#include "NoteTrackControls.h"
#include "../../../../TrackPanelMouseEvent.h" #include "../../../../TrackPanelMouseEvent.h"
#include "../../../../NoteTrack.h" #include "../../../../NoteTrack.h"
#include "../../../../ProjectHistory.h" #include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanel.h" #include "../../../../TrackPanel.h"
NoteTrackButtonHandle::NoteTrackButtonHandle NoteTrackButtonHandle::NoteTrackButtonHandle
@ -52,7 +54,7 @@ UIHandlePtr NoteTrackButtonHandle::HitTest
const std::shared_ptr<NoteTrack> &pTrack) const std::shared_ptr<NoteTrack> &pTrack)
{ {
wxRect midiRect; wxRect midiRect;
TrackInfo::GetMidiControlsRect(rect, midiRect); NoteTrackControls::GetMidiControlsRect(rect, midiRect);
if ( TrackInfo::HideTopItem( rect, midiRect ) ) if ( TrackInfo::HideTopItem( rect, midiRect ) )
return {}; return {};
if (midiRect.Contains(state.m_x, state.m_y)) { if (midiRect.Contains(state.m_x, state.m_y)) {

View File

@ -26,6 +26,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../Project.h" #include "../../../../Project.h"
#include "../../../../ProjectHistory.h" #include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../prefs/ThemePrefs.h"
#include <mutex>
#include <wx/frame.h>
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
NoteTrackControls::~NoteTrackControls() NoteTrackControls::~NoteTrackControls()
@ -67,7 +71,7 @@ std::vector<UIHandlePtr> NoteTrackControls::HitTest
} }
} }
return CommonTrackControls::HitTest(st, pProject); return NoteTrackControlsBase::HitTest(st, pProject);
} }
class NoteTrackMenuTable : public PopupMenuTable class NoteTrackMenuTable : public PopupMenuTable
@ -81,7 +85,7 @@ public:
private: private:
void InitMenu(Menu*, void *pUserData) override void InitMenu(Menu*, void *pUserData) override
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<NoteTrackControlsBase::InitMenuData*>(pUserData);
} }
void DestroyMenu() override void DestroyMenu() override
@ -89,7 +93,7 @@ private:
mpData = nullptr; mpData = nullptr;
} }
CommonTrackControls::InitMenuData *mpData; NoteTrackControlsBase::InitMenuData *mpData;
void OnChangeOctave(wxCommandEvent &); void OnChangeOctave(wxCommandEvent &);
}; };
@ -137,4 +141,172 @@ PopupMenuTable *NoteTrackControls::GetMenuExtension(Track *)
#endif #endif
} }
// drawing related
#include "../../../../widgets/ASlider.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanelDrawingContext.h"
#include "../../../../ViewInfo.h"
using TCPLine = TrackInfo::TCPLine;
#ifdef USE_MIDI
enum : int {
// PRL: was it correct to include the margin?
kMidiCellWidth = ( ( kTrackInfoWidth + kLeftMargin ) / 4) - 2,
kMidiCellHeight = kTrackInfoBtnSize
};
#endif #endif
#include "tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h"
#include "tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h"
namespace {
void GetMidiControlsHorizontalBounds( const wxRect &rect, wxRect &dest )
{
dest.x = rect.x + 1; // To center slightly
// PRL: TODO: kMidiCellWidth is defined in terms of the other constant
// kTrackInfoWidth but I am trying to avoid use of that constant.
// Can cell width be computed from dest.width instead?
dest.width = kMidiCellWidth * 4;
}
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const NoteTrack *t, bool captured, wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight )
{
wxRect sliderRect = rect;
TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect );
auto nt = static_cast<const NoteTrack*>( pTrack );
Selector( sliderRect, nt, captured, nullptr )->OnPaint(*dc, highlight);
}
void VelocitySliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto target = dynamic_cast<VelocitySliderHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction(
&NoteTrackControls::VelocitySlider, dc, rect, pTrack, captured, hit);
}
void MidiControlsDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<NoteTrackButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
auto channel = hit ? target->GetChannel() : -1;
auto &dc = context.dc;
wxRect midiRect = rect;
GetMidiControlsHorizontalBounds(rect, midiRect);
NoteTrack::DrawLabelControls
( static_cast<const NoteTrack *>(pTrack), dc, midiRect, channel );
}
}
static const struct NoteTrackTCPLines
: TCPLines { NoteTrackTCPLines() {
(TCPLines&)*this =
NoteTrackControlsBase::StaticTCPLines();
insert( end(), {
{ TCPLine::kItemMidiControlsRect, kMidiCellHeight * 4, 0,
MidiControlsDrawFunction },
{ TCPLine::kItemVelocity, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
VelocitySliderDrawFunction },
} );
} } noteTrackTCPLines;
void NoteTrackControls::GetVelocityRect(const wxPoint &topleft, wxRect & dest)
{
TrackInfo::GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( noteTrackTCPLines, TCPLine::kItemVelocity );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
void NoteTrackControls::GetMidiControlsRect(const wxRect & rect, wxRect & dest)
{
GetMidiControlsHorizontalBounds( rect, dest );
auto results = TrackInfo::CalcItemY(
noteTrackTCPLines, TCPLine::kItemMidiControlsRect );
dest.y = rect.y + results.first;
dest.height = results.second;
}
unsigned NoteTrackControls::DefaultNoteTrackHeight()
{
return TrackInfo::DefaultTrackHeight( noteTrackTCPLines );
}
const TCPLines &NoteTrackControls::GetTCPLines() const
{
return noteTrackTCPLines;
};
#endif
namespace {
#ifdef EXPERIMENTAL_MIDI_OUT
std::unique_ptr<LWSlider>
gVelocityCaptured
, gVelocity
;
#endif
}
#ifdef EXPERIMENTAL_MIDI_OUT
LWSlider * NoteTrackControls::VelocitySlider
(const wxRect &sliderRect, const NoteTrack *t, bool captured, wxWindow *pParent)
{
static std::once_flag flag;
std::call_once( flag, [] {
wxCommandEvent dummy;
ReCreateVelocitySlider( dummy );
wxTheApp->Bind(EVT_THEME_CHANGE, ReCreateVelocitySlider);
} );
wxPoint pos = sliderRect.GetPosition();
float velocity = t ? t->GetVelocity() : 0.0;
gVelocity->Move(pos);
gVelocity->Set(velocity);
gVelocityCaptured->Move(pos);
gVelocityCaptured->Set(velocity);
auto slider = (captured ? gVelocityCaptured : gVelocity).get();
slider->SetParent( pParent ? pParent :
FindProjectFrame( ::GetActiveProject() ) );
return slider;
}
#endif
void NoteTrackControls::ReCreateVelocitySlider( wxEvent &evt )
{
evt.Skip();
#ifdef EXPERIMENTAL_MIDI_OUT
wxPoint point{ 0, 0 };
wxRect sliderRect;
GetVelocityRect(point, sliderRect);
/* i18n-hint: Title of the Velocity slider, used to adjust the volume of note tracks */
gVelocity = std::make_unique<LWSlider>(nullptr, _("Velocity"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
VEL_SLIDER);
gVelocity->SetDefaultValue(0.0);
gVelocityCaptured = std::make_unique<LWSlider>(nullptr, _("Velocity"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
VEL_SLIDER);
gVelocityCaptured->SetDefaultValue(0.0);
#else
pParent;
#endif
}

View File

@ -11,15 +11,28 @@ Paul Licameli split from TrackPanel.cpp
#ifndef __AUDACITY_NOTE_TRACK_CONTROLS__ #ifndef __AUDACITY_NOTE_TRACK_CONTROLS__
#define __AUDACITY_NOTE_TRACK_CONTROLS__ #define __AUDACITY_NOTE_TRACK_CONTROLS__
#include "../../../ui/CommonTrackControls.h" // to inherit #include "../../ui/PlayableTrackControls.h" // to inherit
class wxEvent;
class LWSlider;
class NoteTrack;
class MuteButtonHandle; class MuteButtonHandle;
class SoloButtonHandle; class SoloButtonHandle;
class NoteTrackButtonHandle; class NoteTrackButtonHandle;
class VelocitySliderHandle; class VelocitySliderHandle;
/////////////////////////////////////////////////////////////////////////////// #include "Audacity.h"
class NoteTrackControls : public CommonTrackControls #include "Experimental.h"
using NoteTrackControlsBase =
#ifdef EXPERIMENTAL_MIDI_OUT
PlayableTrackControls
#else
CommonTrackControls
#endif
;
///////////////////////////////f////////////////////////////////////////////////
class NoteTrackControls : public NoteTrackControlsBase
{ {
NoteTrackControls(const NoteTrackControls&) = delete; NoteTrackControls(const NoteTrackControls&) = delete;
NoteTrackControls &operator=(const NoteTrackControls&) = delete; NoteTrackControls &operator=(const NoteTrackControls&) = delete;
@ -32,7 +45,7 @@ class NoteTrackControls : public CommonTrackControls
public: public:
explicit explicit
NoteTrackControls( std::shared_ptr<Track> pTrack ) NoteTrackControls( std::shared_ptr<Track> pTrack )
: CommonTrackControls( pTrack ) {} : NoteTrackControlsBase( pTrack ) {}
~NoteTrackControls(); ~NoteTrackControls();
std::vector<UIHandlePtr> HitTest std::vector<UIHandlePtr> HitTest
@ -40,6 +53,19 @@ public:
const AudacityProject *pProject) override; const AudacityProject *pProject) override;
PopupMenuTable *GetMenuExtension(Track *pTrack) override; PopupMenuTable *GetMenuExtension(Track *pTrack) override;
const TCPLines& GetTCPLines() const override;
static unsigned DefaultNoteTrackHeight();
static void GetMidiControlsRect(const wxRect & rect, wxRect & dest);
static void GetVelocityRect(const wxPoint &topleft, wxRect & dest);
static LWSlider * VelocitySlider
(const wxRect &sliderRect, const NoteTrack *t, bool captured,
wxWindow *pParent);
private:
static void ReCreateVelocitySlider( wxEvent& );
}; };
#endif #endif

View File

@ -15,9 +15,11 @@
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
#include "NoteTrackControls.h"
#include "../../../../ProjectHistory.h" #include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../TrackPanel.h" // for TrackInfo #include "../../../../TrackInfo.h"
#include "../../../../TrackPanel.h"
#include "../../../../UndoManager.h" #include "../../../../UndoManager.h"
#include "../../../../NoteTrack.h" #include "../../../../NoteTrack.h"
#include "../../../../ViewInfo.h" #include "../../../../ViewInfo.h"
@ -78,13 +80,13 @@ UIHandlePtr VelocitySliderHandle::HitTest
return {}; return {};
wxRect sliderRect; wxRect sliderRect;
TrackInfo::GetVelocityRect(rect.GetTopLeft(), sliderRect); NoteTrackControls::GetVelocityRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) ) if ( TrackInfo::HideTopItem( rect, sliderRect, kTrackInfoSliderAllowance ) )
return {}; return {};
if (sliderRect.Contains(state.m_x, state.m_y)) { if (sliderRect.Contains(state.m_x, state.m_y)) {
auto sliderFn = auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) { []( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::VelocitySlider return NoteTrackControls::VelocitySlider
(sliderRect, static_cast<NoteTrack*>( pTrack ), true, (sliderRect, static_cast<NoteTrack*>( pTrack ), true,
&TrackPanel::Get( *pProject )); &TrackPanel::Get( *pProject ));
}; };

View File

@ -23,12 +23,11 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../TrackPanelMouseEvent.h" #include "../../../../TrackPanelMouseEvent.h"
#include "../../../ui/SelectHandle.h" #include "../../../ui/SelectHandle.h"
#include "StretchHandle.h" #include "StretchHandle.h"
#include "../../../../TrackPanel.h"
NoteTrackView::NoteTrackView( const std::shared_ptr<Track> &pTrack ) NoteTrackView::NoteTrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackView{ pTrack } : CommonTrackView{ pTrack }
{ {
DoSetHeight( TrackInfo::DefaultNoteTrackHeight() ); DoSetHeight( NoteTrackControls::DefaultNoteTrackHeight() );
} }
NoteTrackView::~NoteTrackView() NoteTrackView::~NoteTrackView()

View File

@ -11,12 +11,14 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../Audacity.h" #include "../../../Audacity.h"
#include "PlayableTrackButtonHandles.h" #include "PlayableTrackButtonHandles.h"
#include "PlayableTrackControls.h"
#include "../../../commands/CommandManager.h" #include "../../../commands/CommandManager.h"
#include "../../../Menus.h" #include "../../../Menus.h"
#include "../../../Project.h" #include "../../../Project.h"
#include "../../../ProjectSettings.h" #include "../../../ProjectSettings.h"
#include "../../../RefreshCode.h" #include "../../../RefreshCode.h"
#include "../../../Track.h" #include "../../../Track.h"
#include "../../../TrackInfo.h"
#include "../../../TrackPanel.h" #include "../../../TrackPanel.h"
#include "../../../TrackPanelMouseEvent.h" #include "../../../TrackPanelMouseEvent.h"
@ -60,7 +62,7 @@ UIHandlePtr MuteButtonHandle::HitTest
{ {
wxRect buttonRect; wxRect buttonRect;
if ( pTrack ) if ( pTrack )
TrackInfo::GetMuteSoloRect(rect, buttonRect, false, PlayableTrackControls::GetMuteSoloRect(rect, buttonRect, false,
!ProjectSettings::Get( *pProject ).IsSoloNone(), pTrack.get()); !ProjectSettings::Get( *pProject ).IsSoloNone(), pTrack.get());
if ( TrackInfo::HideTopItem( rect, buttonRect ) ) if ( TrackInfo::HideTopItem( rect, buttonRect ) )
return {}; return {};
@ -116,7 +118,7 @@ UIHandlePtr SoloButtonHandle::HitTest
{ {
wxRect buttonRect; wxRect buttonRect;
if ( pTrack ) if ( pTrack )
TrackInfo::GetMuteSoloRect(rect, buttonRect, true, PlayableTrackControls::GetMuteSoloRect(rect, buttonRect, true,
!ProjectSettings::Get( *pProject ).IsSoloNone(), pTrack.get()); !ProjectSettings::Get( *pProject ).IsSoloNone(), pTrack.get());
if ( TrackInfo::HideTopItem( rect, buttonRect ) ) if ( TrackInfo::HideTopItem( rect, buttonRect ) )

View File

@ -0,0 +1,219 @@
/**********************************************************************
Audacity: A Digital Audio Editor
PlayableTrackControls.cpp
Paul Licameli split from TrackInfo.cpp
**********************************************************************/
#include "PlayableTrackControls.h"
#include "../../../Audacity.h"
#include "../../../Experimental.h"
#include "PlayableTrackButtonHandles.h"
#include "../../../AColor.h"
#include "../../../Track.h"
#include "../../../TrackInfo.h"
#include "../../../TrackPanelDrawingContext.h"
#include "../../../ViewInfo.h"
#include <wx/dc.h>
using TCPLine = TrackInfo::TCPLine;
namespace {
void GetNarrowMuteHorizontalBounds( const wxRect & rect, wxRect &dest )
{
dest.x = rect.x;
dest.width = rect.width / 2 + 1;
}
void GetNarrowSoloHorizontalBounds( const wxRect & rect, wxRect &dest )
{
wxRect muteRect;
GetNarrowMuteHorizontalBounds( rect, muteRect );
dest.x = rect.x + muteRect.width;
dest.width = rect.width - muteRect.width + TitleSoloBorderOverlap;
}
void GetWideMuteSoloHorizontalBounds( const wxRect & rect, wxRect &dest )
{
// Larger button, symmetrically placed intended.
// On windows this gives 15 pixels each side.
dest.width = rect.width - 2 * kTrackInfoBtnSize + 6;
dest.x = rect.x + kTrackInfoBtnSize -3;
}
void MuteOrSoloDrawFunction
( wxDC *dc, const wxRect &bev, const Track *pTrack, bool down,
bool WXUNUSED(captured),
bool solo, bool hit )
{
//bev.Inflate(-1, -1);
bool selected = pTrack ? pTrack->GetSelected() : true;
auto pt = dynamic_cast<const PlayableTrack *>(pTrack);
bool value = pt ? (solo ? pt->GetSolo() : pt->GetMute()) : false;
#if 0
AColor::MediumTrackInfo( dc, t->GetSelected());
if( solo )
{
if( pt && pt->GetSolo() )
{
AColor::Solo(dc, pt->GetSolo(), t->GetSelected());
}
}
else
{
if( pt && pt->GetMute() )
{
AColor::Mute(dc, pt->GetMute(), t->GetSelected(), pt->GetSolo());
}
}
//(solo) ? AColor::Solo(dc, t->GetSolo(), t->GetSelected()) :
// AColor::Mute(dc, t->GetMute(), t->GetSelected(), t->GetSolo());
dc->SetPen( *wxTRANSPARENT_PEN );//No border!
dc->DrawRectangle(bev);
#endif
wxCoord textWidth, textHeight;
wxString str = (solo) ?
/* i18n-hint: This is on a button that will silence all the other tracks.*/
_("Solo") :
/* i18n-hint: This is on a button that will silence this track.*/
_("Mute");
AColor::Bevel2(
*dc,
value == down,
bev,
selected, hit
);
TrackInfo::SetTrackInfoFont(dc);
dc->GetTextExtent(str, &textWidth, &textHeight);
dc->DrawText(str, bev.x + (bev.width - textWidth) / 2, bev.y + (bev.height - textHeight) / 2);
}
void WideMuteDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
wxRect bev = rect;
GetWideMuteSoloHorizontalBounds( rect, bev );
auto target = dynamic_cast<MuteButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false, hit );
}
void WideSoloDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
wxRect bev = rect;
GetWideMuteSoloHorizontalBounds( rect, bev );
auto target = dynamic_cast<SoloButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true, hit );
}
void MuteAndSoloDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
bool bHasSoloButton = TrackInfo::HasSoloButton();
wxRect bev = rect;
if ( bHasSoloButton )
GetNarrowMuteHorizontalBounds( rect, bev );
else
GetWideMuteSoloHorizontalBounds( rect, bev );
{
auto target = dynamic_cast<MuteButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false, hit );
}
if( !bHasSoloButton )
return;
GetNarrowSoloHorizontalBounds( rect, bev );
{
auto target = dynamic_cast<SoloButtonHandle*>( context.target.get() );
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
bool down = captured && bev.Contains( context.lastState.GetPosition());
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true, hit );
}
}
}
void PlayableTrackControls::GetMuteSoloRect
(const wxRect & rect, wxRect & dest, bool solo, bool bHasSoloButton,
const Track *pTrack)
{
auto &trackControl = static_cast<const CommonTrackControls&>(
TrackControls::Get( *pTrack ) );
auto resultsM = TrackInfo::CalcItemY( trackControl.GetTCPLines(), TCPLine::kItemMute );
auto resultsS = TrackInfo::CalcItemY( trackControl.GetTCPLines(), TCPLine::kItemSolo );
dest.height = resultsS.second;
int yMute = resultsM.first;
int ySolo = resultsS.first;
bool bSameRow = ( yMute == ySolo );
bool bNarrow = bSameRow && bHasSoloButton;
if( bNarrow )
{
if( solo )
GetNarrowSoloHorizontalBounds( rect, dest );
else
GetNarrowMuteHorizontalBounds( rect, dest );
}
else
GetWideMuteSoloHorizontalBounds( rect, dest );
if( bSameRow || !solo )
dest.y = rect.y + yMute;
else
dest.y = rect.y + ySolo;
}
const TCPLines& PlayableTrackControls::StaticTCPLines()
{
static const struct PlayableTrackTCPLines
: TCPLines { PlayableTrackTCPLines() {
(TCPLines&)*this =
CommonTrackControls::StaticTCPLines();
insert( end(), {
#ifdef EXPERIMENTAL_DA
// DA: Has Mute and Solo on separate lines.
{ TCPLine::kItemMute, kTrackInfoBtnSize + 1, 1,
WideMuteDrawFunction },
{ TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
WideSoloDrawFunction },
#else
{ TCPLine::kItemMute | TCPLine::kItemSolo, kTrackInfoBtnSize + 1, 0,
MuteAndSoloDrawFunction },
#endif
} );
} } playableTrackTCPLines;
return playableTrackTCPLines;
}

View File

@ -0,0 +1,32 @@
/**********************************************************************
Audacity: A Digital Audio Editor
PlayableTrackControls.cpp
Paul Licameli split from TrackInfo.cpp
**********************************************************************/
#ifndef __AUDACITY_PLAYABLE_TRACK_CONTROLS__
#define __AUDACITY_PLAYABLE_TRACK_CONTROLS__
#include "../../ui/CommonTrackControls.h"
class wxRect;
class Track;
class PlayableTrackControls /* not final */ : public CommonTrackControls
{
public:
// To help subclasses define GetTCPLines
static const TCPLines& StaticTCPLines();
static void GetMuteSoloRect(
const wxRect & rect, wxRect & dest, bool solo, bool bHasSoloButton,
const Track *pTrack);
using CommonTrackControls::CommonTrackControls;
};
#endif

View File

@ -31,11 +31,14 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../ondemand/ODManager.h" #include "../../../../ondemand/ODManager.h"
#include "../../../../prefs/PrefsDialog.h" #include "../../../../prefs/PrefsDialog.h"
#include "../../../../prefs/SpectrumPrefs.h" #include "../../../../prefs/SpectrumPrefs.h"
#include "../../../../prefs/ThemePrefs.h"
#include "../../../../prefs/TracksBehaviorsPrefs.h" #include "../../../../prefs/TracksBehaviorsPrefs.h"
#include "../../../../prefs/WaveformPrefs.h" #include "../../../../prefs/WaveformPrefs.h"
#include "../../../../widgets/AudacityMessageBox.h" #include "../../../../widgets/AudacityMessageBox.h"
#include <mutex>
#include <wx/combobox.h> #include <wx/combobox.h>
#include <wx/frame.h>
#include <wx/sizer.h> #include <wx/sizer.h>
namespace namespace
@ -95,7 +98,7 @@ std::vector<UIHandlePtr> WaveTrackControls::HitTest
} }
} }
return CommonTrackControls::HitTest(st, pProject); return PlayableTrackControls::HitTest(st, pProject);
} }
enum { enum {
@ -159,7 +162,7 @@ private:
mpData = NULL; mpData = NULL;
} }
CommonTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData;
int IdOfWaveColor(int WaveColor); int IdOfWaveColor(int WaveColor);
void OnWaveColorChange(wxCommandEvent & event); void OnWaveColorChange(wxCommandEvent & event);
@ -173,7 +176,7 @@ WaveColorMenuTable &WaveColorMenuTable::Instance()
void WaveColorMenuTable::InitMenu(Menu *pMenu, void *pUserData) void WaveColorMenuTable::InitMenu(Menu *pMenu, void *pUserData)
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex()); auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex());
SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; }); SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; });
@ -252,7 +255,7 @@ private:
mpData = NULL; mpData = NULL;
} }
CommonTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData;
int IdOfFormat(int format); int IdOfFormat(int format);
@ -267,7 +270,7 @@ FormatMenuTable &FormatMenuTable::Instance()
void FormatMenuTable::InitMenu(Menu *pMenu, void *pUserData) void FormatMenuTable::InitMenu(Menu *pMenu, void *pUserData)
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
auto formatId = IdOfFormat(pTrack->GetSampleFormat()); auto formatId = IdOfFormat(pTrack->GetSampleFormat());
SetMenuChecks(*pMenu, [=](int id){ return id == formatId; }); SetMenuChecks(*pMenu, [=](int id){ return id == formatId; });
@ -369,7 +372,7 @@ private:
mpData = NULL; mpData = NULL;
} }
CommonTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData;
int IdOfRate(int rate); int IdOfRate(int rate);
void SetRate(WaveTrack * pTrack, double rate); void SetRate(WaveTrack * pTrack, double rate);
@ -386,7 +389,7 @@ RateMenuTable &RateMenuTable::Instance()
void RateMenuTable::InitMenu(Menu *pMenu, void *pUserData) void RateMenuTable::InitMenu(Menu *pMenu, void *pUserData)
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
const auto rateId = IdOfRate((int)pTrack->GetRate()); const auto rateId = IdOfRate((int)pTrack->GetRate());
SetMenuChecks(*pMenu, [=](int id){ return id == rateId; }); SetMenuChecks(*pMenu, [=](int id){ return id == rateId; });
@ -559,7 +562,7 @@ protected:
DECLARE_POPUP_MENU(WaveTrackMenuTable); DECLARE_POPUP_MENU(WaveTrackMenuTable);
CommonTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData;
void OnSetDisplay(wxCommandEvent & event); void OnSetDisplay(wxCommandEvent & event);
void OnSpectrogramSettings(wxCommandEvent & event); void OnSpectrogramSettings(wxCommandEvent & event);
@ -591,7 +594,7 @@ WaveTrackMenuTable &WaveTrackMenuTable::Instance( Track * pTrack )
void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
std::vector<int> checkedIds; std::vector<int> checkedIds;
@ -622,7 +625,7 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
if ( isMono ) if ( isMono )
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack2 = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack2 = static_cast<WaveTrack*>(mpData->pTrack);
auto next = * ++ tracks.Find(pTrack2); auto next = * ++ tracks.Find(pTrack2);
@ -1011,3 +1014,272 @@ PopupMenuTable *WaveTrackControls::GetMenuExtension(Track * pTrack)
WaveTrackMenuTable & result = WaveTrackMenuTable::Instance( pTrack ); WaveTrackMenuTable & result = WaveTrackMenuTable::Instance( pTrack );
return &result; return &result;
} }
// drawing related
#include "../../../../widgets/ASlider.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanelDrawingContext.h"
#include "../../../../ViewInfo.h"
namespace {
void SliderDrawFunction
( LWSlider *(*Selector)
(const wxRect &sliderRect, const WaveTrack *t, bool captured, wxWindow*),
wxDC *dc, const wxRect &rect, const Track *pTrack,
bool captured, bool highlight )
{
wxRect sliderRect = rect;
TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect );
auto wt = static_cast<const WaveTrack*>( pTrack );
Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, highlight);
}
#include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h"
void PanSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<PanSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
bool captured = hit && target->IsClicked();
SliderDrawFunction
( &WaveTrackControls::PanSlider, dc, rect, pTrack, captured, hit);
}
void GainSliderDrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto target = dynamic_cast<GainSliderHandle*>( context.target.get() );
auto dc = &context.dc;
bool hit = target && target->GetTrack().get() == pTrack;
if( hit )
hit=hit;
bool captured = hit && target->IsClicked();
SliderDrawFunction
( &WaveTrackControls::GainSlider, dc, rect, pTrack, captured, hit);
}
void StatusDrawFunction
( const wxString &string, wxDC *dc, const wxRect &rect )
{
static const int offset = 3;
dc->DrawText(string, rect.x + offset, rect.y);
}
void Status1DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
/// Returns the string to be displayed in the track label
/// indicating whether the track is mono, left, right, or
/// stereo and what sample rate it's using.
auto rate = wt ? wt->GetRate() : 44100.0;
wxString s;
if (!pTrack || TrackList::Channels(pTrack).size() > 1)
// TODO: more-than-two-channels-message
// more appropriate strings
s = _("Stereo, %dHz");
else {
if (wt->GetChannel() == Track::MonoChannel)
s = _("Mono, %dHz");
else if (wt->GetChannel() == Track::LeftChannel)
s = _("Left, %dHz");
else if (wt->GetChannel() == Track::RightChannel)
s = _("Right, %dHz");
}
s = wxString::Format( s, (int) (rate + 0.5) );
StatusDrawFunction( s, dc, rect );
}
void Status2DrawFunction
( TrackPanelDrawingContext &context,
const wxRect &rect, const Track *pTrack )
{
auto dc = &context.dc;
auto wt = static_cast<const WaveTrack*>(pTrack);
auto format = wt ? wt->GetSampleFormat() : floatSample;
auto s = GetSampleFormatStr(format);
StatusDrawFunction( s, dc, rect );
}
}
using TCPLine = TrackInfo::TCPLine;
static const struct WaveTrackTCPLines
: TCPLines { WaveTrackTCPLines() {
(TCPLines&)*this =
PlayableTrackControls::StaticTCPLines();
insert( end(), {
{ TCPLine::kItemGain, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
GainSliderDrawFunction },
{ TCPLine::kItemPan, kTrackInfoSliderHeight, kTrackInfoSliderExtra,
PanSliderDrawFunction },
#ifdef EXPERIMENTAL_DA
// DA: Does not have status information for a track.
#else
{ TCPLine::kItemStatusInfo1, 12, 0,
Status1DrawFunction },
{ TCPLine::kItemStatusInfo2, 12, 0,
Status2DrawFunction },
#endif
} );
} } waveTrackTCPLines;
void WaveTrackControls::GetGainRect(const wxPoint &topleft, wxRect & dest)
{
TrackInfo::GetSliderHorizontalBounds( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemGain );
dest.y = topleft.y + results.first;
dest.height = results.second;
}
void WaveTrackControls::GetPanRect(const wxPoint &topleft, wxRect & dest)
{
GetGainRect( topleft, dest );
auto results = CalcItemY( waveTrackTCPLines, TCPLine::kItemPan );
dest.y = topleft.y + results.first;
}
unsigned WaveTrackControls::DefaultWaveTrackHeight()
{
return TrackInfo::DefaultTrackHeight( waveTrackTCPLines );
}
const TCPLines &WaveTrackControls::GetTCPLines() const
{
return waveTrackTCPLines;
}
namespace
{
std::unique_ptr<LWSlider>
gGainCaptured
, gPanCaptured
, gGain
, gPan;
}
LWSlider *WaveTrackControls::GainSlider(
CellularPanel &panel, const WaveTrack &wt )
{
auto &controls = TrackControls::Get( wt );
auto rect = panel.FindRect( controls );
wxRect sliderRect;
GetGainRect( rect.GetTopLeft(), sliderRect );
return GainSlider( sliderRect, &wt, false, &panel );
}
LWSlider * WaveTrackControls::GainSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured, wxWindow *pParent)
{
static std::once_flag flag;
std::call_once( flag, [] {
wxCommandEvent dummy;
ReCreateGainSlider( dummy );
wxTheApp->Bind(EVT_THEME_CHANGE, ReCreateGainSlider);
} );
wxPoint pos = sliderRect.GetPosition();
float gain = t ? t->GetGain() : 1.0;
gGain->Move(pos);
gGain->Set(gain);
gGainCaptured->Move(pos);
gGainCaptured->Set(gain);
auto slider = (captured ? gGainCaptured : gGain).get();
slider->SetParent( pParent ? pParent :
FindProjectFrame( ::GetActiveProject() ) );
return slider;
}
void WaveTrackControls::ReCreateGainSlider( wxEvent &event )
{
event.Skip();
const wxPoint point{ 0, 0 };
wxRect sliderRect;
GetGainRect(point, sliderRect);
float defPos = 1.0;
/* i18n-hint: Title of the Gain slider, used to adjust the volume */
gGain = std::make_unique<LWSlider>(nullptr, _("Gain"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
DB_SLIDER);
gGain->SetDefaultValue(defPos);
gGainCaptured = std::make_unique<LWSlider>(nullptr, _("Gain"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
DB_SLIDER);
gGainCaptured->SetDefaultValue(defPos);
}
LWSlider *WaveTrackControls::PanSlider(
CellularPanel &panel, const WaveTrack &wt )
{
auto &controls = TrackControls::Get( wt );
auto rect = panel.FindRect( controls );
wxRect sliderRect;
GetPanRect( rect.GetTopLeft(), sliderRect );
return PanSlider( sliderRect, &wt, false, &panel );
}
LWSlider * WaveTrackControls::PanSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured, wxWindow *pParent)
{
static std::once_flag flag;
std::call_once( flag, [] {
wxCommandEvent dummy;
ReCreatePanSlider( dummy );
wxTheApp->Bind(EVT_THEME_CHANGE, ReCreatePanSlider);
} );
wxPoint pos = sliderRect.GetPosition();
float pan = t ? t->GetPan() : 0.0;
gPan->Move(pos);
gPan->Set(pan);
gPanCaptured->Move(pos);
gPanCaptured->Set(pan);
auto slider = (captured ? gPanCaptured : gPan).get();
slider->SetParent( pParent ? pParent :
FindProjectFrame( ::GetActiveProject() ) );
return slider;
}
void WaveTrackControls::ReCreatePanSlider( wxEvent &event )
{
event.Skip();
const wxPoint point{ 0, 0 };
wxRect sliderRect;
GetPanRect(point, sliderRect);
float defPos = 0.0;
/* i18n-hint: Title of the Pan slider, used to move the sound left or right */
gPan = std::make_unique<LWSlider>(nullptr, _("Pan"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
PAN_SLIDER);
gPan->SetDefaultValue(defPos);
gPanCaptured = std::make_unique<LWSlider>(nullptr, _("Pan"),
wxPoint(sliderRect.x, sliderRect.y),
wxSize(sliderRect.width, sliderRect.height),
PAN_SLIDER);
gPanCaptured->SetDefaultValue(defPos);
}

View File

@ -11,14 +11,19 @@ Paul Licameli split from TrackPanel.cpp
#ifndef __AUDACITY_WAVE_TRACK_CONTROLS__ #ifndef __AUDACITY_WAVE_TRACK_CONTROLS__
#define __AUDACITY_WAVE_TRACK_CONTROLS__ #define __AUDACITY_WAVE_TRACK_CONTROLS__
#include "../../../ui/CommonTrackControls.h" // to inherit #include "../../ui/PlayableTrackControls.h" // to inherit
class CellularPanel;
class LWSlider;
class MuteButtonHandle; class MuteButtonHandle;
class SoloButtonHandle; class SoloButtonHandle;
class GainSliderHandle; class GainSliderHandle;
class PanSliderHandle; class PanSliderHandle;
class WaveTrack;
class wxEvent;
class wxWindow;
class WaveTrackControls final : public CommonTrackControls class WaveTrackControls final : public PlayableTrackControls
{ {
WaveTrackControls(const WaveTrackControls&) = delete; WaveTrackControls(const WaveTrackControls&) = delete;
WaveTrackControls &operator=(const WaveTrackControls&) = delete; WaveTrackControls &operator=(const WaveTrackControls&) = delete;
@ -26,7 +31,7 @@ class WaveTrackControls final : public CommonTrackControls
public: public:
explicit explicit
WaveTrackControls( std::shared_ptr<Track> pTrack ) WaveTrackControls( std::shared_ptr<Track> pTrack )
: CommonTrackControls( pTrack ) {} : PlayableTrackControls( pTrack ) {}
~WaveTrackControls(); ~WaveTrackControls();
std::vector<UIHandlePtr> HitTest std::vector<UIHandlePtr> HitTest
@ -35,7 +40,28 @@ public:
PopupMenuTable *GetMenuExtension(Track *pTrack) override; PopupMenuTable *GetMenuExtension(Track *pTrack) override;
const TCPLines& GetTCPLines() const override;
static unsigned DefaultWaveTrackHeight();
static void GetGainRect(const wxPoint & topLeft, wxRect &dest);
static void GetPanRect(const wxPoint & topLeft, wxRect &dest);
static LWSlider *GainSlider( CellularPanel &panel, const WaveTrack &wt );
static LWSlider * GainSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured,
wxWindow *pParent);
static LWSlider *PanSlider( CellularPanel &panel, const WaveTrack &wt );
static LWSlider * PanSlider
(const wxRect &sliderRect, const WaveTrack *t, bool captured,
wxWindow *pParent);
static void ReCreateSliders();
private: private:
static void ReCreatePanSlider( wxEvent& );
static void ReCreateGainSlider( wxEvent& );
std::weak_ptr<MuteButtonHandle> mMuteHandle; std::weak_ptr<MuteButtonHandle> mMuteHandle;
std::weak_ptr<SoloButtonHandle> mSoloHandle; std::weak_ptr<SoloButtonHandle> mSoloHandle;
std::weak_ptr<GainSliderHandle> mGainHandle; std::weak_ptr<GainSliderHandle> mGainHandle;

View File

@ -11,8 +11,10 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../Audacity.h" #include "../../../../Audacity.h"
#include "WaveTrackSliderHandles.h" #include "WaveTrackSliderHandles.h"
#include "WaveTrackControls.h"
#include "../../../../ProjectHistory.h" #include "../../../../ProjectHistory.h"
#include "../../../../RefreshCode.h" #include "../../../../RefreshCode.h"
#include "../../../../TrackInfo.h"
#include "../../../../TrackPanel.h" #include "../../../../TrackPanel.h"
#include "../../../../UndoManager.h" #include "../../../../UndoManager.h"
#include "../../../../WaveTrack.h" #include "../../../../WaveTrack.h"
@ -71,15 +73,15 @@ UIHandlePtr GainSliderHandle::HitTest
return {}; return {};
wxRect sliderRect; wxRect sliderRect;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect); WaveTrackControls::GetGainRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect)) if ( TrackInfo::HideTopItem( rect, sliderRect))
return {}; return {};
if (sliderRect.Contains(state.m_x, state.m_y)) { if (sliderRect.Contains(state.m_x, state.m_y)) {
wxRect sliderRect2; wxRect sliderRect2;
TrackInfo::GetGainRect(rect.GetTopLeft(), sliderRect2); WaveTrackControls::GetGainRect(rect.GetTopLeft(), sliderRect2);
auto sliderFn = auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) { []( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::GainSlider return WaveTrackControls::GainSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true, (sliderRect, static_cast<WaveTrack*>( pTrack ), true,
&TrackPanel::Get( *pProject )); &TrackPanel::Get( *pProject ));
}; };
@ -150,13 +152,13 @@ UIHandlePtr PanSliderHandle::HitTest
return {}; return {};
wxRect sliderRect; wxRect sliderRect;
TrackInfo::GetPanRect(rect.GetTopLeft(), sliderRect); WaveTrackControls::GetPanRect(rect.GetTopLeft(), sliderRect);
if ( TrackInfo::HideTopItem( rect, sliderRect)) if ( TrackInfo::HideTopItem( rect, sliderRect))
return {}; return {};
if (sliderRect.Contains(state.m_x, state.m_y)) { if (sliderRect.Contains(state.m_x, state.m_y)) {
auto sliderFn = auto sliderFn =
[]( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) { []( AudacityProject *pProject, const wxRect &sliderRect, Track *pTrack ) {
return TrackInfo::PanSlider return WaveTrackControls::PanSlider
(sliderRect, static_cast<WaveTrack*>( pTrack ), true, (sliderRect, static_cast<WaveTrack*>( pTrack ), true,
&TrackPanel::Get( *pProject )); &TrackPanel::Get( *pProject ));
}; };

View File

@ -20,7 +20,7 @@ Paul Licameli split from TrackPanel.cpp
#include "WaveTrackVRulerControls.h" #include "WaveTrackVRulerControls.h"
#include "../../../../HitTestResult.h" #include "../../../../HitTestResult.h"
#include "../../../../prefs/SpectrogramSettings.h" #include "../../../../prefs/SpectrogramSettings.h"
#include "../../../../TrackPanel.h" #include "../../../../TrackInfo.h"
#include "../../../../TrackPanelMouseEvent.h" #include "../../../../TrackPanelMouseEvent.h"
#include "CutlineHandle.h" #include "CutlineHandle.h"
@ -33,7 +33,7 @@ Paul Licameli split from TrackPanel.cpp
WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack ) WaveTrackView::WaveTrackView( const std::shared_ptr<Track> &pTrack )
: CommonTrackView{ pTrack } : CommonTrackView{ pTrack }
{ {
DoSetHeight( TrackInfo::DefaultWaveTrackHeight() ); DoSetHeight( WaveTrackControls::DefaultWaveTrackHeight() );
} }
WaveTrackView::~WaveTrackView() WaveTrackView::~WaveTrackView()

View File

@ -16,7 +16,7 @@ Paul Licameli split from TrackControls.cpp
#include "../../Menus.h" #include "../../Menus.h"
#include "../../Project.h" #include "../../Project.h"
#include "../../ProjectHistory.h" #include "../../ProjectHistory.h"
#include "../../TrackPanel.h" // for TrackInfo #include "../../TrackInfo.h"
#include "../../TrackPanelMouseEvent.h" #include "../../TrackPanelMouseEvent.h"
#include <wx/textdlg.h> #include <wx/textdlg.h>
#include "../../commands/CommandType.h" #include "../../commands/CommandType.h"

View File

@ -20,6 +20,9 @@ class MinimizeButtonHandle;
class SelectButtonHandle; class SelectButtonHandle;
class TrackSelectHandle; class TrackSelectHandle;
namespace TrackInfo{ struct TCPLine; }
using TCPLines = std::vector< TrackInfo::TCPLine >;
class CommonTrackControls /* not final */ : public TrackControls class CommonTrackControls /* not final */ : public TrackControls
{ {
public: public:
@ -35,6 +38,13 @@ public:
unsigned result; unsigned result;
}; };
// This decides what details to draw in the track control panel, besides
// those at the bottom
virtual const TCPLines& GetTCPLines() const;
// To help subclasses define GetTCPLines
static const TCPLines& StaticTCPLines();
protected: protected:
// An override is supplied for derived classes to call through but it is // An override is supplied for derived classes to call through but it is
// still marked pure virtual // still marked pure virtual

View File

@ -13,11 +13,11 @@ Paul Licameli split from class TrackView
#include "BackgroundCell.h" #include "BackgroundCell.h"
#include "TimeShiftHandle.h" #include "TimeShiftHandle.h"
#include "TrackControls.h" #include "TrackControls.h"
#include "../../TrackPanel.h" // for TrackInfo
#include "ZoomHandle.h" #include "ZoomHandle.h"
#include "../ui/SelectHandle.h" #include "../ui/SelectHandle.h"
#include "../../ProjectSettings.h" #include "../../ProjectSettings.h"
#include "../../Track.h" #include "../../Track.h"
#include "../../TrackInfo.h"
#include "../../TrackPanelMouseEvent.h" #include "../../TrackPanelMouseEvent.h"
std::vector<UIHandlePtr> CommonTrackView::HitTest std::vector<UIHandlePtr> CommonTrackView::HitTest

View File

@ -17,6 +17,7 @@ Paul Licameli split from TrackPanel.cpp
#include "../../ProjectHistory.h" #include "../../ProjectHistory.h"
#include "../../RefreshCode.h" #include "../../RefreshCode.h"
#include "../../Track.h" #include "../../Track.h"
#include "../../TrackInfo.h"
#include "../../TrackPanel.h" #include "../../TrackPanel.h"
#include "../../commands/CommandManager.h" #include "../../commands/CommandManager.h"
#include "../../tracks/ui/TrackView.h" #include "../../tracks/ui/TrackView.h"

View File

@ -268,6 +268,7 @@
<ClCompile Include="..\..\..\src\toolbars\SpectralSelectionBar.cpp" /> <ClCompile Include="..\..\..\src\toolbars\SpectralSelectionBar.cpp" />
<ClCompile Include="..\..\..\src\Track.cpp" /> <ClCompile Include="..\..\..\src\Track.cpp" />
<ClCompile Include="..\..\..\src\TrackArtist.cpp" /> <ClCompile Include="..\..\..\src\TrackArtist.cpp" />
<ClCompile Include="..\..\..\src\TrackInfo.cpp" />
<ClCompile Include="..\..\..\src\TrackPanel.cpp" /> <ClCompile Include="..\..\..\src\TrackPanel.cpp" />
<ClCompile Include="..\..\..\src\TrackPanelAx.cpp" /> <ClCompile Include="..\..\..\src\TrackPanelAx.cpp" />
<ClCompile Include="..\..\..\src\TrackPanelResizeHandle.cpp" /> <ClCompile Include="..\..\..\src\TrackPanelResizeHandle.cpp" />
@ -286,6 +287,7 @@
<ClCompile Include="..\..\..\src\tracks\playabletrack\notetrack\ui\NoteTrackVZoomHandle.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\notetrack\ui\NoteTrackVZoomHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\notetrack\ui\StretchHandle.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\notetrack\ui\StretchHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackControls.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.cpp" />
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.cpp" /> <ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.cpp" />
@ -586,6 +588,7 @@
<ClInclude Include="..\..\..\src\tracks\playabletrack\notetrack\ui\NoteTrackVZoomHandle.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\notetrack\ui\NoteTrackVZoomHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\notetrack\ui\StretchHandle.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\notetrack\ui\StretchHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackControls.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\CutlineHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\SampleHandle.h" />
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.h" /> <ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackControls.h" />
@ -707,6 +710,7 @@
<ClInclude Include="..\..\..\src\TimeTrack.h" /> <ClInclude Include="..\..\..\src\TimeTrack.h" />
<ClInclude Include="..\..\..\src\Track.h" /> <ClInclude Include="..\..\..\src\Track.h" />
<ClInclude Include="..\..\..\src\TrackArtist.h" /> <ClInclude Include="..\..\..\src\TrackArtist.h" />
<ClInclude Include="..\..\..\src\TrackInfo.h" />
<ClInclude Include="..\..\..\src\TrackPanel.h" /> <ClInclude Include="..\..\..\src\TrackPanel.h" />
<ClInclude Include="..\..\..\src\TrackPanelAx.h" /> <ClInclude Include="..\..\..\src\TrackPanelAx.h" />
<ClInclude Include="..\..\..\src\UndoManager.h" /> <ClInclude Include="..\..\..\src\UndoManager.h" />

View File

@ -365,6 +365,9 @@
<ClCompile Include="..\..\..\src\TrackArtist.cpp"> <ClCompile Include="..\..\..\src\TrackArtist.cpp">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\TrackInfo.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\TrackPanelAx.cpp"> <ClCompile Include="..\..\..\src\TrackPanelAx.cpp">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
@ -1037,6 +1040,9 @@
<ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.cpp"> <ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.cpp">
<Filter>src\tracks\playabletrack\ui</Filter> <Filter>src\tracks\playabletrack\ui</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackControls.cpp">
<Filter>src\tracks\playabletrack\ui</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.cpp"> <ClCompile Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.cpp">
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter> <Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
</ClCompile> </ClCompile>
@ -1474,6 +1480,9 @@
<ClInclude Include="..\..\..\src\TrackArtist.h"> <ClInclude Include="..\..\..\src\TrackArtist.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\TrackInfo.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\TrackPanel.h"> <ClInclude Include="..\..\..\src\TrackPanel.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
@ -2224,6 +2233,9 @@
<ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.h"> <ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackButtonHandles.h">
<Filter>src\tracks\playabletrack\ui</Filter> <Filter>src\tracks\playabletrack\ui</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\tracks\playabletrack\ui\PlayableTrackControls.h">
<Filter>src\tracks\playabletrack\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.h"> <ClInclude Include="..\..\..\src\tracks\playabletrack\wavetrack\ui\WaveTrackSliderHandles.h">
<Filter>src\tracks\playabletrack\wavetrack\ui</Filter> <Filter>src\tracks\playabletrack\wavetrack\ui</Filter>
</ClInclude> </ClInclude>