You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
12 KiB
348 lines
12 KiB
//========= 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"); |
|
} |
|
|
|
|
|
|