From 50d2a5b665c83328d41d49604aa950ae9816a8bb Mon Sep 17 00:00:00 2001 From: BusinessmanProgrammerSteve Date: Mon, 13 Sep 2010 07:41:17 +0000 Subject: [PATCH] Draw a (slightly lighter) selection outside of clips in audio tracks. --- src/AllThemeResources.h | 2 + src/TrackArtist.cpp | 85 ++++++++++++++++++++++++++++++++++++----- src/TrackArtist.h | 7 ++++ 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/src/AllThemeResources.h b/src/AllThemeResources.h index d28d03bb6..02f5bf05a 100644 --- a/src/AllThemeResources.h +++ b/src/AllThemeResources.h @@ -333,4 +333,6 @@ from there. Audacity will look for a file called "Pause.png". DEFINE_COLOUR( clrSyncLockSel, wxColour(192, 192, 192), wxT("SyncLockSel")); DEFINE_COLOUR( clrTrackInfoSyncLockSel, wxColour( 64, 64, 64), wxT("TrackInfoSyncLockSel")); DEFINE_COLOUR( clrSelTranslucent, wxColour(104, 104, 148, 127), wxT("SelTranslucent")); + // This is for waveform drawing, selected outside of clips + DEFINE_COLOUR( clrBlankSelected, wxColour(170, 170, 192), wxT("BlankSelected")); diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index d94fbbedb..9e1da4397 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -113,6 +113,7 @@ void TrackArtist::SetColours() theTheme.SetBrushColour( sampleBrush, clrSample); theTheme.SetBrushColour( selsampleBrush, clrSelSample); theTheme.SetBrushColour( dragsampleBrush, clrDragSample); + theTheme.SetBrushColour( blankSelectedBrush, clrBlankSelected); theTheme.SetPenColour( blankPen, clrBlank); theTheme.SetPenColour( unselectedPen, clrUnselected); @@ -120,13 +121,14 @@ void TrackArtist::SetColours() theTheme.SetPenColour( samplePen, clrSample); theTheme.SetPenColour( selsamplePen, clrSelSample); theTheme.SetPenColour( muteSamplePen, clrMuteSample); - theTheme.SetPenColour( odProgressDonePen, clrProgressDone); - theTheme.SetPenColour( odProgressNotYetPen, clrProgressNotYet); + theTheme.SetPenColour( odProgressDonePen, clrProgressDone); + theTheme.SetPenColour( odProgressNotYetPen, clrProgressNotYet); theTheme.SetPenColour( rmsPen, clrRms); theTheme.SetPenColour( muteRmsPen, clrMuteRms); theTheme.SetPenColour( shadowPen, clrShadow); theTheme.SetPenColour( clippedPen, clrClipped); theTheme.SetPenColour( muteClippedPen, clrMuteClipped); + theTheme.SetPenColour( blankSelectedPen,clrBlankSelected); } void TrackArtist::SetInset(int left, int top, int right, int bottom) @@ -1086,10 +1088,8 @@ void TrackArtist::DrawWaveform(WaveTrack *track, bool dB, bool muted) { - // MM: Draw background. We should optimize that a bit more. - dc.SetPen(*wxTRANSPARENT_PEN); - dc.SetBrush(blankBrush); - dc.DrawRectangle(r); + DrawBackgroundWithSelection(&dc, r, track, blankSelectedBrush, blankBrush, + viewInfo->sel0, viewInfo->sel1, viewInfo->h, viewInfo->zoom); for (WaveClipList::compatibility_iterator it = track->GetClipIterator(); it; it = it->GetNext()) DrawClipWaveform(track, it->GetData(), dc, r, viewInfo, @@ -1424,10 +1424,8 @@ void TrackArtist::DrawSpectrum(WaveTrack *track, bool autocorrelation, bool logF) { - // MM: Draw background. We should optimize that a bit more. - dc.SetPen(*wxTRANSPARENT_PEN); - dc.SetBrush(blankBrush); - dc.DrawRectangle(r); + DrawBackgroundWithSelection(&dc, r, track, blankSelectedBrush, blankBrush, + viewInfo->sel0, viewInfo->sel1, viewInfo->h, viewInfo->zoom); if(!viewInfo->bUpdateTrackIndicator && viewInfo->bIsPlaying) { // BG: Draw (undecorated) waveform instead of spectrum @@ -2678,3 +2676,70 @@ void TrackArtist::DrawSyncLockTiles(wxDC *dc, wxRect r) } } +void TrackArtist::DrawBackgroundWithSelection(wxDC *dc, const wxRect &r, + Track *track, wxBrush &selBrush, wxBrush &unselBrush, + double sel0, double sel1, double h, double pps) +{ + //MM: Draw background. We should optimize that a bit more. + //AWD: "+ 1.5" and "+ 2.5" throughout match code in + //AdornedRulerPanel::DoDrawSelection() and make selection line up with ruler. + //I don't know if/why this is correct. + + dc->SetPen(*wxTRANSPARENT_PEN); + if (track->GetSelected() || track->IsSyncLockSelected()) + { + // Rectangles before, within, after the selction + wxRect before = r; + wxRect within = r; + wxRect after = r; + + before.width = int ((sel0 - h) * pps + 2.5); + if (before.GetRight() > r.GetRight()) { + before.width = r.width; + } + + if (before.width > 0) { + dc->SetBrush(unselBrush); + dc->DrawRectangle(before); + + within.x = before.GetRight(); + } + within.width = r.x + int ((sel1 - h) * pps + 2.5) - within.x; + + if (within.GetRight() > r.GetRight()) { + within.width = r.GetRight() - within.x; + } + + if (within.width > 0) { + if (track->GetSelected()) { + dc->SetBrush(selBrush); + dc->DrawRectangle(within); + } + else { + // Per condition above, track must be sync-lock selected + dc->SetBrush(unselBrush); + dc->DrawRectangle(within); + DrawSyncLockTiles(dc, within); + } + + after.x = within.GetRight(); + } + else { + // `within` not drawn; start where it would have gone + after.x = within.x; + } + + after.width = r.GetRight() - after.x; + if (after.width > 0) { + dc->SetBrush(unselBrush); + dc->DrawRectangle(after); + } + } + else + { + // Track not selected; just draw background + dc->SetBrush(unselBrush); + dc->DrawRectangle(r); + } +} + diff --git a/src/TrackArtist.h b/src/TrackArtist.h index a93a53143..567a75e17 100644 --- a/src/TrackArtist.h +++ b/src/TrackArtist.h @@ -94,6 +94,11 @@ class AUDACITY_DLL_API TrackArtist { // Helper: draws the "sync-locked" watermark tiled to a rectangle static void DrawSyncLockTiles(wxDC *dc, wxRect r); + // Helper: draws background with selection rect + static void DrawBackgroundWithSelection(wxDC *dc, const wxRect &r, + Track *track, wxBrush &selBrush, wxBrush &unselBrush, + double sel0, double sel1, double h, double pps); + private: // @@ -194,6 +199,7 @@ class AUDACITY_DLL_API TrackArtist { wxBrush selsampleBrush; wxBrush dragsampleBrush;// for samples which are draggable. wxBrush muteSampleBrush; + wxBrush blankSelectedBrush; wxPen blankPen; wxPen unselectedPen; wxPen selectedPen; @@ -207,6 +213,7 @@ class AUDACITY_DLL_API TrackArtist { wxPen shadowPen; wxPen clippedPen; wxPen muteClippedPen; + wxPen blankSelectedPen; Ruler *vruler;