Audacity 3.2.0
Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
PrefsDialog Class Referenceabstract

Dialog that shows the current PrefsPanel in a tabbed divider. More...

#include <PrefsDialog.h>

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

Public Member Functions

 PrefsDialog (wxWindow *parent, AudacityProject *pProject, const TranslatableString &titlePrefix=XO("Preferences:"), PrefsPanel::Factories &factories=PrefsPanel::DefaultFactories())
 
virtual ~PrefsDialog ()
 
int ShowModal () override
 
void ShuttleAll (ShuttleGui &S)
 
void OnCategoryChange (wxCommandEvent &e)
 
void OnOK (wxCommandEvent &e)
 
void OnCancel (wxCommandEvent &e)
 
void OnPreview (wxCommandEvent &e)
 
void OnHelp (wxCommandEvent &e)
 
void OnTreeKeyDown (wxTreeEvent &e)
 
void SelectPageByName (const wxString &pageName)
 
int GetSelectedPage () const
 
- 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
 

Protected Member Functions

virtual long GetPreferredPage ()=0
 
virtual void SavePreferredPage ()=0
 

Private Member Functions

void RecordExpansionState ()
 
PrefsPanelGetCurrentPanel ()
 

Private Attributes

wxTreebookmCategories {}
 
PrefsPanelmUniquePage {}
 
PrefsPanel::FactoriesmFactories
 
const TranslatableString mTitlePrefix
 
std::unique_ptr< SettingTransactionmTransaction
 

Detailed Description

Dialog that shows the current PrefsPanel in a tabbed divider.

Definition at line 28 of file PrefsDialog.h.

Constructor & Destructor Documentation

◆ PrefsDialog()

PrefsDialog::PrefsDialog ( wxWindow *  parent,
AudacityProject pProject,
const TranslatableString titlePrefix = XO("Preferences:"),
PrefsPanel::Factories factories = PrefsPanel::DefaultFactories() 
)

Definition at line 441 of file PrefsDialog.cpp.

