Audacity 3.2.0
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
audacity::cloud::audiocom::ShareAudioDialog Class Referencefinal

#include <ShareAudioDialog.h>

Inheritance diagram for audacity::cloud::audiocom::ShareAudioDialog:
[legend]
Collaboration diagram for audacity::cloud::audiocom::ShareAudioDialog:
[legend]

Classes

class  ExportProgressUpdater
 
struct  InitialStatePanel
 
struct  ProgressPanel
 
struct  Services
 

Public Member Functions

 ShareAudioDialog (AudacityProject &project, AudiocomTrace, wxWindow *parent=nullptr)
 
 ~ShareAudioDialog () override
 
- Public Member Functions inherited from wxDialogWrapper
 wxDialogWrapper ()
 
 wxDialogWrapper (wxWindow *parent, wxWindowID id, const TranslatableString &title, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE, const TranslatableString &name=XO("Dialog"))
 
bool Create (wxWindow *parent, wxWindowID id, const TranslatableString &title, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE, const TranslatableString &name=XO("Dialog"))
 
void SetTitle (const TranslatableString &title)
 
void SetLabel (const TranslatableString &title)
 
void SetName (const TranslatableString &title)
 
void SetName ()
 
- Public Member Functions inherited from wxTabTraversalWrapper< wxDialog >
 wxTabTraversalWrapper (Args &&... args)
 
 wxTabTraversalWrapper (const wxTabTraversalWrapper &)=delete
 
 wxTabTraversalWrapper (wxTabTraversalWrapper &&)=delete
 
wxTabTraversalWrapperoperator= (const wxTabTraversalWrapper &)=delete
 
wxTabTraversalWrapperoperator= (wxTabTraversalWrapper &&)=delete
 

Private Types

using Clock = std::chrono::steady_clock
 

Private Member Functions

void Populate (ShuttleGui &s)
 
void OnCancel ()
 
void OnContinue ()
 
wxString ExportProject ()
 
void StartUploadProcess ()
 
void HandleUploadSucceeded (const UploadSuccessfulPayload &payload)
 
void HandleUploadFailed (const UploadFailedPayload &payload)
 
void HandleExportFailure ()
 
void ResetProgress ()
 
void UpdateProgress (uint64_t current, uint64_t total)
 

Private Attributes

AudacityProjectmProject
 
struct audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel mInitialStatePanel
 
struct audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel mProgressPanel
 
wxButton * mContinueButton { nullptr }
 
wxButton * mCancelButton { nullptr }
 
std::unique_ptr< ServicesmServices
 
const AudiocomTrace mAudiocomTrace
 
std::unique_ptr< ExportProgressUpdatermExportProgressUpdater
 
Clock::time_point mStageStartTime
 
Clock::time_point mLastUIUpdateTime
 
int mLastProgressValue { 0 }
 
wxString mFilePath
 
std::function< void()> mContinueAction
 
bool mIsAuthorised { false }
 
bool mInProgress { false }
 

Detailed Description

Definition at line 40 of file ShareAudioDialog.h.

Member Typedef Documentation

◆ Clock

using audacity::cloud::audiocom::ShareAudioDialog::Clock = std::chrono::steady_clock
private

Definition at line 116 of file ShareAudioDialog.h.

Constructor & Destructor Documentation

◆ ShareAudioDialog()

audacity::cloud::audiocom::ShareAudioDialog::ShareAudioDialog ( AudacityProject project,
AudiocomTrace  trace,
wxWindow *  parent = nullptr 
)

Definition at line 168 of file ShareAudioDialog.cpp.

