summaryrefslogtreecommitdiff
path: root/utils/vgui_panel_zoo/CascadingMenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/vgui_panel_zoo/CascadingMenu.cpp')
-rw-r--r--utils/vgui_panel_zoo/CascadingMenu.cpp208
1 files changed, 208 insertions, 0 deletions
diff --git a/utils/vgui_panel_zoo/CascadingMenu.cpp b/utils/vgui_panel_zoo/CascadingMenu.cpp
new file mode 100644
index 0000000..3881823
--- /dev/null
+++ b/utils/vgui_panel_zoo/CascadingMenu.cpp
@@ -0,0 +1,208 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "DemoPage.h"
+
+#include <VGUI/IVGui.h>
+#include <vgui_controls/Menu.h>
+#include <vgui_controls/MenuButton.h>
+#include <Keyvalues.h>
+#include <vgui_controls/Controls.h>
+
+
+
+using namespace vgui;
+
+
+class CascadingMenuDemo: public DemoPage
+{
+ public:
+ CascadingMenuDemo(Panel *parent, const char *name);
+ ~CascadingMenuDemo();
+ void InitMenus();
+
+ // Functions that are executed in response to selecting ]
+ // menu items.
+ void OnMaggie();
+ void OnHomer();
+ void OnMarcia();
+ void OnJohn();
+ void OnRed();
+
+ private:
+
+ MenuButton *m_pOuterMenuButton;
+ Menu *m_pOuterMenu;
+ MenuButton *m_pInnerMenuButton;
+ Menu *m_pInnerMenu;
+ Menu *m_pInnerMenu2;
+ Menu *m_pDeepestMenu;
+ DECLARE_PANELMAP();
+
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CascadingMenuDemo::CascadingMenuDemo(Panel *parent, const char *name) : DemoPage(parent, name)
+{
+ InitMenus();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CascadingMenuDemo::~CascadingMenuDemo()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Create cascading menus.
+// We will create a Menu with 2 Menus inside it, and yet another Menu inside one of those!
+//-----------------------------------------------------------------------------
+void CascadingMenuDemo::InitMenus()
+{
+ // A drop down menu button for the top most menu
+ m_pOuterMenuButton = new MenuButton(this, "OuterMenu", "Click to open menu");
+
+ // Size the Button so we can read its label.
+ m_pOuterMenuButton->SizeToContents();
+ int wide, tall;
+ m_pOuterMenuButton->GetContentSize(wide, tall);
+ m_pOuterMenuButton->SetSize(wide + Label::Content, tall + Label::Content);
+
+
+ // Create the Menu to go with it.
+ m_pOuterMenu = new Menu(m_pOuterMenuButton, "OuterMenu");
+
+ // Add the menu items to this menu
+ m_pOuterMenu->AddMenuItem("&Homer", new KeyValues ("Homer"), this);
+ m_pOuterMenu->AddMenuItem("&Apu", new KeyValues ("Apu"), this);
+ m_pOuterMenu->AddMenuItem("&Bart", new KeyValues ("Bart"), this);
+ m_pOuterMenu->AddMenuItem("Lisa", new KeyValues ("Lisa"), this);
+ m_pOuterMenu->AddMenuItem("&George", new KeyValues ("George"), this);
+ m_pOuterMenu->AddMenuItem("&Marge", new KeyValues ("Marge"), this);
+ m_pOuterMenu->AddMenuItem("Maggi&e", new KeyValues ("Maggie"), this);
+ m_pOuterMenu->SetVisible(false);
+
+ // Make the number of visible menu items 20
+ m_pOuterMenu->SetNumberOfVisibleItems(20);
+
+ // Attach this menu to the menu button
+ m_pOuterMenuButton->SetMenu(m_pOuterMenu);
+
+ // Position the menu button on screen.
+ int x, y, dwide, dtall;
+ GetBounds (x, y, dwide, dtall);
+ m_pOuterMenuButton->SetPos(10, dtall/2);
+
+ // Create cascading menu #1
+ // Cascading menu's don't need menu buttons, as they are triggered
+ // by selecting the menu item of the menu they are in.
+ m_pInnerMenu = new Menu(m_pOuterMenu, "InnerMenu");
+
+ // Add menu items to this menu.
+ m_pInnerMenu->AddMenuItem("Marcia", new KeyValues ("Marcia"), this);
+ m_pInnerMenu->AddMenuItem("Greg", new KeyValues ("Greg"), this);
+ m_pInnerMenu->AddMenuItem("&Peter", new KeyValues ("Peter"), this);
+ m_pInnerMenu->AddMenuItem("AliceWithALongName", new KeyValues ("Alice"), this);
+ m_pInnerMenu->AddMenuItem("&Carol", new KeyValues ("Carol"), this);
+ m_pInnerMenu->AddMenuItem("&Tiger", new KeyValues ("Tiger"), this);
+ m_pInnerMenu->AddMenuItem("&Sam", new KeyValues ("Sam"), this);
+ m_pInnerMenu->AddMenuItem("&Bobby", new KeyValues ("Bobby"), this);
+ m_pInnerMenu->AddMenuItem("Cindy", new KeyValues ("Cindy"), this);
+ m_pInnerMenu->SetVisible(false);
+ // Now add the cascading menu to the top menu as a menu item!
+ m_pOuterMenu->AddCascadingMenuItem("InnerMenu", this, m_pInnerMenu);
+
+ // Create cascading menu #2
+ m_pInnerMenu2 = new Menu(m_pOuterMenu, "InnerMenu2");
+ m_pInnerMenu2->AddMenuItem("John", new KeyValues ("John"), this);
+ m_pInnerMenu2->AddMenuItem("Paul", new KeyValues ("Paul"), this);
+ m_pInnerMenu2->AddMenuItem("Ringo", new KeyValues ("Ringo"), this);
+ m_pInnerMenu2->AddMenuItem("George", new KeyValues ("George"), this);
+ m_pInnerMenu2->AddMenuItem("Magical", new KeyValues ("Magical"), this);
+ m_pInnerMenu2->AddMenuItem("Mystery", new KeyValues ("Mystery"), this);
+ m_pInnerMenu2->AddMenuItem("Tour", new KeyValues ("Tour"), this);
+ m_pInnerMenu2->AddMenuItem("Yellow Sub", new KeyValues ("Yellow Sub"), this);
+ m_pInnerMenu2->SetVisible(false);
+
+ // Add this cascading menu to the top menu as a manu item.
+ m_pOuterMenu->AddCascadingMenuItem("InnerMenu2", this, m_pInnerMenu2);
+
+
+ // Finally, a cascading menu inside a cascading menu!
+ m_pDeepestMenu = new Menu(m_pInnerMenu, "DeepestMenu");
+
+ // Add menu items to this menu.
+ m_pDeepestMenu->AddMenuItem("Red", new KeyValues ("Red"), this);
+ m_pDeepestMenu->AddMenuItem("Orange", new KeyValues ("Orange"), this);
+ m_pDeepestMenu->AddMenuItem("Yellow", new KeyValues ("Yellow"), this);
+ m_pDeepestMenu->AddMenuItem("Green", new KeyValues ("Green"), this);
+ m_pDeepestMenu->AddMenuItem("Blue", new KeyValues ("Blue"), this);
+ m_pDeepestMenu->AddMenuItem("Indigo", new KeyValues ("Indigo"), this);
+ m_pDeepestMenu->AddMenuItem("Purple", new KeyValues ("Purple"), this);
+ m_pDeepestMenu->AddMenuItem("Yellow Sun", new KeyValues ("Yellow Sun"), this);
+ m_pDeepestMenu->SetVisible(false);
+
+ // Set the number of visible items in the menu to 4, this menu will have a scrollbar.
+ m_pDeepestMenu->SetNumberOfVisibleItems(4);
+
+ // Add this menu item to one of the other menus already in the top most menu above
+ m_pInnerMenu->AddCascadingMenuItem("DeepestMenu", this, m_pDeepestMenu);
+
+}
+
+// Messages recieved from each of the menus, prints out when message is recieved
+void CascadingMenuDemo::OnMaggie()
+{
+ ivgui()->DPrintf("Maggie selected.\n");
+}
+
+void CascadingMenuDemo::OnMarcia()
+{
+ ivgui()->DPrintf("Marcia selected.\n");
+}
+
+void CascadingMenuDemo::OnJohn()
+{
+ ivgui()->DPrintf("John selected.\n");
+}
+
+void CascadingMenuDemo::OnRed()
+{
+ ivgui()->DPrintf("Red selected.\n");
+}
+
+void CascadingMenuDemo::OnHomer()
+{
+ ivgui()->DPrintf("Homer selected.\n");
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Message map
+//-----------------------------------------------------------------------------
+MessageMapItem_t CascadingMenuDemo::m_MessageMap[] =
+{
+ MAP_MESSAGE( CascadingMenuDemo, "Maggie", OnMaggie ), // from outermenu
+ MAP_MESSAGE( CascadingMenuDemo, "Homer", OnHomer ), // from outermenu
+ MAP_MESSAGE( CascadingMenuDemo, "Marcia", OnMarcia ), // from innermenu2
+ MAP_MESSAGE( CascadingMenuDemo, "John", OnJohn ), // from innermenu2
+ MAP_MESSAGE( CascadingMenuDemo, "Red", OnRed ), // from deepest menu
+
+};
+
+IMPLEMENT_PANELMAP(CascadingMenuDemo, DemoPage);
+
+
+Panel* CascadingMenuDemo_Create(Panel *parent)
+{
+ return new CascadingMenuDemo(parent, "CascadingMenuDemo");
+}
+
+