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.
349 lines
12 KiB
349 lines
12 KiB
5 years ago
|
//========= 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");
|
||
|
}
|
||
|
|
||
|
|