171 parent, wxID_ANY, XO("Share Audio"), wxDefaultPosition, { 480, 250 },
172 wxDEFAULT_DIALOG_STYLE)
174 , mInitialStatePanel(*this)
175 , mServices(std::make_unique<Services>())
176 , mAudiocomTrace(trace)
177{
179
180 ShuttleGui s(this, eIsCreating);
181
182 s.StartVerticalLay();
183 {
184 Populate(s);
185 }
186 s.EndVerticalLay();
187
188 Layout();
189 Fit();
190 Centre();
191
192 const auto size = GetSize();
193
194 SetMinSize({ size.x, std::min(250, size.y) });
195 SetMaxSize({ size.x, -1 });
196
197 mContinueAction = [this]() {
198 if (mInitialStatePanel.root->IsShown())
200 };
201
202 Bind(
203 wxEVT_CHAR_HOOK,
204 [this](auto& evt)
205 {
206 if (!IsEscapeKey(evt))
207 {
208 evt.Skip();
209 return;
210 }
211
212 OnCancel();
213 });
214}
int min(int a, int b)
XO("Cut/Copy/Paste")
@ eIsCreating
Definition: ShuttleGui.h:37
const auto project
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:640
struct audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel mInitialStatePanel
AuthorizationHandler & GetAuthorizationHandler()

◆ ~ShareAudioDialog()

audacity::cloud::audiocom::ShareAudioDialog::~ShareAudioDialog ( )
override

Definition at line 216 of file ShareAudioDialog.cpp.

217{
219 // Clean up the temp file when the dialog is closed
220 if (!mFilePath.empty() && wxFileExists(mFilePath))
221 wxRemoveFile(mFilePath);
222}

References audacity::cloud::audiocom::GetAuthorizationHandler(), mFilePath, and audacity::cloud::audiocom::AuthorizationHandler::PopSuppressDialogs().

Here is the call graph for this function:

Member Function Documentation

◆ ExportProject()

wxString audacity::cloud::audiocom::ShareAudioDialog::ExportProject ( )
private

Definition at line 313 of file ShareAudioDialog.cpp.

314{
316
317 const double t0 = 0.0;
318 const double t1 = tracks.GetEndTime();
319
320 const int nChannels = CalculateChannels(tracks);
321
322 auto hasMimeType = [](const auto&& mimeTypes, const std::string& mimeType)
323 {
324 return std::find(mimeTypes.begin(), mimeTypes.end(), mimeType) != mimeTypes.end();
325 };
326
327 const auto& registry = ExportPluginRegistry::Get();
328
329 for(const auto& preferredMimeType : GetServiceConfig().GetPreferredAudioFormats())
330 {
331 auto config = GetServiceConfig().GetExportConfig(preferredMimeType);
333 auto pluginIt = std::find_if(registry.begin(), registry.end(), [&](auto t)
334 {
335 auto [plugin, formatIndex] = t;
336 parameters.clear();
337 return hasMimeType(plugin->GetMimeTypes(formatIndex), preferredMimeType) &&
338 plugin->ParseConfig(formatIndex, config, parameters);
339 });
340
341 if(pluginIt == registry.end())
342 continue;
343
344 const auto [plugin, formatIndex] = *pluginIt;
345
346 const auto formatInfo = plugin->GetFormatInfo(formatIndex);
347 const auto path = GenerateTempPath(formatInfo.extensions[0]);
348
349 if(path.empty())
350 continue;
351
352 mExportProgressUpdater = std::make_unique<ExportProgressUpdater>(*this);
353
354 auto builder = ExportTaskBuilder{}
355 .SetParameters(parameters)
356 .SetNumChannels(nChannels)
358 .SetPlugin(plugin)
359 .SetFileName(path)
360 .SetRange(t0, t1, false);
361
362 auto result = ExportResult::Error;
364 {
365 auto exportTask = builder.Build(mProject);
366
367 auto f = exportTask.get_future();
368 std::thread(std::move(exportTask), std::ref(*mExportProgressUpdater)).detach();
369
371 {
372 while(f.wait_for(std::chrono::milliseconds(50)) != std::future_status::ready)
373 mExportProgressUpdater->UpdateUI();
374 result = f.get();
375 });
376 });
377
378 mExportProgressUpdater->SetResult(result);
379 const auto success = result == ExportResult::Success;
380 if(!success && wxFileExists(path))
381 wxRemoveFile(path);
382 if(success)
383 return path;
384 }
385 return {};
386}
const auto tracks
static ExportPluginRegistry & Get()
std::vector< std::tuple< ExportOptionID, ExportValue > > Parameters
Definition: ExportPlugin.h:93
ExportTaskBuilder & SetPlugin(const ExportPlugin *plugin, int format=0) noexcept
Definition: Export.cpp:59
ExportTaskBuilder & SetParameters(ExportProcessor::Parameters parameters) noexcept
Definition: Export.cpp:47
ExportTaskBuilder & SetNumChannels(unsigned numChannels) noexcept
Definition: Export.cpp:53
ExportTaskBuilder & SetSampleRate(double sampleRate) noexcept
Definition: Export.cpp:72
ExportTaskBuilder & SetFileName(const wxFileName &filename)
Definition: Export.cpp:33
ExportTaskBuilder & SetRange(double t0, double t1, bool selectedOnly=false) noexcept
Definition: Export.cpp:39
static ProjectRate & Get(AudacityProject &project)
Definition: ProjectRate.cpp:28
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:314
rapidjson::Document GetExportConfig(const std::string &exporterName) const
Export configuration suitable for the mime type provided.
std::unique_ptr< ExportProgressUpdater > mExportProgressUpdater
void ExceptionWrappedCall(Callable callable)
double GetRate(const Track &track)
Definition: TimeTrack.cpp:182
const ServiceConfig & GetServiceConfig()
Returns the instance of the ServiceConfig.

