Audacity 3.2.0
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
BrushHandle Class Reference

#include <BrushHandle.h>

Inheritance diagram for BrushHandle:
[legend]
Collaboration diagram for BrushHandle:
[legend]

Classes

class  StateSaver
 

Public Member Functions

 BrushHandle (std::shared_ptr< StateSaver > pStateSaver, const std::shared_ptr< ChannelView > &pChannelView, const TrackList &trackList, const TrackPanelMouseState &st, const ViewInfo &viewInfo, const std::shared_ptr< SpectralData > &pSpectralData, const ProjectSettings &pSettings)
 
BrushHandleoperator= (const BrushHandle &)=default
 
virtual ~BrushHandle ()
 
std::shared_ptr< const TrackFindTrack () const override
 
bool IsDragging () const override
 
void Enter (bool forward, AudacityProject *pProject) override
 
bool Escape (AudacityProject *pProject) override
 
void HandleHopBinData (int hopNum, int freqBinNum)
 
Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject) override
 
HitTestPreview Preview (const TrackPanelMouseState &state, AudacityProject *pProject) override
 
Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override
 
Result Cancel (AudacityProject *) override
 
- Public Member Functions inherited from UIHandle
virtual ~UIHandle ()=0
 
virtual void Enter (bool forward, AudacityProject *pProject)
 
virtual bool HasRotation () const
 
virtual bool Rotate (bool forward)
 
virtual bool HasEscape (AudacityProject *pProject) const
 
virtual bool Escape (AudacityProject *pProject)
 
virtual bool HandlesRightClick ()
 Whether the handle has any special right-button handling. More...
 