445: wxDialogWrapper(parent, wxID_ANY, XO("Audacity Preferences"),
446 wxDefaultPosition,
447 wxDefaultSize,
448 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
449, mFactories(factories)
450, mTitlePrefix(titlePrefix)
451{
452 wxASSERT(factories.size() > 0);
453 const bool uniquePage = (factories.size() == 1);
454 SetLayoutDirection(wxLayout_LeftToRight);
455
456 ShuttleGui S(this, eIsCreating);
457
458 S.StartVerticalLay(true);
459 {
460 wxASSERT(factories.size() > 0);
461 if (!uniquePage) {
462 mCategories = safenew wxTreebookExt(S.GetParent(), wxID_ANY, mTitlePrefix);
463#if wxUSE_ACCESSIBILITY
464 // so that name can be set on a standard control
465 mCategories->GetTreeCtrl()->SetAccessible(
466 safenew TreeCtrlAx(mCategories->GetTreeCtrl()));
467#endif
468 // RJH: Prevent NVDA from reading "treeCtrl"
469 mCategories->GetTreeCtrl()->SetName(_("Category"));
470 S.StartHorizontalLay(wxALIGN_LEFT | wxEXPAND, true);
471 {
472 S.Prop(1)
473 .Position(wxEXPAND)
474 .AddWindow(mCategories);
475
476 {
477 typedef std::pair<int, int> IntPair;
478 std::vector<IntPair> stack;
479 int iPage = 0;
480 for (auto it = factories.begin(), end = factories.end();
481 it != end; ++it, ++iPage)
482 {
483 const auto &node = *it;
484 const auto &factory = node.factory;
485 wxWindow *const w = factory(mCategories, wxID_ANY, pProject);
486 node.enabled = (w != nullptr);
487 if (stack.empty()) {
488 // Parameters are: AddPage(page, name, IsSelected, imageId).
489 if (w)
490 mCategories->AddPage(w, w->GetName(), false, 0);
491 }
492 else {
493 IntPair &top = *stack.rbegin();
494 if (w)
495 mCategories->InsertSubPage(top.first,
496 w, w->GetName(), false, 0);
497 if (--top.second == 0) {
498 // Expand all nodes before the layout calculation
499 mCategories->ExpandNode(top.first, true);
500 stack.pop_back();
501 }
502 }
503 if (node.nChildren > 0)
504 stack.push_back(IntPair(iPage, node.nChildren));
505 }
506 }
507 }
508 S.EndHorizontalLay();
509 }
510 else {
511 // TODO: Look into getting rid of mUniquePage and instead
512 // adding into mCategories, so there is just one page in mCategories.
513 // And then hiding the treebook.
514
515 // Unique page, don't show the factory
516 const auto &node = factories[0];
517 const auto &factory = node.factory;
518 mUniquePage = factory(S.GetParent(), wxID_ANY, pProject);
519 node.enabled = (mUniquePage != nullptr);
520 if (mUniquePage) {
521 wxWindow * uniquePageWindow = S.Prop(1)
522 .Position(wxEXPAND)
523 .AddWindow(mUniquePage);
524 // We're not in the wxTreebook, so add the accelerator here
525 wxAcceleratorEntry entries[1];
526#if defined(__WXMAC__)
527 // Is there a standard shortcut on Mac?
528#else
529 entries[0].Set(wxACCEL_NORMAL, (int) WXK_F1, wxID_HELP);
530#endif
531 wxAcceleratorTable accel(1, entries);
532 uniquePageWindow->SetAcceleratorTable(accel);
533 }
534 }
535 }
536 S.EndVerticalLay();
537
538 S.AddStandardButtons(eOkButton | eCancelButton | ePreviewButton | eHelpButton);
539
541 wxWindow *const previewButton =
542 wxWindow::FindWindowById(wxID_PREVIEW, GetParent());
543 previewButton->Show(false);
544 }
545
546#if defined(__WXGTK__)
547 if (mCategories)
548 mCategories->GetTreeCtrl()->EnsureVisible(mCategories->GetTreeCtrl()->GetRootItem());
549#endif
550
551// mCategories->SetMaxSize({ 790, 600 }); // 790 = 800 - (border * 2)
552 Layout();
553 Fit();
554 wxSize sz = GetSize();
555
556 // Collapse nodes only after layout so the tree is wide enough
557 if (mCategories)
558 {
559 int iPage = 0;
560 for (auto it = factories.begin(), end = factories.end();
561 it != end; ++it) {
562 if (it->enabled)
563 mCategories->ExpandNode(iPage++, it->expanded);
564 }
565 }
566
567 // This ASSERT was originally used to limit us to 800 x 600.
568 // However, the range of screen sizes and dpi of modern (2018) displays
569 // makes pixel dimensions an inadequate measure of usability, so
570 // now we only ASSERT that preferences will fit in the client display
571 // rectangle of the developer / tester's monitor.
572 // Use scrollers when necessary to ensure that preference pages will
573 // be fully visible.
574 wxRect screenRect(wxGetClientDisplayRect());
575 wxASSERT_MSG(sz.x <= screenRect.width && sz.y <= screenRect.height, wxT("Preferences dialog exceeds max size"));
576
577 sz.DecTo(screenRect.GetSize());
578
579 if( !mUniquePage ){
580 int prefWidth, prefHeight;
581 gPrefs->Read(wxT("/Prefs/Width"), &prefWidth, sz.x);
582 gPrefs->Read(wxT("/Prefs/Height"), &prefHeight, wxMax(480,sz.y));
583
584 wxSize prefSize = wxSize(prefWidth, prefHeight);
585 prefSize.DecTo(screenRect.GetSize());
586 SetSize(prefSize);
587 InvalidateBestSize();
588 Layout();
589 }
590 SetMinSize(sz);
591
592 // Center after all that resizing, but make sure it doesn't end up
593 // off-screen
594 CentreOnParent();
595
596 mTransaction = std::make_unique< SettingTransaction >();
597}
wxT("CloseDown"))
static RegisteredToolbarFactory factory
XO("Cut/Copy/Paste")
static ProjectFileIORegistry::AttributeReaderEntries entries
#define _(s)
Definition: Internat.h:73
#define safenew
Definition: MemoryX.h:10
audacity::BasicSettings * gPrefs
Definition: Prefs.cpp:68
@ eIsCreating
Definition: ShuttleGui.h:37
@ eOkButton
Definition: ShuttleGui.h:609
@ eCancelButton
Definition: ShuttleGui.h:610
@ eHelpButton
Definition: ShuttleGui.h:613
@ ePreviewButton
Definition: ShuttleGui.h:614
#define S(N)
Definition: ToChars.cpp:64
const TranslatableString mTitlePrefix
Definition: PrefsDialog.h:68
wxTreebook * mCategories
Definition: PrefsDialog.h:65
std::unique_ptr< SettingTransaction > mTransaction
Definition: PrefsDialog.h:70
PrefsPanel * mUniquePage
Definition: PrefsDialog.h:66
PrefsPanel::Factories & mFactories
Definition: PrefsDialog.h:67
virtual bool ShowsPreviewButton()
Definition: PrefsPanel.cpp:55
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:640
virtual bool Read(const wxString &key, bool *value) const =0
const char * end(const char *str) noexcept
Definition: StringUtils.h:106

