Reduce the amount of repainting done when the selection changes to a new one that doesn't overlap the old selection

Originally committed to SVN as r5068.
This commit is contained in:
Thomas Goyne 2010-12-30 22:19:24 +00:00
parent 364f398c5f
commit f3d1bc23bd
1 changed files with 8 additions and 5 deletions

View File

@ -1206,13 +1206,15 @@ void AudioDisplay::OnSelectionChanged()
SampleRange sel(controller->GetPrimaryPlaybackRange()); SampleRange sel(controller->GetPrimaryPlaybackRange());
scrollbar->SetSelection(AbsoluteXFromSamples(sel.begin()), AbsoluteXFromSamples(sel.length())); scrollbar->SetSelection(AbsoluteXFromSamples(sel.begin()), AbsoluteXFromSamples(sel.length()));
int s1 = RelativeXFromSamples(sel.begin());
int e1 = RelativeXFromSamples(sel.end());
int s2 = RelativeXFromSamples(old_selection.begin());
int e2 = RelativeXFromSamples(old_selection.end());
if (sel.overlaps(old_selection)) if (sel.overlaps(old_selection))
{ {
// Only redraw the parts of the selection that changed, to avoid flicker // Only redraw the parts of the selection that changed, to avoid flicker
int s1 = RelativeXFromSamples(sel.begin());
int e1 = RelativeXFromSamples(sel.end());
int s2 = RelativeXFromSamples(old_selection.begin());
int e2 = RelativeXFromSamples(old_selection.end());
if (s1 != s2) if (s1 != s2)
{ {
wxRect r(std::min(s1, s2)-10, audio_top, abs(s1-s2)+20, audio_height); wxRect r(std::min(s1, s2)-10, audio_top, abs(s1-s2)+20, audio_height);
@ -1226,7 +1228,8 @@ void AudioDisplay::OnSelectionChanged()
} }
else else
{ {
RefreshRect(wxRect(0, audio_top, GetClientSize().GetX(), audio_height)); RefreshRect(wxRect(s1 - 10, audio_top, e1 + 20, audio_height));
RefreshRect(wxRect(s2 - 10, audio_top, e2 + 20, audio_height));
} }
RefreshRect(scrollbar->GetBounds()); RefreshRect(scrollbar->GetBounds());