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 443 of file PrefsDialog.cpp.

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

References _, eCancelButton, eHelpButton, eIsCreating, PackedArray::end(), entries, eOkButton, ePreviewButton, cloud::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 601 of file PrefsDialog.cpp.

602{
603}

Member Function Documentation

◆ GetCurrentPanel()

PrefsPanel * PrefsDialog::GetCurrentPanel ( )
private

Definition at line 651 of file PrefsDialog.cpp.

652{
653 if( mCategories)
654 return static_cast<PrefsPanel*>(mCategories->GetCurrentPage());
655 else
656 return mUniquePage;
657}
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 811 of file PrefsDialog.cpp.

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

References mCategories.

Referenced by GlobalPrefsDialog::SavePreferredPage().

Here is the caller graph for this function:

◆ OnCancel()

void PrefsDialog::OnCancel ( wxCommandEvent &  e)

Definition at line 628 of file PrefsDialog.cpp.

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

References PrefsPanel::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 665 of file PrefsDialog.cpp.

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

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

Here is the call graph for this function:

◆ OnOK()

void PrefsDialog::OnOK ( wxCommandEvent &  e)

Definition at line 699 of file PrefsDialog.cpp.

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

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

References GetCurrentPanel().

Here is the call graph for this function:

◆ OnTreeKeyDown()

void PrefsDialog::OnTreeKeyDown ( wxTreeEvent &  e)

Definition at line 691 of file PrefsDialog.cpp.

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

References OnOK().

Here is the call graph for this function:

◆ RecordExpansionState()

void PrefsDialog::RecordExpansionState ( )
private

Definition at line 842 of file PrefsDialog.cpp.

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

References PackedArray::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 792 of file PrefsDialog.cpp.

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

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 605 of file PrefsDialog.cpp.

606{
607 if (mCategories) {
608 /* long is signed, size_t is unsigned. On some platforms they are different
609 * lengths as well. So we must check that the stored category is both > 0
610 * and within the possible range of categories, making the first check on the
611 * _signed_ value to avoid issues when converting an unsigned one.
612 */
613 long selected = GetPreferredPage();
614 if (selected < 0 || size_t(selected) >= mCategories->GetPageCount())
615 selected = 0; // clamp to available range of tabs
616 mCategories->SetSelection(selected);
617 }
618 else if (mUniquePage) {
619 auto Temp = mTitlePrefix;
620 Temp.Join( Verbatim( mUniquePage->GetLabel() ), wxT(" ") );
621 SetTitle(Temp);
622 SetName(Temp);
623 }
624
625 return wxDialogWrapper::ShowModal();
626}
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 673 of file PrefsDialog.cpp.

674{
675 // Validate all pages first
676 if (mCategories) {
677 for (size_t i = 0; i < mCategories->GetPageCount(); i++) {
678 S.ResetId();
679 PrefsPanel *panel = (PrefsPanel *)mCategories->GetPage(i);
680 panel->PopulateOrExchange( S );
681 }
682 }
683 else
684 {
685 S.ResetId();
686 if (mUniquePage)
688 }
689}
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: