MyGUI  3.0.1
MyGUI_ICroppedRectangle.h
Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009 
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014 
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019 
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00022 */
00023 #ifndef __MYGUI_I_CROPPED_RECTANGLE_H__
00024 #define __MYGUI_I_CROPPED_RECTANGLE_H__
00025 
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Types.h"
00028 
00029 namespace MyGUI
00030 {
00031 
00032     class MYGUI_EXPORT ICroppedRectangle
00033     {
00034     public:
00035         ICroppedRectangle() :
00036             mIsMargin(false),
00037             mCroppedParent(nullptr),
00038             mVisible(true),
00039             mAlign(Align::Default)
00040         { }
00041 
00042         virtual ~ICroppedRectangle() { }
00043 
00045         ICroppedRectangle * getCroppedParent() { return mCroppedParent; }
00046 
00048         virtual void setCoord(const IntCoord& _value) { mCoord = _value; }
00050         const IntCoord& getCoord() const { return mCoord; }
00051 
00053         virtual void setPosition(const IntPoint& _value) { mCoord.left = _value.left; mCoord.top = _value.top; }
00055         IntPoint getPosition() const { return mCoord.point(); }
00056 
00058         virtual void setSize(const IntSize& _value) { mCoord.width = _value.width; mCoord.height = _value.height; }
00060         IntSize getSize() const { return mCoord.size(); }
00061 
00063         virtual void setVisible(bool _value) { mVisible = _value; }
00065         bool isVisible() const { return mVisible; }
00066 
00068         const IntPoint& getAbsolutePosition() const { return mAbsolutePosition; }
00070         IntRect getAbsoluteRect() const { return IntRect(mAbsolutePosition.left, mAbsolutePosition.top, mAbsolutePosition.left+mCoord.width, mAbsolutePosition.top+mCoord.height); }
00072         IntCoord getAbsoluteCoord() const { return IntCoord(mAbsolutePosition.left, mAbsolutePosition.top, mCoord.width, mCoord.height); }
00073 
00075         int getAbsoluteLeft() const { return mAbsolutePosition.left; }
00077         int getAbsoluteTop() const { return mAbsolutePosition.top; }
00078 
00080         virtual void setAlign(Align _value) { mAlign = _value; }
00082         Align getAlign() const { return mAlign; }
00083 
00085         int getLeft() const { return mCoord.left; }
00087         int getRight() const { return mCoord.right(); }
00089         int getTop() const { return mCoord.top; }
00091         int getBottom() const { return mCoord.bottom(); }
00093         int getWidth() const { return mCoord.width; }
00095         int getHeight() const { return mCoord.height; }
00096 
00097 
00098     /*internal:*/
00100         bool _isMargin() const { return mIsMargin; }
00101 
00102         // Get cropped by parent rectangle coordinates
00103         int _getViewLeft() const { return mCoord.left + mMargin.left; }
00104         int _getViewRight() const { return mCoord.right() - mMargin.right; }
00105         int _getViewTop() const { return mCoord.top + mMargin.top; }
00106         int _getViewBottom() const { return mCoord.bottom() - mMargin.bottom; }
00107         int _getViewWidth() const { return mCoord.width - mMargin.left - mMargin.right; }
00108         int _getViewHeight() const { return mCoord.height - mMargin.top - mMargin.bottom; }
00109 
00110         virtual void _updateView() { }
00111         virtual void _correctView() { }
00112         virtual void _setAlign(const IntSize& _oldsize, bool _update)  { }
00113         virtual void _setAlign(const IntCoord& _oldcoord, bool _update) { }
00114 
00115         void _setCroppedParent(ICroppedRectangle* _parent) { mCroppedParent = _parent; }
00116 
00117         const IntRect& _getMargin() const { return mMargin; }
00118         int _getMarginLeft() const { return mMargin.left; }
00119         int _getMarginRight() const { return mMargin.right; }
00120         int _getMarginTop() const { return mMargin.top; }
00121         int _getMarginBottom() const { return mMargin.bottom; }
00122 
00123     /*obsolete:*/
00124 #ifndef MYGUI_DONT_USE_OBSOLETE
00125 
00126         MYGUI_OBSOLETE("use : void ICroppedRectangle::setVisible(bool _visible)")
00127         void show() { setVisible(true); }
00128         MYGUI_OBSOLETE("use : void ICroppedRectangle::setVisible(bool _visible)")
00129         void hide() { setVisible(false); }
00130         MYGUI_OBSOLETE("use : bool ICroppedRectangle::isVisible()")
00131         bool isShow() { return isVisible(); }
00132 
00133 #endif // MYGUI_DONT_USE_OBSOLETE
00134 
00135     protected:
00136         bool _checkPoint(int _left, int _top)
00137         {
00138             return ! ((_getViewLeft() > _left) || (_getViewTop() > _top) || (_getViewRight() < _left) || (_getViewBottom() < _top));
00139         }
00140 
00141         bool _checkMargin()
00142         {
00143             bool margin = false;
00144             //вылезли ли налево
00145             if (getLeft() < mCroppedParent->mMargin.left)
00146             {
00147                 mMargin.left = mCroppedParent->mMargin.left - getLeft();
00148                 margin = true;
00149             }
00150             else
00151             {
00152                 mMargin.left = 0;
00153             }
00154 
00155             //вылезли ли направо
00156             if (getRight() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right)
00157             {
00158                 mMargin.right = getRight() - (mCroppedParent->getWidth() - mCroppedParent->mMargin.right);
00159                 margin = true;
00160             }
00161             else
00162             {
00163                 mMargin.right = 0;
00164             }
00165 
00166             //вылезли ли вверх
00167             if (getTop() < mCroppedParent->mMargin.top)
00168             {
00169                 mMargin.top = mCroppedParent->mMargin.top - getTop();
00170                 margin = true;
00171             }
00172             else
00173             {
00174                 mMargin.top = 0;
00175             }
00176 
00177             //вылезли ли вниз
00178             if (getBottom() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom)
00179             {
00180                 mMargin.bottom = getBottom() - (mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom);
00181                 margin = true;
00182             }
00183             else
00184             {
00185                 mMargin.bottom = 0;
00186             }
00187 
00188             return margin;
00189         }
00190 
00191         bool _checkOutside() // проверка на полный выход за границу
00192         {
00193             return ( (getRight() < mCroppedParent->mMargin.left ) || // совсем уехали налево
00194                 (getLeft() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right ) || // совсем уехали направо
00195                 (getBottom() < mCroppedParent->mMargin.top  ) || // совсем уехали вверх
00196                 (getTop() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom ) );  // совсем уехали вниз
00197         }
00198 
00199     protected:
00200         bool mIsMargin;
00201         IntRect mMargin; // перекрытие
00202         IntCoord mCoord; // координаты
00203         IntPoint mAbsolutePosition; // обсолютные координаты
00204 
00205         ICroppedRectangle * mCroppedParent;
00206         bool mVisible;
00207         Align mAlign;
00208 
00209     };
00210 
00211 } // namespace MyGUI
00212 
00213 #endif // __MYGUI_I_CROPPED_RECTANGLE_H__