1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 08:09:32 +02:00

New base classes of TrackPanel just for the bitmap backing and overlay system...

... to make it reusable by other classes.

Also, don't create a second DC when repainting TrackPanel.
This commit is contained in:
Paul Licameli 2016-05-07 13:00:48 -04:00
parent 3569851609
commit 7c2a531486
20 changed files with 419 additions and 253 deletions

View File

@ -1208,10 +1208,12 @@
28FC1AFB0A47762C00A188AE /* WrappedType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 28FC1AF90A47762C00A188AE /* WrappedType.cpp */; };
28FE4A080ABF4E960056F5C4 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 28FE4A060ABF4E960056F5C4 /* mmx_optimized.cpp */; };
28FE4A090ABF4E960056F5C4 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 28FE4A070ABF4E960056F5C4 /* sse_optimized.cpp */; };
5E74D2D81CC4425D00D88B0B /* TrackPanelOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E74D2D61CC4425D00D88B0B /* TrackPanelOverlay.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 */; };
5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */; };
5ED1D0AE1CDE55BD00471E3C /* OverlayPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */; };
5ED1D0B11CDE560C00471E3C /* BackedPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */; };
8406A93812D0F2510011EA01 /* EQDefaultCurves.xml in Resources */ = {isa = PBXBuildFile; fileRef = 8406A93712D0F2510011EA01 /* EQDefaultCurves.xml */; };
8484F31413086237002DF7F0 /* DeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8484F31213086237002DF7F0 /* DeviceManager.cpp */; };
ED15214D163C22F000451B5F /* lsr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED152123163C220300451B5F /* lsr.c */; };
@ -2973,8 +2975,6 @@
28FEC1B21A12B6FB00FACE48 /* EffectAutomationParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EffectAutomationParameters.h; path = ../include/audacity/EffectAutomationParameters.h; sourceTree = SOURCE_ROOT; };
5E4685F81CCA9D84008741F2 /* CommandFunctors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommandFunctors.h; sourceTree = "<group>"; };
5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryX.h; sourceTree = "<group>"; };
5E74D2D61CC4425D00D88B0B /* TrackPanelOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackPanelOverlay.cpp; sourceTree = "<group>"; };
5E74D2D71CC4425D00D88B0B /* TrackPanelOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelOverlay.h; sourceTree = "<group>"; };
5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCell.h; sourceTree = "<group>"; };
5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCellIterator.h; sourceTree = "<group>"; };
5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditCursorOverlay.cpp; sourceTree = "<group>"; };
@ -2985,6 +2985,12 @@
5E74D2E21CC4429700D88B0B /* Scrubbing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scrubbing.h; sourceTree = "<group>"; };
5ED18DB61CC16B1E00FAFE95 /* Reverb_libSoX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reverb_libSoX.h; sourceTree = "<group>"; };
5ED18DB71CC290AB00FAFE95 /* wxFileNameWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wxFileNameWrapper.h; sourceTree = "<group>"; };
5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Overlay.cpp; sourceTree = "<group>"; };
5ED1D0AA1CDE55BD00471E3C /* Overlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Overlay.h; sourceTree = "<group>"; };
5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OverlayPanel.cpp; sourceTree = "<group>"; };
5ED1D0AC1CDE55BD00471E3C /* OverlayPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayPanel.h; sourceTree = "<group>"; };
5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackedPanel.cpp; sourceTree = "<group>"; };
5ED1D0B01CDE560C00471E3C /* BackedPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackedPanel.h; sourceTree = "<group>"; };
82FF184D13CF01A600C1B664 /* dBTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dBTable.cpp; path = sbsms/src/dBTable.cpp; sourceTree = "<group>"; };
82FF184E13CF01A600C1B664 /* dBTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dBTable.h; path = sbsms/src/dBTable.h; sourceTree = "<group>"; };
82FF184F13CF01A600C1B664 /* slide.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slide.cpp; path = sbsms/src/slide.cpp; sourceTree = "<group>"; };
@ -3885,7 +3891,6 @@
1790B0EA09883BFD008A330A /* TrackArtist.cpp */,
1790B0EC09883BFD008A330A /* TrackPanel.cpp */,
1790B0EE09883BFD008A330A /* TrackPanelAx.cpp */,
5E74D2D61CC4425D00D88B0B /* TrackPanelOverlay.cpp */,
1790B0F209883BFD008A330A /* UndoManager.cpp */,
28C8211C1B5C661E00B53328 /* ViewInfo.cpp */,
1790B0F709883BFD008A330A /* VoiceKey.cpp */,
@ -3983,7 +3988,6 @@
5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */,
5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */,
2803C8B619F35AA000278526 /* TrackPanelListener.h */,
5E74D2D71CC4425D00D88B0B /* TrackPanelOverlay.h */,
284416391B82D6BC0000574D /* TranslatableStringArray.h */,
1790B0F309883BFD008A330A /* UndoManager.h */,
1790B0F609883BFD008A330A /* ViewInfo.h */,
@ -4290,46 +4294,52 @@
isa = PBXGroup;
children = (
1790B0FE09883BFD008A330A /* AButton.cpp */,
1790B0FF09883BFD008A330A /* AButton.h */,
1790B10009883BFD008A330A /* ASlider.cpp */,
1790B10109883BFD008A330A /* ASlider.h */,
28F1D8170A2D0018005506A7 /* AttachableScrollBar.cpp */,
28F1D8180A2D0018005506A7 /* AttachableScrollBar.h */,
5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */,
283AA0E90C56ED08002CBD34 /* ErrorDialog.cpp */,
283AA0EA0C56ED08002CBD34 /* ErrorDialog.h */,
28F1D8190A2D0018005506A7 /* ExpandingToolBar.cpp */,
28F1D81A0A2D0018005506A7 /* ExpandingToolBar.h */,
28CCDCFF0F939FD70081F2FC /* FileHistory.cpp */,
28CCDD040F93A0B20081F2FC /* FileHistory.h */,
2897F6FC0AB3DCD0003C20C5 /* Grabber.cpp */,
2897F6FD0AB3DCD0003C20C5 /* Grabber.h */,
280828580A75E0EA000002EF /* Grid.cpp */,
280828590A75E0EA000002EF /* Grid.h */,
280112791943EE0E00D98A16 /* HelpSystem.cpp */,
2801127A1943EE0E00D98A16 /* HelpSystem.h */,
28530C480DF2105200555C94 /* HtmlWindow.cpp */,
28530C490DF2105200555C94 /* HtmlWindow.h */,
28F1D81B0A2D0019005506A7 /* ImageRoll.cpp */,
28F1D81C0A2D0019005506A7 /* ImageRoll.h */,
2849A41E17F8BEC2005C653F /* KeyView.cpp */,
2849A41F17F8BEC2005C653F /* KeyView.h */,
2816372C0BAE3B6C0079C746 /* LinkingHtmlWindow.cpp */,
2816372D0BAE3B6C0079C746 /* LinkingHtmlWindow.h */,
1790B10309883BFD008A330A /* Meter.cpp */,
1790B10409883BFD008A330A /* Meter.h */,
1790B10509883BFD008A330A /* MultiDialog.cpp */,
1790B10609883BFD008A330A /* MultiDialog.h */,
28001B3C1A0F0E5D007DD161 /* NumericTextCtrl.cpp */,
28001B3D1A0F0E5D007DD161 /* NumericTextCtrl.h */,
28F2CED0181867BB00573D61 /* numformatter.cpp */,
28F2CED1181867BB00573D61 /* numformatter.h */,
5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */,
5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */,
28530C4A0DF2105200555C94 /* ProgressDialog.cpp */,
28530C4B0DF2105200555C94 /* ProgressDialog.h */,
1790B10709883BFD008A330A /* Ruler.cpp */,
1790B10809883BFD008A330A /* Ruler.h */,
28F2CED2181867BB00573D61 /* valnum.cpp */,
28F2CED3181867BB00573D61 /* valnum.h */,
1790B10B09883BFD008A330A /* Warning.cpp */,
1790B0FF09883BFD008A330A /* AButton.h */,
1790B10109883BFD008A330A /* ASlider.h */,
28F1D8180A2D0018005506A7 /* AttachableScrollBar.h */,
5ED1D0B01CDE560C00471E3C /* BackedPanel.h */,
283AA0EA0C56ED08002CBD34 /* ErrorDialog.h */,
28F1D81A0A2D0018005506A7 /* ExpandingToolBar.h */,
28CCDD040F93A0B20081F2FC /* FileHistory.h */,
2897F6FD0AB3DCD0003C20C5 /* Grabber.h */,
280828590A75E0EA000002EF /* Grid.h */,
2801127A1943EE0E00D98A16 /* HelpSystem.h */,
28530C490DF2105200555C94 /* HtmlWindow.h */,
28F1D81C0A2D0019005506A7 /* ImageRoll.h */,
2849A41F17F8BEC2005C653F /* KeyView.h */,
2816372D0BAE3B6C0079C746 /* LinkingHtmlWindow.h */,
1790B10409883BFD008A330A /* Meter.h */,
1790B10609883BFD008A330A /* MultiDialog.h */,
28001B3D1A0F0E5D007DD161 /* NumericTextCtrl.h */,
28F2CED1181867BB00573D61 /* numformatter.h */,
5ED1D0AA1CDE55BD00471E3C /* Overlay.h */,
5ED1D0AC1CDE55BD00471E3C /* OverlayPanel.h */,
28530C4B0DF2105200555C94 /* ProgressDialog.h */,
1790B10809883BFD008A330A /* Ruler.h */,
28F2CED3181867BB00573D61 /* valnum.h */,
1790B10C09883BFD008A330A /* Warning.h */,
);
path = widgets;
@ -7293,6 +7303,7 @@
1790B11C09883BFD008A330A /* AudioIO.cpp in Sources */,
1790B11D09883BFD008A330A /* BatchCommandDialog.cpp in Sources */,
1790B11E09883BFD008A330A /* BatchCommands.cpp in Sources */,
5ED1D0B11CDE560C00471E3C /* BackedPanel.cpp in Sources */,
1790B11F09883BFD008A330A /* BatchProcessDialog.cpp in Sources */,
1790B12009883BFD008A330A /* Benchmark.cpp in Sources */,
1790B12109883BFD008A330A /* LegacyAliasBlockFile.cpp in Sources */,
@ -7415,6 +7426,7 @@
28F1D81F0A2D0019005506A7 /* ImageRoll.cpp in Sources */,
2882177B0A35D8730029AF41 /* ShuttlePrefs.cpp in Sources */,
28F00A930A3E2FF100A3E5F5 /* FileNames.cpp in Sources */,
5ED1D0AE1CDE55BD00471E3C /* OverlayPanel.cpp in Sources */,
28FC1AFB0A47762C00A188AE /* WrappedType.cpp in Sources */,
287F9F3D0A69748F00F025FA /* TimeDialog.cpp in Sources */,
28FBCA6B1B42E01100BB3405 /* AudioUnitEffect.cpp in Sources */,
@ -7453,6 +7465,7 @@
28501EA10CEECEF80029ABAA /* HelpText.cpp in Sources */,
28501EA20CEECEF80029ABAA /* SplashDialog.cpp in Sources */,
28501EAA0CEED0670029ABAA /* LoadVamp.cpp in Sources */,
5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */,
28501EAB0CEED0680029ABAA /* VampEffect.cpp in Sources */,
288052C20DEA73F500671EA4 /* NonGuiThread.cpp in Sources */,
28530C4C0DF2105200555C94 /* HtmlWindow.cpp in Sources */,
@ -7584,7 +7597,6 @@
ED920CAF15B19F61008CA12C /* ModulePrefs.cpp in Sources */,
EDD2431416934A6100D9DEC2 /* BassTreble.cpp in Sources */,
ED19449A1733F92800F4F5CA /* Reverb.cpp in Sources */,
5E74D2D81CC4425D00D88B0B /* TrackPanelOverlay.cpp in Sources */,
2849A42017F8BEC2005C653F /* KeyView.cpp in Sources */,
284FD04217FC72A50009A025 /* ScienFilter.cpp in Sources */,
284FD04517FC72EE0009A025 /* Biquad.cpp in Sources */,