References audacity::cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::CalculateChannels(), Error, ExportProgressUI::ExceptionWrappedCall(), audacity::cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::GenerateTempPath(), ExportPluginRegistry::Get(), ProjectRate::Get(), TrackList::Get(), audacity::cloud::audiocom::ServiceConfig::GetExportConfig(), anonymous_namespace{TimeTrack.cpp}::GetRate(), audacity::cloud::audiocom::GetServiceConfig(), mExportProgressUpdater, mProject, ExportTaskBuilder::SetFileName(), ExportTaskBuilder::SetNumChannels(), ExportTaskBuilder::SetParameters(), ExportTaskBuilder::SetPlugin(), ExportTaskBuilder::SetRange(), ExportTaskBuilder::SetSampleRate(), Success, and tracks.

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HandleExportFailure()

void audacity::cloud::audiocom::ShareAudioDialog::HandleExportFailure ( )
private

Definition at line 499 of file ShareAudioDialog.cpp.

500{
501 EndModal(wxID_ABORT);
502
504 {}, XO("Export error"),
505 XO("We are unable to prepare this file for uploading."), {},
507}
void ShowErrorDialog(const WindowPlacement &placement, const TranslatableString &dlogTitle, const TranslatableString &message, const ManualPageID &helpPage, const ErrorDialogOptions &options={})
Show an error dialog with a link to the manual for further help.
Definition: BasicUI.h:272
Options for variations of error dialogs; the default is for modal dialogs.
Definition: BasicUI.h:52

References BasicUI::ModalError, BasicUI::ShowErrorDialog(), and XO().

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HandleUploadFailed()

void audacity::cloud::audiocom::ShareAudioDialog::HandleUploadFailed ( const UploadFailedPayload payload)
private

Definition at line 470 of file ShareAudioDialog.cpp.

471{
472 EndModal(wxID_ABORT);
473
474 TranslatableString message;
475
476 if (!payload.message.empty())
477 {
478 auto details = payload.message;
479
480 for (auto& err : payload.additionalErrors)
481 details += " " + err.second;
482
483 message = XO("Error: %s").Format(details);
484 }
485 else
486 {
487 message = XO(
488 "We are unable to upload this file. Please try again and make sure to link to your audio.com account before uploading.");
489 }
490
492 {}, XO("Upload error"),
493 message,
494 {},
496
497}
Holds a msgid for the translation catalog; may also bind format arguments.

References audacity::cloud::audiocom::UploadFailedPayload::additionalErrors, audacity::cloud::audiocom::UploadFailedPayload::message, BasicUI::ModalError, BasicUI::ShowErrorDialog(), and XO().

Here is the call graph for this function:

◆ HandleUploadSucceeded()

void audacity::cloud::audiocom::ShareAudioDialog::HandleUploadSucceeded ( const UploadSuccessfulPayload payload)
private

