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< TrackView > &pTrackView, const TrackList &trackList, const TrackPanelMouseState &st, const ViewInfo &viewInfo, const std::shared_ptr< SpectralData > &pSpectralData, const ProjectSettings &pSettings)
 
BrushHandleoperator= (const BrushHandle &)=default
 
virtual ~BrushHandle ()
 
bool IsClicked () const
 
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)
 
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::weak_ptr< TrackFindTrack ()
 
void Draw (TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
 

Private Attributes

std::shared_ptr< StateSavermpStateSaver
 
std::shared_ptr< SpectralDatampSpectralData
 
std::weak_ptr< TrackViewmpView
 
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 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< TrackView > &  pTrackView,
const TrackList trackList,
const TrackPanelMouseState st,
const ViewInfo viewInfo,
const std::shared_ptr< SpectralData > &  pSpectralData,
const ProjectSettings pSettings 
)
explicit

Definition at line 143 of file BrushHandle.cpp.

150 : mpStateSaver{ move(pStateSaver) }
151 , mpSpectralData(pSpectralData)
152 , mpView{ pTrackView }
153{
154 const wxMouseState &state = st.state;
155 auto pTrack = pTrackView->FindTrack().get();
156 auto wt = dynamic_cast<WaveTrack *>(pTrack);
157 double rate = mpSpectralData->GetSR();
158
159 mRect = st.rect;
160 mBrushRadius = pSettings.GetBrushRadius();
161 const auto &settings = SpectrogramSettings::Get(*wt);
162 mFreqUpperBound = settings.maxFreq - 1;
163 mFreqLowerBound = settings.minFreq + 1;
165 mIsOvertones = pSettings.IsOvertones();
166 // Borrowed from TimeToLongSample
167 mSampleCountLowerBound = floor( pTrack->GetStartTime() * rate + 0.5);
168 mSampleCountUpperBound = floor( pTrack->GetEndTime() * rate + 0.5);
169}
static Settings & settings()
Definition: TrackInfo.cpp:87
std::shared_ptr< StateSaver > mpStateSaver
Definition: BrushHandle.h:88
wxInt64 mFreqUpperBound
Definition: BrushHandle.h:110
long long mSampleCountLowerBound
Definition: BrushHandle.h:109
std::weak_ptr< TrackView > mpView
Definition: BrushHandle.h:98
bool mIsSmartSelection
Definition: BrushHandle.h:108
wxInt64 mFreqLowerBound
Definition: BrushHandle.h:110
int mBrushRadius
Definition: BrushHandle.h:112
bool mIsOvertones
Definition: BrushHandle.h:108
wxRect mRect
Definition: BrushHandle.h:99
long long mSampleCountUpperBound
Definition: BrushHandle.h:109
std::shared_ptr< SpectralData > mpSpectralData
Definition: BrushHandle.h:89
bool IsOvertones() const
int GetBrushRadius() const
bool IsSmartSelection() const
static SpectrogramSettings & Get(const WaveTrack &track)
Mutative access to attachment even if the track argument is const.
A Track that contains audio waveform data.
Definition: WaveTrack.h:51

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 171 of file BrushHandle.cpp.

172{
173}

Member Function Documentation

◆ Cancel()

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

Implements UIHandle.

Definition at line 402 of file BrushHandle.cpp.

403{
404 mpStateSaver.reset();
406}

References mpStateSaver, and RefreshCode::RefreshAll.

◆ Click()

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

Implements UIHandle.

Definition at line 221 of file BrushHandle.cpp.

