ns/releases/3.03/source/ui/UIComponents.cpp
tankefugl 54a4ac5469 o Branched from 3.02
git-svn-id: https://unknownworlds.svn.cloudforge.com/ns1@85 67975925-1194-0748-b3d5-c16f83f1a3a1
2005-04-26 15:38:32 +00:00

758 lines
22 KiB
C++

#include "ui/UIComponents.h"
#include "ui/UITags.h"
#include "ui/UIUtil.h"
//extern "C"
//{
// void* VGui_GetPanel();
//}
//////////////////////////
// Panel -> UIComponent //
//////////////////////////
void UIPanel::AllocateComponent(const TRDescription& inDescription)
{
this->mUIPanel = new Panel();
}
bool UIPanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theArgOne, theArgTwo;
UIComponent::SetClassProperties(inDesc, inPanel, inSchemeManager);
// Position (normalized screen coords)
float theXPos = UIDefaultXPos;
float theYPos = UIDefaultYPos;
theArgOne = inDesc.GetTagValue(UITagXPos, theXPos);
theArgTwo = inDesc.GetTagValue(UITagYPos, theYPos);
if(theArgOne || theArgTwo)
{
inPanel->setPos(theXPos*ScreenWidth(), theYPos*ScreenHeight());
}
// Width and height (normalized screen coords)
float theWidth = UIDefaultWidth;
float theHeight = UIDefaultHeight;
theArgOne = inDesc.GetTagValue(UITagWidth, theWidth);
theArgTwo = inDesc.GetTagValue(UITagHeight, theHeight);
if(theArgOne || theArgTwo)
{
inPanel->setSize(theWidth*ScreenWidth(), theHeight*ScreenHeight());
}
// Preferred size (normalized screen coords)
float thePreferredWidth = UIDefaultPreferredWidth;
float thePreferredHeight = UIDefaultPreferredHeight;
theArgOne = inDesc.GetTagValue(UITagPreferredWidth, thePreferredWidth);
theArgTwo = inDesc.GetTagValue(UITagPreferredHeight, thePreferredHeight);
if(theArgOne || theArgTwo)
{
inPanel->setPreferredSize(thePreferredWidth*ScreenWidth(), thePreferredHeight*ScreenHeight());
}
// Background color (rgba)
string theColorString;
if(inDesc.GetTagValue(UITagBGColor, theColorString))
{
Color theColor;
UIStringToColor(theColorString, theColor);
inPanel->setBgColor(theColor);
}
// Foreground color (rgba)
if(inDesc.GetTagValue(UITagFGColor, theColorString))
{
Color theColor;
UIStringToColor(theColorString, theColor);
inPanel->setFgColor(theColor);
}
// Default visibility (bool)
bool theTempBool = UIDefaultVisibility;
if(inDesc.GetTagValue(UITagVisible, theTempBool))
{
inPanel->setVisible(theTempBool);
}
// Remember the comp name
this->SetName(inDesc.GetName());
return true;
}
void UIPanel::Update(float theCurrentTime)
{
UIComponent::Update(theCurrentTime);
}
////////////////////
// Label -> Panel //
////////////////////
void UILabel::AllocateComponent(const TRDescription& inDesc)
{
string theTitle;
inDesc.GetTagValue(UITagText, theTitle);
string theDefaultText;
LocalizeString(theTitle.c_str(), theDefaultText);
this->mUILabel = new Label(theDefaultText.c_str());
}
bool UILabel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theSuccess = true;
Label* theLabel = (Label*)inPanel;
theSuccess = UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
if(theSuccess)
{
string theAlignmentString;
if(inDesc.GetTagValue(UITagAlignment, theAlignmentString))
{
// Convert the alignment from a string to the label enum
Label::Alignment theAlignment = vgui::Label::a_center;
UIStringToAlignment(theAlignmentString, theAlignment);
theLabel->setContentAlignment(theAlignment);
}
string theTitle;
if(inDesc.GetTagValue(UITagText, theTitle))
{
string theDefaultText("");
LocalizeString(theTitle.c_str(), theDefaultText);
theLabel->setText(theDefaultText.length(), theDefaultText.c_str());
}
// Get font to use
std::string theSchemeName;
if(inDesc.GetTagValue(UITagScheme, theSchemeName))
{
const char* theSchemeCString = theSchemeName.c_str();
SchemeHandle_t theSchemeHandle = inSchemeManager->getSchemeHandle(theSchemeCString);
Font* theFont = inSchemeManager->getFont(theSchemeHandle);
if(theFont)
{
theLabel->setFont(theFont);
}
theSuccess = true;
}
}
return theSuccess;
}
void UILabel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
/////////////////////////
// ImageLabel -> Label //
/////////////////////////
void UIImageLabel::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
string theImageName("ru");
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
inDesc.GetTagValue(UITagImage, theImageName);
// Construct it!
this->mUIImageLabel = new CImageLabel(theImageName.c_str(), theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth, theHeight);
}
bool UIImageLabel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UILabel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIImageLabel::Update(float theCurrentTime)
{
UILabel::Update(theCurrentTime);
}
//////////////////////////
// ProgressBar -> Panel //
//////////////////////////
void UIProgressBar::AllocateComponent(const TRDescription& inDesc)
{
int theSegmentCount = UIDefaultProgressBarSegments;
inDesc.GetTagValue(UITagSegments, theSegmentCount);
this->mUIProgressBar = new ProgressBar(theSegmentCount);
}
bool UIProgressBar::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIProgressBar::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////////////
// ConfigWizard -> Panel //
///////////////////////////
void UIConfigWizard::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
this->mUIConfigWizard = new ConfigWizard(theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth, theHeight);
}
bool UIConfigWizard::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIConfigWizard::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////////////
// TreeFolder -> Panel //
///////////////////////////
void UITreeFolder::AllocateComponent(const TRDescription& inDesc)
{
string thePathName = UIDefaultPathName;
inDesc.GetTagValue(UITagPathName, thePathName);
this->mUITreeFolder = new TreeFolder(thePathName.c_str());
}
bool UITreeFolder::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UITreeFolder::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////
// Menu -> Panel //
///////////////////
void UIMenu::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
this->mUIMenu = new Menu(theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth, theHeight);
}
bool UIMenu::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIMenu::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
////////////////////////
// PopupMenu -> Panel //
////////////////////////
void UIPopupMenu::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
this->mUIPopupMenu = new PopupMenu(theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth, theHeight);
}
bool UIPopupMenu::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIMenu::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIPopupMenu::Update(float theCurrentTime)
{
UIMenu::Update(theCurrentTime);
}
/////////////////////////
// ImagePanel -> Panel //
/////////////////////////
void UIImagePanel::AllocateComponent(const TRDescription& inDesc)
{
Image* theImage = NULL;
this->mUIImagePanel = new ImagePanel(theImage);
}
bool UIImagePanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIImagePanel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
/////////////////////
// Button -> Label //
/////////////////////
void UIButton::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth, theHeight;
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
string theTitle;
inDesc.GetTagValue(UITagText, theTitle);
string theDefaultText;
LocalizeString(theTitle.c_str(), theDefaultText);
this->mUIButton = new Button(theDefaultText.c_str(), theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth, theHeight);
}
bool UIButton::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UILabel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIButton::Update(float theCurrentTime)
{
UILabel::Update(theCurrentTime);
}
/////////////////////////////////////
// FadingImageLabel -> CImageLabel //
/////////////////////////////////////
void UIFadingImageLabel::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth = ScreenWidth();
int theHeight = ScreenHeight();
string theImageName("default");
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
inDesc.GetTagValue(UITagImage, theImageName);
// Construct it!
//this->mUIFadingImageLabel = new FadingImageLabel(theImageName.c_str(), theXPos*ScreenWidth, theYPos*ScreenHeight, theWidth, theHeight);
//this->mUIFadingImageLabel = new FadingImageLabel(theImageName.c_str(), theXPos*ScreenWidth, theYPos*ScreenHeight);
//this->mUIFadingImageLabel = new FadingImageLabel(theXPos*ScreenWidth, theYPos*ScreenHeight);
this->mUIFadingImageLabel = new FadingImageLabel(0, 0);
}
bool UIFadingImageLabel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theSuccess = true;
// TODO: Add special tags
// fade time
// image
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIFadingImageLabel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
this->mUIFadingImageLabel->Update(theCurrentTime);
}
void UIMarqueeComponent::AllocateComponent(const TRDescription& inDesc)
{
float theXPos, theYPos;
int theWidth = ScreenWidth();
int theHeight = ScreenHeight();
UIGetPosition(inDesc, theXPos, theYPos, theWidth, theHeight);
// Construct it!
this->mUIMarqueeComponent = new MarqueeComponent();
}
bool UIMarqueeComponent::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theSuccess = true;
// TODO: Add special tags
// fade time
// image
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIMarqueeComponent::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////////////
// ColoredPanel -> Panel //
///////////////////////////
void UIColoredPanel::AllocateComponent(const TRDescription& inDesc)
{
// Position (normalized screen coords)
float theXPos = UIDefaultXPos;
float theYPos = UIDefaultYPos;
inDesc.GetTagValue(UITagXPos, theXPos);
inDesc.GetTagValue(UITagYPos, theYPos);
// Width and height (normalized screen coords)
float theWidth = UIDefaultWidth;
float theHeight = UIDefaultHeight;
inDesc.GetTagValue(UITagWidth, theWidth);
inDesc.GetTagValue(UITagHeight, theHeight);
this->mUIColoredPanel = new ColoredPanel(theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth*ScreenWidth(), theHeight*ScreenHeight());
}
bool UIColoredPanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIColoredPanel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
/////////////////////////////
// InvisiblePanel -> Panel //
/////////////////////////////
void UIInvisiblePanel::AllocateComponent(const TRDescription& inDesc)
{
this->mUIInvisiblePanel = new InvisiblePanel();
}
bool UIInvisiblePanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIInvisiblePanel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////////////
// Slider -> Panel //
///////////////////////////
void UISlider::AllocateComponent(const TRDescription& inDesc)
{
float theX = 0;
float theY = 0;
float theWidth = 50;
float theHeight = 50;
bool theIsVertical = false;
inDesc.GetTagValue(UITagXPos, theX);
inDesc.GetTagValue(UITagYPos, theY);
inDesc.GetTagValue(UITagWidth, theWidth);
inDesc.GetTagValue(UITagHeight, theHeight);
inDesc.GetTagValue(UIIsVertical, theIsVertical);
int theScreenWidth = ScreenWidth();
int theScreenHeight = ScreenHeight();
this->mUISlider = new Slider(theX*theScreenWidth, theY*theScreenHeight, theWidth*theScreenWidth, theHeight*theScreenHeight, theIsVertical);
}
bool UISlider::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
// Read lower and upper limits
int theLowerValue = 0;
int theUpperValue = 20;
inDesc.GetTagValue(UILowerValue, theLowerValue);
inDesc.GetTagValue(UIUpperValue, theUpperValue);
Slider* theSlider = dynamic_cast<Slider*>(inPanel);
ASSERT(theSlider);
theSlider->setRange(theLowerValue, theUpperValue);
int theRangeWindow;
if(inDesc.GetTagValue(UIRangeWindow, theRangeWindow))
{
// The range window is in pixels, the lower and upper values are in their own arbitrary scale
//int theValueRange = theUpperValue - theLowerValue;
//ASSERT(theRangeWindow < theValueRange);
theSlider->setRangeWindowEnabled(true);
theSlider->setRangeWindow(theRangeWindow);
}
int theStartingValue;
if(inDesc.GetTagValue(UIDefaultIntValue, theStartingValue))
{
theSlider->setValue(theStartingValue);
}
return true;
}
void UISlider::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
///////////////////////////
// Slider2 -> Panel //
///////////////////////////
void UISlider2::AllocateComponent(const TRDescription& inDesc)
{
float theX = 0;
float theY = 0;
float theWidth = 50;
float theHeight = 50;
bool theIsVertical = false;
inDesc.GetTagValue(UITagXPos, theX);
inDesc.GetTagValue(UITagYPos, theY);
inDesc.GetTagValue(UITagWidth, theWidth);
inDesc.GetTagValue(UITagHeight, theHeight);
inDesc.GetTagValue(UIIsVertical, theIsVertical);
int theScreenWidth = ScreenWidth();
int theScreenHeight = ScreenHeight();
this->mUISlider2 = new Slider2(theX*theScreenWidth, theY*theScreenHeight, theWidth*theScreenWidth, theHeight*theScreenHeight, theIsVertical);
}
bool UISlider2::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
// Read lower and upper limits
int theLowerValue = 0;
int theUpperValue = 20;
inDesc.GetTagValue(UILowerValue, theLowerValue);
inDesc.GetTagValue(UIUpperValue, theUpperValue);
Slider2* theSlider2 = dynamic_cast<Slider2*>(inPanel);
ASSERT(theSlider2);
theSlider2->setRange(theLowerValue, theUpperValue);
int theRangeWindow;
if(inDesc.GetTagValue(UIRangeWindow, theRangeWindow))
{
// The range window is in pixels, the lower and upper values are in their own arbitrary scale
//int theValueRange = theUpperValue - theLowerValue;
//ASSERT(theRangeWindow < theValueRange);
theSlider2->setRangeWindowEnabled(true);
theSlider2->setRangeWindow(theRangeWindow);
}
int theStartingValue;
if(inDesc.GetTagValue(UIDefaultIntValue, theStartingValue))
{
theSlider2->setValue(theStartingValue);
}
return true;
}
void UISlider2::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
//////////////////////////
// StaticLabel -> Label //
//////////////////////////
void UIStaticLabel::AllocateComponent(const TRDescription& inDesc)
{
string theTitle;
inDesc.GetTagValue(UITagText, theTitle);
string theDefaultText("");
LocalizeString(theTitle.c_str(), theDefaultText);
// Position (normalized screen coords)
float theXPos = UIDefaultXPos;
float theYPos = UIDefaultYPos;
inDesc.GetTagValue(UITagXPos, theXPos);
inDesc.GetTagValue(UITagYPos, theYPos);
// Width and height (normalized screen coords)
float theWidth = UIDefaultWidth;
float theHeight = UIDefaultHeight;
inDesc.GetTagValue(UITagWidth, theWidth);
inDesc.GetTagValue(UITagHeight, theHeight);
this->mUIStaticLabel = new StaticLabel(theDefaultText.c_str(), theXPos*ScreenWidth(), theYPos*ScreenHeight(), theWidth*ScreenWidth(), theHeight*ScreenHeight());
}
bool UIStaticLabel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
return UILabel::SetClassProperties(inDesc, inPanel, inSchemeManager);
}
void UIStaticLabel::Update(float theCurrentTime)
{
UILabel::Update(theCurrentTime);
}
//////////////////////////
// SpritePanel -> Panel //
//////////////////////////
void UISpritePanel::AllocateComponent(const TRDescription& inDesc)
{
string theBaseSpriteName;
inDesc.GetTagValue(UIBaseSprite, theBaseSpriteName);
string theRenderMode;
inDesc.GetTagValue(UIRenderMode, theRenderMode);
this->mUISpritePanel = new SpritePanel(theBaseSpriteName, theRenderMode);
string theVAlignment;
if(inDesc.GetTagValue(UIVAlignment, theVAlignment))
{
this->mUISpritePanel->SetVAlignment(theVAlignment);
}
}
bool UISpritePanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theSuccess = true;
SpritePanel* theSpritePanel = (SpritePanel*)inPanel;
theSuccess = UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
if(theSuccess)
{
// Add any of our own properties here
}
return theSuccess;
}
void UISpritePanel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
//////////////////////////
// DummyPanel -> Panel //
//////////////////////////
void UIDummyPanel::AllocateComponent(const TRDescription& inDesc)
{
this->mUIDummyPanel = new DummyPanel();
}
bool UIDummyPanel::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
bool theSuccess = true;
theSuccess = UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
return theSuccess;
}
void UIDummyPanel::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}
/////////////////////////
// SliderPlus -> Panel //
/////////////////////////
void UISliderPlus::AllocateComponent(const TRDescription& inDesc)
{
float theX = 0;
float theY = 0;
float theWidth = 50;
float theHeight = 50;
bool theIsVertical = false;
inDesc.GetTagValue(UITagXPos, theX);
inDesc.GetTagValue(UITagYPos, theY);
inDesc.GetTagValue(UITagWidth, theWidth);
inDesc.GetTagValue(UITagHeight, theHeight);
inDesc.GetTagValue(UIIsVertical, theIsVertical);
int theScreenWidth = ScreenWidth();
int theScreenHeight = ScreenHeight();
this->mUISliderPlus = new SliderPlus(theX*theScreenWidth, theY*theScreenHeight, theWidth*theScreenWidth, theHeight*theScreenHeight, theIsVertical);
}
bool UISliderPlus::SetClassProperties(const TRDescription& inDesc, Panel* inPanel, CSchemeManager* inSchemeManager)
{
UIPanel::SetClassProperties(inDesc, inPanel, inSchemeManager);
// Read lower and upper limits
int theLowerValue = 0;
int theUpperValue = 20;
inDesc.GetTagValue(UILowerValue, theLowerValue);
inDesc.GetTagValue(UIUpperValue, theUpperValue);
SliderPlus* theSlider = dynamic_cast<SliderPlus*>(inPanel);
ASSERT(theSlider);
theSlider->setRange(theLowerValue, theUpperValue);
int theRangeWindow;
if(inDesc.GetTagValue(UIRangeWindow, theRangeWindow))
{
// The range window is in pixels, the lower and upper values are in their own arbitrary scale
//int theValueRange = theUpperValue - theLowerValue;
//ASSERT(theRangeWindow < theValueRange);
//theSlider->setRangeWindowEnabled(true);
theSlider->setRangeWindow(theRangeWindow);
}
int theStartingValue;
if(inDesc.GetTagValue(UIDefaultIntValue, theStartingValue))
{
theSlider->setValue(theStartingValue);
}
return true;
}
void UISliderPlus::Update(float theCurrentTime)
{
UIPanel::Update(theCurrentTime);
}