genesis-3d_engine/Engine/addons/myguiengine/include/MyGUI_ICroppedRectangle.h

270 lines
5.9 KiB
C
Raw Normal View History

/*!
@file
@author Georgiy Evmenov
@date 11/2007
*/
/*
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_I_CROPPED_RECTANGLE_H__
#define __MYGUI_I_CROPPED_RECTANGLE_H__
#include "MyGUI_Prerequest.h"
#include "MyGUI_Types.h"
namespace MyGUI
{
class MYGUI_EXPORT ICroppedRectangle
{
public:
ICroppedRectangle() :
mIsMargin(false),
mCroppedParent(nullptr)
{ }
virtual ~ICroppedRectangle() { }
/** Get parent ICroppedRectangle */
ICroppedRectangle* getCroppedParent()
{
return mCroppedParent;
}
/** Set position */
virtual void setPosition(const IntPoint& _value)
{
mCoord.left = _value.left;
mCoord.top = _value.top;
}
/** Set size */
virtual void setSize(const IntSize& _value)
{
mCoord.width = _value.width;
mCoord.height = _value.height;
}
/** Set coordinates (position and size) */
virtual void setCoord(const IntCoord& _value)
{
mCoord = _value;
}
/** Get position */
IntPoint getPosition() const
{
return mCoord.point();
}
/** Get size */
IntSize getSize() const
{
return mCoord.size();
}
/** Get coordinates (position and size) */
const IntCoord& getCoord() const
{
return mCoord;
}
/** Get position in screen coordinates */
const IntPoint& getAbsolutePosition() const
{
return mAbsolutePosition;
}
/** Get rectangle in screen coordinates */
IntRect getAbsoluteRect() const
{
return IntRect(mAbsolutePosition.left, mAbsolutePosition.top, mAbsolutePosition.left + mCoord.width, mAbsolutePosition.top + mCoord.height);
}
/** Get coordinate in screen coordinates */
IntCoord getAbsoluteCoord() const
{
return IntCoord(mAbsolutePosition.left, mAbsolutePosition.top, mCoord.width, mCoord.height);
}
/** Get X in screen coordinates */
int getAbsoluteLeft() const
{
return mAbsolutePosition.left;
}
/** Get Y in screen coordinates */
int getAbsoluteTop() const
{
return mAbsolutePosition.top;
}
/** Get left x-coordinate */
int getLeft() const
{
return mCoord.left;
}
/** Get right x-coordinate */
int getRight() const
{
return mCoord.right();
}
/** Get top y-coordinate */
int getTop() const
{
return mCoord.top;
}
/** Get bottom y-coordinate */
int getBottom() const
{
return mCoord.bottom();
}
/** Get width */
int getWidth() const
{
return mCoord.width;
}
/** Get height */
int getHeight() const
{
return mCoord.height;
}
/*internal:*/
/** True if rectangle is cropped by parent rectangle */
bool _isMargin() const
{
return mIsMargin;
}
// Get cropped by parent rectangle coordinates
int _getViewLeft() const
{
return mCoord.left + mMargin.left;
}
int _getViewRight() const
{
return mCoord.right() - mMargin.right;
}
int _getViewTop() const
{
return mCoord.top + mMargin.top;
}
int _getViewBottom() const
{
return mCoord.bottom() - mMargin.bottom;
}
int _getViewWidth() const
{
return mCoord.width - mMargin.left - mMargin.right;
}
int _getViewHeight() const
{
return mCoord.height - mMargin.top - mMargin.bottom;
}
void _setCroppedParent(ICroppedRectangle* _parent)
{
mCroppedParent = _parent;
}
const IntRect& _getMargin() const
{
return mMargin;
}
int _getMarginLeft() const
{
return mMargin.left;
}
int _getMarginRight() const
{
return mMargin.right;
}
int _getMarginTop() const
{
return mMargin.top;
}
int _getMarginBottom() const
{
return mMargin.bottom;
}
protected:
bool _checkMargin()
{
bool margin = false;
//вылезли ли налево
if (getLeft() < mCroppedParent->mMargin.left)
{
mMargin.left = mCroppedParent->mMargin.left - getLeft();
margin = true;
}
else
{
mMargin.left = 0;
}
//вылезли ли направо
if (getRight() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right)
{
mMargin.right = getRight() - (mCroppedParent->getWidth() - mCroppedParent->mMargin.right);
margin = true;
}
else
{
mMargin.right = 0;
}
//вылезли ли вверх
if (getTop() < mCroppedParent->mMargin.top)
{
mMargin.top = mCroppedParent->mMargin.top - getTop();
margin = true;
}
else
{
mMargin.top = 0;
}
//вылезли ли вниз
if (getBottom() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom)
{
mMargin.bottom = getBottom() - (mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom);
margin = true;
}
else
{
mMargin.bottom = 0;
}
return margin;
}
bool _checkOutside() const // проверка на полный выход за границу
{
return ( (getRight() < mCroppedParent->mMargin.left ) || // совсем уехали налево
(getLeft() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right ) || // совсем уехали направо
(getBottom() < mCroppedParent->mMargin.top ) || // совсем уехали вверх
(getTop() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom ) ); // совсем уехали вниз
}
protected:
IntRect mMargin; // перекрытие
IntCoord mCoord; // координаты
IntPoint mAbsolutePosition; // обсолютные координаты
bool mIsMargin;
ICroppedRectangle* mCroppedParent;
};
} // namespace MyGUI
#endif // __MYGUI_I_CROPPED_RECTANGLE_H__