223{
224 if (mpStateSaver)
225 // Clear all unless there is a modifier key down
226 mpStateSaver->Init( *pProject, !evt.event.HasAnyModifiers() );
227
228 using namespace RefreshCode;
229
230 const auto pView = mpView.lock();
231 if ( !pView )
232 return Cancelled;
233
234 wxMouseEvent &event = evt.event;
235 const auto sTrack = TrackList::Get( *pProject ).Lock( FindTrack() );
236 const auto pTrack = sTrack.get();
237 const WaveTrack *const wt =
238 static_cast<const WaveTrack*>(pTrack);
239 auto &trackPanel = TrackPanel::Get( *pProject );
240 auto &viewInfo = ViewInfo::Get( *pProject );
241
242 return RefreshAll;
243}
std::weak_ptr< Track > FindTrack()
std::shared_ptr< Subclass > Lock(const std::weak_ptr< Subclass > &wTrack)
Definition: Track.h:1606
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:487
static TrackPanel & Get(AudacityProject &project)
Definition: TrackPanel.cpp:231
static ViewInfo & Get(AudacityProject &project)
Definition: ViewInfo.cpp:235
Namespace containing an enum 'what to do on a refresh?'.
Definition: RefreshCode.h:16

References RefreshCode::Cancelled, TrackPanelMouseEvent::event, FindTrack(), ViewInfo::Get(), TrackList::Get(), TrackPanel::Get(), TrackList::Lock(), 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 245 of file BrushHandle.cpp.

