1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-17 16:50:26 +02:00

Define drawing function of CellularPanel, which visits nodes

This commit is contained in:
Paul Licameli 2018-11-03 00:04:50 -04:00
parent 040decf9e3
commit cb2ea25afc
12 changed files with 157 additions and 43 deletions

View File

@ -252,6 +252,7 @@ src/TrackPanel.h
src/TrackPanelAx.cpp src/TrackPanelAx.cpp
src/TrackPanelAx.h src/TrackPanelAx.h
src/TrackPanelCell.h src/TrackPanelCell.h
src/TrackPanelDrawable.h
src/TrackPanelDrawingContext.h src/TrackPanelDrawingContext.h
src/TrackPanelListener.h src/TrackPanelListener.h
src/TrackPanelMouseEvent.h src/TrackPanelMouseEvent.h

View File

@ -3238,6 +3238,7 @@
5E19D64C217D51190024D0B1 /* PluginMenus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PluginMenus.cpp; path = menus/PluginMenus.cpp; sourceTree = "<group>"; }; 5E19D64C217D51190024D0B1 /* PluginMenus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PluginMenus.cpp; path = menus/PluginMenus.cpp; sourceTree = "<group>"; };
5E19F59722A9665500E3F88E /* AutoRecoveryDialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AutoRecoveryDialog.cpp; sourceTree = "<group>"; }; 5E19F59722A9665500E3F88E /* AutoRecoveryDialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AutoRecoveryDialog.cpp; sourceTree = "<group>"; };
5E19F59822A9665500E3F88E /* AutoRecoveryDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoRecoveryDialog.h; sourceTree = "<group>"; }; 5E19F59822A9665500E3F88E /* AutoRecoveryDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoRecoveryDialog.h; sourceTree = "<group>"; };
5E1C3F4D218F7604002CD087 /* TrackPanelDrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelDrawable.h; sourceTree = "<group>"; };
5E2A19921EED688500217B58 /* SelectionState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionState.cpp; sourceTree = "<group>"; }; 5E2A19921EED688500217B58 /* SelectionState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionState.cpp; sourceTree = "<group>"; };
5E2A19931EED688500217B58 /* SelectionState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionState.h; sourceTree = "<group>"; }; 5E2A19931EED688500217B58 /* SelectionState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionState.h; sourceTree = "<group>"; };
5E2B3E6022BF9621005042E1 /* RealtimeEffectManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeEffectManager.cpp; sourceTree = "<group>"; }; 5E2B3E6022BF9621005042E1 /* RealtimeEffectManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeEffectManager.cpp; sourceTree = "<group>"; };
@ -4607,6 +4608,7 @@
1790B0ED09883BFD008A330A /* TrackPanel.h */, 1790B0ED09883BFD008A330A /* TrackPanel.h */,
1790B0EF09883BFD008A330A /* TrackPanelAx.h */, 1790B0EF09883BFD008A330A /* TrackPanelAx.h */,
5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */, 5E74D2D91CC4427B00D88B0B /* TrackPanelCell.h */,
5E1C3F4D218F7604002CD087 /* TrackPanelDrawable.h */,
5E52335F1EFDD57D001E4BB8 /* TrackPanelDrawingContext.h */, 5E52335F1EFDD57D001E4BB8 /* TrackPanelDrawingContext.h */,
2803C8B619F35AA000278526 /* TrackPanelListener.h */, 2803C8B619F35AA000278526 /* TrackPanelListener.h */,
5E15123A1DB000C000702E29 /* TrackPanelMouseEvent.h */, 5E15123A1DB000C000702E29 /* TrackPanelMouseEvent.h */,

View File

@ -1122,3 +1122,32 @@ std::shared_ptr<TrackPanelCell> CellularPanel::LastCell() const
auto &state = *mState; auto &state = *mState;
return state.mLastCell.lock(); return state.mLastCell.lock();
} }
void CellularPanel::Draw( TrackPanelDrawingContext &context, unsigned nPasses )
{
const auto panelRect = GetClientRect();
auto lastCell = LastCell();
for ( unsigned iPass = 0; iPass < nPasses; ++iPass ) {
VisitPostorder( [&]( const wxRect &rect, TrackPanelNode &node ) {
// Draw the node
const auto newRect = node.DrawingArea( rect, panelRect, iPass );
if ( newRect.Intersects( panelRect ) )
node.Draw( context, newRect, iPass );
// Draw the current handle if it is associated with the node
if ( &node == lastCell.get() ) {
auto target = Target();
if ( target ) {
const auto targetRect =
target->DrawingArea( rect, panelRect, iPass );
if ( targetRect.Intersects( panelRect ) )
target->Draw( context, targetRect, iPass );
}
}
} ); // nodes
} // passes
}

View File