virtual Result Click (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual Result Drag (const TrackPanelMouseEvent &event, AudacityProject *pProject)=0
 
virtual HitTestPreview Preview (const TrackPanelMouseState &state, AudacityProject *pProject)=0
 
virtual Result Release (const TrackPanelMouseEvent &event, AudacityProject *pProject, wxWindow *pParent)=0
 
virtual Result Cancel (AudacityProject *pProject)=0
 
virtual bool StopsOnKeystroke ()
 
virtual void OnProjectChange (AudacityProject *pProject)
 
virtual std::shared_ptr< const TrackFindTrack () const =0
 
virtual bool IsDragging () const
 
Result GetChangeHighlight () const
 
void SetChangeHighlight (Result val)
 
- Public Member Functions inherited from TrackPanelDrawable
virtual ~TrackPanelDrawable ()=0
 
virtual void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
 
virtual wxRect DrawingArea (TrackPanelDrawingContext &context, const wxRect &rect, const wxRect &panelRect, unsigned iPass)
 

Private Member Functions

 BrushHandle (const BrushHandle &)
 
std::shared_ptr< WaveChannelFindChannel ()
 
void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
 

Private Attributes

std::shared_ptr< StateSavermpStateSaver
 
std::shared_ptr< SpectralDatampSpectralData
 
std::weak_ptr< ChannelViewmpView
 
wxRect mRect {}
 
double mFreqSnappingRatio { 0.01 }
 
double mOvertonesThreshold { 0.999 }
 
bool mIsSmartSelection
 
bool mIsOvertones
 
long long mSampleCountUpperBound
 
long long mSampleCountLowerBound
 
wxInt64 mFreqUpperBound
 
wxInt64 mFreqLowerBound
 
int mMostRecentX { -1 }
 
int mMostRecentY { -1 }
 
int mBrushRadius
 
bool mbCtrlDown
 
std::shared_ptr< SelectionStateChangermSelectionStateChanger
 

Additional Inherited Members

- Public Types inherited from UIHandle
using Result = unsigned
 
using Cell = TrackPanelCell
 
- Static Public Member Functions inherited from UIHandle
static UIHandle::Result NeedChangeHighlight (const UIHandle &, const UIHandle &)
 
static std::shared_ptr< const TrackTrackFromChannel (const std::shared_ptr< const Channel > &pChannel)
 A frequent convenience in the definition of UIHandles. More...
 
- Static Public Member Functions inherited from TrackPanelDrawable
static wxRect MaximizeWidth (const wxRect &rect, const wxRect &panelRect)
 
static wxRect MaximizeHeight (const wxRect &rect, const wxRect &panelRect)
 
- Protected Attributes inherited from UIHandle
Result mChangeHighlight { 0 }
 

Detailed Description

Definition at line 30 of file BrushHandle.h.

Constructor & Destructor Documentation

◆ BrushHandle() [1/2]

BrushHandle::BrushHandle ( const BrushHandle )
private

◆ BrushHandle() [2/2]

BrushHandle::BrushHandle ( std::shared_ptr< StateSaver pStateSaver,
const std::shared_ptr< ChannelView > &  pChannelView,
const TrackList trackList,
const TrackPanelMouseState st,
const ViewInfo viewInfo,
const std::shared_ptr< SpectralData > &  pSpectralData,
const ProjectSettings pSettings 
)
explicit

Definition at line 138 of file BrushHandle.cpp.

145 : mpStateSaver{ move(pStateSaver) }
146 , mpSpectralData(pSpectralData)
147 , mpView{ pChannelView }
148{
149 const wxMouseState &state = st.state;
150 auto wc = pChannelView->FindChannel<WaveChannel>();
151 double rate = mpSpectralData->GetSR();
152
153 mRect = st.rect;
154 mBrushRadius = pSettings.GetBrushRadius();
155 const auto &settings = SpectrogramSettings::Get(*wc);
156 mFreqUpperBound = settings.maxFreq - 1;
157 mFreqLowerBound = settings.minFreq + 1;
159 mIsOvertones = pSettings.IsOvertones();
160 // Borrowed from TimeToLongSample
161 mSampleCountLowerBound = floor( wc->GetStartTime() * rate + 0.5);
162 mSampleCountUpperBound = floor( wc->GetEndTime() * rate + 0.5);
163}
static Settings & settings()
Definition: TrackInfo.cpp:69
std::shared_ptr< StateSaver > mpStateSaver
Definition: BrushHandle.h:90
wxInt64 mFreqUpperBound
Definition: BrushHandle.h:112
long long mSampleCountLowerBound
Definition: BrushHandle.h:111
bool mIsSmartSelection
Definition: BrushHandle.h:110
wxInt64 mFreqLowerBound
Definition: BrushHandle.h:112
std::weak_ptr< ChannelView > mpView
Definition: BrushHandle.h:100
int mBrushRadius
Definition: BrushHandle.h:114
bool mIsOvertones
Definition: BrushHandle.h:110
wxRect mRect
Definition: BrushHandle.h:101
long long mSampleCountUpperBound
Definition: BrushHandle.h:111
std::shared_ptr< SpectralData > mpSpectralData
Definition: BrushHandle.h:91
bool IsOvertones() const
int GetBrushRadius() const
bool IsSmartSelection() const
static SpectrogramSettings & Get(const WaveTrack &track)

References SpectrogramSettings::Get(), ProjectSettings::GetBrushRadius(), ProjectSettings::IsOvertones(), ProjectSettings::IsSmartSelection(), mBrushRadius, mFreqLowerBound, mFreqUpperBound, mIsOvertones, mIsSmartSelection, mpSpectralData, mRect, mSampleCountLowerBound, mSampleCountUpperBound, TrackPanelMouseState::rect, settings(), and TrackPanelMouseState::state.

Here is the call graph for this function:

◆ ~BrushHandle()

BrushHandle::~BrushHandle ( )
virtual

Definition at line 165 of file BrushHandle.cpp.

166{
167}

Member Function Documentation

◆ Cancel()

UIHandle::Result BrushHandle::Cancel ( AudacityProject pProject)
overridevirtual

Implements UIHandle.

Definition at line 395 of file BrushHandle.cpp.

396{
397 mpStateSaver.reset();
399}

References mpStateSaver, and RefreshCode::RefreshAll.

◆ Click()

UIHandle::Result BrushHandle::Click ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 220 of file BrushHandle.cpp.

222{
223 if (mpStateSaver)
224 // Clear all unless there is a modifier key down
225 mpStateSaver->Init( *pProject, !evt.event.HasAnyModifiers() );
226
227 using namespace RefreshCode;
228
229 const auto pView = mpView.lock();
230 if ( !pView )
231 return Cancelled;
232
233 wxMouseEvent &event = evt.event;
234 auto &trackPanel = TrackPanel::Get( *pProject );
235 auto &viewInfo = ViewInfo::Get( *pProject );
236
237 return RefreshAll;
238}
static TrackPanel & Get(AudacityProject &project)
Definition: TrackPanel.cpp:234
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
Namespace containing an enum 'what to do on a refresh?'.
Definition: RefreshCode.h:16

References Cancelled, TrackPanelMouseEvent::event, ViewInfo::Get(), TrackPanel::Get(), mpStateSaver, mpView, and RefreshCode::RefreshAll.

Here is the call graph for this function:

◆ Drag()

UIHandle::Result BrushHandle::Drag ( const TrackPanelMouseEvent event,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 240 of file BrushHandle.cpp.

242{
243 using namespace RefreshCode;
244
245 const auto pView = mpView.lock();
246 if ( !pView )
247 return Cancelled;
248
249 wxMouseEvent &event = evt.event;
250 const auto wc = FindChannel();
251 auto &trackPanel = TrackPanel::Get( *pProject );
252 auto &viewInfo = ViewInfo::Get( *pProject );
253
254 auto posXToHopNum = [&](int x0){
255 double posTime = viewInfo.PositionToTime(x0, mRect.x);
256 sampleCount sc = wc->TimeToLongSamples(posTime);
257 auto hopSize = mpSpectralData->GetHopSize();
258 return (sc.as_long_long() + hopSize / 2) / hopSize;
259 };
260
261 auto posYToFreqBin = [&](int y0){
262 int resFreq = PositionToFrequency(*wc, 0, y0, mRect.y, mRect.height);
263 double resFreqBin = resFreq / (mpSpectralData->GetSR() / mpSpectralData->GetWindowSize());
264 return static_cast<int>(std::round(resFreqBin));
265 };
266
267 auto drawCircle = [&](int h0, int bm){
268 // For each (h0, b0), draw circle
269 int h2 = mBrushRadius;
270 int b2 = 0;
271 int hChange = 1 - (mBrushRadius << 1);
272 int bChange = 0;
273 int radiusError = 0;
274 while (h2 >= b2) {
275 for (int i = h0 - h2; i <= h0 + h2; i++)
276 {
277 HandleHopBinData(i, bm + b2);
278 HandleHopBinData(i, bm - b2);
279 }
280 for (int i = h0 - b2; i <= h0 + b2; i++)
281 {
282 HandleHopBinData(i, bm + h2);
283 HandleHopBinData(i, bm - h2);
284 }
285
286 b2++;
287 radiusError += bChange;
288 bChange += 2;
289 if (((radiusError << 1) + hChange) > 0)
290 {
291 h2--;
292 radiusError += hChange;
293 hChange += 2;
294 }
295 } // End of full circle drawing
296 };
297
298 // Clip the coordinates
299 // TODO: Find ways to access the ClipParameters (for the mid)
300 int dest_xcoord = std::clamp(event.m_x, mRect.x + 10, mRect.x + mRect.width);
301 int dest_ycoord = std::clamp(event.m_y, mRect.y + 10, mRect.y + mRect.height);
302
303 int h1 = posXToHopNum(dest_xcoord);
304 int b1 = posYToFreqBin(dest_ycoord);
305
306 mbCtrlDown = event.ControlDown() || event.AltDown();
307
308 // Use the hop and bin number to calculate the brush stroke, instead of the mouse coordinates
309 // For mouse coordinate:
310 // (src_xcoord, src_ycoord) -> (dest_xcoord, dest_ycoord)
311
312 const auto &hopSize = mpSpectralData->GetHopSize();
313 if(!mpSpectralData->coordHistory.empty()){
314 int src_xcoord = mpSpectralData->coordHistory.back().first;
315 int src_ycoord = mpSpectralData->coordHistory.back().second;
316
317 int h0 = posXToHopNum(src_xcoord);
318 int b0 = posYToFreqBin(src_ycoord);
319 int wd = mBrushRadius * 2;
320
321 int dh = abs(h1-h0), sh = h0<h1 ? 1 : -1;
322 int db = -abs(b1-b0), sb = b0<b1 ? 1 : -1;
323 int err = dh+db, err2;
324
325 // Line drawing (draw points until the start coordinate reaches the end)
326 while(true){
327 if (h0 == h1 && b0 == b1)
328 break;
329 err2 = err * 2;
330 if (err2 * 2 >= db) { err += db; h0 += sh; }
331 if (err2 * 2 <= dh) { err += dh; b0 += sb; }
332
333
334 int bm = b0;
336 // Correct the y coord (snap to highest energy freq. bin)
337 if(auto *sView = dynamic_cast<SpectrumView*>(pView.get())){
338 int resFreqBin =
340 h0 * hopSize, hopSize, mFreqSnappingRatio, bm);
341 if(resFreqBin != - 1)
342 bm = resFreqBin;
343 }
344 }
345
346 if(mIsOvertones){
347 // take bm and calculate the highest energy
348 std::vector<int> binsToWork = SpectralDataManager::FindHighestFrequencyBins(*wc,
349 h0 * hopSize, hopSize, mOvertonesThreshold, bm);
350 for(auto & bins: binsToWork)
351 drawCircle(h0, bins);
352 }
353
354 drawCircle(h0, bm);
355 } // End of line connecting
356 }
357 mpSpectralData->coordHistory.push_back(std::make_pair(dest_xcoord, dest_ycoord));
358 return RefreshAll;
359}
double mFreqSnappingRatio
Definition: BrushHandle.h:105
bool mbCtrlDown
Definition: BrushHandle.h:115
void HandleHopBinData(int hopNum, int freqBinNum)
double mOvertonesThreshold
Definition: BrushHandle.h:108
std::shared_ptr< WaveChannel > FindChannel()
static std::vector< int > FindHighestFrequencyBins(WaveChannel &wc, long long int startSC, int hopSize, double threshold, int targetFreqBin)
static int FindFrequencySnappingBin(const WaveChannel &channel, long long startSC, int hopSize, double threshold, int targetFreqBin)
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
long long as_long_long() const
Definition: SampleCount.h:48
double PositionToFrequency(const WaveChannel &wc, bool maySnap, wxInt64 mouseYCoordinate, wxInt64 trackTopEdge, int trackHeight)
Definition: BrushHandle.cpp:80
fastfloat_really_inline void round(adjusted_mantissa &am, callback cb) noexcept
Definition: fast_float.h:2512

