genesis-3d_engine/Engine/addons/myguiengine/include/MyGUI_Align.h
zhongdaohuan 6e8fbca745 genesis-3d engine version 1.3.
match the genesis editor version 1.3.0.653.
2014-05-05 14:50:33 +08:00

270 lines
6.8 KiB
C++

/*!
@file
@author Albert Semenov
@date 08/2008
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MYGUI_ALIGN_H__
#define __MYGUI_ALIGN_H__
#include "MyGUI_Prerequest.h"
#include "MyGUI_Macros.h"
#include "MyGUI_Diagnostic.h"
#include "MyGUI_StringUtility.h"
#include <map>
namespace MyGUI
{
struct MYGUI_EXPORT Align
{
enum Enum
{
HCenter = MYGUI_FLAG_NONE, /**< center horizontally */
VCenter = MYGUI_FLAG_NONE, /**< center vertically */
Center = HCenter | VCenter, /**< center in the dead center */
Left = MYGUI_FLAG(1), /**< value from the left (and center vertically) */
Right = MYGUI_FLAG(2), /**< value from the right (and center vertically) */
HStretch = Left | Right, /**< stretch horizontally proportionate to parent window (and center vertically) */
Top = MYGUI_FLAG(3), /**< value from the top (and center horizontally) */
Bottom = MYGUI_FLAG(4), /**< value from the bottom (and center horizontally) */
VStretch = Top | Bottom, /**< stretch vertically proportionate to parent window (and center horizontally) */
Stretch = HStretch | VStretch, /**< stretch proportionate to parent window */
Default = Left | Top /**< default value (value from left and top) */
};
Align(Enum _value = Default) :
value(_value)
{
}
bool isHCenter() const
{
return HCenter == (value & ((int)HStretch));
}
bool isVCenter() const
{
return VCenter == (value & ((int)VStretch));
}
bool isCenter() const
{
return Center == (value & ((int)Stretch));
}
bool isLeft() const
{
return Left == (value & ((int)HStretch));
}
bool isRight() const
{
return Right == (value & ((int)HStretch));
}
bool isHStretch() const
{
return HStretch == (value & ((int)HStretch));
}
bool isTop() const
{
return Top == (value & ((int)VStretch));
}
bool isBottom() const
{
return (Bottom == (value & ((int)VStretch)));
}
bool isVStretch() const
{
return (VStretch == (value & ((int)VStretch)));
}
bool isStretch() const
{
return (Stretch == (value & ((int)Stretch)));
}
bool isDefault() const
{
return (Default == (value & ((int)Stretch)));
}
Align& operator |= (Align const& _other)
{
value = Enum(int(value) | int(_other.value));
return *this;
}
friend Align operator | (Enum const& a, Enum const& b)
{
return Align(Enum(int(a) | int(b)));
}
friend Align operator | (Align const& a, Align const& b)
{
return Align(Enum(int(a.value) | int(b.value)));
}
friend bool operator == (Align const& a, Align const& b)
{
return a.value == b.value;
}
friend bool operator != (Align const& a, Align const& b)
{
return a.value != b.value;
}
typedef std::map<std::string, int> MapAlign;
static Align parse(const std::string& _value)
{
Align result(Enum(0));
const MapAlign& map_names = result.getValueNames();
const std::vector<std::string>& vec = utility::split(_value);
for (size_t pos = 0; pos < vec.size(); pos++)
{
MapAlign::const_iterator iter = map_names.find(vec[pos]);
if (iter != map_names.end())
{
result.value = Enum(int(result.value) | int(iter->second));
}
}
return result;
}
std::string print() const
{
std::string result;
if (value & Left)
{
if (value & Right)
result = "HStretch";
else
result = "Left";
}
else if (value & Right)
result = "Right";
else
result = "HCenter";
if (value & Top)
{
if (value & Bottom)
result += " VStretch";
else
result += " Top";
}
else if (value & Bottom)
result += " Bottom";
else
result += " VCenter";
return result;
}
friend std::ostream& operator << ( std::ostream& _stream, const Align& _value )
{
_stream << _value.print();
return _stream;
}
friend std::istream& operator >> ( std::istream& _stream, Align& _value )
{
_value.value = Enum(0);
std::string value;
_stream >> value;
const MapAlign& map_names = _value.getValueNames();
MapAlign::const_iterator iter = map_names.find(value);
if (iter != map_names.end())
_value.value = Enum(int(_value.value) | int(iter->second));
if (!_stream.eof())
{
std::string value2;
_stream >> value2;
iter = map_names.find(value2);
if (iter != map_names.end())
_value.value = Enum(int(_value.value) | int(iter->second));
}
return _stream;
}
//- zhaoxiaohang add this function here for the script binding,I will write the reason below.
//- because we need to use the enum (Align::Enum) as a param in the script function ICall_getAlign and ICall_setAlign
//- in the function setAlign, because struct has only one member(Align::Enum value),the c plus plus can convert it form an int(enum) to the strunt Align aotomatically.
//- but in the function getAlign,we use struct Align as the return value,but we use an int(enum) to get int in the c sharp code,this is dangource,because I don't know
//- what will happen(what I only know is that it caused a bad memory.I've got no more details).
int GetValue()
{
return value;
}
private:
const MapAlign& getValueNames() const
{
static MapAlign map_names;
if (map_names.empty())
{
// OBSOLETE
map_names["ALIGN_HCENTER"] = HCenter;
map_names["ALIGN_VCENTER"] = VCenter;
map_names["ALIGN_CENTER"] = Center;
map_names["ALIGN_LEFT"] = Left;
map_names["ALIGN_RIGHT"] = Right;
map_names["ALIGN_HSTRETCH"] = HStretch;
map_names["ALIGN_TOP"] = Top;
map_names["ALIGN_BOTTOM"] = Bottom;
map_names["ALIGN_VSTRETCH"] = VStretch;
map_names["ALIGN_STRETCH"] = Stretch;
map_names["ALIGN_DEFAULT"] = Default;
MYGUI_REGISTER_VALUE(map_names, HCenter);
MYGUI_REGISTER_VALUE(map_names, VCenter);
MYGUI_REGISTER_VALUE(map_names, Center);
MYGUI_REGISTER_VALUE(map_names, Left);
MYGUI_REGISTER_VALUE(map_names, Right);
MYGUI_REGISTER_VALUE(map_names, HStretch);
MYGUI_REGISTER_VALUE(map_names, Top);
MYGUI_REGISTER_VALUE(map_names, Bottom);
MYGUI_REGISTER_VALUE(map_names, VStretch);
MYGUI_REGISTER_VALUE(map_names, Stretch);
MYGUI_REGISTER_VALUE(map_names, Default);
}
return map_names;
}
private:
Enum value;
};
} // namespace MyGUI
#endif // __MYGUI_ALIGN_H__