References _, eCancelButton, eHelpButton, eIsCreating, details::end(), entries, eOkButton, ePreviewButton, factory, gPrefs, mCategories, mTitlePrefix, mTransaction, mUniquePage, audacity::BasicSettings::Read(), S, safenew, PrefsPanel::ShowsPreviewButton(), and wxT().

Referenced by anonymous_namespace{SpectrumView.cpp}::SpectrogramSettingsHandler::OnSpectrogramSettings().

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

◆ ~PrefsDialog()

PrefsDialog::~PrefsDialog ( )
virtual

Definition at line 599 of file PrefsDialog.cpp.

600{
601}

Member Function Documentation

◆ GetCurrentPanel()

PrefsPanel * PrefsDialog::GetCurrentPanel ( )
private

Definition at line 649 of file PrefsDialog.cpp.

650{
651 if( mCategories)
652 return static_cast<PrefsPanel*>(mCategories->GetCurrentPage());
653 else
654 return mUniquePage;
655}
Base class for a panel in the PrefsDialog. Classes derived from this class include BatchPrefs,...
Definition: PrefsPanel.h:51

References mCategories, and mUniquePage.

Referenced by OnHelp(), and OnPreview().

Here is the caller graph for this function:

◆ GetPreferredPage()

virtual long PrefsDialog::GetPreferredPage ( )
protectedpure virtual

Implemented in GlobalPrefsDialog, and anonymous_namespace{AudioSetupToolBar.cpp}::ViewDeviceSettingsDialog.

Referenced by anonymous_namespace{SpectrumView.cpp}::SpectrogramSettingsHandler::OnSpectrogramSettings(), and ShowModal().

Here is the caller graph for this function:

◆ GetSelectedPage()

int PrefsDialog::GetSelectedPage ( ) const

Definition at line 809 of file PrefsDialog.cpp.

810{
811 if (mCategories)
812 return mCategories->GetSelection();
813 else
814 return 0;
815}

References mCategories.

Referenced by GlobalPrefsDialog::SavePreferredPage().

Here is the caller graph for this function:

◆ OnCancel()

void PrefsDialog::OnCancel ( wxCommandEvent &  e)

Definition at line 626 of file PrefsDialog.cpp.

