NS/main/source/ui/UIPieMenu.cpp

180 lines
5.7 KiB
C++

//======== (C) Copyright 2002 Charles G. Cleveland All rights reserved. =========
//
// The copyright to the contents herein is the property of Charles G. Cleveland.
// The contents may be used and/or copied only with the written permission of
// Charles G. Cleveland, or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: UIPieMenu.cpp $
// $Date: 2002/08/16 02:29:20 $
//
//-------------------------------------------------------------------------------
// $Log: UIPieMenu.cpp,v $
// Revision 1.9 2002/08/16 02:29:20 Flayra
// - Added document headers
// - Started to add support for pie nodes with both images and text
//
//===============================================================================
#include "ui/UIPieMenu.h"
#include "ui/UIUtil.h"
#include "ui/UITags.h"
#include "ui/PieMenu.h"
const string kPieMenuNodeXDistance("nodexspacing");
const string kPieMenuNodeYDistance("nodeyspacing");
const string kNodeTarga("nodeimage");
const string kPieMenuNodePrefix("node");
const string kPieMenuDefaultImage("defaultimage");
UIPieMenu::UIPieMenu(void)
{
this->mType = "PieMenu";
}
// Destructor automatically removes component from the engine
UIPieMenu::~UIPieMenu(void)
{
}
void UIPieMenu::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
string theImageName("default");
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
string theRootName;
inDesc.GetTagValue(UIRootName, theRootName);
this->mPieMenu = new PieMenu(theRootName, theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth*ScreenWidth(), theHeight*ScreenHeight());
}
vgui::Panel* UIPieMenu::GetComponentPointer(void)
{
return this->mPieMenu;
}
const string& UIPieMenu::GetType(void) const
{
return this->mType;
}
// Not virtual, this is meant to act only on the class specified. Operate on panel because that is
// the lowest level of hierarchy (not that we're going to do anything with it anyways)
bool UIPieMenu::SetClassProperties(const TRDescription& inDesc, Panel* inComponent, CSchemeManager* inSchemeManager)
{
bool theSuccess;
// Let parent classes go first
theSuccess = UIPanel::SetClassProperties(inDesc, inComponent, inSchemeManager);
if(theSuccess)
{
// Dynamic_cast inComponent to an PieMenu (will always succeed)
PieMenu* thePieMenu = (PieMenu*)inComponent;
// Read font if specified
std::string theSchemeName;
if(inDesc.GetTagValue(UITagScheme, theSchemeName))
{
if(thePieMenu)
{
const char* theSchemeCString = theSchemeName.c_str();
SchemeHandle_t theSchemeHandle = inSchemeManager->getSchemeHandle(theSchemeCString);
Font* theFont = inSchemeManager->getFont(theSchemeHandle);
if(theFont)
{
thePieMenu->SetFont(theFont);
thePieMenu->GetRootNode()->setFont(theFont);
}
}
}
// Set colors of root node to that of the pie menu
Color theColor;
thePieMenu->getFgColor(theColor);
thePieMenu->GetRootNode()->setFgColor(theColor);
thePieMenu->getBgColor(theColor);
thePieMenu->GetRootNode()->setBgColor(theColor);
// Read node distances
float theNodeXDistance = 0.0f;
inDesc.GetTagValue(kPieMenuNodeXDistance, theNodeXDistance);
float theNodeYDistance = 0.0f;
inDesc.GetTagValue(kPieMenuNodeYDistance, theNodeYDistance);
thePieMenu->SetNodeDistance(theNodeXDistance, theNodeYDistance);
// Set pop-up menu default image
string theDefaultImage;
if(inDesc.GetTagValue(kPieMenuDefaultImage, theDefaultImage))
{
thePieMenu->SetDefaultImage(theDefaultImage);
}
// Read specified image to use
//string theNodeTargaName;
//if(inDesc.GetTagValue(kNodeTarga, theNodeTargaName))
//{
// thePieMenu->SetNodeTargaName(theNodeTargaName);
//}
// Now read in the nodes until there are no more. Assumes first node is root.
thePieMenu->GetRootNode()->SetSizeKeepCenter(theNodeXDistance*ScreenWidth(), theNodeYDistance*ScreenHeight());
StringVector theNodeList;
inDesc.GetTagStringList(kPieMenuNodePrefix, theNodeList);
for(StringVector::iterator theIter = theNodeList.begin(); theIter != theNodeList.end(); theIter++)
{
thePieMenu->AddNode(*theIter);
}
// Set the connector, if any
string theConnectorName;
if(inDesc.GetTagValue(UIConnectorName, theConnectorName))
{
if(theConnectorName != "")
{
this->mPieMenu->SetConnectorName(theConnectorName);
}
}
// Now have the piemenu recompute visible size for all nodes
thePieMenu->RecomputeVisibleSize();
// for(int i = 0; ; i++)
// {
// char theNum[4];
// sprintf(theNum, "%d", i);
// string theNodeName(kPieMenuNodePrefix + string(theNum));
//
// string theNodeString;
// if(inDesc.GetTagValue(theNodeName, theNodeString))
// {
// thePieMenu->AddNode(theNodeString);
// }
// else
// {
// break;
// }
// }
// Tell it we're done
thePieMenu->SetConstructionComplete();
// Make sure to propagate new position to all children. Children may have been added
// after the position was set so just make sure to re-set the position before we leave now
// that all children have been added.
}
return theSuccess;
}
void UIPieMenu::Update(float theCurrentTime)
{
this->mPieMenu->Update(theCurrentTime);
}