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:
parent
3569851609
commit
7c2a531486
@ -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 */,
|
||||
|
@ -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 \
|
||||
|
@ -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; }
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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()
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
83
src/widgets/BackedPanel.cpp
Normal file
83
src/widgets/BackedPanel.cpp
Normal 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
46
src/widgets/BackedPanel.h
Normal 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
|
@ -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());
|
@ -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
|
103
src/widgets/OverlayPanel.cpp
Normal file
103
src/widgets/OverlayPanel.cpp
Normal 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()
|
45
src/widgets/OverlayPanel.h
Normal file
45
src/widgets/OverlayPanel.h
Normal 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
|
@ -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;
|
||||
|
@ -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" />
|
||||
|
@ -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">
|
||||
|
Loading…
x
Reference in New Issue
Block a user