@ -17,6 +17,7 @@ class ViewInfo;
class AudacityProject; class AudacityProject;
class TrackPanelCell; class TrackPanelCell;
struct TrackPanelDrawingContext;
class TrackPanelGroup; class TrackPanelGroup;
class TrackPanelNode; class TrackPanelNode;
struct TrackPanelMouseEvent; struct TrackPanelMouseEvent;
@ -108,6 +109,12 @@ public:
void HandleCursorForPresentMouseState(bool doHit = true); void HandleCursorForPresentMouseState(bool doHit = true);
// Visit the Draw functions of all cells that intersect the panel area,
// and of handles associated with such cells,
// and of all groups of cells,
// repeatedly with a pass count from 0 to nPasses - 1
void Draw( TrackPanelDrawingContext &context, unsigned nPasses );
protected: protected:
bool HasEscape(); bool HasEscape();
bool CancelDragging( bool escaping ); bool CancelDragging( bool escaping );

View File

@ -298,6 +298,7 @@ audacity_SOURCES = \
TrackPanelAx.cpp \ TrackPanelAx.cpp \
TrackPanelAx.h \ TrackPanelAx.h \
TrackPanelCell.h \ TrackPanelCell.h \
TrackPanelDrawable.h \
TrackPanelDrawingContext.h \ TrackPanelDrawingContext.h \
TrackPanelListener.h \ TrackPanelListener.h \
TrackPanelMouseEvent.h \ TrackPanelMouseEvent.h \

View File

