From 3d7471a612eac5e1bc82024e7694299f6d9385a7 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 30 Jun 2017 22:23:54 -0400 Subject: [PATCH 1/7] new file --- mac/Audacity.xcodeproj/project.pbxproj | 2 ++ src/Makefile.am | 1 + src/Makefile.in | 6 ++-- src/TrackPanelDrawingContext.h | 28 +++++++++++++++++++ win/Projects/Audacity/Audacity.vcxproj | 1 + .../Audacity/Audacity.vcxproj.filters | 3 ++ 6 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/TrackPanelDrawingContext.h diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index 16ebbc0ae..886abcb03 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -3061,6 +3061,7 @@ 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NoteTrackSliderHandles.cpp; sourceTree = ""; }; 5E3FFE711EC9032B0020F7C9 /* NoteTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoteTrackSliderHandles.h; sourceTree = ""; }; 5E4685F81CCA9D84008741F2 /* CommandFunctors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommandFunctors.h; sourceTree = ""; }; + 5E52335F1EFDD57D001E4BB8 /* TrackPanelDrawingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelDrawingContext.h; sourceTree = ""; }; 5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryX.h; sourceTree = ""; }; 5E667A5E1F0BEE5F00C942A5 /* WaveTrackVZoomHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaveTrackVZoomHandle.cpp; sourceTree = ""; }; 5E667A5F1F0BEE5F00C942A5 /* WaveTrackVZoomHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveTrackVZoomHandle.h; sourceTree = ""; }; @@ -4157,6 +4158,7 @@ 1790B0EF09883BFD008A330A /* TrackPanelAx.h */, 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */, 5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */, + 5E52335F1EFDD57D001E4BB8 /* TrackPanelDrawingContext.h */, 2803C8B619F35AA000278526 /* TrackPanelListener.h */, 5E15123A1DB000C000702E29 /* TrackPanelMouseEvent.h */, 5E7396611DAFDB1E00BA0A4D /* TrackPanelResizeHandle.h */, diff --git a/src/Makefile.am b/src/Makefile.am index 900774196..ea1fbae5e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -247,6 +247,7 @@ audacity_SOURCES = \ TrackPanelAx.h \ TrackPanelCell.h \ TrackPanelCellIterator.h \ + TrackPanelDrawingContext.h \ TrackPanelListener.h \ TrackPanelMouseEvent.h \ TrackPanelResizeHandle.cpp \ diff --git a/src/Makefile.in b/src/Makefile.in index 1e79794ec..3596499f5 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -328,7 +328,8 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TrackPanel.cpp TrackPanel.h TrackPanelAx.cpp TrackPanelAx.h \ - TrackPanelCell.h TrackPanelCellIterator.h TrackPanelListener.h \ + TrackPanelCell.h TrackPanelCellIterator.h \ + TrackPanelDrawingContext.h TrackPanelListener.h \ TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \ TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \ TrackPanelResizerCell.h TranslatableStringArray.h UIHandle.h \ @@ -1342,7 +1343,8 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \ TimerRecordDialog.cpp TimerRecordDialog.h TimeTrack.cpp \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TrackPanel.cpp TrackPanel.h TrackPanelAx.cpp TrackPanelAx.h \ - TrackPanelCell.h TrackPanelCellIterator.h TrackPanelListener.h \ + TrackPanelCell.h TrackPanelCellIterator.h \ + TrackPanelDrawingContext.h TrackPanelListener.h \ TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \ TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \ TrackPanelResizerCell.h TranslatableStringArray.h UIHandle.h \ diff --git a/src/TrackPanelDrawingContext.h b/src/TrackPanelDrawingContext.h new file mode 100644 index 000000000..f55cacdf4 --- /dev/null +++ b/src/TrackPanelDrawingContext.h @@ -0,0 +1,28 @@ +/********************************************************************** + + Audacity: A Digital Audio Editor + + TrackPanelDrawingContext.h + + Paul Licameli + + **********************************************************************/ + +#ifndef __AUDACITY_TRACK_PANEL_DRAWING_CONTEXT__ +#define __AUDACITY_TRACK_PANEL_DRAWING_CONTEXT__ + +#include "MemoryX.h" + +class UIHandle; +using UIHandlePtr = std::shared_ptr; +class wxDC; + +#include + +struct TrackPanelDrawingContext { + wxDC &dc; + UIHandlePtr target; + wxMouseState lastState; +}; + +#endif diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index 0131c3aba..57af61d3a 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -508,6 +508,7 @@ + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index 7ba58244e..1cf7e738a 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -1933,6 +1933,9 @@ src + + src + src From f09a7be3dcff5245ffcaae43bcfcd3265e72ac44 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 7 Jul 2017 07:56:49 -0400 Subject: [PATCH 2/7] TCP draw use hit target for button, slider state; remove hacky global --- src/TrackPanel.cpp | 147 ++++++++++++------ src/TrackPanel.h | 72 ++++----- .../ui/PlayableTrackButtonHandles.cpp | 4 +- .../ui/PlayableTrackButtonHandles.h | 4 +- src/tracks/ui/ButtonHandle.cpp | 31 ++-- src/tracks/ui/ButtonHandle.h | 9 +- src/tracks/ui/SliderHandle.cpp | 4 +- src/tracks/ui/SliderHandle.h | 5 + src/tracks/ui/TrackButtonHandles.cpp | 6 +- src/tracks/ui/TrackButtonHandles.h | 1 - src/tracks/ui/TrackControls.cpp | 2 - src/tracks/ui/TrackControls.h | 3 - 12 files changed, 161 insertions(+), 127 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 729865dc1..d4a383386 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1066,11 +1066,9 @@ void TrackPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event)) struct TrackInfo::TCPLine { using DrawFunction = void (*)( - wxDC *dc, + TrackPanelDrawingContext &context, const wxRect &rect, - const Track *maybeNULL, - int pressed, // a value from MouseCaptureEnum; TODO: make it bool - bool captured + const Track *maybeNULL ); unsigned items; // a bitwise OR of values of the enum above @@ -1696,6 +1694,8 @@ void TrackPanel::Refresh(bool eraseBackground /* = TRUE */, DisplaySelection(); } +#include "TrackPanelDrawingContext.h" + /// Draw the actual track areas. We only draw the borders /// and the little buttons and menues and whatnot here, the /// actual contents of each track are drawn by the TrackArtist. @@ -1856,20 +1856,21 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, #include "tracks/ui/TrackControls.h" void TrackInfo::DrawItems -( wxDC *dc, const wxRect &rect, const Track &track, - int mouseCapture, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track &track ) { const auto topLines = getTCPLines( track ); const auto bottomLines = commonTrackTCPBottomLines; DrawItems - ( dc, rect, &track, topLines, bottomLines, mouseCapture, captured ); + ( context, rect, &track, topLines, bottomLines ); } void TrackInfo::DrawItems -( wxDC *dc, const wxRect &rect, const Track *pTrack, - const std::vector &topLines, const std::vector &bottomLines, - int mouseCapture, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack, + const std::vector &topLines, const std::vector &bottomLines ) { + auto dc = &context.dc; TrackInfo::SetTrackInfoFont(dc); dc->SetTextForeground(theTheme.Colour(clrTrackPanelText)); @@ -1882,7 +1883,7 @@ void TrackInfo::DrawItems }; if ( !TrackInfo::HideTopItem( rect, itemRect ) && line.drawFunction ) - line.drawFunction( dc, itemRect, pTrack, mouseCapture, captured ); + line.drawFunction( context, itemRect, pTrack ); yy += line.height + line.extraSpace; } } @@ -1895,20 +1896,26 @@ void TrackInfo::DrawItems rect.x, rect.y + yy, rect.width, line.height }; - line.drawFunction( dc, itemRect, pTrack, mouseCapture, captured ); + line.drawFunction( context, itemRect, pTrack ); } } } } +#include "tracks/ui/TrackButtonHandles.h" void TrackInfo::CloseTitleDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; bool selected = pTrack ? pTrack->GetSelected() : true; { - bool down = captured && (pressed == TrackPanel::IsClosing); wxRect bev = rect; GetCloseBoxHorizontalBounds( rect, bev ); + auto target = dynamic_cast( 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 ); #ifdef EXPERIMENTAL_THEMING @@ -1935,12 +1942,15 @@ void TrackInfo::CloseTitleDrawFunction } { + wxRect bev = rect; + GetTitleBarHorizontalBounds( rect, bev ); + auto target = dynamic_cast( 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"); - bool down = captured && (pressed == TrackPanel::IsPopping); - wxRect bev = rect; - GetTitleBarHorizontalBounds( rect, bev ); //bev.Inflate(-1, -1); AColor::Bevel2(*dc, !down, bev, selected); @@ -1993,15 +2003,20 @@ void TrackInfo::CloseTitleDrawFunction } void TrackInfo::MinimizeSyncLockDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured ) +( 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 ? pTrack->GetMinimized() : false; { - bool down = captured && (pressed == TrackPanel::IsMinimizing); wxRect bev = rect; GetMinimizeHorizontalBounds(rect, bev); + auto target = dynamic_cast( 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()); @@ -2040,13 +2055,15 @@ void TrackInfo::MinimizeSyncLockDrawFunction } void TrackInfo::MidiControlsDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { #ifdef EXPERIMENTAL_MIDI_OUT + auto &dc = context.dc; wxRect midiRect = rect; GetMidiControlsHorizontalBounds(rect, midiRect); NoteTrack::DrawLabelControls - ( static_cast(pTrack), *dc, midiRect ); + ( static_cast(pTrack), dc, midiRect ); #endif // EXPERIMENTAL_MIDI_OUT } @@ -2062,35 +2079,50 @@ void TrackInfo::SliderDrawFunction Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, false); } +#include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h" void TrackInfo::PanSliderDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto target = dynamic_cast( context.target.get() ); + auto dc = &context.dc; + bool hit = target && target->GetTrack().get() == pTrack; + bool captured = hit && target->IsClicked(); SliderDrawFunction ( &TrackInfo::PanSlider, dc, rect, pTrack, captured); } void TrackInfo::GainSliderDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto target = dynamic_cast( context.target.get() ); + auto dc = &context.dc; + bool hit = target && target->GetTrack().get() == pTrack; + bool captured = hit && target->IsClicked(); SliderDrawFunction ( &TrackInfo::GainSlider, dc, rect, pTrack, captured); } #ifdef EXPERIMENTAL_MIDI_OUT +#include "tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h" void TrackInfo::VelocitySliderDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; + auto target = dynamic_cast( context.target.get() ); + bool hit = target && target->GetTrack().get() == pTrack; + bool captured = hit && target->IsClicked(); SliderDrawFunction ( &TrackInfo::VelocitySlider, dc, rect, pTrack, captured); } #endif void TrackInfo::MuteOrSoloDrawFunction -( wxDC *dc, const wxRect &bev, const Track *pTrack, int pressed, bool captured, +( wxDC *dc, const wxRect &bev, const Track *pTrack, bool down, bool captured, bool solo ) { - bool down = captured && - (pressed == ( solo ? TrackPanel::IsSoloing : TrackPanel::IsMuting )); //bev.Inflate(-1, -1); bool selected = pTrack ? pTrack->GetSelected() : true; auto pt = dynamic_cast(pTrack); @@ -2137,25 +2169,40 @@ void TrackInfo::MuteOrSoloDrawFunction dc->DrawText(str, bev.x + (bev.width - textWidth) / 2, bev.y + (bev.height - textHeight) / 2); } +#include "tracks/playabletrack/ui/PlayableTrackButtonHandles.h" void TrackInfo::WideMuteDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; wxRect bev = rect; GetWideMuteSoloHorizontalBounds( rect, bev ); - MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, false ); + auto target = dynamic_cast( 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 ); } void TrackInfo::WideSoloDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; wxRect bev = rect; GetWideMuteSoloHorizontalBounds( rect, bev ); - MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, true ); + auto target = dynamic_cast( 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 ); } void TrackInfo::MuteAndSoloDrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; bool bHasSoloButton = TrackPanel::HasSoloButton(); wxRect bev = rect; @@ -2163,13 +2210,25 @@ void TrackInfo::MuteAndSoloDrawFunction GetNarrowMuteHorizontalBounds( rect, bev ); else GetWideMuteSoloHorizontalBounds( rect, bev ); - MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, false ); + { + auto target = dynamic_cast( 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 ); + } if( !bHasSoloButton ) return; GetNarrowSoloHorizontalBounds( rect, bev ); - MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, true ); + { + auto target = dynamic_cast( 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 ); + } } void TrackInfo::StatusDrawFunction @@ -2180,8 +2239,10 @@ void TrackInfo::StatusDrawFunction } void TrackInfo::Status1DrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; auto wt = static_cast(pTrack); /// Returns the string to be displayed in the track label @@ -2208,8 +2269,10 @@ void TrackInfo::Status1DrawFunction } void TrackInfo::Status2DrawFunction -( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool ) +( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ) { + auto dc = &context.dc; auto wt = static_cast(pTrack); auto format = wt ? wt->GetSampleFormat() : floatSample; auto s = GetSampleFormatStr(format); @@ -2256,16 +2319,8 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) rect.y += kTopMargin; rect.height -= (kBottomMargin + kTopMargin); - // Need to know which button, if any, to draw as pressed. - const MouseCaptureEnum mouseCapture = - // This public global variable is a hack for now, which should go away - // when TrackPanelCell gets a virtual function into which we move this - // drawing code. - MouseCaptureEnum(TrackControls::gCaptureState); - auto pClickedTrack = GetTracks()->Lock(mpClickedTrack); - const bool captured = (t == pClickedTrack.get()); - - TrackInfo::DrawItems( dc, rect, *t, mouseCapture, captured ); + TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState }; + TrackInfo::DrawItems( context, rect, *t ); //mTrackInfo.DrawBordersWithin( dc, rect, *t ); } diff --git a/src/TrackPanel.h b/src/TrackPanel.h index a09edae41..85ed67a6f 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -61,6 +61,8 @@ using UIHandlePtr = std::shared_ptr; // Declared elsewhere, to reduce compilation dependencies class TrackPanelListener; +struct TrackPanelDrawingContext; + enum class UndoPush : unsigned char; // JKC Nov 2011: Disabled warning C4251 which is to do with DLL linkage @@ -93,26 +95,26 @@ public: struct TCPLine; static void DrawItems - ( wxDC *dc, const wxRect &rect, const Track &track, int mouseCapture, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track &track ); static void DrawItems - ( wxDC *dc, const wxRect &rect, const Track *pTrack, + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack, const std::vector &topLines, - const std::vector &bottomLines, - int mouseCapture, bool captured ); + const std::vector &bottomLines ); static void CloseTitleDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void MinimizeSyncLockDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void MidiControlsDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); template static void SliderDrawFunction @@ -122,45 +124,45 @@ public: wxDC *dc, const wxRect &rect, const Track *pTrack, bool captured ); static void PanSliderDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void GainSliderDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); #ifdef EXPERIMENTAL_MIDI_OUT static void VelocitySliderDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); #endif static void MuteOrSoloDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, + ( wxDC *dc, const wxRect &rect, const Track *pTrack, bool down, bool captured, bool solo ); static void WideMuteDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void WideSoloDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void MuteAndSoloDrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void StatusDrawFunction ( const wxString &string, wxDC *dc, const wxRect &rect ); static void Status1DrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); static void Status2DrawFunction - ( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, - bool captured ); + ( TrackPanelDrawingContext &context, + const wxRect &rect, const Track *pTrack ); public: int GetTrackInfoWidth() const; @@ -492,20 +494,6 @@ protected: int mMouseMostRecentX; int mMouseMostRecentY; -public: - // Old enumeration of click-and-drag states, which will shrink and disappear - // as UIHandle subclasses take over the repsonsibilities. - enum MouseCaptureEnum - { - IsUncaptured = 0, - IsClosing, - IsMuting, - IsSoloing, - IsMinimizing, - IsPopping, - }; - -protected: friend class TrackPanelAx; #if wxUSE_ACCESSIBILITY diff --git a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp index 541c66753..8a1834a77 100644 --- a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp +++ b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp @@ -20,7 +20,7 @@ Paul Licameli split from TrackPanel.cpp MuteButtonHandle::MuteButtonHandle ( const std::shared_ptr &pTrack, const wxRect &rect ) - : ButtonHandle{ pTrack, rect, TrackPanel::IsMuting } + : ButtonHandle{ pTrack, rect } {} MuteButtonHandle::~MuteButtonHandle() @@ -62,7 +62,7 @@ UIHandlePtr MuteButtonHandle::HitTest SoloButtonHandle::SoloButtonHandle ( const std::shared_ptr &pTrack, const wxRect &rect ) - : ButtonHandle{ pTrack, rect, TrackPanel::IsSoloing } + : ButtonHandle{ pTrack, rect } {} SoloButtonHandle::~SoloButtonHandle() diff --git a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h index fc3da646a..f5942fcd6 100644 --- a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h +++ b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h @@ -12,8 +12,6 @@ Paul Licameli split from TrackPanel.cpp #define __AUDACITY_PLAYABLE_TRACK_BUTTON_HANDLES__ #include "../../ui/ButtonHandle.h" -#include "../../../TrackPanel.h" - class wxMouseState; class MuteButtonHandle final : public ButtonHandle @@ -50,7 +48,7 @@ class SoloButtonHandle final : public ButtonHandle public: explicit SoloButtonHandle - ( const std::shared_ptr &pTrack, const wxRect &rect ); + ( const std::shared_ptr &pTrack, const wxRect &rect ); SoloButtonHandle &operator=(const SoloButtonHandle&) = default; diff --git a/src/tracks/ui/ButtonHandle.cpp b/src/tracks/ui/ButtonHandle.cpp index 88b38cf6a..4e07932a0 100644 --- a/src/tracks/ui/ButtonHandle.cpp +++ b/src/tracks/ui/ButtonHandle.cpp @@ -21,10 +21,9 @@ Paul Licameli #include "../ui/TrackControls.h" ButtonHandle::ButtonHandle -( const std::shared_ptr &pTrack, const wxRect &rect, int dragCode ) +( const std::shared_ptr &pTrack, const wxRect &rect ) : mpTrack{ pTrack } , mRect{ rect } - , mDragCode{ dragCode } {} ButtonHandle::~ButtonHandle() @@ -45,7 +44,8 @@ UIHandle::Result ButtonHandle::Click // Come here for left click or double click if (mRect.Contains(event.m_x, event.m_y)) { - TrackControls::gCaptureState = mDragCode; + mWasIn = true; + mIsClicked = true; // Toggle visible button state return RefreshCell; } @@ -62,14 +62,10 @@ UIHandle::Result ButtonHandle::Drag if (!pTrack) return Cancelled; - const int newState = - mRect.Contains(event.m_x, event.m_y) ? mDragCode : 0; - if (TrackControls::gCaptureState == newState) - return RefreshNone; - else { - TrackControls::gCaptureState = newState; - return RefreshCell; - } + auto isIn = mRect.Contains(event.m_x, event.m_y); + auto result = (isIn == mWasIn) ? RefreshNone : RefreshCell; + mWasIn = isIn; + return result; } HitTestPreview ButtonHandle::Preview @@ -90,22 +86,13 @@ UIHandle::Result ButtonHandle::Release Result result = RefreshNone; const wxMouseEvent &event = evt.event; - if (TrackControls::gCaptureState) { - TrackControls::gCaptureState = 0; - result = RefreshCell; - } if (pTrack && mRect.Contains(event.m_x, event.m_y)) - result |= CommitChanges(event, pProject, pParent); + result |= RefreshCell | CommitChanges(event, pProject, pParent); return result; } UIHandle::Result ButtonHandle::Cancel(AudacityProject *pProject) { using namespace RefreshCode; - if (TrackControls::gCaptureState) { - TrackControls::gCaptureState = 0; - return RefreshCell; - } - else - return RefreshNone; + return RefreshCell; // perhaps unnecessarily if pointer is out of the box } diff --git a/src/tracks/ui/ButtonHandle.h b/src/tracks/ui/ButtonHandle.h index 318c0ab94..45899385e 100644 --- a/src/tracks/ui/ButtonHandle.h +++ b/src/tracks/ui/ButtonHandle.h @@ -23,9 +23,13 @@ class ButtonHandle /* not final */ : public UIHandle { ButtonHandle(const ButtonHandle&) = delete; +public: + std::shared_ptr GetTrack() const { return mpTrack.lock(); } + bool IsClicked() const { return mIsClicked; } + protected: explicit ButtonHandle - ( const std::shared_ptr &pTrack, const wxRect &rect, int dragCode ); + ( const std::shared_ptr &pTrack, const wxRect &rect ); ButtonHandle &operator=(const ButtonHandle&) = default; @@ -56,7 +60,8 @@ protected: std::weak_ptr mpTrack; wxRect mRect; - int mDragCode; + bool mWasIn{ true }; + bool mIsClicked{}; }; #endif diff --git a/src/tracks/ui/SliderHandle.cpp b/src/tracks/ui/SliderHandle.cpp index a06786efc..d422d820f 100644 --- a/src/tracks/ui/SliderHandle.cpp +++ b/src/tracks/ui/SliderHandle.cpp @@ -44,8 +44,10 @@ UIHandle::Result SliderHandle::Click // Just did a modal dialog in OnMouseEvent // Do not start a drag return RefreshCell | Cancelled; - else + else { + mIsClicked = true; return RefreshCell; + } } UIHandle::Result SliderHandle::Drag diff --git a/src/tracks/ui/SliderHandle.h b/src/tracks/ui/SliderHandle.h index 63397ceef..6ae9afb4c 100644 --- a/src/tracks/ui/SliderHandle.h +++ b/src/tracks/ui/SliderHandle.h @@ -32,6 +32,9 @@ public: SliderHandle &operator=(const SliderHandle&) = default; + std::shared_ptr GetTrack() const { return mpTrack.lock(); } + bool IsClicked() const { return mIsClicked; } + protected: virtual ~SliderHandle(); @@ -67,6 +70,8 @@ protected: LWSlider *GetSlider( AudacityProject *pProject ); float mStartingValue {}; + + bool mIsClicked{}; }; #endif diff --git a/src/tracks/ui/TrackButtonHandles.cpp b/src/tracks/ui/TrackButtonHandles.cpp index 13fb0913f..39d68b0d2 100644 --- a/src/tracks/ui/TrackButtonHandles.cpp +++ b/src/tracks/ui/TrackButtonHandles.cpp @@ -19,7 +19,7 @@ Paul Licameli split from TrackPanel.cpp MinimizeButtonHandle::MinimizeButtonHandle ( const std::shared_ptr &pTrack, const wxRect &rect ) - : ButtonHandle{ pTrack, rect, TrackPanel::IsMinimizing } + : ButtonHandle{ pTrack, rect } {} MinimizeButtonHandle::~MinimizeButtonHandle() @@ -69,7 +69,7 @@ UIHandlePtr MinimizeButtonHandle::HitTest CloseButtonHandle::CloseButtonHandle ( const std::shared_ptr &pTrack, const wxRect &rect ) - : ButtonHandle{ pTrack, rect, TrackPanel::IsClosing } + : ButtonHandle{ pTrack, rect } {} CloseButtonHandle::~CloseButtonHandle() @@ -121,7 +121,7 @@ UIHandlePtr CloseButtonHandle::HitTest MenuButtonHandle::MenuButtonHandle ( const std::shared_ptr &pCell, const std::shared_ptr &pTrack, const wxRect &rect ) - : ButtonHandle{ pTrack, rect, TrackPanel::IsPopping } + : ButtonHandle{ pTrack, rect } , mpCell{ pCell } {} diff --git a/src/tracks/ui/TrackButtonHandles.h b/src/tracks/ui/TrackButtonHandles.h index a9aa2bb2a..ef3d4a7c4 100644 --- a/src/tracks/ui/TrackButtonHandles.h +++ b/src/tracks/ui/TrackButtonHandles.h @@ -12,7 +12,6 @@ Paul Licameli split from TrackPanel.cpp #define __AUDACITY_TRACK_BUTTON_HANDLES__ #include "../ui/ButtonHandle.h" -#include "../../TrackPanel.h" class wxMouseState; diff --git a/src/tracks/ui/TrackControls.cpp b/src/tracks/ui/TrackControls.cpp index 576cefa6a..0342a0e9a 100644 --- a/src/tracks/ui/TrackControls.cpp +++ b/src/tracks/ui/TrackControls.cpp @@ -21,8 +21,6 @@ Paul Licameli split from TrackPanel.cpp #include "../../Track.h" #include -int TrackControls::gCaptureState; - TrackControls::TrackControls( std::shared_ptr pTrack ) : mwTrack{ pTrack } { diff --git a/src/tracks/ui/TrackControls.h b/src/tracks/ui/TrackControls.h index 51f8060c9..16e011493 100644 --- a/src/tracks/ui/TrackControls.h +++ b/src/tracks/ui/TrackControls.h @@ -42,9 +42,6 @@ public: unsigned result; }; - // Make this hack go away! See TrackPanel::DrawOutside - static int gCaptureState; - protected: // An override is supplied for derived classes to call through but it is // still marked pure virtual From ada4b6307d1b8fe08547c6cd205be2c0c8769752 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 23 Jun 2017 19:28:38 -0400 Subject: [PATCH 3/7] Pass more context information into drawing routines --- src/Envelope.cpp | 10 +++++-- src/Envelope.h | 5 +++- src/LabelTrack.cpp | 10 +++++-- src/LabelTrack.h | 3 +- src/Printing.cpp | 6 +++- src/TimeTrack.cpp | 7 ++++- src/TimeTrack.h | 5 +++- src/TrackArtist.cpp | 55 +++++++++++++++++++++--------------- src/TrackArtist.h | 35 ++++++++++++++--------- src/TrackPanel.cpp | 31 ++++++++++++-------- src/TrackPanel.h | 12 +++++--- src/effects/Equalization.cpp | 7 +++-- 12 files changed, 121 insertions(+), 65 deletions(-) diff --git a/src/Envelope.cpp b/src/Envelope.cpp index 8e241fcb8..8a596b79e 100644 --- a/src/Envelope.cpp +++ b/src/Envelope.cpp @@ -311,11 +311,15 @@ static void DrawPoint(wxDC & dc, const wxRect & r, int x, int y, bool top) } } +#include "TrackPanelDrawingContext.h" + /// TODO: This should probably move to track artist. -void Envelope::DrawPoints(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo, - bool dB, double dBRange, - float zoomMin, float zoomMax, bool mirrored) const +void Envelope::DrawPoints +(TrackPanelDrawingContext &context, const wxRect & r, const ZoomInfo &zoomInfo, + bool dB, double dBRange, + float zoomMin, float zoomMax, bool mirrored) const { + auto &dc = context.dc; dc.SetPen(AColor::envelopePen); dc.SetBrush(*wxWHITE_BRUSH); diff --git a/src/Envelope.h b/src/Envelope.h index 3108c3dea..1662d640a 100644 --- a/src/Envelope.h +++ b/src/Envelope.h @@ -73,6 +73,7 @@ private: }; typedef std::vector EnvArray; +struct TrackPanelDrawingContext; class Envelope final : public XMLTagHandler { public: @@ -117,7 +118,9 @@ public: XMLTagHandler *HandleXMLChild(const wxChar *tag) override; void WriteXML(XMLWriter &xmlFile) const /* not override */; - void DrawPoints(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo, + void DrawPoints( + TrackPanelDrawingContext &context, + const wxRect & r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin, float zoomMax, bool mirrored) const; diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index ab204904c..26d519fdc 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -773,13 +773,17 @@ namespace { } } +#include "TrackPanelDrawingContext.h" + /// Draw calls other functions to draw the LabelTrack. /// @param dc the device context /// @param r the LabelTrack rectangle. -void LabelTrack::Draw(wxDC & dc, const wxRect & r, - const SelectedRegion &selectedRegion, - const ZoomInfo &zoomInfo) const +void LabelTrack::Draw +(TrackPanelDrawingContext &context, const wxRect & r, + const SelectedRegion &selectedRegion, + const ZoomInfo &zoomInfo) const { + auto &dc = context.dc; auto pHit = findHit(); if(msFont.Ok()) diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 99660af30..cd981a481 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -40,6 +40,7 @@ class ZoomInfo; struct LabelTrackHit; +struct TrackPanelDrawingContext; class LabelStruct { @@ -147,7 +148,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track static wxFont GetFont(const wxString &faceName, int size = DefaultFontSize); static void ResetFont(); - void Draw(wxDC & dc, const wxRect & r, + void Draw(TrackPanelDrawingContext &context, const wxRect & r, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo) const; diff --git a/src/Printing.cpp b/src/Printing.cpp index 860b9d845..cafc61a2a 100644 --- a/src/Printing.cpp +++ b/src/Printing.cpp @@ -32,6 +32,8 @@ #include "Experimental.h" +#include "TrackPanelDrawingContext.h" + // Globals, so that we remember settings from session to session wxPrintData &gPrintData() { @@ -97,7 +99,9 @@ bool AudacityPrintout::OnPrintPage(int WXUNUSED(page)) r.width = width; r.height = (int)(n->GetHeight() * scale); - artist.DrawTrack(n, *dc, r, SelectedRegion(), zoomInfo, false, false, false, false); + TrackPanelDrawingContext context{ *dc, {}, {} }; + artist.DrawTrack( + context, n, r, SelectedRegion(), zoomInfo, false, false, false, false); dc->SetPen(*wxBLACK_PEN); AColor::Line(*dc, 0, r.y, width, r.y); diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index 55ec5b346..d01c39843 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -257,8 +257,13 @@ void TimeTrack::WriteXML(XMLWriter &xmlFile) const xmlFile.EndTag(wxT("timetrack")); } -void TimeTrack::Draw(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo) const +#include "TrackPanelDrawingContext.h" + +void TimeTrack::Draw +(TrackPanelDrawingContext &context, const wxRect & r, const ZoomInfo &zoomInfo) const { + auto &dc = context.dc; + double min = zoomInfo.PositionToTime(0); double max = zoomInfo.PositionToTime(r.width); if (min > max) diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 81b8ba8b4..7dde3c494 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -22,6 +22,7 @@ class wxDC; class Envelope; class Ruler; class ZoomInfo; +struct TrackPanelDrawingContext; class EnvelopeHandle; @@ -67,7 +68,9 @@ class TimeTrack final : public Track { double GetStartTime() const override { return 0.0; } double GetEndTime() const override { return 0.0; } - void Draw(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo) const; + void Draw + (TrackPanelDrawingContext &context, + const wxRect & r, const ZoomInfo &zoomInfo) const; // XMLTagHandler callback methods for loading and saving diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index 04763d32d..fe5443bea 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -183,6 +183,8 @@ audio tracks. #include "Theme.h" #include "AllThemeResources.h" #include "Experimental.h" +#include "TrackPanelDrawingContext.h" + #undef PROFILE_WAVEFORM #ifdef PROFILE_WAVEFORM @@ -315,9 +317,9 @@ void TrackArtist::SetMargins(int left, int top, int right, int bottom) mMarginBottom = bottom; } -void TrackArtist::DrawTracks(TrackList * tracks, +void TrackArtist::DrawTracks(TrackPanelDrawingContext &context, + TrackList * tracks, Track * start, - wxDC & dc, const wxRegion & reg, const wxRect & rect, const wxRect & clip, @@ -409,7 +411,7 @@ void TrackArtist::DrawTracks(TrackList * tracks, rr.y += mMarginTop; rr.width -= (mMarginLeft + mMarginRight); rr.height -= (mMarginTop + mMarginBottom); - DrawTrack(t, dc, rr, + DrawTrack(context, t, rr, selectedRegion, zoomInfo, drawEnvelope, bigPoints, drawSliders, hasSolo); } @@ -438,8 +440,8 @@ void TrackArtist::DrawTracks(TrackList * tracks, } } -void TrackArtist::DrawTrack(const Track * t, - wxDC & dc, +void TrackArtist::DrawTrack(TrackPanelDrawingContext &context, + const Track * t, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -448,6 +450,7 @@ void TrackArtist::DrawTrack(const Track * t, bool drawSliders, bool hasSolo) { + auto &dc = context.dc; switch (t->GetKind()) { case Track::Wave: { @@ -466,7 +469,7 @@ void TrackArtist::DrawTrack(const Track * t, switch (wt->GetDisplay()) { case WaveTrack::Waveform: - DrawWaveform(wt, dc, rect, selectedRegion, zoomInfo, + DrawWaveform(context, wt, rect, selectedRegion, zoomInfo, drawEnvelope, bigPoints, drawSliders, muted); break; case WaveTrack::Spectrum: @@ -503,16 +506,18 @@ void TrackArtist::DrawTrack(const Track * t, } #endif // USE_MIDI case Track::Label: - DrawLabelTrack((LabelTrack *)t, dc, rect, selectedRegion, zoomInfo); + DrawLabelTrack(context, (LabelTrack *)t, rect, selectedRegion, zoomInfo); break; case Track::Time: - DrawTimeTrack((TimeTrack *)t, dc, rect, zoomInfo); + DrawTimeTrack(context, (TimeTrack *)t, rect, zoomInfo); break; } } -void TrackArtist::DrawVRuler(const Track *t, wxDC * dc, wxRect & rect) +void TrackArtist::DrawVRuler +(TrackPanelDrawingContext &context, const Track *t, wxRect & rect) { + auto dc = &context.dc; int kind = t->GetKind(); // Label and Time tracks do not have a vruler @@ -1468,8 +1473,8 @@ void TrackArtist::DrawEnvLine(wxDC &dc, const wxRect &rect, int x0, int y0, int } } -void TrackArtist::DrawWaveform(const WaveTrack *track, - wxDC & dc, +void TrackArtist::DrawWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -1478,13 +1483,14 @@ void TrackArtist::DrawWaveform(const WaveTrack *track, bool drawSliders, bool muted) { + auto &dc = context.dc; const bool dB = !track->GetWaveformSettings().isLinear(); DrawBackgroundWithSelection(&dc, rect, track, blankSelectedBrush, blankBrush, selectedRegion, zoomInfo); for (const auto &clip: track->GetClips()) - DrawClipWaveform(track, clip.get(), dc, rect, selectedRegion, zoomInfo, + DrawClipWaveform(context, track, clip.get(), rect, selectedRegion, zoomInfo, drawEnvelope, bigPoints, dB, muted); @@ -1737,9 +1743,9 @@ void FindWavePortions } } -void TrackArtist::DrawClipWaveform(const WaveTrack *track, +void TrackArtist::DrawClipWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const WaveClip *clip, - wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -1748,6 +1754,7 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track, bool dB, bool muted) { + auto &dc = context.dc; #ifdef PROFILE_WAVEFORM Profiler profiler; #endif @@ -1954,7 +1961,8 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track, if (drawEnvelope) { DrawEnvelope(dc, mid, env, zoomMin, zoomMax, dB, dBRange); - clip->GetEnvelope()->DrawPoints(dc, rect, zoomInfo, dB, dBRange, zoomMin, zoomMax, true); + clip->GetEnvelope()->DrawPoints + (context, rect, zoomInfo, dB, dBRange, zoomMin, zoomMax, true); } // Draw arrows on the left side if the track extends to the left of the @@ -3188,8 +3196,8 @@ void TrackArtist::DrawNoteTrack(const NoteTrack *track, #endif // USE_MIDI -void TrackArtist::DrawLabelTrack(const LabelTrack *track, - wxDC & dc, +void TrackArtist::DrawLabelTrack(TrackPanelDrawingContext &context, + const LabelTrack *track, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo) @@ -3200,15 +3208,15 @@ void TrackArtist::DrawLabelTrack(const LabelTrack *track, if (!track->GetSelected() && !track->IsSyncLockSelected()) sel0 = sel1 = 0.0; - track->Draw(dc, rect, SelectedRegion(sel0, sel1), zoomInfo); + track->Draw(context, rect, SelectedRegion(sel0, sel1), zoomInfo); } -void TrackArtist::DrawTimeTrack(const TimeTrack *track, - wxDC & dc, +void TrackArtist::DrawTimeTrack(TrackPanelDrawingContext &context, + const TimeTrack *track, const wxRect & rect, const ZoomInfo &zoomInfo) { - track->Draw(dc, rect, zoomInfo); + track->Draw(context, rect, zoomInfo); wxRect envRect = rect; envRect.height -= 2; double lower = track->GetRangeLower(), upper = track->GetRangeUpper(); @@ -3217,8 +3225,9 @@ void TrackArtist::DrawTimeTrack(const TimeTrack *track, lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / mdBrange + 1.0; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / mdBrange + 1.0; } - track->GetEnvelope()->DrawPoints(dc, envRect, zoomInfo, - track->GetDisplayLog(), mdBrange, lower, upper, false); + track->GetEnvelope()->DrawPoints + (context, envRect, zoomInfo, + track->GetDisplayLog(), mdBrange, lower, upper, false); } void TrackArtist::UpdatePrefs() diff --git a/src/TrackArtist.h b/src/TrackArtist.h index 3bb0b5a3b..30e841696 100644 --- a/src/TrackArtist.h +++ b/src/TrackArtist.h @@ -41,6 +41,8 @@ class Ruler; class SelectedRegion; class ZoomInfo; +struct TrackPanelDrawingContext; + #ifndef uchar typedef unsigned char uchar; #endif @@ -52,19 +54,22 @@ class AUDACITY_DLL_API TrackArtist { ~TrackArtist(); void SetColours(); - void DrawTracks(TrackList *tracks, Track *start, - wxDC & dc, const wxRegion & reg, + void DrawTracks(TrackPanelDrawingContext &context, + TrackList *tracks, Track *start, + const wxRegion & reg, const wxRect & rect, const wxRect & clip, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders); - void DrawTrack(const Track *t, - wxDC & dc, const wxRect & rect, + void DrawTrack(TrackPanelDrawingContext &context, + const Track *t, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool hasSolo); - void DrawVRuler(const Track *t, wxDC *dc, wxRect & rect); + void DrawVRuler(TrackPanelDrawingContext &context, + const Track *t, wxRect & rect); void UpdateVRuler(const Track *t, wxRect & rect); @@ -94,8 +99,9 @@ class AUDACITY_DLL_API TrackArtist { // Lower-level drawing functions // - void DrawWaveform(const WaveTrack *track, - wxDC & dc, const wxRect & rect, + void DrawWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool muted); @@ -117,18 +123,21 @@ class AUDACITY_DLL_API TrackArtist { bool muted); #endif // USE_MIDI - void DrawLabelTrack(const LabelTrack *track, - wxDC & dc, const wxRect & rect, + void DrawLabelTrack(TrackPanelDrawingContext &context, + const LabelTrack *track, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); - void DrawTimeTrack(const TimeTrack *track, - wxDC & dc, const wxRect & rect, const ZoomInfo &zoomInfo); + void DrawTimeTrack(TrackPanelDrawingContext &context, + const TimeTrack *track, + const wxRect & rect, const ZoomInfo &zoomInfo); void DrawTimeSlider(wxDC & dc, const wxRect & rect, bool rightwards); - void DrawClipWaveform(const WaveTrack *track, const WaveClip *clip, - wxDC & dc, const wxRect & rect, + void DrawClipWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const WaveClip *clip, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool dB, bool muted); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index d4a383386..58c7b4185 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1718,26 +1718,28 @@ void TrackPanel::DrawTracks(wxDC * dc) bool bigPointsFlag = pTtb->IsDown(drawTool) || bMultiToolDown; bool sliderFlag = bMultiToolDown; + TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState }; + // The track artist actually draws the stuff inside each track auto first = GetProject()->GetFirstVisible(); - mTrackArtist->DrawTracks(GetTracks(), first.get(), - *dc, region, tracksRect, clip, + mTrackArtist->DrawTracks(context, GetTracks(), first.get(), + region, tracksRect, clip, mViewInfo->selectedRegion, *mViewInfo, envelopeFlag, bigPointsFlag, sliderFlag); - DrawEverythingElse(dc, region, clip); + DrawEverythingElse(context, region, clip); } /// Draws 'Everything else'. In particular it draws: /// - Drop shadow for tracks and vertical rulers. /// - Zooming Indicators. /// - Fills in space below the tracks. -void TrackPanel::DrawEverythingElse(wxDC * dc, +void TrackPanel::DrawEverythingElse(TrackPanelDrawingContext &context, const wxRegion ®ion, const wxRect & clip) { // We draw everything else - + auto dc = &context.dc; wxRect focusRect(-1, -1, 0, 0); wxRect trackRect = clip; trackRect.height = 0; // for drawing background in no tracks case. @@ -1787,7 +1789,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, if (mAx->IsFocused(t)) { focusRect = borderRect; } - DrawOutside(borderTrack, dc, borderRect); + DrawOutside(context, borderTrack, borderRect); } // Believe it or not, we can speed up redrawing if we don't @@ -1806,7 +1808,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, rect.y += kTopMargin; rect.width = GetVRulerWidth(); rect.height -= (kTopMargin + kBottomMargin); - mTrackArtist->DrawVRuler(t, dc, rect); + mTrackArtist->DrawVRuler(context, t, rect); } #ifdef EXPERIMENTAL_OUTPUT_DISPLAY @@ -1819,7 +1821,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, rect.y += kTopMargin; rect.width = GetVRulerWidth(); rect.height -= (kTopMargin + kBottomMargin); - mTrackArtist->DrawVRuler(t, dc, rect); + mTrackArtist->DrawVRuler(context, t, rect); } } #endif @@ -2279,15 +2281,18 @@ void TrackInfo::Status2DrawFunction StatusDrawFunction( s, dc, rect ); } -void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) +void TrackPanel::DrawOutside +(TrackPanelDrawingContext &context, + Track * t, const wxRect & rec) { + auto dc = &context.dc; bool bIsWave = (t->GetKind() == Track::Wave); // Draw things that extend right of track control panel { // Start with whole track rect wxRect rect = rec; - DrawOutsideOfTrack(t, dc, rect); + DrawOutsideOfTrack(context, t, rect); // Now exclude left, right, and top insets rect.x += kLeftInset; @@ -2319,7 +2324,6 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) rect.y += kTopMargin; rect.height -= (kBottomMargin + kTopMargin); - TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState }; TrackInfo::DrawItems( context, rect, *t ); //mTrackInfo.DrawBordersWithin( dc, rect, *t ); @@ -2329,8 +2333,11 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) // Paint the inset areas left, top, and right in a background color // If linked to a following channel, also paint the separator area, which // overlaps the next track rectangle's top -void TrackPanel::DrawOutsideOfTrack(Track * t, wxDC * dc, const wxRect & rect) +void TrackPanel::DrawOutsideOfTrack +(TrackPanelDrawingContext &context, Track * t, const wxRect & rect) { + auto dc = &context.dc; + // Fill in area outside of the track AColor::TrackPanelBackground(dc, false); wxRect side; diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 85ed67a6f..11a7e03bc 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -171,7 +171,6 @@ public: void DrawBackground(wxDC * dc, const wxRect & rect, bool bSelected, bool bHasMuteSolo, const int labelw, const int vrul) const; void DrawBordersWithin(wxDC * dc, const wxRect & rect, const Track &track ) const; - void DrawVRuler(wxDC * dc, const wxRect & rect, Track * t) const; static void GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest ); static void GetCloseBoxRect(const wxRect & rect, wxRect &dest); @@ -412,14 +411,19 @@ public: protected: void DrawTracks(wxDC * dc); - void DrawEverythingElse(wxDC *dc, const wxRegion & region, + void DrawEverythingElse(TrackPanelDrawingContext &context, + const wxRegion & region, const wxRect & clip); - void DrawOutside(Track *t, wxDC *dc, const wxRect & rec); + void DrawOutside + (TrackPanelDrawingContext &context, + Track *t, const wxRect & rec); void HighlightFocusedTrack (wxDC* dc, const wxRect &rect); void DrawShadow (Track *t, wxDC* dc, const wxRect & rect); void DrawBordersAroundTrack(Track *t, wxDC* dc, const wxRect & rect, const int labelw, const int vrul); - void DrawOutsideOfTrack (Track *t, wxDC* dc, const wxRect & rect); + void DrawOutsideOfTrack + (TrackPanelDrawingContext &context, + Track *t, const wxRect & rect); public: // Set the object that performs catch-all event handling when the pointer diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp index 3feee2c24..5a3c4c21b 100644 --- a/src/effects/Equalization.cpp +++ b/src/effects/Equalization.cpp @@ -2871,6 +2871,7 @@ void EqualizationPanel::OnSize(wxSizeEvent & WXUNUSED(event)) Refresh( false ); } +#include "TrackPanelDrawingContext.h" void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event)) { wxPaintDC dc(this); @@ -3038,8 +3039,10 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event)) memDC.SetPen(*wxBLACK_PEN); if( mEffect->mDraw->GetValue() ) { - mEffect->mEnvelope->DrawPoints(memDC, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0, - mEffect->mdBMin, mEffect->mdBMax, false); + TrackPanelDrawingContext context{ memDC, {}, {} }; + mEffect->mEnvelope->DrawPoints( + context, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0, + mEffect->mdBMin, mEffect->mdBMax, false); } dc.Blit(0, 0, mWidth, mHeight, &memDC, 0, 0, wxCOPY, FALSE); From 2475b1554bb7df27f38f70d1fa0965b5c101d8ca Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 9 Jul 2017 12:24:07 -0400 Subject: [PATCH 4/7] Support for TCP button highlighting --- src/AColor.cpp | 7 +++++-- src/AColor.h | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/AColor.cpp b/src/AColor.cpp index 331b506da..84dbe3d3b 100644 --- a/src/AColor.cpp +++ b/src/AColor.cpp @@ -230,10 +230,13 @@ void AColor::Bevel(wxDC & dc, bool up, const wxRect & r) AColor::Line(dc, r.x, r.y + r.height, r.x + r.width, r.y + r.height); } -void AColor::Bevel2(wxDC & dc, bool up, const wxRect & r, bool bSel) +void AColor::Bevel2 +(wxDC & dc, bool up, const wxRect & r, bool bSel, bool bHighlight) { int index = 0; - if( bSel ) + if ( bHighlight ) + index = bmpHiliteButtonExpand; + else if( bSel ) index = up ? bmpUpButtonExpandSel : bmpDownButtonExpandSel; else index = up ? bmpUpButtonExpand : bmpDownButtonExpand; diff --git a/src/AColor.h b/src/AColor.h index c0c7e8b68..fe8d0c2c4 100644 --- a/src/AColor.h +++ b/src/AColor.h @@ -66,7 +66,8 @@ class AColor { static void Line(wxDC & dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); static void DrawFocus(wxDC & dc, wxRect & r); static void Bevel(wxDC & dc, bool up, const wxRect & r); - static void Bevel2(wxDC & dc, bool up, const wxRect & r, bool bSel=false); + static void Bevel2 + (wxDC & dc, bool up, const wxRect & r, bool bSel=false, bool bHighlight = false); static void BevelTrackInfo(wxDC & dc, bool up, const wxRect & r); static wxColour Blend(const wxColour & c1, const wxColour & c2); From 25641ae568fb01be5041c57b9da9908ec8cdcf64 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 21 Jun 2017 23:16:46 -0400 Subject: [PATCH 5/7] Highlight TCP buttons --- src/TrackPanel.cpp | 18 +++++++++--------- src/TrackPanel.h | 2 +- src/tracks/ui/ButtonHandle.cpp | 4 +++- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 58c7b4185..b14cb600b 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1918,7 +1918,7 @@ void TrackInfo::CloseTitleDrawFunction 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 ); + AColor::Bevel2(*dc, !down, bev, selected, hit ); #ifdef EXPERIMENTAL_THEMING wxPen pen( theTheme.Colour( clrTrackPanelText )); @@ -1954,7 +1954,7 @@ void TrackInfo::CloseTitleDrawFunction pTrack ? pTrack->GetName() : _("Name"); //bev.Inflate(-1, -1); - AColor::Bevel2(*dc, !down, bev, selected); + AColor::Bevel2(*dc, !down, bev, selected, hit); // Draw title text SetTrackInfoFont(dc); @@ -2024,7 +2024,7 @@ void TrackInfo::MinimizeSyncLockDrawFunction //AColor::MediumTrackInfo(dc, t->GetSelected()); //dc->DrawRectangle(bev); - AColor::Bevel2(*dc, !down, bev, selected); + AColor::Bevel2(*dc, !down, bev, selected, hit); #ifdef EXPERIMENTAL_THEMING wxColour c = theTheme.Colour(clrTrackPanelText); @@ -2123,7 +2123,7 @@ void TrackInfo::VelocitySliderDrawFunction void TrackInfo::MuteOrSoloDrawFunction ( wxDC *dc, const wxRect &bev, const Track *pTrack, bool down, bool captured, - bool solo ) + bool solo, bool hit ) { //bev.Inflate(-1, -1); bool selected = pTrack ? pTrack->GetSelected() : true; @@ -2163,7 +2163,7 @@ void TrackInfo::MuteOrSoloDrawFunction *dc, value == down, bev, - selected + selected, hit ); SetTrackInfoFont(dc); @@ -2183,7 +2183,7 @@ void TrackInfo::WideMuteDrawFunction 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 ); + MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false, hit ); } void TrackInfo::WideSoloDrawFunction @@ -2197,7 +2197,7 @@ void TrackInfo::WideSoloDrawFunction 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 ); + MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true, hit ); } void TrackInfo::MuteAndSoloDrawFunction @@ -2217,7 +2217,7 @@ void TrackInfo::MuteAndSoloDrawFunction 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 ); + MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false, hit ); } if( !bHasSoloButton ) @@ -2229,7 +2229,7 @@ void TrackInfo::MuteAndSoloDrawFunction 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 ); + MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true, hit ); } } diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 11a7e03bc..943aeb540 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -139,7 +139,7 @@ public: static void MuteOrSoloDrawFunction ( wxDC *dc, const wxRect &rect, const Track *pTrack, bool down, - bool captured, bool solo ); + bool captured, bool solo, bool hit ); static void WideMuteDrawFunction ( TrackPanelDrawingContext &context, diff --git a/src/tracks/ui/ButtonHandle.cpp b/src/tracks/ui/ButtonHandle.cpp index 4e07932a0..54412c936 100644 --- a/src/tracks/ui/ButtonHandle.cpp +++ b/src/tracks/ui/ButtonHandle.cpp @@ -24,7 +24,9 @@ ButtonHandle::ButtonHandle ( const std::shared_ptr &pTrack, const wxRect &rect ) : mpTrack{ pTrack } , mRect{ rect } -{} +{ + mChangeHighlight = RefreshCode::RefreshCell; +} ButtonHandle::~ButtonHandle() { From 44d6d5f4270c6fb8db5d51745c03bb47b79289fe Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 22 Jun 2017 00:23:17 -0400 Subject: [PATCH 6/7] Highlight MIDI channel buttons --- src/NoteTrack.cpp | 13 ++++++++++--- src/NoteTrack.h | 3 ++- src/TrackPanel.cpp | 5 ++++- .../notetrack/ui/NoteTrackButtonHandle.cpp | 13 ++++++++++++- .../notetrack/ui/NoteTrackButtonHandle.h | 4 ++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index dddd76e99..4ccbd5987 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -251,7 +251,7 @@ void NoteTrack::WarpAndTransposeNotes(double t0, double t1, // Draws the midi channel toggle buttons within the given rect. // The rect should be evenly divisible by 4 on both axis. void NoteTrack::DrawLabelControls -( const NoteTrack *pTrack, wxDC & dc, const wxRect &rect ) +( const NoteTrack *pTrack, wxDC & dc, const wxRect &rect, int highlightedChannel ) { wxASSERT_MSG(rect.width % 4 == 0, "Midi channel control rect width must be divisible by 4"); wxASSERT_MSG(rect.height % 4 == 0, "Midi channel control rect height must be divisible by 4"); @@ -273,7 +273,11 @@ void NoteTrack::DrawLabelControls bool visible = pTrack ? pTrack->IsVisibleChan(chanName - 1) : true; if (visible) { - AColor::MIDIChannel(&dc, chanName); + // highlightedChannel counts 0 based + if ( chanName == highlightedChannel + 1 ) + AColor::LightMIDIChannel(&dc, chanName); + else + AColor::MIDIChannel(&dc, chanName); dc.DrawRectangle(box); // two choices: channel is enabled (to see and play) when button is in // "up" position (original Audacity style) or in "down" position @@ -299,7 +303,10 @@ void NoteTrack::DrawLabelControls box.x, box.y + box.height - 1, box.x + box.width - 1, box.y + box.height - 1); } else { - AColor::MIDIChannel(&dc, 0); + if ( chanName == highlightedChannel + 1 ) + AColor::LightMIDIChannel(&dc, chanName); + else + AColor::MIDIChannel(&dc, 0); dc.DrawRectangle(box); #if CHANNEL_ON_IS_DOWN AColor::LightMIDIChannel(&dc, 0); diff --git a/src/NoteTrack.h b/src/NoteTrack.h index 7c705e56c..03b78c51b 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -90,7 +90,8 @@ class AUDACITY_DLL_API NoteTrack final const TimeWarper &warper, double semitones); static void DrawLabelControls - ( const NoteTrack *pTrack, wxDC & dc, const wxRect &rect ); + ( const NoteTrack *pTrack, wxDC & dc, const wxRect &rect, + int highlightedChannel = -1 ); int FindChannel(const wxRect &rect, int mx, int my); bool LabelClick(const wxRect &rect, int x, int y, bool right); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index b14cb600b..a50eb04b0 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2056,16 +2056,19 @@ void TrackInfo::MinimizeSyncLockDrawFunction } } +#include "tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h" void TrackInfo::MidiControlsDrawFunction ( TrackPanelDrawingContext &context, const wxRect &rect, const Track *pTrack ) { #ifdef EXPERIMENTAL_MIDI_OUT + auto target = dynamic_cast( context.target.get() ); + auto channel = target ? target->GetChannel() : -1; auto &dc = context.dc; wxRect midiRect = rect; GetMidiControlsHorizontalBounds(rect, midiRect); NoteTrack::DrawLabelControls - ( static_cast(pTrack), dc, midiRect ); + ( static_cast(pTrack), dc, midiRect, channel ); #endif // EXPERIMENTAL_MIDI_OUT } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp index 9a4e1dd1d..ec47314ed 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.cpp @@ -24,12 +24,23 @@ NoteTrackButtonHandle::NoteTrackButtonHandle : mpTrack{ pTrack } , mChannel{ channel } , mRect{ rect } -{} +{ + mChangeHighlight = RefreshCode::RefreshCell; +} NoteTrackButtonHandle::~NoteTrackButtonHandle() { } +UIHandle::Result NoteTrackButtonHandle::NeedChangeHighlight +(const NoteTrackButtonHandle &oldState, const NoteTrackButtonHandle &newState) +{ + if (oldState.GetChannel() != newState.GetChannel()) + // Repaint whenever the highlighted button is different + return RefreshCode::RefreshCell; + return 0; +} + UIHandlePtr NoteTrackButtonHandle::HitTest (std::weak_ptr &holder, const wxMouseState &state, const wxRect &rect, diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h index bf5b4dbb6..b80068387 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackButtonHandle.h @@ -42,6 +42,10 @@ public: int GetChannel() const { return mChannel; } + static UIHandle::Result NeedChangeHighlight + (const NoteTrackButtonHandle &oldState, + const NoteTrackButtonHandle &newState); + protected: Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override; From 51e25cdfa0bb598e5c6ff126b55a82e08ef53cdf Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 25 Jun 2017 18:15:54 -0400 Subject: [PATCH 7/7] Highlighting of Track Control Panel sliders --- src/TrackPanel.cpp | 11 ++++++----- src/TrackPanel.h | 3 ++- src/tracks/ui/SliderHandle.cpp | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index a50eb04b0..2e394df24 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2076,12 +2076,13 @@ template void TrackInfo::SliderDrawFunction ( LWSlider *(*Selector) (const wxRect &sliderRect, const TrackClass *t, bool captured, wxWindow*), - wxDC *dc, const wxRect &rect, const Track *pTrack, bool captured ) + wxDC *dc, const wxRect &rect, const Track *pTrack, + bool captured, bool highlight ) { wxRect sliderRect = rect; TrackInfo::GetSliderHorizontalBounds( rect.GetTopLeft(), sliderRect ); auto wt = static_cast( pTrack ); - Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, false); + Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, highlight); } #include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h" @@ -2094,7 +2095,7 @@ void TrackInfo::PanSliderDrawFunction bool hit = target && target->GetTrack().get() == pTrack; bool captured = hit && target->IsClicked(); SliderDrawFunction - ( &TrackInfo::PanSlider, dc, rect, pTrack, captured); + ( &TrackInfo::PanSlider, dc, rect, pTrack, captured, hit); } void TrackInfo::GainSliderDrawFunction @@ -2106,7 +2107,7 @@ void TrackInfo::GainSliderDrawFunction bool hit = target && target->GetTrack().get() == pTrack; bool captured = hit && target->IsClicked(); SliderDrawFunction - ( &TrackInfo::GainSlider, dc, rect, pTrack, captured); + ( &TrackInfo::GainSlider, dc, rect, pTrack, captured, hit); } #ifdef EXPERIMENTAL_MIDI_OUT @@ -2120,7 +2121,7 @@ void TrackInfo::VelocitySliderDrawFunction bool hit = target && target->GetTrack().get() == pTrack; bool captured = hit && target->IsClicked(); SliderDrawFunction - ( &TrackInfo::VelocitySlider, dc, rect, pTrack, captured); + ( &TrackInfo::VelocitySlider, dc, rect, pTrack, captured, hit); } #endif diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 943aeb540..8e11c1e89 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -121,7 +121,8 @@ public: ( LWSlider *(*Selector) (const wxRect &sliderRect, const TrackClass *t, bool captured, wxWindow*), - wxDC *dc, const wxRect &rect, const Track *pTrack, bool captured ); + wxDC *dc, const wxRect &rect, const Track *pTrack, + bool captured, bool highlight ); static void PanSliderDrawFunction ( TrackPanelDrawingContext &context, diff --git a/src/tracks/ui/SliderHandle.cpp b/src/tracks/ui/SliderHandle.cpp index d422d820f..6bae9d82e 100644 --- a/src/tracks/ui/SliderHandle.cpp +++ b/src/tracks/ui/SliderHandle.cpp @@ -21,7 +21,9 @@ SliderHandle::SliderHandle : mSliderFn{ sliderFn } , mRect{ rect } , mpTrack{ pTrack } -{} +{ + mChangeHighlight = RefreshCode::RefreshCell; +} SliderHandle::~SliderHandle() {