247{
248 using namespace RefreshCode;
249
250 const auto pView = mpView.lock();
251 if ( !pView )
252 return Cancelled;
253
254 wxMouseEvent &event = evt.event;
255 const auto sTrack = TrackList::Get( *pProject ).Lock( FindTrack() );
256 const auto pTrack = sTrack.get();
257 WaveTrack *const wt =
258 static_cast<WaveTrack*>(pTrack);
259 auto &trackPanel = TrackPanel::Get( *pProject );
260 auto &viewInfo = ViewInfo::Get( *pProject );
261
262 auto posXToHopNum = [&](int x0){
263 double posTime = viewInfo.PositionToTime(x0, mRect.x);
264 sampleCount sc = wt->TimeToLongSamples(posTime);
265 auto hopSize = mpSpectralData->GetHopSize();
266 return (sc.as_long_long() + hopSize / 2) / hopSize;
267 };
268
269 auto posYToFreqBin = [&](int y0){
270 int resFreq = PositionToFrequency(wt, 0, y0, mRect.y, mRect.height);
271 double resFreqBin = resFreq / (mpSpectralData->GetSR() / mpSpectralData->GetWindowSize());
272 return static_cast<int>(std::round(resFreqBin));
273 };
274
275 auto drawCircle = [&](int h0, int bm){
276 // For each (h0, b0), draw circle
277 int h2 = mBrushRadius;
278 int b2 = 0;
279 int hChange = 1 - (mBrushRadius << 1);
280 int bChange = 0;
281 int radiusError = 0;
282 while (h2 >= b2) {
283 for (int i = h0 - h2; i <= h0 + h2; i++)
284 {
285 HandleHopBinData(i, bm + b2);
286 HandleHopBinData(i, bm - b2);
287 }
288 for (int i = h0 - b2; i <= h0 + b2; i++)
289 {
290 HandleHopBinData(i, bm + h2);
291 HandleHopBinData(i, bm - h2);
292 }
293
294 b2++;
295 radiusError += bChange;
296 bChange += 2;
297 if (((radiusError << 1) + hChange) > 0)
298 {
299 h2--;
300 radiusError += hChange;
301 hChange += 2;
302 }
303 } // End of full circle drawing
304 };
305
306 // Clip the coordinates
307 // TODO: Find ways to access the ClipParameters (for the mid)
308 int dest_xcoord = std::clamp(event.m_x, mRect.x + 10, mRect.x + mRect.width);
309 int dest_ycoord = std::clamp(event.m_y, mRect.y + 10, mRect.y + mRect.height);
310
311 int h1 = posXToHopNum(dest_xcoord);
312 int b1 = posYToFreqBin(dest_ycoord);
313
314 mbCtrlDown = event.ControlDown() || event.AltDown();
315
316 // Use the hop and bin number to calculate the brush stroke, instead of the mouse coordinates
317 // For mouse coordinate:
318 // (src_xcoord, src_ycoord) -> (dest_xcoord, dest_ycoord)
319
320 const auto &hopSize = mpSpectralData->GetHopSize();
321 if(!mpSpectralData->coordHistory.empty()){
322 int src_xcoord = mpSpectralData->coordHistory.back().first;
323 int src_ycoord = mpSpectralData->coordHistory.back().second;
324
325 int h0 = posXToHopNum(src_xcoord);
326 int b0 = posYToFreqBin(src_ycoord);
327 int wd = mBrushRadius * 2;
328
329 int dh = abs(h1-h0), sh = h0<h1 ? 1 : -1;
330 int db = -abs(b1-b0), sb = b0<b1 ? 1 : -1;
331 int err = dh+db, err2;
332
333 // Line drawing (draw points until the start coordinate reaches the end)
334 while(true){
335 if (h0 == h1 && b0 == b1)
336 break;
337 err2 = err * 2;
338 if (err2 * 2 >= db) { err += db; h0 += sh; }
339 if (err2 * 2 <= dh) { err += dh; b0 += sb; }
340
341
342 int bm = b0;
344 // Correct the y coord (snap to highest energy freq. bin)
345 if(auto *sView = dynamic_cast<SpectrumView*>(pView.get())){
347 h0 * hopSize, hopSize, mFreqSnappingRatio, bm);
348 if(resFreqBin != - 1)
349 bm = resFreqBin;
350 }
351 }
352
353 if(mIsOvertones){
354 // take bm and calculate the highest energy
355 std::vector<int> binsToWork = SpectralDataManager::FindHighestFrequencyBins(wt,
356 h0 * hopSize, hopSize, mOvertonesThreshold, bm);
357 for(auto & bins: binsToWork)
358 drawCircle(h0, bins);
359 }
360
361 drawCircle(h0, bm);
362 } // End of line connecting
363 }
364 mpSpectralData->coordHistory.push_back(std::make_pair(dest_xcoord, dest_ycoord));
365 return RefreshAll;
366}
double mFreqSnappingRatio
Definition: BrushHandle.h:103
bool mbCtrlDown
Definition: BrushHandle.h:113
void HandleHopBinData(int hopNum, int freqBinNum)
double mOvertonesThreshold
Definition: BrushHandle.h:106
sampleCount TimeToLongSamples(double t0) const
Convert correctly between an (absolute) time in seconds and a number of samples.
Definition: SampleTrack.cpp:43
static int FindFrequencySnappingBin(WaveTrack *wt, long long startSC, int hopSize, double threshold, int targetFreqBin)
static std::vector< int > FindHighestFrequencyBins(WaveTrack *wt, long long int 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 WaveTrack *wt, 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(), RefreshCode::Cancelled, TrackPanelMouseEvent::event, SpectralDataManager::FindFrequencySnappingBin(), SpectralDataManager::FindHighestFrequencyBins(), FindTrack(), ViewInfo::Get(), TrackList::Get(), TrackPanel::Get(), HandleHopBinData(), TrackList::Lock(), mbCtrlDown, mBrushRadius, mFreqSnappingRatio, mIsOvertones, mIsSmartSelection, mOvertonesThreshold, mpSpectralData, mpView, mRect, anonymous_namespace{BrushHandle.cpp}::PositionToFrequency(), RefreshCode::RefreshAll, fast_float::round(), and SampleTrack::TimeToLongSamples().

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 408 of file BrushHandle.cpp.

411{
412 if ( iPass == TrackArtist::PassTracks ) {
413 auto& dc = context.dc;
414 wxPoint coord;
415 coord.x = mMostRecentX;
416 coord.y = mMostRecentY;
417 dc.SetBrush( *wxTRANSPARENT_BRUSH );
418 dc.SetPen( *wxYELLOW_PEN );
419 dc.DrawCircle(coord, mBrushRadius);
420 }
421}
int mMostRecentX
Definition: BrushHandle.h:111
int mMostRecentY
Definition: BrushHandle.h:111

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

◆ Enter()

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

Reimplemented from UIHandle.

Definition at line 194 of file BrushHandle.cpp.

195{
196
197}

◆ Escape()

bool BrushHandle::Escape ( AudacityProject pProject)
overridevirtual

Reimplemented from UIHandle.

Definition at line 199 of file BrushHandle.cpp.

200{
201 return false;
202}

◆ FindTrack()

std::weak_ptr< Track > BrushHandle::FindTrack ( )
private

Definition at line 423 of file BrushHandle.cpp.

424{
425 auto pView = mpView.lock();
426 if (!pView)
427 return {};
428 else
429 return pView->FindTrack();
430}

References mpView.

Referenced by Click(), and Drag().

Here is the caller graph for this function:

◆ HandleHopBinData()

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

Definition at line 205 of file BrushHandle.cpp.

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

References mbCtrlDown, mFreqUpperBound, mpSpectralData, and mSampleCountUpperBound.

Referenced by Drag().

Here is the caller graph for this function:

◆ IsClicked()

bool BrushHandle::IsClicked ( ) const

Definition at line 57 of file BrushHandle.cpp.

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

References mSelectionStateChanger.

◆ operator=()

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

◆ Preview()

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

Implements UIHandle.

Definition at line 368 of file BrushHandle.cpp.

370{
372 wxCursor *pCursor = CrosshairCursor();
373 return { tip, pCursor };
374}
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 376 of file BrushHandle.cpp.

379{
380 using namespace RefreshCode;
381 mpSpectralData->saveAndClearBuffer();
382 if (mpStateSaver) {
383 mpStateSaver->Commit();
384 mpStateSaver.reset();
385 }
386 if(mbCtrlDown){
387 ProjectHistory::Get( *pProject ).PushState(
388 XO( "Erased selected area" ),
389 XO( "Erased selected area" ) );
390 ProjectHistory::Get( *pProject ).ModifyState(true);
391 }
392 else{
393 ProjectHistory::Get( *pProject ).PushState(
394 XO( "Selected area using Brush Tool" ),
395 XO( "Brush tool selection" ) );
396 ProjectHistory::Get( *pProject ).ModifyState(true);
397 }
398
399 return RefreshNone;
400}
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 113 of file BrushHandle.h.

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

◆ mBrushRadius

int BrushHandle::mBrushRadius
private

Definition at line 112 of file BrushHandle.h.

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

◆ mFreqLowerBound

wxInt64 BrushHandle::mFreqLowerBound
private

Definition at line 110 of file BrushHandle.h.

Referenced by BrushHandle().

◆ mFreqSnappingRatio

double BrushHandle::mFreqSnappingRatio { 0.01 }
private

Definition at line 103 of file BrushHandle.h.

Referenced by Drag().

◆ mFreqUpperBound

wxInt64 BrushHandle::mFreqUpperBound
private

Definition at line 110 of file BrushHandle.h.

Referenced by BrushHandle(), and HandleHopBinData().

◆ mIsOvertones

bool BrushHandle::mIsOvertones
private

Definition at line 108 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mIsSmartSelection

bool BrushHandle::mIsSmartSelection
private

Definition at line 108 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mMostRecentX

int BrushHandle::mMostRecentX { -1 }
private

Definition at line 111 of file BrushHandle.h.

Referenced by Draw().

◆ mMostRecentY

int BrushHandle::mMostRecentY { -1 }
private

Definition at line 111 of file BrushHandle.h.

Referenced by Draw().

◆ mOvertonesThreshold

double BrushHandle::mOvertonesThreshold { 0.999 }
private

Definition at line 106 of file BrushHandle.h.

Referenced by Drag().

◆ mpSpectralData

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

Definition at line 89 of file BrushHandle.h.

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

◆ mpStateSaver

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

Definition at line 88 of file BrushHandle.h.

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

◆ mpView

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

Definition at line 98 of file BrushHandle.h.

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

◆ mRect

wxRect BrushHandle::mRect {}
private

Definition at line 99 of file BrushHandle.h.

Referenced by BrushHandle(), and Drag().

◆ mSampleCountLowerBound

long long BrushHandle::mSampleCountLowerBound
private

Definition at line 109 of file BrushHandle.h.

Referenced by BrushHandle().

◆ mSampleCountUpperBound

long long BrushHandle::mSampleCountUpperBound
private

Definition at line 109 of file BrushHandle.h.

Referenced by BrushHandle(), and HandleHopBinData().

◆ mSelectionStateChanger

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

Definition at line 115 of file BrushHandle.h.

Referenced by IsClicked().


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