1
0
forked from 0ad/0ad
0ad/source/ps/Overlay.cpp
Ykkrosh f0d9806b3f # Restructured GUI implementation
CGUI now represents a single 'page'. CGUIManager maintains multiple
pages and switches between them.
Split the XML files into pregame, loading, session and messagebox pages.
Added hotloading of GUI pages.
Minor GUI cleanups.
(Merge from hg 81862d33780c)

This was SVN commit r7214.
2009-12-03 20:17:22 +00:00

472 lines
7.5 KiB
C++

/* Copyright (C) 2009 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/
/*
Overlay.cpp
*/
#include "precompiled.h"
#include <string>
#include "Overlay.h"
#include "Parser.h"
bool CColor::ParseString(const CStr& Value, float DefaultAlpha)
{
// Use the parser to parse the values
CParser& parser (CParserCache::Get("_[-$arg(_minus)]$value_[-$arg(_minus)]$value_[-$arg(_minus)]$value_[[-$arg(_minus)]$value_]"));
std::string str = Value;
CParserLine line;
line.ParseString(parser, str);
if (!line.m_ParseOK)
{
// TODO Gee: Parsing failed
return false;
}
float values[4];
values[3] = DefaultAlpha;
for (int i=0; i<(int)line.GetArgCount(); ++i)
{
if (!line.GetArgFloat(i, values[i]))
{
// Parsing failed
return false;
}
}
r = values[0]/255.f;
g = values[1]/255.f;
b = values[2]/255.f;
a = values[3]/255.f;
return true;
}
/*************************************************************************/
bool CColor::operator == (const CColor &color) const
{
return r==color.r &&
g==color.g &&
b==color.b &&
a==color.a;
}
/*************************************************************************/
CRect::CRect() :
left(0.f), top(0.f), right(0.f), bottom(0.f)
{
}
CRect::CRect(const CPos &pos) :
left(pos.x), top(pos.y), right(pos.x), bottom(pos.y)
{
}
CRect::CRect(const CSize &size) :
left(0.f), top(0.f), right(size.cx), bottom(size.cy)
{
}
CRect::CRect(const CPos &upperleft, const CPos &bottomright) :
left(upperleft.x), top(upperleft.y), right(bottomright.x), bottom(bottomright.y)
{
}
CRect::CRect(const CPos &pos, const CSize &size) :
left(pos.x), top(pos.y), right((pos.x+size.cx)), bottom((pos.y+size.cy))
{
}
CRect::CRect(const float l, const float t, const float r, const float b) :
left(l), top(t), right(r), bottom(b)
{
}
// =
void CRect::operator = (const CRect& a)
{
left = a.left;
top = a.top;
right = a.right;
bottom = a.bottom;
}
// ==
bool CRect::operator ==(const CRect &a) const
{
return (left==a.left &&
top==a.top &&
right==a.right &&
bottom==a.bottom);
}
// !=
bool CRect::operator != (const CRect& a) const
{
return !(*this==a);
}
// - (the unary operator)
CRect CRect::operator - (void) const
{
return CRect(-left, -top, -right, -bottom);
}
// + (the unary operator)
CRect CRect::operator + (void) const
{
return *this;
}
// +
CRect CRect::operator + (const CRect& a) const
{
return CRect(left+a.left, top+a.top, right+a.right, bottom+a.bottom);
}
// +
CRect CRect::operator + (const CPos& a) const
{
return CRect(left+a.x, top+a.y, right+a.x, bottom+a.y);
}
// +
CRect CRect::operator + (const CSize& a) const
{
return CRect(left+a.cx, top+a.cy, right+a.cx, bottom+a.cy);
}
// -
CRect CRect::operator - (const CRect& a) const
{
return CRect(left-a.left, top-a.top, right-a.right, bottom-a.bottom);
}
// -
CRect CRect::operator - (const CPos& a) const
{
return CRect(left-a.x, top-a.y, right-a.x, bottom-a.y);
}
// -
CRect CRect::operator - (const CSize& a) const
{
return CRect(left-a.cx, top-a.cy, right-a.cx, bottom-a.cy);
}
// +=
void CRect::operator +=(const CRect& a)
{
left += a.left;
top += a.top;
right += a.right;
bottom += a.bottom;
}
// +=
void CRect::operator +=(const CPos& a)
{
left += a.x;
top += a.y;
right += a.x;
bottom += a.y;
}
// +=
void CRect::operator +=(const CSize& a)
{
left += a.cx;
top += a.cy;
right += a.cx;
bottom += a.cy;
}
// -=
void CRect::operator -=(const CRect& a)
{
left -= a.left;
top -= a.top;
right -= a.right;
bottom -= a.bottom;
}
// -=
void CRect::operator -=(const CPos& a)
{
left -= a.x;
top -= a.y;
right -= a.x;
bottom -= a.y;
}
// -=
void CRect::operator -=(const CSize& a)
{
left -= a.cx;
top -= a.cy;
right -= a.cx;
bottom -= a.cy;
}
float CRect::GetWidth() const
{
return right-left;
}
float CRect::GetHeight() const
{
return bottom-top;
}
CSize CRect::GetSize() const
{
return CSize(right-left, bottom-top);
}
CPos CRect::TopLeft() const
{
return CPos(left, top);
}
CPos CRect::BottomRight() const
{
return CPos(right, right);
}
CPos CRect::CenterPoint() const
{
return CPos((left+right)/2.f, (top+bottom)/2.f);
}
bool CRect::PointInside(const CPos &point) const
{
return (point.x >= left &&
point.x <= right &&
point.y >= top &&
point.y <= bottom);
}
CRect CRect::Scale(float x, float y) const
{
return CRect(left*x, top*y, right*x, bottom*y);
}
/*************************************************************************/
CPos::CPos() : x(0.f), y(0.f)
{
}
CPos::CPos(const CSize& s) : x(s.cx), y(s.cy)
{
}
CPos::CPos(const float &_x, const float &_y) : x(_x), y(_y)
{
}
// =
void CPos::operator = (const CPos& a)
{
x = a.x;
y = a.y;
}
// ==
bool CPos::operator ==(const CPos &a) const
{
return (x==a.x && y==a.y);
}
// !=
bool CPos::operator != (const CPos& a) const
{
return !(*this==a);
}
// - (the unary operator)
CPos CPos::operator - (void) const
{
return CPos(-x, -y);
}
// + (the unary operator)
CPos CPos::operator + (void) const
{
return *this;
}
// +
CPos CPos::operator + (const CPos& a) const
{
return CPos(x+a.x, y+a.y);
}
// +
CPos CPos::operator + (const CSize& a) const
{
return CPos(x+a.cx, y+a.cy);
}
// -
CPos CPos::operator - (const CPos& a) const
{
return CPos(x-a.x, y-a.y);
}
// -
CPos CPos::operator - (const CSize& a) const
{
return CPos(x-a.cx, y-a.cy);
}
// +=
void CPos::operator +=(const CPos& a)
{
x += a.x;
y += a.y;
}
// +=
void CPos::operator +=(const CSize& a)
{
x += a.cx;
y += a.cy;
}
// -=
void CPos::operator -=(const CPos& a)
{
x -= a.x;
y -= a.y;
}
// -=
void CPos::operator -=(const CSize& a)
{
x -= a.cx;
y -= a.cy;
}
/*************************************************************************/
CSize::CSize() : cx(0.f), cy(0.f)
{
}
CSize::CSize(const CRect &rect) : cx(rect.GetWidth()), cy(rect.GetHeight())
{
}
CSize::CSize(const CPos &pos) : cx(pos.x), cy(pos.y)
{
}
CSize::CSize(const float &_cx, const float &_cy) : cx(_cx), cy(_cy)
{
}
// =
void CSize::operator = (const CSize& a)
{
cx = a.cx;
cy = a.cy;
}
// ==
bool CSize::operator ==(const CSize &a) const
{
return (cx==a.cx && cy==a.cy);
}
// !=
bool CSize::operator != (const CSize& a) const
{
return !(*this==a);
}
// - (the unary operator)
CSize CSize::operator - (void) const
{
return CSize(-cx, -cy);
}
// + (the unary operator)
CSize CSize::operator + (void) const
{
return *this;
}
// +
CSize CSize::operator + (const CSize& a) const
{
return CSize(cx+a.cx, cy+a.cy);
}
// -
CSize CSize::operator - (const CSize& a) const
{
return CSize(cx-a.cx, cy-a.cy);
}
// /
CSize CSize::operator / (const float& a) const
{
return CSize(cx/a, cy/a);
}
// *
CSize CSize::operator * (const float& a) const
{
return CSize(cx*a, cy*a);
}
// +=
void CSize::operator +=(const CSize& a)
{
cx += a.cx;
cy += a.cy;
}
// -=
void CSize::operator -=(const CSize& a)
{
cx -= a.cx;
cy -= a.cy;
}
// /=
void CSize::operator /=(const float& a)
{
cx /= a;
cy /= a;
}
// *=
void CSize::operator *=(const float& a)
{
cx *= a;
cy *= a;
}