View File

@ -236,8 +236,6 @@ audacity_SOURCES = \
TrackPanelCell.h \
TrackPanelCellIterator.h \
TrackPanelListener.h \
TrackPanelOverlay.cpp \
TrackPanelOverlay.h \
TranslatableStringArray.h \
UndoManager.cpp \
UndoManager.h \
@ -540,6 +538,8 @@ audacity_SOURCES = \
widgets/ASlider.h \
widgets/AttachableScrollBar.cpp \
widgets/AttachableScrollBar.h \
widgets/BackedPanel.cpp \
widgets/BackedPanel.h \
widgets/ErrorDialog.cpp \
widgets/ErrorDialog.h \
widgets/ExpandingToolBar.cpp \
@ -568,6 +568,10 @@ audacity_SOURCES = \
widgets/NumericTextCtrl.h \
widgets/numformatter.cpp \
widgets/numformatter.h \
widgets/Overlay.cpp \
widgets/Overlay.h \
widgets/OverlayPanel.cpp \
widgets/OverlayPanel.h \
widgets/ProgressDialog.cpp \
widgets/ProgressDialog.h \
widgets/Ruler.cpp \

View File

@ -21,6 +21,8 @@
#include "Audacity.h"
#include "Experimental.h"
#include "widgets/OverlayPanel.h"
#include "DirManager.h"
#include "ViewInfo.h"
#include "TrackPanelListener.h"
@ -62,7 +64,6 @@ class Tags;
class EffectPlugs;
class TrackPanel;
class TrackPanelOverlay;
class FreqWindow;
class ContrastDialog;
class Meter;
@ -710,11 +711,11 @@ public:
friend class CommandManager;
// TrackPanelOverlay objects
std::unique_ptr<TrackPanelOverlay>
std::unique_ptr<Overlay>
mIndicatorOverlay, mCursorOverlay;
#ifdef EXPERIMENTAL_SCRUBBING_BASIC
std::unique_ptr<TrackPanelOverlay> mScrubOverlay;
std::unique_ptr<Overlay> mScrubOverlay;
std::unique_ptr<Scrubber> mScrubber;
public:
Scrubber &GetScrubber() { return *mScrubber; }