@ -345,26 +345,26 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \
TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \
TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \ TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \
TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \ TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \
TrackPanelDrawingContext.h TrackPanelListener.h \ TrackPanelDrawable.h TrackPanelDrawingContext.h \
TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \ TrackPanelListener.h TrackPanelMouseEvent.h \
TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \ TrackPanelResizeHandle.cpp TrackPanelResizeHandle.h \
TrackPanelResizerCell.h TrackUtilities.cpp TrackUtilities.h \ TrackPanelResizerCell.cpp TrackPanelResizerCell.h \
TranslatableStringArray.h UIHandle.h UIHandle.cpp \ TrackUtilities.cpp TrackUtilities.h TranslatableStringArray.h \
UndoManager.cpp UndoManager.h UserException.cpp \ UIHandle.h UIHandle.cpp UndoManager.cpp UndoManager.h \
UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \ UserException.cpp UserException.h ViewInfo.cpp ViewInfo.h \
VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \ VoiceKey.cpp VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp \
WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \ WaveTrack.h WaveTrackLocation.h WrappedType.cpp WrappedType.h \
ZoomInfo.h wxFileNameWrapper.h commands/AppCommandEvent.cpp \ ZoomInfo.cpp ZoomInfo.h wxFileNameWrapper.h \
commands/AppCommandEvent.h commands/AudacityCommand.cpp \ commands/AppCommandEvent.cpp commands/AppCommandEvent.h \
commands/AudacityCommand.h commands/BatchEvalCommand.cpp \ commands/AudacityCommand.cpp commands/AudacityCommand.h \
commands/BatchEvalCommand.h commands/Command.cpp \ commands/BatchEvalCommand.cpp commands/BatchEvalCommand.h \
commands/Command.h commands/CommandBuilder.cpp \ commands/Command.cpp commands/Command.h \
commands/CommandBuilder.h commands/CommandContext.cpp \ commands/CommandBuilder.cpp commands/CommandBuilder.h \
commands/CommandContext.h commands/CommandDirectory.cpp \ commands/CommandContext.cpp commands/CommandContext.h \
commands/CommandDirectory.h commands/CommandFlag.h \ commands/CommandDirectory.cpp commands/CommandDirectory.h \
commands/CommandFunctors.h commands/CommandHandler.cpp \ commands/CommandFlag.h commands/CommandFunctors.h \
commands/CommandHandler.h commands/CommandManager.cpp \ commands/CommandHandler.cpp commands/CommandHandler.h \
commands/CommandManager.h \ commands/CommandManager.cpp commands/CommandManager.h \
commands/CommandManagerWindowClasses.h commands/CommandMisc.h \ commands/CommandManagerWindowClasses.h commands/CommandMisc.h \
commands/CommandSignature.cpp commands/CommandSignature.h \ commands/CommandSignature.cpp commands/CommandSignature.h \
commands/CommandTargets.h commands/CommandType.cpp \ commands/CommandTargets.h commands/CommandType.cpp \
@ -1449,26 +1449,26 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \
TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \ TimeTrack.h Track.cpp Track.h TrackArtist.cpp TrackArtist.h \
TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \ TrackInfo.cpp TrackInfo.h TrackPanel.cpp TrackPanel.h \
TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \ TrackPanelAx.cpp TrackPanelAx.h TrackPanelCell.h \
TrackPanelDrawingContext.h TrackPanelListener.h \ TrackPanelDrawable.h TrackPanelDrawingContext.h \
TrackPanelMouseEvent.h TrackPanelResizeHandle.cpp \ TrackPanelListener.h TrackPanelMouseEvent.h \
TrackPanelResizeHandle.h TrackPanelResizerCell.cpp \ TrackPanelResizeHandle.cpp TrackPanelResizeHandle.h \
TrackPanelResizerCell.h TrackUtilities.cpp TrackUtilities.h \ TrackPanelResizerCell.cpp TrackPanelResizerCell.h \
TranslatableStringArray.h UIHandle.h UIHandle.cpp \ TrackUtilities.cpp TrackUtilities.h TranslatableStringArray.h \
UndoManager.cpp UndoManager.h UserException.cpp \ UIHandle.h UIHandle.cpp UndoManager.cpp UndoManager.h \
UserException.h ViewInfo.cpp ViewInfo.h VoiceKey.cpp \ UserException.cpp UserException.h ViewInfo.cpp ViewInfo.h \
VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp WaveTrack.h \ VoiceKey.cpp VoiceKey.h WaveClip.cpp WaveClip.h WaveTrack.cpp \
WaveTrackLocation.h WrappedType.cpp WrappedType.h ZoomInfo.cpp \ WaveTrack.h WaveTrackLocation.h WrappedType.cpp WrappedType.h \
ZoomInfo.h wxFileNameWrapper.h commands/AppCommandEvent.cpp \ ZoomInfo.cpp ZoomInfo.h wxFileNameWrapper.h \
commands/AppCommandEvent.h commands/AudacityCommand.cpp \ commands/AppCommandEvent.cpp commands/AppCommandEvent.h \
commands/AudacityCommand.h commands/BatchEvalCommand.cpp \ commands/AudacityCommand.cpp commands/AudacityCommand.h \
commands/BatchEvalCommand.h commands/Command.cpp \ commands/BatchEvalCommand.cpp commands/BatchEvalCommand.h \
commands/Command.h commands/CommandBuilder.cpp \ commands/Command.cpp commands/Command.h \
commands/CommandBuilder.h commands/CommandContext.cpp \ commands/CommandBuilder.cpp commands/CommandBuilder.h \
commands/CommandContext.h commands/CommandDirectory.cpp \ commands/CommandContext.cpp commands/CommandContext.h \
commands/CommandDirectory.h commands/CommandFlag.h \ commands/CommandDirectory.cpp commands/CommandDirectory.h \
commands/CommandFunctors.h commands/CommandHandler.cpp \ commands/CommandFlag.h commands/CommandFunctors.h \
commands/CommandHandler.h commands/CommandManager.cpp \ commands/CommandHandler.cpp commands/CommandHandler.h \
commands/CommandManager.h \ commands/CommandManager.cpp commands/CommandManager.h \
commands/CommandManagerWindowClasses.h commands/CommandMisc.h \ commands/CommandManagerWindowClasses.h commands/CommandMisc.h \
commands/CommandSignature.cpp commands/CommandSignature.h \ commands/CommandSignature.cpp commands/CommandSignature.h \
commands/CommandTargets.h commands/CommandType.cpp \ commands/CommandTargets.h commands/CommandType.cpp \

View File

@ -1666,6 +1666,21 @@ void TrackPanel::OnTrackFocusChange( wxCommandEvent &event )
} }
} }
TrackPanelDrawable::~TrackPanelDrawable()
{
}
void TrackPanelDrawable::Draw(
TrackPanelDrawingContext &, const wxRect &, unsigned )
{
}
wxRect TrackPanelDrawable::DrawingArea(
const wxRect &rect, const wxRect &, unsigned )
{
return rect;
}
TrackPanelNode::TrackPanelNode() TrackPanelNode::TrackPanelNode()
{ {
} }

View File

