1 /**********************************************************************
2 
3   Audacity: A Digital Audio Editor
4 
5   TrackArtist.h
6 
7   Dominic Mazzoni
8 
9   This singleton class handles the actual rendering of WaveTracks
10   (both waveforms and spectra), NoteTracks, and LabelTracks.
11 
12   It's actually a little harder than it looks, because for
13   waveforms at least it needs to cache the samples that are
14   currently on-screen.
15 
16 **********************************************************************/
17 
18 #ifndef __AUDACITY_TRACKARTIST__
19 #define __AUDACITY_TRACKARTIST__
20 
21 
22 
23 
24 #include <wx/brush.h> // member variable
25 #include <wx/pen.h> // member variables
26 
27 #include "Prefs.h"
28 
29 class wxRect;
30 
31 class TrackList;
32 class TrackPanel;
33 class SelectedRegion;
34 class Track;
35 class TrackPanel;
36 struct TrackPanelDrawingContext;
37 class ZoomInfo;
38 
39 namespace TrackArt {
40 
41    static constexpr int ClipFrameRadius{ 6 };
42 
43    AUDACITY_DLL_API
44    void DrawClipAffordance(wxDC& dc, const wxRect& affordanceRect, const wxString& title, bool highlight = false, bool selected = false);
45 
46    AUDACITY_DLL_API
47    wxRect GetAffordanceTitleRect(const wxRect& affordanceRect);
48 
49    AUDACITY_DLL_API
50    void DrawClipEdges(wxDC& dc, const wxRect& clipRect, bool selected = false);
51 
52    //Used to draw clip boundaries without contents/details when it's not
53    //sensible to show them
54    AUDACITY_DLL_API
55    void DrawClipFolded(wxDC& dc, const wxRect& rect);
56 
57    // Helper: draws the "sync-locked" watermark tiled to a rectangle
58    AUDACITY_DLL_API
59    void DrawSyncLockTiles(
60       TrackPanelDrawingContext &context, const wxRect &rect );
61 
62    // Helper: draws background with selection rect
63    AUDACITY_DLL_API
64    void DrawBackgroundWithSelection(TrackPanelDrawingContext &context,
65          const wxRect &rect, const Track *track,
66          const wxBrush &selBrush, const wxBrush &unselBrush,
67          bool useSelection = true);
68 
69    AUDACITY_DLL_API
70    void DrawCursor(TrackPanelDrawingContext& context,
71         const wxRect& rect, const Track* track);
72 
73    AUDACITY_DLL_API
74    void DrawNegativeOffsetTrackArrows( TrackPanelDrawingContext &context,
75                                        const wxRect & rect );
76 
77    AUDACITY_DLL_API
78    wxString TruncateText(wxDC& dc, const wxString& text, const int maxWidth);
79 }
80 
81 class AUDACITY_DLL_API TrackArtist final : private PrefsListener {
82 
83 public:
84 
85    enum : unsigned {
86       PassTracks,
87       PassMargins,
88       PassBorders,
89       PassControls,
90       PassZooming,
91       PassBackground,
92       PassFocus,
93       PassSnapping,
94 
95       NPasses
96    };
97 
98    TrackArtist( TrackPanel *parent_ );
99    ~TrackArtist();
100    static TrackArtist *Get( TrackPanelDrawingContext & );
101 
SetBackgroundBrushes(wxBrush unselectedBrushIn,wxBrush selectedBrushIn,wxPen unselectedPenIn,wxPen selectedPenIn)102    void SetBackgroundBrushes(wxBrush unselectedBrushIn, wxBrush selectedBrushIn,
103                              wxPen unselectedPenIn, wxPen selectedPenIn) {
104      this->unselectedBrush = unselectedBrushIn;
105      this->selectedBrush = selectedBrushIn;
106      this->unselectedPen = unselectedPenIn;
107      this->selectedPen = selectedPenIn;
108    }
109 
110    void SetColours(int iColorIndex);
111 
112    void UpdatePrefs() override;
113    void UpdateSelectedPrefs( int id ) override;
114 
115    TrackPanel *parent;
116 
117    // Preference values
118    float mdBrange;            // "/GUI/EnvdBRange"
119    bool mShowClipping;        // "/GUI/ShowClipping"
120    int  mSampleDisplay;
121    bool mbShowTrackNameInTrack;  // "/GUI/ShowTrackNameInWaveform"
122 
123    wxBrush blankBrush;
124    wxBrush unselectedBrush;
125    wxBrush selectedBrush;
126    wxBrush sampleBrush;
127    wxBrush selsampleBrush;
128    wxBrush dragsampleBrush;// for samples which are draggable.
129    wxBrush muteSampleBrush;
130    wxBrush blankSelectedBrush;
131    wxPen blankPen;
132    wxPen unselectedPen;
133    wxPen selectedPen;
134    wxPen samplePen;
135    wxPen rmsPen;
136    wxPen muteRmsPen;
137    wxPen selsamplePen;
138    wxPen muteSamplePen;
139    wxPen odProgressNotYetPen;
140    wxPen odProgressDonePen;
141    wxPen shadowPen;
142    wxPen clippedPen;
143    wxPen muteClippedPen;
144    wxPen blankSelectedPen;
145 
146 #ifdef EXPERIMENTAL_FFT_Y_GRID
147    bool fftYGridOld;
148 #endif //EXPERIMENTAL_FFT_Y_GRID
149 
150 #ifdef EXPERIMENTAL_FIND_NOTES
151    bool fftFindNotesOld;
152    int findNotesMinAOld;
153    int findNotesNOld;
154    bool findNotesQuantizeOld;
155 #endif
156 
157    const SelectedRegion *pSelectedRegion{};
158    ZoomInfo *pZoomInfo{};
159 
160    bool drawEnvelope{ false };
161    bool bigPoints{ false };
162    bool drawSliders{ false };
163    bool onBrushTool{ false };
164    bool hasSolo{ false };
165 };
166 
167 extern AUDACITY_DLL_API int GetWaveYPos(float value, float min, float max,
168                        int height, bool dB, bool outer, float dBr,
169                        bool clip);
170 extern float FromDB(float value, double dBRange);
171 extern AUDACITY_DLL_API float ValueOfPixel(int yy, int height, bool offset,
172                           bool dB, double dBRange, float zoomMin, float zoomMax);
173 
174 #endif                          // define __AUDACITY_TRACKARTIST__
175