Definition at line 463 of file ShareAudioDialog.cpp.

465{
466 EndModal(wxID_CLOSE);
467 OpenInDefaultBrowser(wxString { payload.audioUrl });
468}
bool OpenInDefaultBrowser(const wxString &url)
Open an URL in default browser.
Definition: BasicUI.cpp:246

References audacity::cloud::audiocom::UploadSuccessfulPayload::audioUrl, and BasicUI::OpenInDefaultBrowser().

Here is the call graph for this function:

◆ OnCancel()

void audacity::cloud::audiocom::ShareAudioDialog::OnCancel ( )
private

Definition at line 270 of file ShareAudioDialog.cpp.

271{
272 if (mInProgress)
273 {
274 AudacityMessageDialog dlgMessage(
275 this, XO("Are you sure you want to cancel?"), XO("Cancel upload to Audio.com"),
276 wxYES_NO | wxICON_QUESTION | wxNO_DEFAULT | wxSTAY_ON_TOP);
277
278 const auto result = dlgMessage.ShowModal();
279
280 if (result != wxID_YES)
281 return;
282
283 // If export has started, notify it that it should be canceled
285 mExportProgressUpdater->Cancel();
286 }
287
288
289 // If upload was started - ask it to discard the result.
290 // The result should be discarded even after the upload has finished
291 if (mServices->uploadPromise)
292 mServices->uploadPromise->DiscardResult();
293
294 EndModal(wxID_CANCEL);
295}
Wrap wxMessageDialog so that caption IS translatable.

References mExportProgressUpdater, mInProgress, mServices, and XO().

Referenced by Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnContinue()

void audacity::cloud::audiocom::ShareAudioDialog::OnContinue ( )
private

Definition at line 297 of file ShareAudioDialog.cpp.

298{
300}

References mContinueAction.

Referenced by Populate().

Here is the caller graph for this function:

◆ Populate()

void audacity::cloud::audiocom::ShareAudioDialog::Populate ( ShuttleGui s)
private

Definition at line 224 of file ShareAudioDialog.cpp.

225{
228
229 s.StartHorizontalLay(wxEXPAND, 0);
230 {
232 {
233 s.SetBorder(2);
234 s.StartHorizontalLay(wxEXPAND, 0);
235 {
236 s.AddSpace(0, 0, 1);
237
238 mCancelButton = s.AddButton(XXO("&Cancel"));
239 mCancelButton->Bind(wxEVT_BUTTON, [this](auto) { OnCancel(); });
240
241 s.AddSpace(4, 0, 0);
242
243 mContinueButton = s.AddButton(XXO("C&ontinue"));
244 mContinueButton->Bind(wxEVT_BUTTON, [this](auto) { OnContinue(); });
245 }
247 }
249 }
251
252 const auto title = mProject.GetProjectName();
253
254 if (!title.empty())
255 {
257 mInitialStatePanel.trackTitle->SetInsertionPoint(title.length());
258 }
259
261
263 wxEVT_TEXT,
264 [this](auto&) {
265 mContinueButton->Enable(
267 });
268}
XXO("&Cut/Copy/Paste Toolbar")
static const auto title
const wxString & GetProjectName() const
Definition: Project.cpp:100
void SetBorder(int Border)
Definition: ShuttleGui.h:495
void EndInvisiblePanel()
wxPanel * StartInvisiblePanel(int border=0)
wxButton * AddButton(const TranslatableString &Text, int PositionFlags=wxALIGN_CENTRE, bool setDefault=false)
Definition: ShuttleGui.cpp:362
void EndHorizontalLay()
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1)
wxSizerItem * AddSpace(int width, int height, int prop=0)
struct audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel mProgressPanel