@ -14,9 +14,11 @@ Paul Licameli
#include "Audacity.h" #include "Audacity.h"
#include "MemoryX.h" #include "MemoryX.h"
#include "TrackPanelDrawable.h" // to inherit
class AudacityProject; class AudacityProject;
struct HitTestPreview; struct HitTestPreview;
struct TrackPanelDrawingContext;
struct TrackPanelMouseEvent; struct TrackPanelMouseEvent;
struct TrackPanelMouseState; struct TrackPanelMouseState;
class ViewInfo; class ViewInfo;
@ -31,9 +33,9 @@ using UIHandlePtr = std::shared_ptr<UIHandle>;
#include <vector> #include <vector>
/// \brief The TrackPanel is built up of nodes, subtrees of the CellularPanel's area /// \brief The TrackPanel is built up of nodes, subtrees of the CellularPanel's area
/// This class itself has almost nothing in it. Other classes derived from it /// Common base class for TrackPanelCell (leaf) and TrackPanelGroup (nonleaf)
/// build up the capabilities.
class AUDACITY_DLL_API /* not final */ TrackPanelNode class AUDACITY_DLL_API /* not final */ TrackPanelNode
: public TrackPanelDrawable
{ {
public: public:
TrackPanelNode(); TrackPanelNode();

51
src/TrackPanelDrawable.h Normal file
View File

@ -0,0 +1,51 @@
/**********************************************************************
Audacity: A Digital Audio Editor
TrackPanelDrawable.h
Paul Licameli
**********************************************************************/
#ifndef __AUDACITY_TRACK_PANEL_DRAWABLE__
#define __AUDACITY_TRACK_PANEL_DRAWABLE__
struct TrackPanelDrawingContext;
struct wxRect;
/// \brief Drawing interface common to cells, groups of cells, and temporary handles in CellularPanel
class TrackPanelDrawable {
public:
virtual ~TrackPanelDrawable() = 0;
// Drawing functions of the subdivision are visited repeatedly in one
// painting if their areas (as computed by DrawingArea) intersect the
// panel area, and depending on iPass may overpaint results of previous
// passes.
// Drawing function is given the rectangle computed by DrawingArea.
// iPass counts zero-based up to some limit given to CellularPanel::Draw.
// Default implementation does nothing.
virtual void Draw(
TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass );
// For drawing purposes, a cell might require a bigger rectangle than for
// hit-test purposes, spilling over into other parts of the partition of the
// panel area.
// Default implementation returns rect unchanged.
virtual wxRect DrawingArea(
const wxRect &rect, const wxRect &panelRect, unsigned iPass );
// Utilities for implementing DrawingArea:
static inline wxRect MaximizeWidth(
const wxRect &rect, const wxRect &panelRect ) {
return { panelRect.x, rect.y, panelRect.width, rect.height };
}
static inline wxRect MaximizeHeight(
const wxRect &rect, const wxRect &panelRect ) {
return { rect.x, panelRect.y, rect.width, panelRect.height };
}
};
#endif

View File

@ -13,6 +13,7 @@ Paul Licameli
#include <utility> #include <utility>
#include "MemoryX.h" #include "MemoryX.h"
#include "TrackPanelDrawable.h" // to inherit
class wxDC; class wxDC;
class wxRect; class wxRect;
@ -27,10 +28,11 @@ struct TrackPanelMouseState;
#include "MemoryX.h" #include "MemoryX.h"
/// \brief Short-lived drawing and event-handling object associated with a TrackPanelCell
// A TrackPanelCell reports a handle object of some subclass, in response to a // A TrackPanelCell reports a handle object of some subclass, in response to a
// hit test at a mouse position; then this handle processes certain events, // hit test at a mouse position; then this handle processes certain events,
// and maintains necessary state through click-drag-release event sequences. // and maintains necessary state through click-drag-release event sequences.
class UIHandle /* not final */ class UIHandle /* not final */ : public TrackPanelDrawable
{ {
public: public:
// See RefreshCode.h for bit flags: // See RefreshCode.h for bit flags:

View File

@ -582,6 +582,7 @@
<ClInclude Include="..\..\..\src\toolbars\SpectralSelectionBar.h" /> <ClInclude Include="..\..\..\src\toolbars\SpectralSelectionBar.h" />
<ClInclude Include="..\..\..\src\toolbars\SpectralSelectionBarListener.h" /> <ClInclude Include="..\..\..\src\toolbars\SpectralSelectionBarListener.h" />
<ClInclude Include="..\..\..\src\TrackPanelCell.h" /> <ClInclude Include="..\..\..\src\TrackPanelCell.h" />
<ClInclude Include="..\..\..\src\TrackPanelDrawable.h" />
<ClInclude Include="..\..\..\src\TrackPanelDrawingContext.h" /> <ClInclude Include="..\..\..\src\TrackPanelDrawingContext.h" />
<ClInclude Include="..\..\..\src\TrackPanelListener.h" /> <ClInclude Include="..\..\..\src\TrackPanelListener.h" />
<ClInclude Include="..\..\..\src\TrackPanelMouseEvent.h" /> <ClInclude Include="..\..\..\src\TrackPanelMouseEvent.h" />

View File

@ -2404,6 +2404,9 @@
<ClInclude Include="..\..\..\src\tracks\ui\TrackView.h"> <ClInclude Include="..\..\..\src\tracks\ui\TrackView.h">
<Filter>src\tracks\ui</Filter> <Filter>src\tracks\ui</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\TrackPanelDrawable.h">
<Filter>src</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Image Include="..\..\audacity.ico"> <Image Include="..\..\audacity.ico">