View File

@ -157,7 +157,6 @@ is time to refresh some aspect of the screen.
#include "TrackPanel.h"
#include "TrackPanelCell.h"
#include "TrackPanelCellIterator.h"
#include "TrackPanelOverlay.h"
//#define DEBUG_DRAW_TIMING 1
// #define SPECTRAL_EDITING_ESC_KEY
@ -346,14 +345,13 @@ enum {
OnZoomFitVerticalID,
};
BEGIN_EVENT_TABLE(TrackPanel, wxWindow)
BEGIN_EVENT_TABLE(TrackPanel, OverlayPanel)
EVT_MOUSE_EVENTS(TrackPanel::OnMouseEvent)
EVT_MOUSE_CAPTURE_LOST(TrackPanel::OnCaptureLost)
EVT_COMMAND(wxID_ANY, EVT_CAPTURE_KEY, TrackPanel::OnCaptureKey)
EVT_KEY_DOWN(TrackPanel::OnKeyDown)
EVT_KEY_UP(TrackPanel::OnKeyUp)
EVT_CHAR(TrackPanel::OnChar)
EVT_SIZE(TrackPanel::OnSize)
EVT_PAINT(TrackPanel::OnPaint)
EVT_SET_FOCUS(TrackPanel::OnSetFocus)
EVT_KILL_FOCUS(TrackPanel::OnKillFocus)
@ -423,15 +421,13 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
ViewInfo * viewInfo,
TrackPanelListener * listener,
AdornedRulerPanel * ruler)
: wxPanel(parent, id, pos, size, wxWANTS_CHARS | wxNO_BORDER),
: OverlayPanel(parent, id, pos, size, wxWANTS_CHARS | wxNO_BORDER),
mTrackInfo(this),
mListener(listener),
mTracks(tracks),
mViewInfo(viewInfo),
mRuler(ruler),
mTrackArtist(NULL),
mBacking(NULL),
mResizeBacking(false),
mRefreshBacking(false),
mConverter(NumericConverter::TIME),
mAutoScrolling(false),
@ -450,11 +446,6 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
SetAccessible( mAx );
#endif
// Preinit the backing DC and bitmap so routines that require it will
// not cause a crash if they run before the panel is fully initialized.
mBacking = new wxBitmap(1, 1);
mBackingDC.SelectObject(*mBacking);
mMouseCapture = IsUncaptured;
mSlideUpDownOnly = false;
mLabelTrackStartXPos=-1;
@ -581,11 +572,6 @@ TrackPanel::~TrackPanel()
if (HasCapture())
ReleaseMouse();
if (mBacking)
{
mBackingDC.SelectObject( wxNullBitmap );
delete mBacking;
}
delete mTrackArtist;
@ -1054,17 +1040,6 @@ double TrackPanel::GetScreenEndTime() const
return mViewInfo->PositionToTime(width, true);
}
/// OnSize() is called when the panel is resized
void TrackPanel::OnSize(wxSizeEvent & /* event */)
{
// Tell OnPaint() to recreate the backing bitmap
mResizeBacking = true;
// Refresh the entire area. Really only need to refresh when
// expanding...is it worth the trouble?
Refresh();
}
/// AS: OnPaint( ) is called during the normal course of
/// completing a repaint operation.
void TrackPanel::OnPaint(wxPaintEvent & /* event */)
@ -1086,44 +1061,27 @@ void TrackPanel::OnPaint(wxPaintEvent & /* event */)
// Reset (should a mutex be used???)
mRefreshBacking = false;
if (mResizeBacking)
{
// Reset
mResizeBacking = false;
// Delete the backing bitmap
if (mBacking)
{
mBackingDC.SelectObject(wxNullBitmap);
delete mBacking;
mBacking = NULL;
}
wxSize sz = GetClientSize();
mBacking = new wxBitmap();
mBacking->Create(sz.x, sz.y); //, *dc);
mBackingDC.SelectObject(*mBacking);
}
// Redraw the backing bitmap
DrawTracks(&mBackingDC);
DrawTracks(&GetBackingDCForRepaint());
// Copy it to the display
dc.Blit(0, 0, mBacking->GetWidth(), mBacking->GetHeight(), &mBackingDC, 0, 0);
DisplayBitmap(dc);
}
else
{
// Copy full, possibly clipped, damage rectangle
dc.Blit(box.x, box.y, box.width, box.height, &mBackingDC, box.x, box.y);
RepairBitmap(dc, box.x, box.y, box.width, box.height);
}
// Done with the clipped DC
}
// Drawing now goes directly to the client area. It can't use the paint DC
// becuase the paint DC might be clipped and DrawOverlays() may need to draw
// outside the clipped region.
DrawOverlays(true);
// Drawing now goes directly to the client area.
// DrawOverlays() may need to draw outside the clipped region.
// (Used to make a new, separate wxClientDC, but that risks flashing
// problems on Mac.)
dc.DestroyClippingRegion();
DrawOverlays(true, &dc);
}
#if DEBUG_DRAW_TIMING
sw.Pause();
@ -7069,83 +7027,6 @@ void TrackPanel::DrawOutsideOfTrack(Track * t, wxDC * dc, const wxRect & rect)
#endif
}
void TrackPanel::AddOverlay(TrackPanelOverlay *pOverlay)
{
mOverlays.push_back(pOverlay);
}
bool TrackPanel::RemoveOverlay(TrackPanelOverlay *pOverlay)
{
const size_t oldSize = mOverlays.size();
std::remove(mOverlays.begin(), mOverlays.end(), pOverlay);
return oldSize != mOverlays.size();
}
void TrackPanel::ClearOverlays()
{
mOverlays.clear();
}
void TrackPanel::DrawOverlays(bool repaint)
{
size_t n_pairs = mOverlays.size();
std::vector< std::pair<wxRect, bool> > pairs;
pairs.reserve(n_pairs);
// Find out the rectangles and outdatedness for each overlay
wxSize size(mBackingDC.GetSize());
for (const auto pOverlay : mOverlays)
pairs.push_back(pOverlay->GetRectangle(size));
// See what requires redrawing. If repainting, all.
// If not, then whatever is outdated, and whatever will be damaged by
// undrawing.
// By redrawing only what needs it, we avoid flashing things like
// the cursor that are drawn with invert.
if (!repaint) {
bool done;
do {
done = true;
for (size_t ii = 0; ii < n_pairs; ++ii) {
for (size_t jj = ii + 1; jj < n_pairs; ++jj) {
if (pairs[ii].second != pairs[jj].second &&
pairs[ii].first.Intersects(pairs[jj].first)) {
done = false;
pairs[ii].second = pairs[jj].second = true;
}
}
}
} while (!done);
}
// Erase
bool done = true;
auto it2 = pairs.begin();
for (auto pOverlay : mOverlays) {
if (repaint || it2->second) {
done = false;
wxClientDC dc(this);
pOverlay->Erase(dc, mBackingDC);
}
++it2;
}
// Draw
if (!done) {
it2 = pairs.begin();
for (auto pOverlay : mOverlays) {
if (repaint || it2->second) {
wxClientDC dc(this);
TrackPanelCellIterator begin(this, true);
TrackPanelCellIterator end(this, false);
pOverlay->Draw(dc, begin, end);
}
++it2;
}
}
}
/// Draw a three-level highlight gradient around the focused track.
void TrackPanel::HighlightFocusedTrack(wxDC * dc, const wxRect & rect)
{

View File

@ -14,10 +14,7 @@
#include "MemoryX.h"
#include <vector>
#include <wx/dcmemory.h>
#include <wx/panel.h>
#include <wx/timer.h>
#include <wx/window.h>
#include "Experimental.h"
#include "audacity/Types.h"
@ -28,6 +25,7 @@
#include "Snap.h"
#include "Track.h"
#include "widgets/OverlayPanel.h"
class wxMenu;
class wxRect;
@ -35,7 +33,6 @@ class wxRect;
class LabelTrack;
class SpectrumAnalyst;
class TrackPanel;
class TrackPanelOverlay;
class TrackArtist;
class Ruler;
class SnapManager;
@ -137,7 +134,7 @@ private:
const int DragThreshold = 3;// Anything over 3 pixels is a drag, else a click.
class AUDACITY_DLL_API TrackPanel final : public wxPanel {
class AUDACITY_DLL_API TrackPanel final : public OverlayPanel {
public:
TrackPanel(wxWindow * parent,
@ -157,7 +154,6 @@ class AUDACITY_DLL_API TrackPanel final : public wxPanel {
virtual void UpdatePrefs();
virtual void OnSize(wxSizeEvent & event);
virtual void OnPaint(wxPaintEvent & event);
virtual void OnMouseEvent(wxMouseEvent & event);
virtual void OnCaptureLost(wxMouseCaptureLostEvent & event);
@ -510,20 +506,6 @@ protected:
virtual void DrawBordersAroundTrack(Track *t, wxDC* dc, const wxRect & rect, const int labelw, const int vrul);
virtual void DrawOutsideOfTrack (Track *t, wxDC* dc, const wxRect & rect);
public:
// Register and unregister overlay objects.
// The sequence in which they were registered is the sequence in
// which they are painted.
// TrackPanel is not responsible for their memory management.
virtual void AddOverlay(TrackPanelOverlay *pOverlay);
// Returns true if the overlay was found
virtual bool RemoveOverlay(TrackPanelOverlay *pOverlay);
virtual void ClearOverlays();
// Erase and redraw things like the cursor, cheaply and directly to the
// client area, without full refresh.
virtual void DrawOverlays(bool repaint);
protected:
virtual int IdOfRate( int rate );
virtual int IdOfFormat( int format );
@ -572,9 +554,6 @@ protected:
int mTimeCount;
wxMemoryDC mBackingDC;
wxBitmap *mBacking;
bool mResizeBacking;
bool mRefreshBacking;
int mPrevWidth;
int mPrevHeight;
@ -813,9 +792,6 @@ protected:
public:
wxSize vrulerSize;
protected:
std::vector<TrackPanelOverlay*> mOverlays;
public:
DECLARE_EVENT_TABLE()
};

View File

@ -65,9 +65,12 @@ std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
}
void EditCursorOverlay::Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end)
void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
{
TrackPanel &tp = static_cast<TrackPanel&>(panel);
TrackPanelCellIterator begin(&tp, true);
TrackPanelCellIterator end(&tp, false);
mLastCursorX = mNewCursorX;
if (mLastCursorX == -1)
return;

View File

@ -11,11 +11,11 @@ Paul Licameli split from TrackPanel.cpp
#ifndef __AUDACITY_EDIT_CURSOR_OVERLAY__
#define __AUDACITY_EDIT_CURSOR_OVERLAY__
#include "../../TrackPanelOverlay.h"
#include "../../widgets/Overlay.h"
class AudacityProject;
class EditCursorOverlay final : public TrackPanelOverlay
class EditCursorOverlay final : public Overlay
{
public:
EditCursorOverlay(AudacityProject *project);
@ -23,8 +23,7 @@ public:
private:
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;
AudacityProject *mProject;

View File

@ -61,9 +61,12 @@ std::pair<wxRect, bool> PlayIndicatorOverlay::DoGetRectangle(wxSize size)
}
void PlayIndicatorOverlay::Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end)
void PlayIndicatorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
{
TrackPanel &tp = static_cast<TrackPanel&>(panel);
TrackPanelCellIterator begin(&tp, true);
TrackPanelCellIterator end(&tp, false);
mLastIndicatorX = mNewIndicatorX;
if (!between_incexc(0, mLastIndicatorX, dc.GetSize().GetWidth()))
return;
@ -106,7 +109,7 @@ void PlayIndicatorOverlay::Draw
void PlayIndicatorOverlay::Erase(wxDC &dc, wxDC &src)
{
TrackPanelOverlay::Erase(dc, src);
Overlay::Erase(dc, src);
mProject->GetRulerPanel()->ClearIndicator();
}

View File

@ -11,13 +11,13 @@ Paul Licameli split from TrackPanel.cpp
#ifndef __AUDACITY_PLAY_INDICATOR_OVERLAY__
#define __AUDACITY_PLAY_INDICATOR_OVERLAY__
#include "../../TrackPanelOverlay.h"
#include <wx/event.h>
#include "../../widgets/Overlay.h"
class AudacityProject;
class PlayIndicatorOverlay final : public wxEvtHandler, public TrackPanelOverlay
class PlayIndicatorOverlay final : public wxEvtHandler, public Overlay
{
public:
PlayIndicatorOverlay(AudacityProject *project);
@ -25,8 +25,7 @@ public:
private:
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;
void Erase(wxDC &dc, wxDC &src) override;
void OnTimer(wxCommandEvent &event);

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Audacity.h"
#include "Scrubbing.h"
#include "../../Experimental.h"
#include <functional>
@ -532,8 +533,7 @@ std::pair<wxRect, bool> ScrubbingOverlay::DoGetRectangle(wxSize)
);
}
void ScrubbingOverlay::Draw
(wxDC &dc, TrackPanelCellIterator, TrackPanelCellIterator)
void ScrubbingOverlay::Draw(OverlayPanel &, wxDC &dc)
{
mLastScrubRect = mNextScrubRect;
mLastScrubSpeedText = mNextScrubSpeedText;

View File

@ -16,7 +16,7 @@ Paul Licameli split from TrackPanel.cpp
#include <wx/longlong.h>
#include "../../Experimental.h"
#include "../../TrackPanelOverlay.h"
#include "../../widgets/Overlay.h"
class AudacityProject;
@ -128,7 +128,7 @@ private:
};
// Specialist in drawing the scrub speed, and listening for certain events
class ScrubbingOverlay final : public wxEvtHandler, public TrackPanelOverlay
class ScrubbingOverlay final : public wxEvtHandler, public Overlay
{
public:
ScrubbingOverlay(AudacityProject *project);
@ -136,8 +136,7 @@ public:
private:
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;
void OnTimer(wxCommandEvent &event);

View File

@ -0,0 +1,83 @@
//
// BackedPanel.cpp
// Audacity
//
// Created by Paul Licameli on 5/7/16.
//
//
#include "../Audacity.h"
#include "BackedPanel.h"
BackedPanel::BackedPanel(wxWindow * parent, wxWindowID id,
const wxPoint & pos,
const wxSize & size,
long style)
: wxPanel(parent, id, pos, size, style)
, mBacking{ safenew wxBitmap(1, 1) }
{
// Preinit the backing DC and bitmap so routines that require it will
// not cause a crash if they run before the panel is fully initialized.
mBackingDC.SelectObject(*mBacking);
}
BackedPanel::~BackedPanel()
{
if (mBacking)
mBackingDC.SelectObject( wxNullBitmap );
}
wxDC &BackedPanel::GetBackingDC()
{
return mBackingDC;
}
wxDC &BackedPanel::GetBackingDCForRepaint()
{
if (mResizeBacking)
{
// Reset
mResizeBacking = false;
ResizeBacking();
}
return mBackingDC;
}
void BackedPanel::ResizeBacking()
{
// Delete the backing bitmap
if (mBacking)
mBackingDC.SelectObject(wxNullBitmap);
wxSize sz = GetClientSize();
mBacking.reset(safenew wxBitmap);
mBacking->Create(sz.x, sz.y); //, *dc);
mBackingDC.SelectObject(*mBacking);
}
void BackedPanel::RepairBitmap(wxDC &dc, wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
dc.Blit(x, y, width, height, &mBackingDC, x, y);
}
void BackedPanel::DisplayBitmap(wxDC &dc)
{
RepairBitmap(dc, 0, 0, mBacking->GetWidth(), mBacking->GetHeight());
}
void BackedPanel::OnSize(wxSizeEvent & /* event */)
{
// Tell OnPaint() to recreate the backing bitmap
mResizeBacking = true;
// Refresh the entire area. Really only need to refresh when
// expanding...is it worth the trouble?
Refresh();
}
BEGIN_EVENT_TABLE(BackedPanel, wxPanel)
EVT_SIZE(BackedPanel::OnSize)
END_EVENT_TABLE()

46
src/widgets/BackedPanel.h Normal file
View File

@ -0,0 +1,46 @@
//
// BackedPanel.h
// Audacity
//
// Created by Paul Licameli on 5/7/16.
//
//
#ifndef __AUDACITY_BACKED_PANEL__
#define __AUDACITY_BACKED_PANEL__
#include "../MemoryX.h"
#include <wx/panel.h>
#include <wx/dcmemory.h>
class AUDACITY_DLL_API BackedPanel /* not final */ : public wxPanel {
public:
BackedPanel(wxWindow * parent, wxWindowID id,
const wxPoint & pos,
const wxSize & size,
long style);
~BackedPanel();
wxDC &GetBackingDC();
wxDC &GetBackingDCForRepaint();
void ResizeBacking();
void RepairBitmap(wxDC &dc, wxCoord x, wxCoord y, wxCoord width, wxCoord height);
void DisplayBitmap(wxDC &dc);
void OnSize(wxSizeEvent & event);
private:
std::unique_ptr<wxBitmap> mBacking;
wxMemoryDC mBackingDC;
bool mResizeBacking {};
DECLARE_EVENT_TABLE()
};
#endif

View File

@ -1,22 +1,20 @@
/**********************************************************************
//
// Overlay.cpp
// Audacity
//
// Created by Paul Licameli on 5/7/16.
//
//
Audacity: A Digital Audio Editor
TrackPanelOverlay.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "TrackPanelOverlay.h"
#include "Overlay.h"
#include <wx/dc.h>
TrackPanelOverlay::~TrackPanelOverlay()
Overlay::~Overlay()
{
}
std::pair<wxRect, bool> TrackPanelOverlay::GetRectangle(wxSize size)
std::pair<wxRect, bool> Overlay::GetRectangle(wxSize size)
{
auto result = DoGetRectangle(size);
#ifdef __WXMAC__
@ -28,7 +26,7 @@ std::pair<wxRect, bool> TrackPanelOverlay::GetRectangle(wxSize size)
return result;
}
void TrackPanelOverlay::Erase(wxDC &dc, wxDC &src)
void Overlay::Erase(wxDC &dc, wxDC &src)
{
wxRect rect(dc.GetSize());
rect.Intersect(src.GetSize());

View File

@ -1,27 +1,25 @@
/**********************************************************************
//
// Overlay.h
// Audacity
//
// Created by Paul Licameli on 5/7/16.
//
//
Audacity: A Digital Audio Editor
TrackPanelOverlay.h
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#ifndef __AUDACITY_TRACK_PANEL_OVERLAY__
#define __AUDACITY_TRACK_PANEL_OVERLAY__
class TrackPanelCellIterator;
#ifndef __AUDACITY_OVERLAY__
#define __AUDACITY_OVERLAY__
#include <utility>
class OverlayPanel;
class wxDC;
class wxRect;
class wxSize;
class TrackPanelOverlay
class Overlay
{
public:
virtual ~TrackPanelOverlay() = 0;
virtual ~Overlay() = 0;
// nonvirtual wrapper
std::pair<wxRect, bool> GetRectangle(wxSize size);
@ -34,10 +32,9 @@ public:
// Default implementation blits from backing store over GetRectangle().first
virtual void Erase(wxDC &dc, wxDC &src);
// Draw; dc.GetSize() tells you the total dimensions, and the iterators let you
// find the rectangles of tracks (or other sub-rectangles of the panel)
virtual void Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) = 0;
// Draw; dc.GetSize() tells you the total dimensions, and the panel is supplied
// as context
virtual void Draw(OverlayPanel &panel, wxDC &dc) = 0;
};
#endif

View File

@ -0,0 +1,103 @@
//
// OverlayPanel.cpp
// Audacity
//
// Created by Paul Licameli on 5/7/16.
//
//
#include "../Audacity.h"
#include "OverlayPanel.h"
#include "Overlay.h"
#include "../AColor.h"
#include <algorithm>
#include <wx/dcclient.h>
OverlayPanel::OverlayPanel(wxWindow * parent, wxWindowID id,
const wxPoint & pos,
const wxSize & size,
long style)
: BackedPanel(parent, id, pos, size, style)
{}
void OverlayPanel::AddOverlay(Overlay *pOverlay)
{
mOverlays.push_back(pOverlay);
}
bool OverlayPanel::RemoveOverlay(Overlay *pOverlay)
{
const size_t oldSize = mOverlays.size();
std::remove(mOverlays.begin(), mOverlays.end(), pOverlay);
return oldSize != mOverlays.size();
}
void OverlayPanel::ClearOverlays()
{
mOverlays.clear();
}
void OverlayPanel::DrawOverlays(bool repaint, wxDC *pDC)
{
size_t n_pairs = mOverlays.size();
std::vector< std::pair<wxRect, bool> > pairs;
pairs.reserve(n_pairs);
// Find out the rectangles and outdatedness for each overlay
wxSize size(GetBackingDC().GetSize());
for (const auto pOverlay : mOverlays)
pairs.push_back(pOverlay->GetRectangle(size));
// See what requires redrawing. If repainting, all.
// If not, then whatever is outdated, and whatever will be damaged by
// undrawing.
// By redrawing only what needs it, we avoid flashing things like
// the cursor that are drawn with invert.
if (!repaint) {
bool done;
do {
done = true;
for (size_t ii = 0; ii < n_pairs; ++ii) {
for (size_t jj = ii + 1; jj < n_pairs; ++jj) {
if (pairs[ii].second != pairs[jj].second &&
pairs[ii].first.Intersects(pairs[jj].first)) {
done = false;
pairs[ii].second = pairs[jj].second = true;
}
}
}
} while (!done);
}
Maybe<wxClientDC> myDC;
auto &dc = pDC ? *pDC : (myDC.create(this), *myDC);
// Erase
bool done = true;
auto it2 = pairs.begin();
for (auto pOverlay : mOverlays) {
if (repaint || it2->second) {
done = false;
pOverlay->Erase(dc, GetBackingDC());
}
++it2;
}
// Draw
if (!done) {
it2 = pairs.begin();
for (auto pOverlay : mOverlays) {
if (repaint || it2->second) {
// Guarantee a clean state of the dc each pass:
ADCChanger changer{ &dc };
pOverlay->Draw(*this, dc);
}
++it2;
}
}
}
BEGIN_EVENT_TABLE(OverlayPanel, BackedPanel)
END_EVENT_TABLE()

View File

@ -0,0 +1,45 @@
//
// OverlayPanel.h
// Audacity
//
// Created by Paul Licameli on 5/1/16.
//
//
#ifndef __AUDACITY_OVERLAY_PANEL__
#define __AUDACITY_OVERLAY_PANEL__
#include <vector>
#include "BackedPanel.h"
class Overlay;
class AUDACITY_DLL_API OverlayPanel /* not final */ : public BackedPanel {
public:
OverlayPanel(wxWindow * parent, wxWindowID id,
const wxPoint & pos,
const wxSize & size,
// default as for wxPanel:
long style = wxTAB_TRAVERSAL | wxNO_BORDER);
// Register and unregister overlay objects.
// The sequence in which they were registered is the sequence in
// which they are painted.
// OverlayPanel is not responsible for their memory management.
void AddOverlay(Overlay *pOverlay);
// Returns true if the overlay was found
bool RemoveOverlay(Overlay *pOverlay);
void ClearOverlays();
// Erase and redraw things like the cursor, cheaply and directly to the
// client area, without full refresh.
void DrawOverlays(bool repaint, wxDC *pDC = nullptr);
private:
std::vector<Overlay*> mOverlays;
DECLARE_EVENT_TABLE()
};
#endif

View File

@ -77,7 +77,6 @@ array of Ruler::Label.
#include "../TimeTrack.h"
#include "../TrackPanel.h"
#include "../TrackPanelCellIterator.h"
#include "../TrackPanelOverlay.h"
#include "../Menus.h"
#include "../NumberScale.h"
#include "../Prefs.h"
@ -1656,7 +1655,7 @@ Graphical helper for AdornedRulerPanel.
**********************************************************************/
class QuickPlayIndicatorOverlay final : public TrackPanelOverlay
class QuickPlayIndicatorOverlay final : public Overlay
{
public:
QuickPlayIndicatorOverlay(AudacityProject *project)
@ -1687,8 +1686,7 @@ public:
private:
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;
AudacityProject *mProject;
int mOldQPIndicatorPos;
@ -1709,9 +1707,12 @@ std::pair<wxRect, bool> QuickPlayIndicatorOverlay::DoGetRectangle(wxSize size)
);
}
void QuickPlayIndicatorOverlay::Draw
(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end)
void QuickPlayIndicatorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
{
TrackPanel &tp = static_cast<TrackPanel&>(panel);
TrackPanelCellIterator begin(&tp, true);
TrackPanelCellIterator end(&tp, false);
mOldQPIndicatorPos = mNewQPIndicatorPos;
mOldQPIndicatorSnapped = mNewQPIndicatorSnapped;
mOldPreviewingScrub = mNewPreviewingScrub;

View File

@ -213,7 +213,6 @@
<ClCompile Include="..\..\..\src\TrackArtist.cpp" />
<ClCompile Include="..\..\..\src\TrackPanel.cpp" />
<ClCompile Include="..\..\..\src\TrackPanelAx.cpp" />
<ClCompile Include="..\..\..\src\TrackPanelOverlay.cpp" />
<ClCompile Include="..\..\..\src\tracks\ui\EditCursorOverlay.cpp" />
<ClCompile Include="..\..\..\src\tracks\ui\PlayIndicatorOverlay.cpp" />
<ClCompile Include="..\..\..\src\tracks\ui\Scrubbing.cpp" />
@ -222,8 +221,11 @@
<ClCompile Include="..\..\..\src\VoiceKey.cpp" />
<ClCompile Include="..\..\..\src\WaveClip.cpp" />
<ClCompile Include="..\..\..\src\WaveTrack.cpp" />
<ClCompile Include="..\..\..\src\widgets\BackedPanel.cpp" />
<ClCompile Include="..\..\..\src\widgets\HelpSystem.cpp" />
<ClCompile Include="..\..\..\src\widgets\NumericTextCtrl.cpp" />
<ClCompile Include="..\..\..\src\widgets\Overlay.cpp" />
<ClCompile Include="..\..\..\src\widgets\OverlayPanel.cpp" />
<ClCompile Include="..\..\..\src\WrappedType.cpp" />
<ClCompile Include="..\..\..\src\effects\Amplify.cpp" />
<ClCompile Include="..\..\..\src\effects\AutoDuck.cpp" />
@ -443,14 +445,16 @@
<ClInclude Include="..\..\..\src\TrackPanelCell.h" />
<ClInclude Include="..\..\..\src\TrackPanelCellIterator.h" />
<ClInclude Include="..\..\..\src\TrackPanelListener.h" />
<ClInclude Include="..\..\..\src\TrackPanelOverlay.h" />
<ClInclude Include="..\..\..\src\tracks\ui\EditCursorOverlay.h" />
<ClInclude Include="..\..\..\src\tracks\ui\PlayIndicatorOverlay.h" />
<ClInclude Include="..\..\..\src\tracks\ui\Scrubbing.h" />
<ClInclude Include="..\..\..\src\TranslatableStringArray.h" />
<ClInclude Include="..\..\..\src\WaveTrackLocation.h" />
<ClInclude Include="..\..\..\src\widgets\BackedPanel.h" />
<ClInclude Include="..\..\..\src\widgets\HelpSystem.h" />
<ClInclude Include="..\..\..\src\widgets\NumericTextCtrl.h" />
<ClInclude Include="..\..\..\src\widgets\Overlay.h" />
<ClInclude Include="..\..\..\src\widgets\OverlayPanel.h" />
<ClInclude Include="..\..\..\src\wxFileNameWrapper.h" />
<ClInclude Include="..\..\configwin.h" />
<ClInclude Include="..\..\..\src\Dependencies.h" />

View File

@ -860,9 +860,6 @@
<ClCompile Include="..\..\..\src\RealFFTf48x.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\TrackPanelOverlay.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\tracks\ui\EditCursorOverlay.cpp">
<Filter>src\tracks\ui</Filter>
</ClCompile>
@ -875,6 +872,15 @@
<ClCompile Include="..\..\..\src\TrackPanel.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\widgets\BackedPanel.cpp">
<Filter>src\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\widgets\Overlay.cpp">
<Filter>src\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\widgets\OverlayPanel.cpp">
<Filter>src\widgets</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\AboutDialog.h">
@ -1732,9 +1738,6 @@
<ClInclude Include="..\..\..\src\effects\VST\VSTControlMSW.h">
<Filter>src\effects\VST</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\TrackPanelOverlay.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\TranslatableStringArray.h">
<Filter>src</Filter>
</ClInclude>
@ -1771,6 +1774,15 @@
<ClInclude Include="..\..\..\src\commands\CommandFunctors.h">
<Filter>src\commands</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\widgets\BackedPanel.h">
<Filter>src\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\widgets\Overlay.h">
<Filter>src\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\widgets\OverlayPanel.h">
<Filter>src\widgets</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\..\audacity.ico">