References ShuttleGuiBase::AddButton(), ShuttleGui::AddSpace(), ShuttleGuiBase::EndHorizontalLay(), ShuttleGuiBase::EndInvisiblePanel(), AudacityProject::GetProjectName(), audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel::HasValidTitle(), mCancelButton, mContinueButton, mInitialStatePanel, mIsAuthorised, mProgressPanel, mProject, OnCancel(), OnContinue(), audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel::PopulateInitialStatePanel(), audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel::PopulateProgressPanel(), ShuttleGuiBase::SetBorder(), ShuttleGuiBase::StartHorizontalLay(), ShuttleGuiBase::StartInvisiblePanel(), title, audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel::trackTitle, and XXO().

Here is the call graph for this function:

◆ ResetProgress()

void audacity::cloud::audiocom::ShareAudioDialog::ResetProgress ( )
private

Definition at line 509 of file ShareAudioDialog.cpp.

510{
511 mStageStartTime = Clock::now();
513
514 mProgressPanel.elapsedTime->SetLabel(" 00:00:00");
515 mProgressPanel.remainingTime->SetLabel(" 00:00:00");
516 mProgressPanel.progress->SetValue(0);
517
519
521
523}
void Yield()
Dispatch waiting events, including actions enqueued by CallAfter.
Definition: BasicUI.cpp:225

References BasicUI::Yield().

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StartUploadProcess()

void audacity::cloud::audiocom::ShareAudioDialog::StartUploadProcess ( )
private

Definition at line 388 of file ShareAudioDialog.cpp.

389{
390 mInProgress = true;
391
392 mInitialStatePanel.root->Hide();
393 mProgressPanel.root->Show();
394
395 mProgressPanel.info->Hide();
396
397 mContinueButton->Hide();
398
399 Layout();
400 Fit();
401
403
405
406 if(mFilePath.empty())
407 {
410 {
412 }
413
414 return;
415 }
416
417 mProgressPanel.title->SetLabel(XO("Uploading audio...").Translation());
419
420 mServices->uploadPromise = mServices->uploadService.Upload(
422 [this](const auto& result) {
423 CallAfter(
424 [this, result]()
425 {
426 mInProgress = false;
427
428 if (result.result == UploadOperationCompleted::Result::Success)
429 {
430 // Success indicates that UploadSuccessfulPayload is in the payload
431 assert(std::holds_alternative<UploadSuccessfulPayload>(result.payload));
432
433 if (
434 auto payload =
435 std::get_if<UploadSuccessfulPayload>(&result.payload))
436 HandleUploadSucceeded(*payload);
437 else
438 HandleUploadSucceeded({});
439
440 }
441 else if (
442 result.result != UploadOperationCompleted::Result::Aborted)
443 {
444 if (
445 auto payload =
446 std::get_if<UploadFailedPayload>(&result.payload))
447 HandleUploadFailed(*payload);
448 else
449 HandleUploadFailed({});
450 }
451 });
452 },
453 [this](auto current, auto total) {
454 CallAfter(
455 [this, current, total]()
456 {
457 UpdateProgress(current, total);
458 });
459 },
461}
void UpdateProgress(uint64_t current, uint64_t total)
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
Definition: BasicUI.cpp:214

References Cancelled, ExportProject(), audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel::GetTrackTitle(), HandleExportFailure(), audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel::info, mContinueButton, mExportProgressUpdater, mFilePath, mInitialStatePanel, mInProgress, mProgressPanel, mServices, ResetProgress(), audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel::root, audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel::root, audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel::title, and XO().

Here is the call graph for this function:

◆ UpdateProgress()

void audacity::cloud::audiocom::ShareAudioDialog::UpdateProgress ( uint64_t  current,
uint64_t  total 
)
private

Definition at line 537 of file ShareAudioDialog.cpp.

538{
539 using namespace std::chrono;
540
541 const auto now = Clock::now();
542
543 if (current == 0)
544 return;
545
546 if (current > total)
547 current = total;
548
549 if (mLastProgressValue != current)
550 {
551 constexpr int scale = 10000;
552
553 mLastProgressValue = static_cast<int>(current);
554
555 mProgressPanel.progress->SetRange(scale);
556 mProgressPanel.progress->SetValue((current * scale) / total);
557
558 if (current == total && mServices->uploadPromise)
559 {
561 mProgressPanel.title->SetLabel(XO("Finalizing upload...").Translation());
562 }
563 }
564
565 const auto elapsedSinceUIUpdate = now - mLastUIUpdateTime;
566
567 constexpr auto uiUpdateTimeout = 500ms;
568
569 if (elapsedSinceUIUpdate < uiUpdateTimeout && current < total)
570 return;
571
572 mLastUIUpdateTime = now;
573
574 const auto elapsed = duration_cast<milliseconds>(now - mStageStartTime);
575
577
578 const auto estimate = elapsed * total / current;
579 const auto remains = estimate - elapsed;
580
583 std::chrono::duration_cast<std::chrono::milliseconds>(remains));
584}
void SetTimeLabel(wxStaticText *label, std::chrono::milliseconds time)

