Audacity 3.2.0
AboutDialog.cpp
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 AboutDialog.cpp
6
7 Dominic Mazzoni
8 Vaughan Johnson
9 James Crook
10
11********************************************************************//*****************************************************************//********************************************************************/
26
27
28
29#include "AboutDialog.h"
30
31#include <wx/html/htmlwin.h>
32#include <wx/hyperlink.h>
33#include <wx/statbmp.h>
34#include <wx/sstream.h>
35#include <wx/txtstrm.h>
36#include <wx/statbox.h>
37#include <wx/stattext.h>
38
39#include "FileNames.h"
40#include "HelpText.h"
41#include "ShuttleGui.h"
42#include "HelpSystem.h"
44
45#include "AllThemeResources.h"
46#include "Theme.h"
47
48#include "../images/AudacityLogoWithName.xpm"
49
50// Notice this is a "system include". This is on purpose and only until
51// we convert over to CMake. Once converted, the "RevisionIndent.h" file
52// should be deleted and this can be changed back to a user include if
53// desired.
54//
55// RevisionIdent.h may contain #defines like these ones:
56//#define REV_LONG "28864acb238cb3ca71dda190a2d93242591dd80e"
57//#define REV_TIME "Sun Apr 12 12:40:22 2015 +0100"
58#include "RevisionIdent.h"
59
60#ifndef REV_TIME
61#define REV_TIME "unknown date and time"
62#endif
63
64#ifdef REV_LONG
65#define REV_IDENT wxString( "[[https://github.com/audacity/audacity/commit/" )+ REV_LONG + "|" + wxString( REV_LONG ).Left(6) + "]] of " + REV_TIME
66#else
67#define REV_IDENT (XO("No revision identifier was provided").Translation())
68#endif
69
70#if defined(HAS_SENTRY_REPORTING) || defined(HAVE_UPDATES_CHECK) || defined(USE_BREAKPAD)
71#define HAS_PRIVACY_POLICY
72#endif
73
74// To substitute into many other translatable strings
75static const auto ProgramName =
76 //XO("Audacity");
77 Verbatim("Audacity");
78
80{
81 const auto sysAdminFormat =
82 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
83 XO("%s, system administration");
84 const auto coFounderFormat =
85 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
86 XO("%s, co-founder and developer");
87 const auto designerFormat =
88 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
89 XO("%s, designer");
90 const auto developerFormat =
91 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
92 XO("%s, developer");
93 const auto developerAndSupprtFormat =
94 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
95 XO("%s, developer and support");
96 const auto documentationAndSupportFormat =
97 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
98 XO("%s, documentation and support");
99 const auto qaDocumentationAndSupportFormat =
100 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
101 XO("%s, QA tester, documentation and support");
102 const auto documentationAndSupportFrenchFormat =
103 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
104 XO("%s, documentation and support, French");
105 const auto qualityAssuranceFormat =
106 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
107 XO("%s, quality assurance");
108 const auto accessibilityAdvisorFormat =
109 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
110 XO("%s, accessibility advisor");
111 const auto graphicArtistFormat =
112 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
113 XO("%s, graphic artist");
114 const auto composerFormat =
115 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
116 XO("%s, composer");
117 const auto testerFormat =
118 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
119 XO("%s, tester");
120 const auto NyquistPluginsFormat =
121 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
122 XO("%s, Nyquist plug-ins");
123 const auto webDeveloperFormat =
124 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
125 XO("%s, web developer");
126 const auto graphicsFormat =
127 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
128 XO("%s, graphics");
129 const auto presetsFormat =
130 /* i18n-hint: For "About Audacity..." credits, substituting a person's proper name */
131 XO("%s, effects presets");
132
133 // The Audacity Team: developers and support
134 AddCredit(wxT("Antons \u010cinakovs"), testerFormat, roleTeamMember);
135 AddCredit(wxT("Matthieu Hodgkinson"), developerFormat, roleTeamMember);
136 AddCredit(wxT("Peter Jonas"), developerFormat, roleTeamMember);
137 AddCredit(wxT("Martin Keary"), roleTeamMember);
138 AddCredit(wxT("Sergey Lapysh"), testerFormat, roleTeamMember);
139 AddCredit(wxT("Yana Larina"), roleTeamMember);
140 AddCredit(wxT("Dilson's Pickles"), designerFormat, roleTeamMember);
141 AddCredit(wxT("Anita Sudan"), roleTeamMember);
142 AddCredit(wxT("Vitaly Sverchinsky"), developerFormat, roleTeamMember);
143 AddCredit(wxT("Leo Wattenberg"), designerFormat, roleTeamMember);
144 AddCredit(wxT("Jessica Williamson"), designerFormat, roleTeamMember);
145
146
147 // Emeritus: people who were "lead developers" or made an
148 // otherwise distinguished contribution, but who are no
149 // longer active.
150 AddCredit(wxT("Gale Andrews"), qualityAssuranceFormat, roleEmeritusTeam);
151 AddCredit(wxT("Richard Ash"), developerFormat, roleEmeritusTeam);
152 AddCredit(wxT("Christian Brochec"),
153 documentationAndSupportFrenchFormat, roleEmeritusTeam);
154 AddCredit(wxT("Matt Brubeck"), developerFormat, roleEmeritusTeam);
155 AddCredit(wxT("Arturo \"Buanzo\" Busleiman"), sysAdminFormat, roleEmeritusTeam);
156 AddCredit(wxT("Michael Chinen"), developerFormat, roleEmeritusTeam);
157 AddCredit(wxT("James Crook"), developerFormat, roleEmeritusTeam);
158 AddCredit(wxT("Roger Dannenberg"), coFounderFormat, roleEmeritusTeam);
159 AddCredit(wxT("Steve Daulton"), roleEmeritusTeam);
160 AddCredit(wxT("Al Dimond"), developerFormat, roleEmeritusTeam);
161 AddCredit(wxT("Benjamin Drung"), developerFormat, roleEmeritusTeam);
162 AddCredit(wxT("Joshua Haberman"), developerFormat, roleEmeritusTeam);
163 AddCredit(wxT("Ruslan Ijbulatov"), developerFormat, roleEmeritusTeam);
164 AddCredit(wxT("Vaughan Johnson"), developerFormat, roleEmeritusTeam);
165 AddCredit(wxT("Greg Kozikowski"), documentationAndSupportFormat, roleEmeritusTeam);
166 AddCredit(wxT("Paul Licameli"), developerFormat, roleEmeritusTeam);
167 AddCredit(wxT("Leland Lucius"), developerFormat, roleEmeritusTeam);
168 AddCredit(wxT("Dominic Mazzoni"), coFounderFormat, roleEmeritusTeam);
169 AddCredit(wxT("Markus Meyer"), developerFormat, roleEmeritusTeam);
170 AddCredit(wxT("Monty Montgomery"), developerFormat, roleEmeritusTeam);
171 AddCredit(wxT("Shane Mueller"), developerFormat, roleEmeritusTeam);
172 AddCredit(wxT("Tony Oetzmann"), documentationAndSupportFormat, roleEmeritusTeam);
173 AddCredit(wxT("Alexandre Prokoudine"), documentationAndSupportFormat, roleEmeritusTeam);
174 AddCredit(wxT("Peter Sampson"), qaDocumentationAndSupportFormat, roleEmeritusTeam);
175 AddCredit(wxT("Martyn Shaw"), developerFormat, roleEmeritusTeam);
176 AddCredit(wxT("Dmitry Vedenko"), developerFormat, roleEmeritusTeam);
177 AddCredit(wxT("Bill Wharrie"), documentationAndSupportFormat, roleEmeritusTeam);
178
179 // Contributors
180 AddCredit(wxT("Lynn Allan"), developerFormat, roleContributor);
181 AddCredit(wxT("Johan Althoff (teetow)"), designerFormat, roleContributor);
182 AddCredit(wxT("Brian Armstrong"), developerFormat, roleContributor);
183 AddCredit(wxT("David Avery"), developerFormat, roleContributor);
184 AddCredit(wxT("David Bailes"), accessibilityAdvisorFormat, roleContributor);
185 AddCredit(wxT("William Bland"), developerFormat, roleContributor);
186 AddCredit(wxT("Sami Boukortt"), developerFormat, roleContributor);
187 AddCredit(wxT("Jeremy R. Brown"), developerFormat, roleContributor);
188 AddCredit(wxT("Alex S. Brown"), developerFormat, roleContributor);
189 AddCredit(wxT("David Bryant"), developerFormat, roleContributor);
190 AddCredit(wxT("Chris Cannam"), developerFormat, roleContributor);
191 AddCredit(wxT("Subhradeep Chakraborty"), developerFormat, roleContributor);
192 AddCredit(wxT("Cory Cook"), developerFormat, roleContributor);
193 AddCredit(wxT("Craig DeForest"), developerFormat, roleContributor);
194 AddCredit(wxT("Edgar Franke (Edgar-RFT)"), developerFormat, roleContributor);
195 AddCredit(wxT("Anton Gerasimov"), developerFormat, roleContributor);
196 AddCredit(wxT("Mitch Golden"), developerFormat, roleContributor);
197 AddCredit(wxT("Brian Gunlogson"), developerFormat, roleContributor);
198 AddCredit(wxT("Gonzalo Guzm\u00E1n"), documentationAndSupportFormat, roleContributor);
199 AddCredit(wxT("Andrew Hallendorff"), developerFormat, roleContributor);
200 AddCredit(wxT("Robert H\u00E4nggi"), developerFormat, roleContributor);
201 AddCredit(wxT("Jouni Helminen"), designerFormat, roleContributor);
202 AddCredit(wxT("Daniel Horgan"), developerFormat, roleContributor);
203 AddCredit(wxT("David Hostetler"), developerFormat, roleContributor);
204 AddCredit(wxT("Edward Hui"), developerFormat, roleContributor);
205 AddCredit(wxT("Vladislav Isaev"), presetsFormat, roleContributor);
206 AddCredit(wxT("Marek Iwaszkiewicz"), presetsFormat, roleContributor);
207 AddCredit(wxT("Steve Jolly"), developerFormat, roleContributor);
208 AddCredit(wxT("Steven Jones"), developerFormat, roleContributor);
209 AddCredit(wxT("Henric Jungheim"), developerFormat, roleContributor);
210 AddCredit(wxT("Myungchul Keum"), developerFormat, roleContributor);
211 AddCredit(wxT("Arun Kishore"), developerFormat, roleContributor);
212 AddCredit(wxT("Paul Livesey"), developerFormat, roleContributor);
213 AddCredit(wxT("Harvey Lubin"), graphicArtistFormat, roleContributor);
214 AddCredit(wxT("Max Maisel"), developerFormat, roleContributor);
215 AddCredit(wxT("Pietro Marcello"), developerFormat, roleContributor);
216 AddCredit(wxT("Greg Mekkes"), developerFormat, roleContributor);
217 AddCredit(wxT("Abe Milde"), developerFormat, roleContributor);
218 AddCredit(wxT("Ryan Miller"), testerFormat, roleContributor);
219 AddCredit(wxT("Paul Nasca"), developerFormat, roleContributor);
220 AddCredit(wxT("Clayton Otey"), developerFormat, roleContributor);
221 AddCredit(wxT("Pavel Penikov"), testerFormat, roleContributor);
222 AddCredit(wxT("Mark Phillips"), developerFormat, roleContributor);
223 AddCredit(wxT("Andr\u00E9 Pinto"), developerFormat, roleContributor);
224 AddCredit(wxT("Pokechu22"), developerFormat, roleContributor);
225 AddCredit(wxT("Jean Claude Risset"), composerFormat, roleContributor);
226 AddCredit(wxT("RuRo"), developerFormat, roleContributor);
227 AddCredit(wxT("Augustus Saunders"), developerFormat, roleContributor);
228 AddCredit(wxT("Benjamin Schwartz"), developerFormat, roleContributor);
229 AddCredit(wxT("Cliff Scott"), testerFormat, roleContributor);
230 AddCredit(wxT("David R. Sky"), NyquistPluginsFormat, roleContributor);
231 AddCredit(wxT("Joe Souza"), developerFormat, roleContributor);
232 AddCredit(wxT("K. Soze"), developerFormat, roleContributor);
233 AddCredit(wxT("Rob Sykes"), developerFormat, roleContributor);
234 AddCredit(wxT("Mike Underwood"), developerFormat, roleContributor);
235 AddCredit(wxT("Philip Van Baren"), developerFormat, roleContributor);
236 AddCredit(wxT("Salvo Ventura"), developerFormat, roleContributor);
237 AddCredit(wxT("Darrell Walisser"), developerFormat, roleContributor);
238 AddCredit(wxT("Jun Wan"), developerFormat, roleContributor);
239 AddCredit(wxT("Daniel Winzen"), developerFormat, roleContributor);
240 AddCredit(wxT("Tom Woodhams"), developerFormat, roleContributor);
241 AddCredit(wxT("Mark Young"), developerFormat, roleContributor);
242 AddCredit(wxT("Wing Yu"), developerFormat, roleContributor);
243
244 // Website and Graphics
245 AddCredit(wxT("Shinta Carolinasari"), webDeveloperFormat, roleGraphics);
246 AddCredit(wxT("Bayu Rizaldhan Rayes"), graphicsFormat, roleGraphics);
247
248 // Libraries
249
250 AddCredit(wxT("[[https://libexpat.github.io/|expat]]"), roleLibrary);
251 AddCredit(wxT("[[https://xiph.org/flac/|FLAC]]"), roleLibrary);
252 AddCredit(wxT("[[http://lame.sourceforge.net/|LAME]]"), roleLibrary);
253 AddCredit(wxT("[[http://www.mega-nerd.com/libsndfile/|libsndfile]]"), roleLibrary);
254 AddCredit(wxT("[[https://sourceforge.net/p/soxr/wiki/Home/|libsoxr]]"), roleLibrary);
255 AddCredit(
256 XO("%s (incorporating %s, %s, %s, %s and %s)")
257 .Format(
258 "[[http://lv2plug.in/|lv2]]",
259 "lilv",
260 "msinttypes",
261 "serd",
262 "sord",
263 "sratom"
264 ).Translation(),
266 AddCredit(wxT("[[https://www.cs.cmu.edu/~music/nyquist/|Nyquist]]"), roleLibrary);
267 AddCredit(wxT("[[https://xiph.org/vorbis/|Ogg Vorbis]]"), roleLibrary);
268 AddCredit(wxT("[[http://www.portaudio.com/|PortAudio]]"), roleLibrary);
269 AddCredit(wxT("[[http://www.portmedia.sourceforge.net/portmidi/|PortMidi]]"), roleLibrary);
270 AddCredit(wxT("[[https://sourceforge.net/p/portmedia/wiki/portsmf/|portsmf]]"), roleLibrary);
271 AddCredit(wxT("[[http://sbsms.sourceforge.net/|sbsms]]"), roleLibrary);
272 AddCredit(wxT("[[https://www.surina.net/soundtouch/|SoundTouch]]"), roleLibrary);
273 AddCredit(wxT("[[http://www.twolame.org/|TwoLAME]]"), roleLibrary);
274 AddCredit(wxT("[[http://www.vamp-plugins.org/|Vamp]]"), roleLibrary);
275 AddCredit(wxT("[[https://wxwidgets.org/|wxWidgets]]"), roleLibrary);
276
277 // Thanks
278
279 AddCredit(wxT("Dave Beydler"), roleThanks);
280 AddCredit(wxT("Brian Cameron"), roleThanks);
281 AddCredit(wxT("Jason Cohen"), roleThanks);
282 AddCredit(wxT("Dave Fancella"), roleThanks);
283 AddCredit(wxT("Steve Harris"), roleThanks);
284 AddCredit(wxT("Daniel James"), roleThanks);
285 AddCredit(wxT("Daniil Kolpakov"), roleThanks);
286 AddCredit(wxT("Robert Leidle"), roleThanks);
287 AddCredit(wxT("Logan Lewis"), roleThanks);
288 AddCredit(wxT("David Luff"), roleThanks);
289 AddCredit(wxT("Jason Pepas"), roleThanks);
290 AddCredit(wxT("Jonathan Ryshpan"), roleThanks);
291 AddCredit(wxT("Michael Schwendt"), roleThanks);
292 AddCredit(wxT("Patrick Shirkey"), roleThanks);
293 AddCredit(wxT("Tuomas Suutari"), roleThanks);
294 AddCredit(wxT("Mark Tomlinson"), roleThanks);
295 AddCredit(wxT("David Topper"), roleThanks);
296 AddCredit(wxT("Rudy Trubitt"), roleThanks);
297 AddCredit(wxT("StreetIQ.com"), roleThanks);
298 AddCredit(wxT("UmixIt Technologies, LLC"), roleThanks);
299 AddCredit(wxT("Verilogix, Inc."), roleThanks);
300}
301
302// ----------------------------------------------------------------------------
303
304BEGIN_EVENT_TABLE(AboutDialog, wxDialogWrapper)
307
309
310namespace {
312}
313
315{
316 return sActiveInstance;
317}
318
319AboutDialog::AboutDialog(wxWindow * parent)
320 /* i18n-hint: information about the program */
321 : wxDialogWrapper(parent, -1, XO("About %s").Format( ProgramName ),
322 wxDefaultPosition, wxDefaultSize,
323 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
324{
325 wxASSERT(!sActiveInstance);
326 sActiveInstance = this;
327
328 SetName();
329 this->SetBackgroundColour(theTheme.Colour( clrAboutBoxBackground ));
330 //this->SetBackgroundColour(theTheme.Colour( clrMedium ));
331 icon = NULL;
332 ShuttleGui S( this, eIsCreating );
333 S.StartNotebook();
334 {
338 }
339 S.EndNotebook();
340
341 S.Id(wxID_OK)
342 .Prop(0)
343 .AddButton(XXO("OK"), wxALIGN_CENTER, true);
344
345 Layout();
346 Fit();
347 this->Centre();
348}
349
350#define ABOUT_DIALOG_WIDTH 506
351
353{
355
356
357 /* i18n-hint: The translation of "translator_credits" will appear
358 * in the credits in the About Audacity window. Use this to add
359 * your own name(s) to the credits.
360 *
361 * For example: "English translation by Dominic Mazzoni." */
362 auto translatorCreditsMsgid = XO("translator_credits");
363 auto translatorCredits = translatorCreditsMsgid.Translation();
364 if ( translatorCredits == translatorCreditsMsgid.MSGID().GET() )
365 // We're in an English locale
366 translatorCredits.clear();
367 else
368 translatorCredits += wxT("<br>");
369
370 wxStringOutputStream o;
371 wxTextOutputStream informationStr( o ); // string to build up list of information in
372 informationStr
373 << wxT("<center>")
374 << XO("<h3>")
375 << ProgramName
376 << wxT(" ")
377 << wxString(AUDACITY_VERSION_STRING)
378 << wxT("</center></h3>")
379 /* i18n-hint: The program's name substitutes for %s */
380 << XO("%s the free, open source, cross-platform software for recording and editing sounds.")
381 .Format(ProgramName)
382
383 << wxT("<h3>")
384 << XO("Credits")
385 << wxT("</h3>")
386
387 << wxT("<p><b>")
388 /* i18n-hint: The program's name substitutes for %s */
389 << XO("%s Team Members").Format( ProgramName )
390 << wxT("</b><br>")
392
393 << wxT("<p><b> ")
394 << XO("Emeritus:")
395 << wxT("</b><br>")
396 /* i18n-hint: The program's name substitutes for %s */
397 << XO("Distinguished %s Team members, not currently active")
398 .Format( ProgramName )
399 << wxT("<br><br>")
401
402 << wxT("<p><b>")
403 << XO("Contributors")
404 << wxT("</b><br>")
406
407 << wxT("<p><b>")
408 << XO("Website and Graphics")
409 << wxT("</b><br>")
411 ;
412
413 if(!translatorCredits.empty()) informationStr
414 << wxT("<p><b>")
415 << XO("Translators")
416 << wxT("</b><br>")
417 << translatorCredits
418 ;
419
420 informationStr
421 << wxT("<p><b>")
422 << XO("Libraries")
423 << wxT("</b><br>")
424 /* i18n-hint: The program's name substitutes for %s */
425 << XO("%s includes code from the following projects:").Format( ProgramName )
426 << wxT("<br><br>")
428
429 << wxT("<p><b>")
430 << XO("Special thanks:")
431 << wxT("</b><br>")
433
434 << wxT("<p><br>")
435 /* i18n-hint: The program's name substitutes for %s */
436 << XO("%s website: ").Format( ProgramName )
437 << wxT("[[https://www.audacityteam.org/|https://www.audacityteam.org/]]")
438
439 << wxT("<p><br>&nbsp; &nbsp; ")
440 /* i18n-hint Audacity's name substitutes for first and third %s,
441 and a "copyright" symbol for the second */
442 << XO("%s software is copyright %s 1999-2024 %s Team.")
443 .Format(
444 Verbatim("<b>%s<sup>&reg;</sup></b>").Format( ProgramName ),
445 wxT("&copy;"),
447 << wxT("<br>")
448
449 << wxT("&nbsp; &nbsp; ")
450 /* i18n-hint Audacity's name substitutes for %s */
451 << XO("The name %s is a registered trademark.")
452 .Format( Verbatim("<b>%s</b>").Format( ProgramName ) )
453 << wxT("<br><br>")
454 << wxT("</center>")
455 ;
456
457 auto pPage = S.StartNotebookPage( ProgramName );
458 S.StartVerticalLay(1);
459 {
460 //v For now, change to AudacityLogoWithName via old-fashioned way, not Theme.
461 wxBitmap logo(AudacityLogoWithName_xpm); //v
462
463 //Setup to scale the logo larger and smaller as necessary
464 const float fScale = 1.0f;
465 wxImage RescaledImage(logo.ConvertToImage());
466 wxColour MainColour(
467 RescaledImage.GetRed(1,1),
468 RescaledImage.GetGreen(1,1),
469 RescaledImage.GetBlue(1,1));
470 pPage->SetBackgroundColour(MainColour);
471 // wxIMAGE_QUALITY_HIGH not supported by wxWidgets 2.6.1, or we would use it here.
472 RescaledImage.Rescale((int)(LOGOWITHNAME_WIDTH * fScale), (int)(LOGOWITHNAME_HEIGHT *fScale));
473 wxBitmap RescaledBitmap(RescaledImage);
474
475 icon =
476 safenew wxStaticBitmap(S.GetParent(), -1,
477 //*logo, //v
478 //v theTheme.Bitmap(bmpAudacityLogo), wxPoint(93, 10), wxSize(215, 190));
479 //v theTheme.Bitmap(bmpAudacityLogoWithName),
480 RescaledBitmap,
481 wxDefaultPosition,
482 wxSize((int)(LOGOWITHNAME_WIDTH*fScale), (int)(LOGOWITHNAME_HEIGHT*fScale)));
483 }
484 S.Prop(0).AddWindow( icon );
485
486 HtmlWindow *html = safenew LinkingHtmlWindow(S.GetParent(), -1,
487 wxDefaultPosition,
488 wxSize(ABOUT_DIALOG_WIDTH, 359),
489 wxHW_SCROLLBAR_AUTO);
490 html->SetPage( FormatHtmlText( o.GetString() ) );
491
492 /* locate the html renderer where it fits in the dialogue */
493 S.Prop(1).Position( wxEXPAND ).Focus()
494 .AddWindow( html );
495
496 S.EndVerticalLay();
497 S.EndNotebookPage();
498}
499
500
507{
508 wxStringOutputStream o;
509 wxTextOutputStream informationStr( o ); // string to build up list of information in
510 S.StartNotebookPage( XO("Build Information") ); // start the tab
511 S.StartVerticalLay(2); // create the window
512 HtmlWindow *html = safenew LinkingHtmlWindow(S.GetParent(), -1, wxDefaultPosition,
513 wxSize(ABOUT_DIALOG_WIDTH, 264),
514 wxHW_SCROLLBAR_AUTO );
515 // create a html pane in it to put the content in.
516 auto enabled = XO("Enabled");
517 auto disabled = XO("Disabled");
518 wxString blank;
519
520 /* this builds up the list of information to go in the window in the string
521 * informationStr */
522
523 informationStr
524 << wxT("<h3>")
525 /* i18n-hint: Information about when audacity was compiled follows */
526 << XO("The Build")
527 << wxT("</h3>\n<table>"); // start build info table
528
529 // Current date
530 AddBuildinfoRow(&informationStr, XO("Program build date:"), __TDATE__);
531 AddBuildinfoRow(&informationStr, XO("Commit Id:"), REV_IDENT );
532
533 auto buildType =
534#ifdef _DEBUG
535 XO("Debug build (debug level %d)").Format(wxDEBUG_LEVEL);
536#else
537 XO("Release build (debug level %d)").Format(wxDEBUG_LEVEL);
538#endif
539 ;
540 if( (sizeof(void*) == 8) ) {
541 buildType = XO("%s, 64 bits").Format( buildType );
542 } else {
543 buildType = XO("%s, 32 bits").Format( buildType );
544 }
545// Remove this once the transition to CMake is complete
546#if defined(CMAKE)
547 buildType = Verbatim("CMake %s").Format( buildType );
548#endif
549
550 AddBuildinfoRow(&informationStr, XO("Build type:"), buildType.Translation());
551
552#ifdef _MSC_FULL_VER
553 AddBuildinfoRow(&informationStr, XO("Compiler:"),
554 wxString::Format(wxT("MSVC %02d.%02d.%05d.%02d"), _MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 100000, _MSC_BUILD));
555#endif
556
557#ifdef __GNUC_PATCHLEVEL__
558#ifdef __MINGW32__
559 AddBuildinfoRow(&informationStr, XO("Compiler:"), wxT("MinGW ") wxMAKE_VERSION_DOT_STRING_T(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__));
560#else
561 AddBuildinfoRow(&informationStr, XO("Compiler:"), wxT("GCC ") wxMAKE_VERSION_DOT_STRING_T(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__));
562#endif
563#endif
564
565#ifdef __clang_version__
566 AddBuildinfoRow(&informationStr, XO("Compiler:"), wxT("clang ") __clang_version__);
567#endif
568
569 // Install prefix
570#ifdef __WXGTK__
571 /* i18n-hint: The directory audacity is installed into (on *nix systems) */
572 AddBuildinfoRow(&informationStr, XO("Installation Prefix:"), \
573 wxT(INSTALL_PREFIX));
574#endif
575
576 // Location of cache
577 AddBuildinfoRow(&informationStr, XO("Cache folder:"), \
579 // Location of settings
580 AddBuildinfoRow(&informationStr, XO("Settings folder:"), \
582 // Location of data
583 AddBuildinfoRow(&informationStr, XO("Data folder:"), \
585 // Location of data
586 AddBuildinfoRow(&informationStr, XO("State folder:"), \
588
589 informationStr << wxT("</table>\n"); // end of build info table
590
591
592 informationStr
593 << wxT("<h3>")
594 /* i18n-hint: Libraries that are essential to audacity */
595 << XO("Core Libraries")
596 << wxT("</h3>\n<table>"); // start table of core libraries
597
598 AddBuildinfoRow(&informationStr, wxT("wxWidgets"),
599 XO("Cross-platform GUI library"), Verbatim(wxVERSION_NUM_DOT_STRING_T));
600
601 AddBuildinfoRow(&informationStr, wxT("PortAudio"),
602 XO("Audio playback and recording"), Verbatim(wxT("v19")));
603
604 AddBuildinfoRow(&informationStr, wxT("libsoxr"),
605 XO("Sample rate conversion"), enabled);
606
607 informationStr << wxT("</table>\n"); // end table of core libraries
608
609 informationStr
610 << wxT("<h3>")
611 << XO("File Format Support")
612 << wxT("</h3>\n<p>");
613
614 informationStr
615 << wxT("<table>"); // start table of file formats supported
616
617 #if defined(USE_LIBMPG123)
618 AddBuildinfoRow(&informationStr, wxT("libmpg123"), XO("MP3 Import"), enabled);
619 #else
620 AddBuildinfoRow(&informationStr, wxT("libmpg123"), XO("MP3 Import"), disabled);
621 #endif
622
623 #if USE_LIBMP3LAME
625 &informationStr, wxT("libmp3lame"),
626 /* i18n-hint: LAME is the codec name. This name should not be translated
627 */
628 XO("MP3 Export"), enabled);
629 #else
631 &informationStr, wxT("libopus"),
632 /* i18n-hint: Opus is the codec name. This name should not be translated
633 */
634 XO("Opus Import and Export"), disabled);
635 #endif
636
637 #ifdef USE_LIBVORBIS
638 AddBuildinfoRow(&informationStr, wxT("libvorbis"),
639 /* i18n-hint: Ogg is the container format. Vorbis is the compression codec.
640 * Both are proper nouns and shouldn't be translated */
641 XO("Ogg Vorbis Import and Export"), enabled);
642 #else
643 AddBuildinfoRow(&informationStr, wxT("libvorbis"),
644 XO("Ogg Vorbis Import and Export"), disabled);
645 #endif
646
647 #if USE_LIBVORBIS && USE_LIBOPUS && USE_OPUSFILE
649 &informationStr, wxT("libopus"),
650 /* i18n-hint: Opus is the codec name. This name should not be translated */
651 XO("Opus Import and Export"), enabled);
652 #else
654 &informationStr, wxT("libopus"),
655 /* i18n-hint: Opus is the codec name. This name should not be translated
656 */
657 XO("Opus Import and Export"), disabled);
658 #endif
659
660 #ifdef USE_LIBID3TAG
661 AddBuildinfoRow(&informationStr, wxT("libid3tag"), XO("ID3 tag support"),
662 enabled);
663 #else
664 AddBuildinfoRow(&informationStr, wxT("libid3tag"), XO("ID3 tag support"),
665 disabled);
666 #endif
667
668 # if USE_LIBFLAC
669 /* i18n-hint: FLAC stands for Free Lossless Audio Codec, but is effectively
670 * a proper noun and so shouldn't be translated */
671 AddBuildinfoRow(&informationStr, wxT("libflac"), XO("FLAC import and export"),
672 enabled);
673 # else
674 AddBuildinfoRow(&informationStr, wxT("libflac"), XO("FLAC import and export"),
675 disabled);
676 # endif
677
678 # if USE_LIBTWOLAME
679 AddBuildinfoRow(&informationStr, wxT("libtwolame"), XO("MP2 export"),
680 enabled);
681 # else
682 AddBuildinfoRow(&informationStr, wxT("libtwolame"), XO("MP2 export"),
683 disabled);
684 # endif
685
686 #ifdef USE_FFMPEG
687 AddBuildinfoRow(&informationStr, wxT("ffmpeg"), XO("FFmpeg Import/Export"), enabled);
688 #else
689 AddBuildinfoRow(&informationStr, wxT("ffmpeg"), XO("FFmpeg Import/Export"), disabled);
690 #endif
691
692 informationStr << wxT("</table>\n"); //end table of file formats supported
693
694 informationStr
695 << wxT("<h3>")
696 << XO("Features")
697 << wxT("</h3>\n<table>"); // start table of features
698
699 # if USE_NYQUIST
700 AddBuildinfoRow(&informationStr, wxT("Nyquist"), XO("Plug-in support"),
701 enabled);
702 # else
703 AddBuildinfoRow(&informationStr, wxT("Nyquist"), XO("Plug-in support"),
704 disabled);
705 # endif
706
707 # if USE_LADSPA
708 AddBuildinfoRow(&informationStr, wxT("LADSPA"), XO("Plug-in support"),
709 enabled);
710 # else
711 AddBuildinfoRow(&informationStr, wxT("LADSPA"), XO("Plug-in support"),
712 disabled);
713 # endif
714
715 # if USE_VAMP
716 AddBuildinfoRow(&informationStr, wxT("Vamp"), XO("Plug-in support"),
717 enabled);
718 # else
719 AddBuildinfoRow(&informationStr, wxT("Vamp"), XO("Plug-in support"),
720 disabled);
721 # endif
722
723 # if USE_AUDIO_UNITS
724 AddBuildinfoRow(&informationStr, wxT("Audio Units"), XO("Plug-in support"),
725 enabled);
726 # else
727 AddBuildinfoRow(&informationStr, wxT("Audio Units"), XO("Plug-in support"),
728 disabled);
729 # endif
730
731 # if USE_VST
732 AddBuildinfoRow(&informationStr, wxT("VST"), XO("Plug-in support"),
733 enabled);
734 # else
735 AddBuildinfoRow(&informationStr, wxT("VST"), XO("Plug-in support"),
736 disabled);
737 # endif
738
739 # if USE_LV2
740 AddBuildinfoRow(&informationStr, wxT("LV2"), XO("Plug-in support"),
741 enabled);
742 # else
743 AddBuildinfoRow(&informationStr, wxT("LV2"), XO("Plug-in support"),
744 disabled);
745 # endif
746
747 # if USE_PORTMIXER
748 AddBuildinfoRow(&informationStr, wxT("PortMixer"), XO("Sound card mixer support"),
749 enabled);
750 # else
751 AddBuildinfoRow(&informationStr, wxT("PortMixer"), XO("Sound card mixer support"),
752 disabled);
753 # endif
754
755 # if USE_SOUNDTOUCH
756 AddBuildinfoRow(&informationStr, wxT("SoundTouch"), XO("Pitch and Tempo Change support"),
757 enabled);
758 # else
759 AddBuildinfoRow(&informationStr, wxT("SoundTouch"), XO("Pitch and Tempo Change support"),
760 disabled);
761 # endif
762
763 # if USE_SBSMS
764 AddBuildinfoRow(&informationStr, wxT("SBSMS"), XO("Extreme Pitch and Tempo Change support"),
765 enabled);
766 # else
767 AddBuildinfoRow(&informationStr, wxT("SBSMS"), XO("Extreme Pitch and Tempo Change support"),
768 disabled);
769 # endif
770
771 informationStr << wxT("</table>\n"); // end of table of features
772
773 html->SetPage( FormatHtmlText( o.GetString() ) ); // push the page into the html renderer
774 S.Prop(2)
775 .Position( wxEXPAND )
776 .AddWindow( html ); // make it fill the page
777 // I think the 2 here goes with the StartVerticalLay() call above?
778 S.EndVerticalLay(); // end window
779 S.EndNotebookPage(); // end the tab
780}
781
782
783const wxString GPL_TEXT();
784
786{
787#if defined(HAS_PRIVACY_POLICY)
788 S.StartNotebookPage(XC("Legal", "about dialog"));
789#else
790 S.StartNotebookPage(XO("GPL License"));
791#endif
792
793#if defined(HAS_PRIVACY_POLICY)
794 S.Prop(0).StartPanel();
795 {
796 S.AddSpace(0, 8);
797 /* i18n-hint: For "About Audacity...": Title for Privacy Policy section */
798 S.AddVariableText(XC("PRIVACY POLICY", "about dialog"), true);
799
800 S.AddFixedText(
801 XO("App update checking and error reporting require network access. "
802 "These features are optional."));
803
804 /* i18n-hint: %s will be replaced with "our Privacy Policy" */
805 AccessibleLinksFormatter privacyPolicy(XO("See %s for more info."));
806
807 privacyPolicy.FormatLink(
808 /* i18n-hint: Title of hyperlink to the privacy policy. This is an object of "See". */
809 wxT("%s"), XO("our Privacy Policy"),
810 "https://www.audacityteam.org/about/desktop-privacy-notice/");
811
812 privacyPolicy.Populate(S);
813 }
814 S.EndPanel();
815
816 S.AddSpace(0, 8);
817#endif
818
819 S.Prop(1).StartPanel();
820 {
822 S.GetParent(), -1, wxDefaultPosition, wxSize(ABOUT_DIALOG_WIDTH, 264),
823 wxHW_SCROLLBAR_AUTO );
824
825 html->SetPage(FormatHtmlText(GPL_TEXT()));
826
827 S.Prop(1).Position(wxEXPAND).AddWindow( html );
828 }
829 S.EndPanel();
830
831 S.EndNotebookPage();
832}
833
834void AboutDialog::AddCredit( const wxString &name, Role role )
835{
836 AddCredit( name, {}, role );
837}
838
840 const wxString &name, TranslatableString format, Role role )
841{
842 auto str = format.empty()
843 ? Verbatim( name )
844 : TranslatableString{ format }.Format( name );
845 creditItems.emplace_back(std::move(str), role);
846}
847
849{
850 wxString s;
851
852 for (const auto &item : creditItems)
853 {
854 if (item.role == role)
855 {
856 s += item.description.Translation();
857 s += wxT("<br>");
858 }
859 }
860
861 // Strip last <br>, if any
862 if (s.Right(4) == wxT("<br>"))
863 s = s.Left(s.length() - 4);
864
865 return s;
866}
867
873 wxTextOutputStream *str, const wxChar * libname,
874 const TranslatableString &libdesc, const TranslatableString &status)
875{
876 *str
877 << wxT("<tr><td>")
878 << libname
879 << wxT("</td><td>(")
880 << libdesc
881 << wxT(")</td><td>")
882 << status
883 << wxT("</td></tr>");
884}
885
891 wxTextOutputStream *str,
892 const TranslatableString &description, const wxChar *spec)
893{
894 *str
895 << wxT("<tr><td>")
896 << description
897 << wxT("</td><td>")
898 << spec
899 << wxT("</td></tr>");
900}
901
903{
904 sActiveInstance = {};
905}
906
907void AboutDialog::OnOK(wxCommandEvent & WXUNUSED(event))
908{
909#ifdef __WXMAC__
910 Destroy();
911#else
912 EndModal(wxID_OK);
913#endif
914}
#define REV_IDENT
Definition: AboutDialog.cpp:67
static const auto ProgramName
Definition: AboutDialog.cpp:75
#define ABOUT_DIALOG_WIDTH
const wxString GPL_TEXT()
wxImage(22, 22)
wxT("CloseDown"))
#define LOGOWITHNAME_WIDTH
#define LOGOWITHNAME_HEIGHT
IMPLEMENT_CLASS(AudioSetupToolBar, ToolBar)
END_EVENT_TABLE()
#define str(a)
EVT_BUTTON(wxID_NO, DependencyDialog::OnNo) EVT_BUTTON(wxID_YES
const TranslatableString name
Definition: Distortion.cpp:76
XO("Cut/Copy/Paste")
XXO("&Cut/Copy/Paste Toolbar")
wxString FormatHtmlText(const wxString &Text)
Definition: HelpText.cpp:258
#define XC(s, c)
Definition: Internat.h:37
#define safenew
Definition: MemoryX.h:10
@ eIsCreating
Definition: ShuttleGui.h:37
THEME_API Theme theTheme
Definition: Theme.cpp:82
#define S(N)
Definition: ToChars.cpp:64
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
The AboutDialog shows the program version and developer credits.
Definition: AboutDialog.h:32
virtual ~AboutDialog()
@ roleEmeritusTeam
Definition: AboutDialog.h:50
void OnOK(wxCommandEvent &event)
void AddCredit(const wxString &name, Role role)
wxStaticBitmap * icon
Definition: AboutDialog.h:43
wxString GetCreditsByRole(AboutDialog::Role role)
AboutDialogCreditItemsList creditItems
Definition: AboutDialog.h:58
void AddBuildinfoRow(wxTextOutputStream *str, const wxChar *libname, const TranslatableString &libdesc, const TranslatableString &status)
Add a table row saying if a library is used or not.
void PopulateInformationPage(ShuttleGui &S)
: Fills out the "Information" tab of the preferences dialogue
AboutDialog(wxWindow *parent)
void CreateCreditsList()
Definition: AboutDialog.cpp:79
static AboutDialog * ActiveIntance()
void PopulateLicensePage(ShuttleGui &S)
void PopulateAudacityPage(ShuttleGui &S)
Abstract base class used in importing a file.
HtmlWindow Class.
Definition: HtmlWindow.h:37
An HtmlWindow that handles linked clicked - usually the link will go to our own local copy of the man...
Definition: HelpSystem.h:126
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:640
wxColour & Colour(int iIndex)
Holds a msgid for the translation catalog; may also bind format arguments.
TranslatableString & Format(Args &&...args) &
Capture variadic format arguments (by copy) when there is no plural.
FILES_API FilePath ConfigDir()
Audacity user config directory.
FILES_API FilePath StateDir()
Audacity user state directory.
FILES_API FilePath CacheDir()
Audacity user cache directory.
FILES_API FilePath DataDir()
Audacity user data directory.