From 8ef5f696d8f107027b1f43f8bd893ea83a0108fe Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 10 Jun 2017 15:02:10 -0400 Subject: [PATCH] Define BackgoundCell, move some things into it --- mac/Audacity.xcodeproj/project.pbxproj | 6 + src/Makefile.am | 2 + src/Project.cpp | 5 + src/Project.h | 3 + src/TrackPanel.cpp | 19 +-- src/tracks/ui/BackgroundCell.cpp | 109 ++++++++++++++++++ src/tracks/ui/BackgroundCell.h | 38 ++++++ win/Projects/Audacity/Audacity.vcxproj | 4 +- .../Audacity/Audacity.vcxproj.filters | 6 + 9 files changed, 173 insertions(+), 19 deletions(-) create mode 100644 src/tracks/ui/BackgroundCell.cpp create mode 100644 src/tracks/ui/BackgroundCell.h diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index c6be212ce..8f286e1aa 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1232,6 +1232,7 @@ 5E7396501DAFD98400BA0A4D /* SliderHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73964E1DAFD98400BA0A4D /* SliderHandle.cpp */; }; 5E7396561DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396541DAFDA0000BA0A4D /* WaveTrackSliderHandles.cpp */; }; 5E7396591DAFDA3600BA0A4D /* TrackButtonHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E7396571DAFDA3600BA0A4D /* TrackButtonHandles.cpp */; }; + 5E73965C1DAFDAA400BA0A4D /* BackgroundCell.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E73965A1DAFDAA400BA0A4D /* BackgroundCell.cpp */; }; 5E74D2E31CC4429700D88B0B /* EditCursorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */; }; 5E74D2E41CC4429700D88B0B /* PlayIndicatorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2DF1CC4429700D88B0B /* PlayIndicatorOverlay.cpp */; }; 5E74D2E51CC4429700D88B0B /* Scrubbing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2E11CC4429700D88B0B /* Scrubbing.cpp */; }; @@ -3067,6 +3068,8 @@ 5E7396551DAFDA0000BA0A4D /* WaveTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveTrackSliderHandles.h; sourceTree = ""; }; 5E7396571DAFDA3600BA0A4D /* TrackButtonHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackButtonHandles.cpp; sourceTree = ""; }; 5E7396581DAFDA3600BA0A4D /* TrackButtonHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackButtonHandles.h; sourceTree = ""; }; + 5E73965A1DAFDAA400BA0A4D /* BackgroundCell.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundCell.cpp; sourceTree = ""; }; + 5E73965B1DAFDAA400BA0A4D /* BackgroundCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundCell.h; sourceTree = ""; }; 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCell.h; sourceTree = ""; }; 5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCellIterator.h; sourceTree = ""; }; 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditCursorOverlay.cpp; sourceTree = ""; }; @@ -5764,6 +5767,7 @@ 5E74D2DC1CC4429700D88B0B /* ui */ = { isa = PBXGroup; children = ( + 5E73965A1DAFDAA400BA0A4D /* BackgroundCell.cpp */, 5E73964B1DAFD95B00BA0A4D /* ButtonHandle.cpp */, 5E1512661DB0010C00702E29 /* CommonTrackPanelCell.cpp */, 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */, @@ -5777,6 +5781,7 @@ 5E15126A1DB0010C00702E29 /* TrackUI.cpp */, 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */, 5E73963C1DAFD86000BA0A4D /* ZoomHandle.cpp */, + 5E73965B1DAFDAA400BA0A4D /* BackgroundCell.h */, 5E73964C1DAFD95B00BA0A4D /* ButtonHandle.h */, 5E1512671DB0010C00702E29 /* CommonTrackPanelCell.h */, 5E74D2DE1CC4429700D88B0B /* EditCursorOverlay.h */, @@ -7937,6 +7942,7 @@ 28001B4B1A0F0EB6007DD161 /* SpectralSelectionBar.cpp in Sources */, 28BB98051A15BE6800D1CC80 /* NoiseReduction.cpp in Sources */, 5E74D2E41CC4429700D88B0B /* PlayIndicatorOverlay.cpp in Sources */, + 5E73965C1DAFDAA400BA0A4D /* BackgroundCell.cpp in Sources */, 28D000A51A32920C00367B21 /* DeviceChange.cpp in Sources */, 28D8425C1AD8D69D00551353 /* SelectedRegion.cpp in Sources */, 2888A1631AE25F9A00E06FDC /* Diags.cpp in Sources */, diff --git a/src/Makefile.am b/src/Makefile.am index 2fa2e72f9..1f65420d0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -579,6 +579,8 @@ audacity_SOURCES = \ tracks/timetrack/ui/TimeTrackUI.cpp \ tracks/timetrack/ui/TimeTrackVRulerControls.cpp \ tracks/timetrack/ui/TimeTrackVRulerControls.h \ + tracks/ui/BackgroundCell.cpp \ + tracks/ui/BackgroundCell.h \ tracks/ui/ButtonHandle.h \ tracks/ui/ButtonHandle.cpp \ tracks/ui/CommonTrackPanelCell.cpp \ diff --git a/src/Project.cpp b/src/Project.cpp index 754601189..72394e9ab 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -158,6 +158,7 @@ scroll information. It also has some status flags. #include "toolbars/ToolsToolBar.h" #include "toolbars/TranscriptionToolBar.h" +#include "tracks/ui/BackgroundCell.h" #include "tracks/ui/EditCursorOverlay.h" #include "tracks/ui/PlayIndicatorOverlay.h" #include "tracks/ui/Scrubbing.h" @@ -1078,6 +1079,8 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, mCursorOverlay = std::make_unique(this); + mBackgroundCell = std::make_shared(this); + #ifdef EXPERIMENTAL_SCRUBBING_BASIC mScrubOverlay = std::make_unique(this); mScrubber = std::make_unique(this); @@ -1107,6 +1110,8 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, CreateMenusAndCommands(); + mTrackPanel->SetBackgroundCell(mBackgroundCell); + // LLL: When Audacity starts or becomes active after returning from // another application, the first window that can accept focus // will be given the focus even if we try to SetFocus(). By diff --git a/src/Project.h b/src/Project.h index 1fb0276a2..bc343108a 100644 --- a/src/Project.h +++ b/src/Project.h @@ -102,6 +102,7 @@ enum class UndoPush : unsigned char; class Track; class WaveClip; +class BackgroundCell; AudacityProject *CreateNewAudacityProject(); AUDACITY_DLL_API AudacityProject *GetActiveProject(); @@ -764,6 +765,8 @@ private: std::unique_ptr mIndicatorOverlay, mCursorOverlay; + std::shared_ptr mBackgroundCell; + #ifdef EXPERIMENTAL_SCRUBBING_BASIC std::unique_ptr mScrubOverlay; std::unique_ptr mScrubber; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index a7d5cf8e9..da832ea56 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1458,22 +1458,13 @@ void TrackPanel::HandleCursor(wxMouseEvent & event) if( SetCursorByActivity() ) return; - // (2) If we are not over a track at all, set the cursor to Arrow and - // clear the StatusBar, - const auto foundCell = FindCell( event.m_x, event.m_y ); auto &track = foundCell.pTrack; auto &rect = foundCell.rect; auto &pCell = foundCell.pCell; wxCursor *pCursor = NULL; - if (!track) { - SetCursor(*mArrowCursor); - mListener->TP_DisplayStatusMessage(wxT("")); - return; - } - - // (3) The easy cases are done. + // (2) The easy cases are done. // Now we've got to hit-test against a number of different possibilities. // We could be over the label or a vertical ruler etc... @@ -4174,14 +4165,6 @@ void TrackPanel::HandleTrackSpecificMouseEvent(wxMouseEvent & event) return; } - // AS: If the user clicked outside all tracks, make nothing - // selected. - if ((event.ButtonDown() || event.ButtonDClick()) && !pTrack) { - GetSelectionState().SelectNone( *mTracks, GetMixerBoard() ); - Refresh(false); - return; - } - //Determine if user clicked on the track's left-hand label or ruler if ( !( foundCell.type == CellType::Track || foundCell.type == CellType::Background ) ) { diff --git a/src/tracks/ui/BackgroundCell.cpp b/src/tracks/ui/BackgroundCell.cpp new file mode 100644 index 000000000..eb1c7ec25 --- /dev/null +++ b/src/tracks/ui/BackgroundCell.cpp @@ -0,0 +1,109 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +BackgroundCell.cpp + +Paul Licameli split from TrackPanel.cpp + +**********************************************************************/ + +#include "../../Audacity.h" +#include "BackgroundCell.h" + +#include "../../HitTestResult.h" +#include "../../Project.h" +#include "../../RefreshCode.h" +#include "../../TrackPanelMouseEvent.h" +#include "../../UIHandle.h" + +#include +#include + +namespace +{ + // Define this, just so the click to deselect can dispatch here + class BackgroundHandle : public UIHandle + { + BackgroundHandle() {} + BackgroundHandle(const BackgroundHandle&) = delete; + BackgroundHandle &operator=(const BackgroundHandle&) = delete; + + public: + + static BackgroundHandle& Instance() + { + static BackgroundHandle instance; + return instance; + } + + static HitTestPreview HitPreview() + { + static wxCursor arrowCursor{ wxCURSOR_ARROW }; + return { {}, &arrowCursor }; + } + + static HitTestResult HitAnywhere() + { + return { + HitPreview(), + &BackgroundHandle::Instance() + }; + } + + virtual ~BackgroundHandle() + {} + + Result Click + (const TrackPanelMouseEvent &evt, AudacityProject *pProject) override + { + using namespace RefreshCode; + const wxMouseEvent &event = evt.event; + // Do not start a drag + Result result = Cancelled; + + // AS: If the user clicked outside all tracks, make nothing + // selected. + if ((event.ButtonDown() || event.ButtonDClick())) { + pProject->GetSelectionState().SelectNone + ( *pProject->GetTracks(), pProject->GetMixerBoard() ); + result |= RefreshAll; + } + + return result; + } + + Result Drag + (const TrackPanelMouseEvent &, AudacityProject *) override + { return RefreshCode::RefreshNone; } + + HitTestPreview Preview + (const TrackPanelMouseEvent &, const AudacityProject *) override + { return HitPreview(); } + + Result Release + (const TrackPanelMouseEvent &, AudacityProject *, + wxWindow *) override + { return RefreshCode::RefreshNone; } + + Result Cancel(AudacityProject *) override + { return RefreshCode::RefreshNone; } + }; +} + +BackgroundCell::~BackgroundCell() +{ +} + +HitTestResult BackgroundCell::HitTest +(const TrackPanelMouseEvent &, + const AudacityProject *) +{ + return BackgroundHandle::HitAnywhere(); +} + +Track *BackgroundCell::FindTrack() +{ + return nullptr; +} + diff --git a/src/tracks/ui/BackgroundCell.h b/src/tracks/ui/BackgroundCell.h new file mode 100644 index 000000000..73831780f --- /dev/null +++ b/src/tracks/ui/BackgroundCell.h @@ -0,0 +1,38 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +BackgroundCell.h + +Paul Licameli split from TrackPanel.cpp + +**********************************************************************/ + +#ifndef __AUDACITY_BACKGROUND_CELL__ +#define __AUDACITY_BACKGROUND_CELL__ + +#include "CommonTrackPanelCell.h" + +class AudacityProject; + +class BackgroundCell final : public CommonTrackPanelCell +{ +public: + BackgroundCell(AudacityProject *pProject) + : mpProject(pProject) + {} + + virtual ~BackgroundCell(); + +protected: + HitTestResult HitTest + (const TrackPanelMouseEvent &event, + const AudacityProject *) override; + + Track *FindTrack() override; + +private: + AudacityProject *mpProject; +}; + +#endif diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index 060fc1d72..e6fe01ef8 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -1,4 +1,4 @@ - + @@ -240,6 +240,7 @@ + @@ -505,6 +506,7 @@ + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index 2fd6d201f..154cf63b8 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -1022,6 +1022,9 @@ src\tracks\ui + + src\tracks\ui + @@ -2035,6 +2038,9 @@ src\tracks\ui + + src\tracks\ui +