627{
629
630 if (mCategories) {
631 for (size_t i = 0; i < mCategories->GetPageCount(); i++) {
632 ((PrefsPanel *)mCategories->GetPage(i))->Cancel();
633 }
634 }
635 else if (mUniquePage)
637
638 // Remember modified dialog size, even if cancelling.
639 if( !mUniquePage ){
640 wxSize sz = GetSize();
641 gPrefs->Write(wxT("/Prefs/Width"), sz.x);
642 gPrefs->Write(wxT("/Prefs/Height"), sz.y);
643 }
644 gPrefs->Flush();
645
646 EndModal(false);
647}
@ Cancel
Open was cancelled by the extension.
void RecordExpansionState()
virtual void Cancel()
Definition: PrefsPanel.cpp:51
virtual bool Flush() noexcept=0
virtual bool Write(const wxString &key, bool value)=0

References PrefsPanel::Cancel(), Cancel, audacity::BasicSettings::Flush(), gPrefs, mCategories, mUniquePage, RecordExpansionState(), audacity::BasicSettings::Write(), and wxT().

Here is the call graph for this function:

◆ OnCategoryChange()

void PrefsDialog::OnCategoryChange ( wxCommandEvent &  e)

◆ OnHelp()

void PrefsDialog::OnHelp ( wxCommandEvent &  e)

Definition at line 663 of file PrefsDialog.cpp.