References audacity::cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::SetTimeLabel(), and XO().

Referenced by audacity::cloud::audiocom::ShareAudioDialog::ExportProgressUpdater::UpdateUI().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mAudiocomTrace

const AudiocomTrace audacity::cloud::audiocom::ShareAudioDialog::mAudiocomTrace
private

Definition at line 111 of file ShareAudioDialog.h.

◆ mCancelButton

wxButton* audacity::cloud::audiocom::ShareAudioDialog::mCancelButton { nullptr }
private

Definition at line 107 of file ShareAudioDialog.h.

Referenced by Populate().

◆ mContinueAction

std::function<void()> audacity::cloud::audiocom::ShareAudioDialog::mContinueAction
private

Definition at line 124 of file ShareAudioDialog.h.

Referenced by OnContinue().

◆ mContinueButton

wxButton* audacity::cloud::audiocom::ShareAudioDialog::mContinueButton { nullptr }
private

Definition at line 106 of file ShareAudioDialog.h.

Referenced by Populate(), and StartUploadProcess().

◆ mExportProgressUpdater

std::unique_ptr<ExportProgressUpdater> audacity::cloud::audiocom::ShareAudioDialog::mExportProgressUpdater
private

Definition at line 114 of file ShareAudioDialog.h.

Referenced by ExportProject(), OnCancel(), and StartUploadProcess().

◆ mFilePath

wxString audacity::cloud::audiocom::ShareAudioDialog::mFilePath
private

Definition at line 122 of file ShareAudioDialog.h.

Referenced by StartUploadProcess(), and ~ShareAudioDialog().

◆ mInitialStatePanel

struct audacity::cloud::audiocom::ShareAudioDialog::InitialStatePanel audacity::cloud::audiocom::ShareAudioDialog::mInitialStatePanel
private

Referenced by Populate(), and StartUploadProcess().

◆ mInProgress

bool audacity::cloud::audiocom::ShareAudioDialog::mInProgress { false }
private

Definition at line 127 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mIsAuthorised

bool audacity::cloud::audiocom::ShareAudioDialog::mIsAuthorised { false }
private

Definition at line 126 of file ShareAudioDialog.h.

Referenced by Populate().

◆ mLastProgressValue

int audacity::cloud::audiocom::ShareAudioDialog::mLastProgressValue { 0 }
private

Definition at line 120 of file ShareAudioDialog.h.

◆ mLastUIUpdateTime

Clock::time_point audacity::cloud::audiocom::ShareAudioDialog::mLastUIUpdateTime
private

Definition at line 119 of file ShareAudioDialog.h.

◆ mProgressPanel

struct audacity::cloud::audiocom::ShareAudioDialog::ProgressPanel audacity::cloud::audiocom::ShareAudioDialog::mProgressPanel
private

Referenced by Populate(), and StartUploadProcess().

◆ mProject

AudacityProject& audacity::cloud::audiocom::ShareAudioDialog::mProject
private

Definition at line 64 of file ShareAudioDialog.h.

Referenced by ExportProject(), and Populate().

◆ mServices

std::unique_ptr<Services> audacity::cloud::audiocom::ShareAudioDialog::mServices
private

Definition at line 110 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mStageStartTime

Clock::time_point audacity::cloud::audiocom::ShareAudioDialog::mStageStartTime
private

Definition at line 118 of file ShareAudioDialog.h.


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