References sampleCount::as_long_long(), Cancelled, TrackPanelMouseEvent::event, FindChannel(), SpectralDataManager::FindFrequencySnappingBin(), SpectralDataManager::FindHighestFrequencyBins(), ViewInfo::Get(), TrackPanel::Get(), HandleHopBinData(), mbCtrlDown, mBrushRadius, mFreqSnappingRatio, mIsOvertones, mIsSmartSelection, mOvertonesThreshold, mpSpectralData, mpView, mRect, anonymous_namespace{BrushHandle.cpp}::PositionToFrequency(), RefreshCode::RefreshAll, and fast_float::round().

Here is the call graph for this function:

◆ Draw()

void BrushHandle::Draw ( TrackPanelDrawingContext context,
const wxRect &  rect,
unsigned  iPass 
)
overrideprivatevirtual

Reimplemented from TrackPanelDrawable.

Definition at line 401 of file BrushHandle.cpp.

404{
405 if ( iPass == TrackArtist::PassTracks ) {
406 auto& dc = context.dc;
407 wxPoint coord;
408 coord.x = mMostRecentX;
409 coord.y = mMostRecentY;
410 dc.SetBrush( *wxTRANSPARENT_BRUSH );
411 dc.SetPen( *wxYELLOW_PEN );
412 dc.DrawCircle(coord, mBrushRadius);
413 }
414}
int mMostRecentX
Definition: BrushHandle.h:113
int mMostRecentY
Definition: BrushHandle.h:113

