summaryrefslogtreecommitdiff
path: root/utils/vgui_panel_zoo/WizardPanelDemo.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vgui_panel_zoo/WizardPanelDemo.cpp
downloadarchived-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.cpp348
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");
+}
+
+