diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index cc540ee6f..c40201cb3 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -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 = ""; }; 5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryX.h; sourceTree = ""; }; - 5E74D2D61CC4425D00D88B0B /* TrackPanelOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackPanelOverlay.cpp; sourceTree = ""; }; - 5E74D2D71CC4425D00D88B0B /* TrackPanelOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelOverlay.h; sourceTree = ""; }; 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCell.h; sourceTree = ""; }; 5E74D2DA1CC4427B00D88B0B /* TrackPanelCellIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelCellIterator.h; sourceTree = ""; }; 5E74D2DD1CC4429700D88B0B /* EditCursorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditCursorOverlay.cpp; sourceTree = ""; }; @@ -2985,6 +2985,12 @@ 5E74D2E21CC4429700D88B0B /* Scrubbing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scrubbing.h; sourceTree = ""; }; 5ED18DB61CC16B1E00FAFE95 /* Reverb_libSoX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reverb_libSoX.h; sourceTree = ""; }; 5ED18DB71CC290AB00FAFE95 /* wxFileNameWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wxFileNameWrapper.h; sourceTree = ""; }; + 5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Overlay.cpp; sourceTree = ""; }; + 5ED1D0AA1CDE55BD00471E3C /* Overlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Overlay.h; sourceTree = ""; }; + 5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OverlayPanel.cpp; sourceTree = ""; }; + 5ED1D0AC1CDE55BD00471E3C /* OverlayPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayPanel.h; sourceTree = ""; }; + 5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackedPanel.cpp; sourceTree = ""; }; + 5ED1D0B01CDE560C00471E3C /* BackedPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackedPanel.h; sourceTree = ""; }; 82FF184D13CF01A600C1B664 /* dBTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dBTable.cpp; path = sbsms/src/dBTable.cpp; sourceTree = ""; }; 82FF184E13CF01A600C1B664 /* dBTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dBTable.h; path = sbsms/src/dBTable.h; sourceTree = ""; }; 82FF184F13CF01A600C1B664 /* slide.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slide.cpp; path = sbsms/src/slide.cpp; sourceTree = ""; }; @@ -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 */, diff --git a/src/Makefile.am b/src/Makefile.am index 5df0e7656..8333ecb31 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/Project.h b/src/Project.h index b5a4e97ab..e7e3d613e 100644 --- a/src/Project.h +++ b/src/Project.h @@ -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 + std::unique_ptr mIndicatorOverlay, mCursorOverlay; #ifdef EXPERIMENTAL_SCRUBBING_BASIC - std::unique_ptr mScrubOverlay; + std::unique_ptr mScrubOverlay; std::unique_ptr mScrubber; public: Scrubber &GetScrubber() { return *mScrubber; } diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 0af76d9c1..929ddceb2 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -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 > 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) { diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 7463e94d3..2b1c494b6 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -14,10 +14,7 @@ #include "MemoryX.h" #include -#include -#include #include -#include #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 mOverlays; - public: DECLARE_EVENT_TABLE() }; diff --git a/src/tracks/ui/EditCursorOverlay.cpp b/src/tracks/ui/EditCursorOverlay.cpp index d4832d679..2474ef10b 100644 --- a/src/tracks/ui/EditCursorOverlay.cpp +++ b/src/tracks/ui/EditCursorOverlay.cpp @@ -65,9 +65,12 @@ std::pair EditCursorOverlay::DoGetRectangle(wxSize size) } -void EditCursorOverlay::Draw - (wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) +void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc) { + TrackPanel &tp = static_cast(panel); + TrackPanelCellIterator begin(&tp, true); + TrackPanelCellIterator end(&tp, false); + mLastCursorX = mNewCursorX; if (mLastCursorX == -1) return; diff --git a/src/tracks/ui/EditCursorOverlay.h b/src/tracks/ui/EditCursorOverlay.h index 2c13ec75b..7819cab08 100644 --- a/src/tracks/ui/EditCursorOverlay.h +++ b/src/tracks/ui/EditCursorOverlay.h @@ -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 DoGetRectangle(wxSize size) override; - void Draw - (wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override; + void Draw(OverlayPanel &panel, wxDC &dc) override; AudacityProject *mProject; diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index 6babb60fc..8a14bc930 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -61,9 +61,12 @@ std::pair PlayIndicatorOverlay::DoGetRectangle(wxSize size) } -void PlayIndicatorOverlay::Draw - (wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) +void PlayIndicatorOverlay::Draw(OverlayPanel &panel, wxDC &dc) { + TrackPanel &tp = static_cast(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(); } diff --git a/src/tracks/ui/PlayIndicatorOverlay.h b/src/tracks/ui/PlayIndicatorOverlay.h index 643526946..0dab86a2a 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.h +++ b/src/tracks/ui/PlayIndicatorOverlay.h @@ -11,13 +11,13 @@ Paul Licameli split from TrackPanel.cpp #ifndef __AUDACITY_PLAY_INDICATOR_OVERLAY__ #define __AUDACITY_PLAY_INDICATOR_OVERLAY__ -#include "../../TrackPanelOverlay.h" #include +#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 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); diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index 125c14422..d56891363 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp **********************************************************************/ +#include "../../Audacity.h" #include "Scrubbing.h" #include "../../Experimental.h" #include @@ -532,8 +533,7 @@ std::pair ScrubbingOverlay::DoGetRectangle(wxSize) ); } -void ScrubbingOverlay::Draw - (wxDC &dc, TrackPanelCellIterator, TrackPanelCellIterator) +void ScrubbingOverlay::Draw(OverlayPanel &, wxDC &dc) { mLastScrubRect = mNextScrubRect; mLastScrubSpeedText = mNextScrubSpeedText; diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index 8bffd763b..315221008 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -16,7 +16,7 @@ Paul Licameli split from TrackPanel.cpp #include #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 DoGetRectangle(wxSize size) override; - void Draw - (wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) override; + void Draw(OverlayPanel &panel, wxDC &dc) override; void OnTimer(wxCommandEvent &event); diff --git a/src/widgets/BackedPanel.cpp b/src/widgets/BackedPanel.cpp new file mode 100644 index 000000000..ecc344d57 --- /dev/null +++ b/src/widgets/BackedPanel.cpp @@ -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() + diff --git a/src/widgets/BackedPanel.h b/src/widgets/BackedPanel.h new file mode 100644 index 000000000..0e8040549 --- /dev/null +++ b/src/widgets/BackedPanel.h @@ -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 +#include + +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 mBacking; + wxMemoryDC mBackingDC; + bool mResizeBacking {}; + + DECLARE_EVENT_TABLE() +}; + + +#endif diff --git a/src/TrackPanelOverlay.cpp b/src/widgets/Overlay.cpp similarity index 60% rename from src/TrackPanelOverlay.cpp rename to src/widgets/Overlay.cpp index 7179e97b4..c5d68a541 100644 --- a/src/TrackPanelOverlay.cpp +++ b/src/widgets/Overlay.cpp @@ -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 -TrackPanelOverlay::~TrackPanelOverlay() +Overlay::~Overlay() { } -std::pair TrackPanelOverlay::GetRectangle(wxSize size) +std::pair Overlay::GetRectangle(wxSize size) { auto result = DoGetRectangle(size); #ifdef __WXMAC__ @@ -28,7 +26,7 @@ std::pair 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()); diff --git a/src/TrackPanelOverlay.h b/src/widgets/Overlay.h similarity index 50% rename from src/TrackPanelOverlay.h rename to src/widgets/Overlay.h index 752c0db87..4f723e1ff 100644 --- a/src/TrackPanelOverlay.h +++ b/src/widgets/Overlay.h @@ -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 + +class OverlayPanel; class wxDC; class wxRect; class wxSize; -class TrackPanelOverlay +class Overlay { public: - virtual ~TrackPanelOverlay() = 0; + virtual ~Overlay() = 0; // nonvirtual wrapper std::pair 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 diff --git a/src/widgets/OverlayPanel.cpp b/src/widgets/OverlayPanel.cpp new file mode 100644 index 000000000..1e6e8f9c8 --- /dev/null +++ b/src/widgets/OverlayPanel.cpp @@ -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 +#include + +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 > 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 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() diff --git a/src/widgets/OverlayPanel.h b/src/widgets/OverlayPanel.h new file mode 100644 index 000000000..b5b3fa8d9 --- /dev/null +++ b/src/widgets/OverlayPanel.h @@ -0,0 +1,45 @@ +// +// OverlayPanel.h +// Audacity +// +// Created by Paul Licameli on 5/1/16. +// +// + +#ifndef __AUDACITY_OVERLAY_PANEL__ +#define __AUDACITY_OVERLAY_PANEL__ + +#include +#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 mOverlays; + + + DECLARE_EVENT_TABLE() +}; + +#endif diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 4a59ad801..7c12ceba2 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -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 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 QuickPlayIndicatorOverlay::DoGetRectangle(wxSize size) ); } -void QuickPlayIndicatorOverlay::Draw -(wxDC &dc, TrackPanelCellIterator begin, TrackPanelCellIterator end) +void QuickPlayIndicatorOverlay::Draw(OverlayPanel &panel, wxDC &dc) { + TrackPanel &tp = static_cast(panel); + TrackPanelCellIterator begin(&tp, true); + TrackPanelCellIterator end(&tp, false); + mOldQPIndicatorPos = mNewQPIndicatorPos; mOldQPIndicatorSnapped = mNewQPIndicatorSnapped; mOldPreviewingScrub = mNewPreviewingScrub; diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index b99c18c40..9a26b1099 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -213,7 +213,6 @@ - @@ -222,8 +221,11 @@ + + + @@ -443,14 +445,16 @@ - + + + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index ed9d306ad..9beb69b4e 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -860,9 +860,6 @@ src - - src - src\tracks\ui @@ -875,6 +872,15 @@ src + + src\widgets + + + src\widgets + + + src\widgets + @@ -1732,9 +1738,6 @@ src\effects\VST - - src - src @@ -1771,6 +1774,15 @@ src\commands + + src\widgets + + + src\widgets + + + src\widgets +