664{
665 if (const auto pPanel = GetCurrentPanel()) {
666 const auto &page = pPanel->HelpPageName();
667 HelpSystem::ShowHelp(this, page, true);
668 }
669}
static void ShowHelp(wxWindow *parent, const FilePath &localFileName, const URLString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
Definition: HelpSystem.cpp:231
PrefsPanel * GetCurrentPanel()

References GetCurrentPanel(), and HelpSystem::ShowHelp().

Here is the call graph for this function:

◆ OnOK()

void PrefsDialog::OnOK ( wxCommandEvent &  e)

Definition at line 697 of file PrefsDialog.cpp.

698{
700
701 // Validate all pages first
702 if (mCategories) {
703 for (size_t i = 0; i < mCategories->GetPageCount(); i++) {
704 PrefsPanel *panel = (PrefsPanel *)mCategories->GetPage(i);
705
706 // The dialog doesn't end until all the input is valid
707 if (!panel->Validate()) {
708 mCategories->SetSelection(i);
709 return;
710 }
711 }
712 }
713 else if (mUniquePage) {
714 if (!mUniquePage->Validate())
715 return;
716 }
717
718 // flush now so toolbars will know their position.
719 gPrefs->Flush();
720 if (mCategories) {
721 // Now apply the changes
722 // Reverse order - so Track Name is updated before language change
723 // A workaround for Bug 1661
724 for (int i = (int)mCategories->GetPageCount()-1; i>= 0; i--) {
725 PrefsPanel *panel = (PrefsPanel *)mCategories->GetPage(i);
726
727 panel->Preview();
728 panel->Commit();
729 }
730 }
731 else if (mUniquePage) {
734 }
735
736 if( !mUniquePage ){
737 wxSize sz = GetSize();
738 gPrefs->Write(wxT("/Prefs/Width"), sz.x);
739 gPrefs->Write(wxT("/Prefs/Height"), sz.y);
740 }
741 gPrefs->Flush();
742
744
745#if USE_PORTMIXER
746 auto gAudioIO = AudioIOBase::Get();
747 if (gAudioIO) {
748 // We cannot have opened this dialog if gAudioIO->IsAudioTokenActive(),
749 // per the setting of AudioIONotBusyFlag and AudioIOBusyFlag in
750 // AudacityProject::GetUpdateFlags().
751 // However, we can have an invalid audio token (so IsAudioTokenActive()
752 // is false), but be monitoring.
753 // If monitoring, have to stop the stream, so HandleDeviceChange() can work.
754 // We could disable the Preferences command while monitoring, i.e.,
755 // set AudioIONotBusyFlag/AudioIOBusyFlag according to monitoring, as well.
756 // Instead allow it because unlike recording, for example, monitoring
757 // is not clearly something that should prohibit opening prefs.
758 // TODO: We *could* be smarter in this method and call HandleDeviceChange()
759 // only when the device choices actually changed. True of lots of prefs!
760 // As is, we always stop monitoring before handling the device change.
761 if (gAudioIO->IsMonitoring())
762 {
763 gAudioIO->StopStream();
764 while (gAudioIO->IsBusy()) {
765 using namespace std::chrono;
766 std::this_thread::sleep_for(100ms);
767 }
768 }
769 gAudioIO->HandleDeviceChange();
770 }
771#endif
772
773 // PRL: Is the following concern still valid, now that prefs update is
774 // handled instead by delayed event processing?
775
776 // LL: wxMac can't handle recreating the menus when this dialog is still active,
777 // so AudacityProject::UpdatePrefs() or any of the routines it calls must
778 // not cause MenuCreator::RebuildMenuBar() to be executed.
779
781
782 mTransaction->Commit();
783
784 if( IsModal() )
785 EndModal(true);
786 else
787 Destroy();
788}
static AudioIOBase * Get()
Definition: AudioIOBase.cpp:94
virtual void SavePreferredPage()=0
static void Broadcast(int id=0)
Call this static function to notify all PrefsListener objects.
Definition: Prefs.cpp:128
virtual bool Commit()=0
virtual void Preview()
Definition: PrefsPanel.h:105

References PrefsListener::Broadcast(), PrefsPanel::Commit(), audacity::BasicSettings::Flush(), AudioIOBase::Get(), gPrefs, mCategories, mTransaction, mUniquePage, PrefsPanel::Preview(), RecordExpansionState(), SavePreferredPage(), audacity::BasicSettings::Write(), and wxT().

Referenced by DoReloadPreferences(), and OnTreeKeyDown().

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

◆ OnPreview()

void PrefsDialog::OnPreview ( wxCommandEvent &  e)

Definition at line 657 of file PrefsDialog.cpp.

658{
659 if (const auto pPanel = GetCurrentPanel())
660 pPanel->Preview();
661}

References GetCurrentPanel().

Here is the call graph for this function:

◆ OnTreeKeyDown()

void PrefsDialog::OnTreeKeyDown ( wxTreeEvent &  e)

Definition at line 689 of file PrefsDialog.cpp.

690{
691 if(event.GetKeyCode() == WXK_RETURN)
692 OnOK(event);
693 else
694 event.Skip(); // Ensure standard behavior when enter is not pressed
695}
void OnOK(wxCommandEvent &e)

References OnOK().

Here is the call graph for this function:

◆ RecordExpansionState()

void PrefsDialog::RecordExpansionState ( )
private

Definition at line 840 of file PrefsDialog.cpp.

841{
842 // Remember expansion state of the tree control
843 if (mCategories)
844 {
845 int iPage = 0;
846 for (auto it = mFactories.begin(), end = mFactories.end();
847 it != end; ++it) {
848 if (it->enabled)
849 it->expanded = mCategories->IsNodeExpanded(iPage++);
850 }
851 }
852 else
853 mFactories[0].expanded = true;
854}

References details::end(), mCategories, and mFactories.

Referenced by OnCancel(), and OnOK().

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

◆ SavePreferredPage()

virtual void PrefsDialog::SavePreferredPage ( )
protectedpure virtual

Implemented in GlobalPrefsDialog, and anonymous_namespace{AudioSetupToolBar.cpp}::ViewDeviceSettingsDialog.

Referenced by OnOK(), anonymous_namespace{SpectrumView.cpp}::SpectrogramSettingsHandler::OnSpectrogramSettings(), and SelectPageByName().

Here is the caller graph for this function:

◆ SelectPageByName()

void PrefsDialog::SelectPageByName ( const wxString &  pageName)

Definition at line 790 of file PrefsDialog.cpp.

791{
792 if (mCategories) {
793 size_t n = mCategories->GetPageCount();
794
795 for (size_t i = 0; i < n; i++) {
796 if (mCategories->GetPageText(i) == pageName) {
797 mCategories->SetSelection(i);
798 // This covers the case, when ShowModal is called
799 // after selecting the page.
800 // ShowModal will select the page previously used by
801 // user
803 return;
804 }
805 }
806 }
807}

References mCategories, and SavePreferredPage().

Referenced by NoUpdatesAvailableDialog::NoUpdatesAvailableDialog(), UnwritableLocationErrorDialog::UnwritableLocationErrorDialog(), and UpdateNoticeDialog::UpdateNoticeDialog().

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

◆ ShowModal()

int PrefsDialog::ShowModal ( )
override

Definition at line 603 of file PrefsDialog.cpp.

604{
605 if (mCategories) {
606 /* long is signed, size_t is unsigned. On some platforms they are different
607 * lengths as well. So we must check that the stored category is both > 0
608 * and within the possible range of categories, making the first check on the
609 * _signed_ value to avoid issues when converting an unsigned one.
610 */
611 long selected = GetPreferredPage();
612 if (selected < 0 || size_t(selected) >= mCategories->GetPageCount())
613 selected = 0; // clamp to available range of tabs
614 mCategories->SetSelection(selected);
615 }
616 else if (mUniquePage) {
617 auto Temp = mTitlePrefix;
618 Temp.Join( Verbatim( mUniquePage->GetLabel() ), wxT(" ") );
619 SetTitle(Temp);
620 SetName(Temp);
621 }
622
623 return wxDialogWrapper::ShowModal();
624}
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
virtual long GetPreferredPage()=0
TranslatableString & Join(TranslatableString arg, const wxString &separator={}) &
Append another translatable string.
void SetTitle(const TranslatableString &title)

References GetPreferredPage(), TranslatableString::Join(), mCategories, mTitlePrefix, mUniquePage, wxDialogWrapper::SetName(), wxDialogWrapper::SetTitle(), Verbatim(), and wxT().

Referenced by AudacityApp::InitPart2(), AudacityApp::InitTempDir(), NoUpdatesAvailableDialog::NoUpdatesAvailableDialog(), AudacityApp::OnMenuPreferences(), anonymous_namespace{EditMenus.cpp}::OnPreferences(), UnwritableLocationErrorDialog::UnwritableLocationErrorDialog(), and UpdateNoticeDialog::UpdateNoticeDialog().

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

◆ ShuttleAll()

void PrefsDialog::ShuttleAll ( ShuttleGui S)

Definition at line 671 of file PrefsDialog.cpp.

672{
673 // Validate all pages first
674 if (mCategories) {
675 for (size_t i = 0; i < mCategories->GetPageCount(); i++) {
676 S.ResetId();
677 PrefsPanel *panel = (PrefsPanel *)mCategories->GetPage(i);
678 panel->PopulateOrExchange( S );
679 }
680 }
681 else
682 {
683 S.ResetId();
684 if (mUniquePage)
686 }
687}
virtual void PopulateOrExchange(ShuttleGui &WXUNUSED(S))
Definition: PrefsPanel.h:120

References mCategories, mUniquePage, PrefsPanel::PopulateOrExchange(), and S.

Referenced by GetInfoCommand::SendPreferences().

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

Member Data Documentation

◆ mCategories

wxTreebook* PrefsDialog::mCategories {}
private

◆ mFactories

PrefsPanel::Factories& PrefsDialog::mFactories
private

Definition at line 67 of file PrefsDialog.h.

Referenced by RecordExpansionState().

◆ mTitlePrefix

const TranslatableString PrefsDialog::mTitlePrefix
private

Definition at line 68 of file PrefsDialog.h.

Referenced by PrefsDialog(), and ShowModal().

◆ mTransaction

std::unique_ptr< SettingTransaction > PrefsDialog::mTransaction
private

Definition at line 70 of file PrefsDialog.h.

Referenced by OnOK(), and PrefsDialog().

◆ mUniquePage

PrefsPanel* PrefsDialog::mUniquePage {}
private

Definition at line 66 of file PrefsDialog.h.

Referenced by GetCurrentPanel(), OnCancel(), OnOK(), PrefsDialog(), ShowModal(), and ShuttleAll().


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