References TrackPanelDrawingContext::dc, mBrushRadius, mMostRecentX, mMostRecentY, and TrackArtist::PassTracks.

◆ Enter()

void BrushHandle::Enter ( bool  forward,
AudacityProject pProject 
)
overridevirtual

Reimplemented from UIHandle.

Definition at line 193 of file BrushHandle.cpp.

194{
195
196}

◆ Escape()

bool BrushHandle::Escape ( AudacityProject pProject)
overridevirtual

Reimplemented from UIHandle.

Definition at line 198 of file BrushHandle.cpp.

199{
200 return false;
201}

◆ FindChannel()

std::shared_ptr< WaveChannel > BrushHandle::FindChannel ( )
private

Definition at line 416 of file BrushHandle.cpp.

417{
418 auto pView = mpView.lock();
419 if (!pView)
420 return {};
421 else
422 return pView->FindChannel<WaveChannel>();
423}

References mpView.

Referenced by Drag(), and FindTrack().

Here is the caller graph for this function:

◆ FindTrack()

std::shared_ptr< const Track > BrushHandle::FindTrack ( ) const
overridevirtual
Returns
pointer to associated track, if any

Implements UIHandle.

Definition at line 169 of file BrushHandle.cpp.

170{
171 return TrackFromChannel(const_cast<BrushHandle&>(*this).FindChannel());
172}
static std::shared_ptr< const Track > TrackFromChannel(const std::shared_ptr< const Channel > &pChannel)
A frequent convenience in the definition of UIHandles.
Definition: UIHandle.cpp:63

