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