diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vgui_panel_zoo/WizardPanelDemo.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/vgui_panel_zoo/WizardPanelDemo.cpp')
| -rw-r--r-- | utils/vgui_panel_zoo/WizardPanelDemo.cpp | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/utils/vgui_panel_zoo/WizardPanelDemo.cpp b/utils/vgui_panel_zoo/WizardPanelDemo.cpp new file mode 100644 index 0000000..6455c43 --- /dev/null +++ b/utils/vgui_panel_zoo/WizardPanelDemo.cpp @@ -0,0 +1,348 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +#include "DemoPage.h" + +#include <VGUI/IVGui.h> +//#include <vgui_controls/Controls.h> + +#include <vgui_controls/WizardPanel.h> +#include <vgui_controls/WizardSubPanel.h> +#include <vgui_controls/PHandle.h> + +#include <vgui_controls/RadioButton.h> +#include <vgui_controls/TextEntry.h> +#include <vgui/ISurface.h> + +using namespace vgui; + +//----------------------------------------------------------------------------- +// This is a demo of a Wizard. +// A wizard is an interactive utility within an application that guides the user through +// each step of a task. +// +// Wizards typically display a sequence of steps, the user fills in information +// or makes selections and then clicks a "next" button to go to the next panel +// in the sequence. After all panels have been completed, the user clicks "finish" +// and the wizard exits. +// +// In VGUI, the Wizard class is the panel that holds the wizard navigation buttons +// to move to the previous or next panel, and the finish and cancel buttons to +// exit. It also creates the panels that display when the buttons are pressed, called +// WizardSubPanels. These panels have thier own layout and functions that determine +// when to enable/disable the Wizard's navigation buttons. +// +// In this demo we have a Wizard class, called CWonderfulWizard, that contains +// two WizardSubPanel classes, called CSomeSelections and CMoreSelections. +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// CSomeSelections: First sub panel of the Wonderful wizard +// Provide some user options that we load from a resource file. +//----------------------------------------------------------------------------- +class CSomeSelections : public WizardSubPanel +{ +public: + CSomeSelections(Panel *parent, const char *panelName); + ~CSomeSelections(){}; + + virtual WizardSubPanel *GetNextSubPanel(); + virtual void OnDisplayAsPrev(); + // Called when the wizard 'next' button is pressed. + // Return true if the wizard should advance. + virtual bool OnNextButton() { return true;} + virtual void PerformLayout(); + +private: + TextEntry *m_pFirstNameEdit; + TextEntry *m_pLastNameEdit; + TextEntry *m_pUserNameEdit; + TextEntry *m_pEmailEdit; + }; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CSomeSelections::CSomeSelections(Panel *parent, const char *panelName) : +WizardSubPanel(parent, panelName) +{ + // create the controls + m_pUserNameEdit = new TextEntry(this, "UserNameEdit"); + m_pUserNameEdit->SetPos(100,100); + m_pFirstNameEdit = new TextEntry(this, "FirstNameEdit"); + m_pLastNameEdit = new TextEntry(this, "LastNameEdit"); + m_pEmailEdit = new TextEntry(this, "EmailEdit"); + + // The layout of the controls is loaded from a resource file. + LoadControlSettings("Demo/WizardPanelDemo.res"); +} + + +//----------------------------------------------------------------------------- +// Purpose: Return a pointer to the next subpanel that should be displayed +// Output : WizardSubPanel * +//----------------------------------------------------------------------------- +WizardSubPanel *CSomeSelections::GetNextSubPanel() +{ + // The next panel to be displayed is called 'CMoreSelections' + return dynamic_cast<WizardSubPanel *>(GetWizardPanel()->FindChildByName("CMoreSelections")); +} + +//----------------------------------------------------------------------------- +// Purpose: Execute this code when a panel has had the 'prev' button pressed +// and the panel to be displayed is this one. +// Input : +//----------------------------------------------------------------------------- +void CSomeSelections::OnDisplayAsPrev() +{ + // Enable the 'next' button + GetWizardPanel()->SetNextButtonEnabled(true); + // Buttons are disabled by default, so the prev button will be disabled, + // which is correct since there are no panels before this one. +} + +//----------------------------------------------------------------------------- +// Purpose: Layout the window. +//----------------------------------------------------------------------------- +void CSomeSelections::PerformLayout() +{ + // Set the title of the Wizard. + GetWizardPanel()->SetTitle("Some Selections", false); + // Make sure the 'finish' button is disabled, since we are not on the last panel. + GetWizardPanel()->SetFinishButtonEnabled(false); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// CMoreSelections: Second and last sub panel of the Wonderful wizard +// Just one radio button in here. If the button is selected +// The 'finish' button becomes enabled. +//----------------------------------------------------------------------------- +class CMoreSelections : public WizardSubPanel +{ +public: + CMoreSelections(Panel *parent, const char *panelName); + ~CMoreSelections(){}; + + virtual WizardSubPanel *GetNextSubPanel(); + virtual void OnDisplayAsNext(); + virtual bool OnPrevButton() { return true;} + virtual void PerformLayout(); + void OnRadioButtonChecked(Panel *panel); + + DECLARE_PANELMAP(); + +private: + RadioButton *m_pDoneRadio; +}; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CMoreSelections::CMoreSelections(Panel *parent, const char *panelName) : +WizardSubPanel(parent, panelName) +{ + // create the controls + // a radio button + m_pDoneRadio = new RadioButton(this, "DoneRadio", "Are you done?"); + m_pDoneRadio->SizeToContents(); + m_pDoneRadio->SetPos(100,100); +} + +//----------------------------------------------------------------------------- +// Purpose: The wizard tried to get the subpanel after this one. +// There is no panel to be displayed after this one. So return NULL +//----------------------------------------------------------------------------- +WizardSubPanel *CMoreSelections::GetNextSubPanel() +{ + return NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Called when the subpanel is displayed +// All controls & data should be reinitialized at this time +//----------------------------------------------------------------------------- +void CMoreSelections::OnDisplayAsNext() +{ + // There is no next panel so disable this button. + GetWizardPanel()->SetNextButtonEnabled(false); + // We want the finish button disabled until the radio button is set. + GetWizardPanel()->SetFinishButtonEnabled(false); +} + +//----------------------------------------------------------------------------- +// Purpose: Layout the window and enable/disable buttons as appropriate. +//----------------------------------------------------------------------------- +void CMoreSelections::PerformLayout() +{ + // Set the title of the Wizard. + GetWizardPanel()->SetTitle("All finished?", false); + + // Check if the radio button is selected. + if ( m_pDoneRadio->IsSelected()) + { + // If it is, we will enable the 'finish' button. + GetWizardPanel()->SetFinishButtonEnabled(true); + + } + GetWizardPanel()->SetNextButtonEnabled(false); +} + +//----------------------------------------------------------------------------- +// Purpose: Upon checking the radio button, enable the 'finish' button. +//----------------------------------------------------------------------------- +void CMoreSelections::OnRadioButtonChecked(Panel *panel) +{ + if ( m_pDoneRadio->IsSelected()) + { + GetWizardPanel()->SetFinishButtonEnabled(true); + + } +} + +//----------------------------------------------------------------------------- +// Purpose: Message map +//----------------------------------------------------------------------------- +MessageMapItem_t CMoreSelections::m_MessageMap[] = +{ + MAP_MESSAGE_PTR( CMoreSelections, "RadioButtonChecked", OnRadioButtonChecked, "panel" ), // custom message +}; +IMPLEMENT_PANELMAP(CMoreSelections, Panel); + + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Purpose: A wizard panel containing two +// wizard sub panels +//----------------------------------------------------------------------------- +class CWonderfulWizard : public WizardPanel +{ +public: + CWonderfulWizard(); + ~CWonderfulWizard(){}; + + void Run(void); + void Open(); + +private: +}; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CWonderfulWizard::CWonderfulWizard() : WizardPanel(NULL, "WonderfulWizard") +{ + // The size of the Wizard. + //SetBounds(0, 0, 480, 360); + + // The first panel to be displayed. + WizardSubPanel *subPanel = new CSomeSelections(this, "CSomeSelections"); + subPanel->SetVisible(false); + + // The second panel to be displayed. + subPanel = new CMoreSelections(this, "CMoreSelections"); + subPanel->SetVisible(false); +} + +//----------------------------------------------------------------------------- +// Purpose: Start the wizard, starting with the startPanel +//----------------------------------------------------------------------------- +void CWonderfulWizard::Run( void ) +{ + SetVisible(true); + + // Call run, with the name of the first panel to be displayed. + WizardPanel::Run(dynamic_cast<WizardSubPanel *>(FindChildByName("CSomeSelections"))); + + SetTitle("A Wizard Panel ", true); +} + +//----------------------------------------------------------------------------- +// Purpose: Display the wizard. +//----------------------------------------------------------------------------- +void CWonderfulWizard::Open() +{ + RequestFocus(); + MoveToFront(); + SetVisible(true); + surface()->SetMinimized(this->GetVPanel(), false); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Purpose: A demonstration of a wizard panel containing two +// wizard sub panels +//----------------------------------------------------------------------------- +class WizardPanelDemo: public DemoPage +{ +public: + WizardPanelDemo(Panel *parent, const char *name); + ~WizardPanelDemo(){}; + + void SetVisible(bool status); + +private: + // We use a handle because the window could be destroyed if someone + // closed the wizard. + DHANDLE<CWonderfulWizard> m_hWizardPanel; + +}; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +WizardPanelDemo::WizardPanelDemo(Panel *parent, const char *name) : DemoPage(parent, name) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: When we make this this demo page visible we make the wizard visible. +//----------------------------------------------------------------------------- +void WizardPanelDemo::SetVisible(bool status) +{ + if (status) + { + // Pop up the dialog + if (m_hWizardPanel.Get()) + { + m_hWizardPanel->Open(); + } + else + { + CWonderfulWizard *pWizardPanel = new CWonderfulWizard(); + pWizardPanel->SetPos(100, 100); + pWizardPanel->SetSize(480, 360); + + surface()->CreatePopup(pWizardPanel->GetVPanel(), false); + m_hWizardPanel = pWizardPanel; + m_hWizardPanel->Run(); + } + } + else + { + if (m_hWizardPanel.Get()) + { + m_hWizardPanel->SetVisible(false); + } + } + + DemoPage::SetVisible(status); +} + + + +Panel* WizardPanelDemo_Create(Panel *parent) +{ + return new WizardPanelDemo(parent, "WizardPanelDemo"); +} + + |