References FindChannel(), and UIHandle::TrackFromChannel().

Here is the call graph for this function:

◆ HandleHopBinData()

void BrushHandle::HandleHopBinData ( int  hopNum,
int  freqBinNum 
)

Definition at line 204 of file BrushHandle.cpp.

204 {
205 // Ignore the mouse dragging outside valid area
206 // We should also check for the available freq. range that is visible to user
207 long long sampleCount = hopNum * mpSpectralData->GetHopSize();
208 wxInt64 freq = freqBinNum * mpSpectralData->GetSR() / mpSpectralData->GetWindowSize();
209
211 freq < mFreqLowerBound || freq > mFreqUpperBound)
212 return;
213
214 if(mbCtrlDown)
215 mpSpectralData->removeHopBinData(hopNum, freqBinNum);
216 else
217 mpSpectralData->addHopBinData(hopNum, freqBinNum);
218}

References mbCtrlDown, mFreqUpperBound, mpSpectralData, and mSampleCountUpperBound.

Referenced by Drag().

Here is the caller graph for this function:

◆ IsDragging()

bool BrushHandle::IsDragging ( ) const
overridevirtual

Whether the handle is dragging, affecting other panel painting; default returns false

Reimplemented from UIHandle.

Definition at line 57 of file BrushHandle.cpp.

58{
59 return mSelectionStateChanger.get() != NULL;
60}
std::shared_ptr< SelectionStateChanger > mSelectionStateChanger
Definition: BrushHandle.h:117

References mSelectionStateChanger.

◆ operator=()

BrushHandle & BrushHandle::operator= ( const BrushHandle )
default

◆ Preview()

HitTestPreview BrushHandle::Preview ( const TrackPanelMouseState state,
AudacityProject pProject 
)
overridevirtual

Implements UIHandle.

Definition at line 361 of file BrushHandle.cpp.

363{
365 wxCursor *pCursor = CrosshairCursor();
366 return { tip, pCursor };
367}
Holds a msgid for the translation catalog; may also bind format arguments.

References anonymous_namespace{BrushHandle.cpp}::CrosshairCursor().

Here is the call graph for this function:

◆ Release()

UIHandle::Result BrushHandle::Release ( const TrackPanelMouseEvent event,
AudacityProject pProject,
wxWindow *  pParent 
)
overridevirtual

Implements UIHandle.

Definition at line 369 of file BrushHandle.cpp.

372{
373 using namespace RefreshCode;
374 mpSpectralData->saveAndClearBuffer();
375 if (mpStateSaver) {
376 mpStateSaver->Commit();
377 mpStateSaver.reset();
378 }
379 if(mbCtrlDown){
380 ProjectHistory::Get( *pProject ).PushState(
381 XO( "Erased selected area" ),
382 XO( "Erased selected area" ) );
383 ProjectHistory::Get( *pProject ).ModifyState(true);
384 }
385 else{
386 ProjectHistory::Get( *pProject ).PushState(
387 XO( "Selected area using Brush Tool" ),
388 XO( "Brush tool selection" ) );
389 ProjectHistory::Get( *pProject ).ModifyState(true);
390 }
391
392 return RefreshNone;
393}
XO("Cut/Copy/Paste")
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)

References ProjectHistory::Get(), mbCtrlDown, ProjectHistory::ModifyState(), mpSpectralData, mpStateSaver, ProjectHistory::PushState(), RefreshCode::RefreshNone, and XO().

Here is the call graph for this function:

Member Data Documentation

◆ mbCtrlDown

bool BrushHandle::mbCtrlDown
private

Definition at line 115 of file BrushHandle.h.

Referenced by Drag(), HandleHopBinData(), and Release().

◆ mBrushRadius

int BrushHandle::mBrushRadius
private

Definition at line 114 of file BrushHandle.h.

Referenced by BrushHandle(), Drag(), and Draw().

◆ mFreqLowerBound

wxInt64 BrushHandle::mFreqLowerBound
private

Definition at line 112 of file BrushHandle.h.

Referenced by BrushHandle().

◆ mFreqSnappingRatio

double BrushHandle::mFreqSnappingRatio { 0.01 }
private

Definition at line 105 of file BrushHandle.h.

Referenced by Drag().

◆ mFreqUpperBound

wxInt64 BrushHandle::mFreqUpperBound
private

Definition at line 112 of file BrushHandle.h.

Referenced by BrushHandle(), and HandleHopBinData().

◆ mIsOvertones

bool BrushHandle::mIsOvertones
private

Definition at line 110 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mIsSmartSelection

bool BrushHandle::mIsSmartSelection
private

Definition at line 110 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mMostRecentX

int BrushHandle::mMostRecentX { -1 }
private

Definition at line 113 of file BrushHandle.h.

Referenced by Draw().

◆ mMostRecentY

int BrushHandle::mMostRecentY { -1 }
private

Definition at line 113 of file BrushHandle.h.

Referenced by Draw().

◆ mOvertonesThreshold

double BrushHandle::mOvertonesThreshold { 0.999 }
private

Definition at line 108 of file BrushHandle.h.

Referenced by Drag().

◆ mpSpectralData

std::shared_ptr<SpectralData> BrushHandle::mpSpectralData
private

Definition at line 91 of file BrushHandle.h.

Referenced by BrushHandle(), Drag(), HandleHopBinData(), and Release().

◆ mpStateSaver

std::shared_ptr<StateSaver> BrushHandle::mpStateSaver
private

Definition at line 90 of file BrushHandle.h.

Referenced by Cancel(), Click(), and Release().

◆ mpView

std::weak_ptr<ChannelView> BrushHandle::mpView
private

Definition at line 100 of file BrushHandle.h.

Referenced by Click(), Drag(), and FindChannel().

◆ mRect

wxRect BrushHandle::mRect {}
private

Definition at line 101 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mSampleCountLowerBound

long long BrushHandle::mSampleCountLowerBound
private

Definition at line 111 of file BrushHandle.h.

Referenced by BrushHandle().

◆ mSampleCountUpperBound

long long BrushHandle::mSampleCountUpperBound
private

Definition at line 111 of file BrushHandle.h.

Referenced by BrushHandle(), and HandleHopBinData().

◆ mSelectionStateChanger

std::shared_ptr<SelectionStateChanger> BrushHandle::mSelectionStateChanger
private

Definition at line 117 of file BrushHandle.h.

Referenced by IsDragging().


The documentation for this class was generated from the following files: