2014-03-11 17:13:54 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2013-2014 Chukong Technologies Inc.
|
|
|
|
|
|
|
|
http://www.cocos2d-x.org
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __UIWIDGET_H__
|
|
|
|
#define __UIWIDGET_H__
|
|
|
|
|
2014-07-31 16:38:55 +08:00
|
|
|
#include "2d/CCProtectedNode.h"
|
2014-03-11 17:13:54 +08:00
|
|
|
#include "ui/UILayoutParameter.h"
|
|
|
|
#include "ui/GUIDefine.h"
|
2014-07-21 17:45:56 +08:00
|
|
|
#include "ui/GUIExport.h"
|
2014-06-04 14:26:21 +08:00
|
|
|
#include "base/CCMap.h"
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
|
2014-06-04 14:26:21 +08:00
|
|
|
class EventListenerTouchOneByOne;
|
|
|
|
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
namespace ui {
|
2014-05-09 11:28:36 +08:00
|
|
|
|
2014-07-10 00:45:27 +08:00
|
|
|
typedef enum
|
2014-03-11 17:13:54 +08:00
|
|
|
{
|
|
|
|
TOUCH_EVENT_BEGAN,
|
|
|
|
TOUCH_EVENT_MOVED,
|
|
|
|
TOUCH_EVENT_ENDED,
|
|
|
|
TOUCH_EVENT_CANCELED
|
|
|
|
}TouchEventType;
|
2014-05-04 11:23:20 +08:00
|
|
|
|
2014-07-10 00:45:27 +08:00
|
|
|
typedef void (Ref::*SEL_TouchEvent)(Ref*,TouchEventType);
|
2014-03-11 17:13:54 +08:00
|
|
|
#define toucheventselector(_SELECTOR) (SEL_TouchEvent)(&_SELECTOR)
|
2014-05-09 11:28:36 +08:00
|
|
|
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
/**
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2014-05-13 00:26:39 +08:00
|
|
|
|
|
|
|
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
|
|
|
#ifdef ABSOLUTE
|
|
|
|
#undef ABSOLUTE
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2014-07-21 17:45:56 +08:00
|
|
|
class CC_GUI_DLL Widget : public ProtectedNode, public LayoutParameterProtocol
|
2014-03-11 17:13:54 +08:00
|
|
|
{
|
|
|
|
public:
|
2014-05-08 18:10:21 +08:00
|
|
|
enum class FocusDirection
|
|
|
|
{
|
|
|
|
LEFT,
|
|
|
|
RIGHT,
|
|
|
|
UP,
|
|
|
|
DOWN
|
|
|
|
};
|
|
|
|
|
2014-05-08 18:25:49 +08:00
|
|
|
enum class PositionType
|
|
|
|
{
|
|
|
|
ABSOLUTE,
|
|
|
|
PERCENT
|
|
|
|
};
|
|
|
|
|
2014-05-09 09:37:51 +08:00
|
|
|
enum class SizeType
|
|
|
|
{
|
|
|
|
ABSOLUTE,
|
|
|
|
PERCENT
|
|
|
|
};
|
|
|
|
|
2014-05-09 11:28:36 +08:00
|
|
|
enum class TouchEventType
|
|
|
|
{
|
|
|
|
BEGAN,
|
|
|
|
MOVED,
|
|
|
|
ENDED,
|
|
|
|
CANCELED
|
|
|
|
};
|
2014-05-09 14:56:05 +08:00
|
|
|
|
|
|
|
enum class TextureResType
|
|
|
|
{
|
|
|
|
LOCAL = 0,
|
|
|
|
PLIST = 1
|
|
|
|
};
|
2014-05-09 15:16:33 +08:00
|
|
|
|
2014-05-09 15:23:34 +08:00
|
|
|
enum class BrightStyle
|
|
|
|
{
|
|
|
|
NONE = -1,
|
|
|
|
NORMAL,
|
|
|
|
HIGHLIGHT
|
|
|
|
};
|
2014-05-09 11:28:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
typedef std::function<void(Ref*,Widget::TouchEventType)> ccWidgetTouchCallback;
|
2014-08-21 10:21:07 +08:00
|
|
|
typedef std::function<void(Ref*)> ccWidgetClickCallback;
|
2014-06-09 10:41:17 +08:00
|
|
|
/**
|
|
|
|
* Default constructor
|
|
|
|
*/
|
|
|
|
Widget(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default destructor
|
|
|
|
*/
|
|
|
|
virtual ~Widget();
|
2014-03-11 17:13:54 +08:00
|
|
|
/**
|
|
|
|
* Allocates and initializes a widget.
|
|
|
|
*/
|
|
|
|
static Widget* create();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets whether the widget is enabled
|
2014-05-13 14:56:44 +08:00
|
|
|
*
|
|
|
|
* true if the widget is enabled, widget may be touched , false if the widget is disabled, widget cannot be touched.
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* The default value is true, a widget is default to enabled
|
|
|
|
*
|
2014-05-13 14:56:44 +08:00
|
|
|
* @param enabled
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
|
|
|
virtual void setEnabled(bool enabled);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determines if the widget is enabled
|
|
|
|
*
|
|
|
|
* @return true if the widget is enabled, false if the widget is disabled.
|
|
|
|
*/
|
|
|
|
bool isEnabled() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets whether the widget is bright
|
|
|
|
*
|
|
|
|
* The default value is true, a widget is default to bright
|
|
|
|
*
|
|
|
|
* @param visible true if the widget is bright, false if the widget is dark.
|
|
|
|
*/
|
|
|
|
void setBright(bool bright);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determines if the widget is bright
|
|
|
|
*
|
|
|
|
* @return true if the widget is bright, false if the widget is dark.
|
|
|
|
*/
|
|
|
|
bool isBright() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets whether the widget is touch enabled
|
|
|
|
*
|
|
|
|
* The default value is false, a widget is default to touch disabled
|
|
|
|
*
|
|
|
|
* @param visible true if the widget is touch enabled, false if the widget is touch disabled.
|
|
|
|
*/
|
|
|
|
virtual void setTouchEnabled(bool enabled);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To set the bright style of widget.
|
|
|
|
*
|
|
|
|
* @see BrightStyle
|
|
|
|
*
|
2014-07-16 10:08:23 +08:00
|
|
|
* @param style BrightStyle::NORMAL means the widget is in normal state, BrightStyle::HIGHLIGHT means the widget is in highlight state.
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
|
|
|
void setBrightStyle(BrightStyle style);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determines if the widget is touch enabled
|
|
|
|
*
|
|
|
|
* @return true if the widget is touch enabled, false if the widget is touch disabled.
|
|
|
|
*/
|
|
|
|
bool isTouchEnabled() const;
|
|
|
|
|
|
|
|
/**
|
2014-05-04 10:19:11 +08:00
|
|
|
* Determines if the widget is highlighted
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
2014-05-04 10:19:11 +08:00
|
|
|
* @return true if the widget is highlighted, false if the widget is not hignlighted .
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
2014-05-06 12:04:52 +08:00
|
|
|
bool isHighlighted() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-05-04 10:19:11 +08:00
|
|
|
* Sets whether the widget is hilighted
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
2014-05-04 10:19:11 +08:00
|
|
|
* The default value is false, a widget is default to not hilighted
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
2014-05-04 10:19:11 +08:00
|
|
|
* @param hilight true if the widget is hilighted, false if the widget is not hilighted.
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
2014-05-06 12:04:52 +08:00
|
|
|
void setHighlighted(bool hilight);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-07-16 10:08:23 +08:00
|
|
|
* Gets the left boundary position of this widget in parent's coordination system.
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @return The left boundary position of this widget.
|
|
|
|
*/
|
2014-05-19 16:51:25 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE float getLeftInParent(){return this->getLeftBoundary();}
|
|
|
|
float getLeftBoundary() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-07-16 10:08:23 +08:00
|
|
|
* Gets the bottom boundary position of this widget in parent's coordination system.
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @return The bottom boundary position of this widget.
|
|
|
|
*/
|
2014-05-19 16:51:25 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE float getBottomInParent(){return this->getBottomBoundary();}
|
|
|
|
float getBottomBoundary() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-07-16 10:08:23 +08:00
|
|
|
* Gets the right boundary position of this widget in parent's coordination system.
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @return The right boundary position of this widget.
|
|
|
|
*/
|
2014-05-19 16:51:25 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE float getRightInParent(){return this->getRightBoundary();}
|
|
|
|
float getRightBoundary() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-07-16 10:08:23 +08:00
|
|
|
* Gets the top boundary position of this widget in parent's coordination system.
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @return The top boundary position of this widget.
|
|
|
|
*/
|
2014-05-19 16:51:25 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE float getTopInParent(){return this->getTopBoundary();}
|
|
|
|
float getTopBoundary() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
2014-05-31 07:42:05 +08:00
|
|
|
virtual void visit(cocos2d::Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags) override;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-08-21 10:21:07 +08:00
|
|
|
* Sets the touch event target/selector to the widget
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
2014-05-09 11:28:36 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE void addTouchEventListener(Ref* target,SEL_TouchEvent selector);
|
2014-08-21 10:21:07 +08:00
|
|
|
void addTouchEventListener(const ccWidgetTouchCallback& callback);
|
|
|
|
/**
|
|
|
|
* Set a click event handler to the widget
|
|
|
|
*/
|
|
|
|
void addClickEventListener(const ccWidgetClickCallback& callback);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes the position (x,y) of the widget in OpenGL coordinates
|
|
|
|
*
|
2014-05-15 01:07:09 +08:00
|
|
|
* Usually we use p(x,y) to compose Vec2 object.
|
2014-03-11 17:13:54 +08:00
|
|
|
* The original point (0,0) is at the left-bottom corner of screen.
|
|
|
|
*
|
|
|
|
* @param position The position (x,y) of the widget in OpenGL coordinates
|
|
|
|
*/
|
2014-05-15 01:07:09 +08:00
|
|
|
virtual void setPosition(const Vec2 &pos) override;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
2014-07-15 15:56:07 +08:00
|
|
|
* Set the percent(x,y) of the widget in OpenGL coordinates
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @param percent The percent (x,y) of the widget in OpenGL coordinates
|
|
|
|
*/
|
2014-05-15 01:07:09 +08:00
|
|
|
void setPositionPercent(const Vec2 &percent);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the percent (x,y) of the widget in OpenGL coordinates
|
|
|
|
*
|
2014-05-15 01:07:09 +08:00
|
|
|
* @see setPosition(const Vec2&)
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
|
|
|
* @return The percent (x,y) of the widget in OpenGL coordinates
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
const Vec2& getPositionPercent()const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes the position type of the widget
|
|
|
|
*
|
|
|
|
* @see PositionType
|
|
|
|
*
|
|
|
|
* @param type the position type of widget
|
|
|
|
*/
|
|
|
|
void setPositionType(PositionType type);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the position type of the widget
|
|
|
|
*
|
|
|
|
* @see PositionType
|
|
|
|
*
|
|
|
|
* @return type the position type of widget
|
|
|
|
*/
|
|
|
|
PositionType getPositionType() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets whether the widget should be flipped horizontally or not.
|
|
|
|
*
|
|
|
|
* @param bFlippedX true if the widget should be flipped horizaontally, false otherwise.
|
|
|
|
*/
|
|
|
|
virtual void setFlippedX(bool flippedX);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the flag which indicates whether the widget is flipped horizontally or not.
|
|
|
|
*
|
|
|
|
* It only flips the texture of the widget, and not the texture of the widget's children.
|
|
|
|
* Also, flipping the texture doesn't alter the anchorPoint.
|
|
|
|
* If you want to flip the anchorPoint too, and/or to flip the children too use:
|
|
|
|
* widget->setScaleX(sprite->getScaleX() * -1);
|
|
|
|
*
|
|
|
|
* @return true if the widget is flipped horizaontally, false otherwise.
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
virtual bool isFlippedX()const{return _flippedX;};
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets whether the widget should be flipped vertically or not.
|
|
|
|
*
|
|
|
|
* @param bFlippedY true if the widget should be flipped vertically, flase otherwise.
|
|
|
|
*/
|
|
|
|
virtual void setFlippedY(bool flippedY);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the flag which indicates whether the widget is flipped vertically or not.
|
|
|
|
*
|
|
|
|
* It only flips the texture of the widget, and not the texture of the widget's children.
|
|
|
|
* Also, flipping the texture doesn't alter the anchorPoint.
|
|
|
|
* If you want to flip the anchorPoint too, and/or to flip the children too use:
|
|
|
|
* widget->setScaleY(widget->getScaleY() * -1);
|
|
|
|
*
|
|
|
|
* @return true if the widget is flipped vertically, flase otherwise.
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
virtual bool isFlippedY()const{return _flippedY;};
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/** @deprecated Use isFlippedX() instead */
|
|
|
|
CC_DEPRECATED_ATTRIBUTE bool isFlipX() { return isFlippedX(); };
|
|
|
|
/** @deprecated Use setFlippedX() instead */
|
|
|
|
CC_DEPRECATED_ATTRIBUTE void setFlipX(bool flipX) { setFlippedX(flipX); };
|
|
|
|
/** @deprecated Use isFlippedY() instead */
|
|
|
|
CC_DEPRECATED_ATTRIBUTE bool isFlipY() { return isFlippedY(); };
|
|
|
|
/** @deprecated Use setFlippedY() instead */
|
|
|
|
CC_DEPRECATED_ATTRIBUTE void setFlipY(bool flipY) { setFlippedY(flipY); };
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Checks a point if in parent's area.
|
|
|
|
*
|
|
|
|
* @param point
|
|
|
|
*
|
|
|
|
* @return true if the point is in parent's area, flase otherwise.
|
|
|
|
*/
|
2014-06-06 16:48:49 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE bool clippingParentAreaContainPoint(const Vec2 &pt){return this->isClippingParentContainsPoint(pt);}
|
|
|
|
bool isClippingParentContainsPoint(const Vec2& pt);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Gets the touch began point of widget when widget is selected.
|
|
|
|
*
|
|
|
|
* @return the touch began point.
|
|
|
|
*/
|
2014-06-06 16:48:49 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE const Vec2& getTouchStartPos()const{return this->getTouchBeganPosition();}
|
|
|
|
const Vec2& getTouchBeganPosition()const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Gets the touch move point of widget when widget is selected.
|
|
|
|
*
|
|
|
|
* @return the touch move point.
|
|
|
|
*/
|
2014-06-06 16:48:49 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE const Vec2& getTouchMovePos()const{ return this->getTouchMovePosition();}
|
|
|
|
const Vec2& getTouchMovePosition()const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Gets the touch end point of widget when widget is selected.
|
|
|
|
*
|
|
|
|
* @return the touch end point.
|
|
|
|
*/
|
2014-06-06 16:48:49 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE const Vec2& getTouchEndPos()const{return this->getTouchEndPosition();}
|
|
|
|
const Vec2& getTouchEndPosition()const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes the size that is widget's size
|
|
|
|
*
|
|
|
|
* @param size that is widget's size
|
|
|
|
*/
|
2014-06-20 11:18:53 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE virtual void setSize(const Size &size);
|
|
|
|
virtual void setContentSize(const Size& contentSize) override;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes the percent that is widget's percent size
|
|
|
|
*
|
|
|
|
* @param percent that is widget's percent size
|
|
|
|
*/
|
2014-05-15 01:07:09 +08:00
|
|
|
virtual void setSizePercent(const Vec2 &percent);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes the size type of widget.
|
|
|
|
*
|
|
|
|
* @see SizeType
|
|
|
|
*
|
|
|
|
* @param type that is widget's size type
|
|
|
|
*/
|
|
|
|
void setSizeType(SizeType type);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the size type of widget.
|
|
|
|
*
|
|
|
|
* @see SizeType
|
|
|
|
*
|
|
|
|
* @param type that is widget's size type
|
|
|
|
*/
|
|
|
|
SizeType getSizeType() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns size of widget
|
|
|
|
*
|
|
|
|
* @return size
|
|
|
|
*/
|
2014-06-20 11:18:53 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE const Size& getSize() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
const Size& getCustomSize() const;
|
2014-03-13 10:11:41 +08:00
|
|
|
|
2014-06-20 10:40:16 +08:00
|
|
|
virtual const Size& getLayoutSize() {return _contentSize;};
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns size percent of widget
|
|
|
|
*
|
|
|
|
* @return size percent
|
|
|
|
*/
|
2014-05-15 01:07:09 +08:00
|
|
|
const Vec2& getSizePercent() const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks a point if is in widget's space
|
|
|
|
*
|
|
|
|
* @param point
|
|
|
|
*
|
|
|
|
* @return true if the point is in widget's space, flase otherwise.
|
|
|
|
*/
|
2014-05-15 01:07:09 +08:00
|
|
|
virtual bool hitTest(const Vec2 &pt);
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
virtual bool onTouchBegan(Touch *touch, Event *unusedEvent);
|
|
|
|
virtual void onTouchMoved(Touch *touch, Event *unusedEvent);
|
|
|
|
virtual void onTouchEnded(Touch *touch, Event *unusedEvent);
|
|
|
|
virtual void onTouchCancelled(Touch *touch, Event *unusedEvent);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets a LayoutParameter to widget.
|
|
|
|
*
|
|
|
|
* @see LayoutParameter
|
|
|
|
*
|
|
|
|
* @param LayoutParameter pointer
|
|
|
|
*
|
|
|
|
* @param type Relative or Linear
|
|
|
|
*/
|
|
|
|
void setLayoutParameter(LayoutParameter* parameter);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets LayoutParameter of widget.
|
|
|
|
*
|
|
|
|
* @see LayoutParameter
|
|
|
|
*
|
|
|
|
* @param type Relative or Linear
|
|
|
|
*
|
|
|
|
* @return LayoutParameter
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
LayoutParameter* getLayoutParameter()const override;
|
2014-05-19 17:43:27 +08:00
|
|
|
CC_DEPRECATED_ATTRIBUTE LayoutParameter* getLayoutParameter(LayoutParameter::Type type);
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
2014-07-15 11:46:53 +08:00
|
|
|
* Note: when you set _ignoreSize to true, no matther you call setContentSize or not,
|
|
|
|
* the widget size is always equal to the return value of the member function getVirtualRendererSize.
|
|
|
|
*
|
|
|
|
* @param ignore, set member variabl _ignoreSize to ignore
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
|
|
|
virtual void ignoreContentAdaptWithSize(bool ignore);
|
|
|
|
|
|
|
|
/**
|
2014-07-15 11:46:53 +08:00
|
|
|
* Query whether the widget ignores user deinfed content size or not
|
2014-03-11 17:13:54 +08:00
|
|
|
*
|
2014-07-15 11:46:53 +08:00
|
|
|
* @return bool
|
2014-03-11 17:13:54 +08:00
|
|
|
*/
|
|
|
|
bool isIgnoreContentAdaptWithSize() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets world position of widget.
|
|
|
|
*
|
|
|
|
* @return world position of widget.
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
Vec2 getWorldPosition()const;
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the Virtual Renderer of widget.
|
|
|
|
*
|
|
|
|
* For example, a button's Virtual Renderer is it's texture renderer.
|
|
|
|
*
|
|
|
|
* @return Node pointer.
|
|
|
|
*/
|
|
|
|
virtual Node* getVirtualRenderer();
|
|
|
|
|
2014-07-15 11:46:53 +08:00
|
|
|
|
2014-04-17 14:08:25 +08:00
|
|
|
virtual const Size& getVirtualRendererSize() const;
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the "class name" of widget.
|
|
|
|
*/
|
|
|
|
virtual std::string getDescription() const override;
|
|
|
|
|
|
|
|
Widget* clone();
|
|
|
|
|
|
|
|
virtual void onEnter() override;
|
|
|
|
virtual void onExit() override;
|
|
|
|
|
|
|
|
void updateSizeAndPosition();
|
|
|
|
|
2014-03-13 10:11:41 +08:00
|
|
|
void updateSizeAndPosition(const Size& parentSize);
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
void setActionTag(int tag);
|
2014-05-27 10:19:05 +08:00
|
|
|
int getActionTag()const;
|
2014-03-21 13:44:29 +08:00
|
|
|
|
2014-08-15 15:28:28 +08:00
|
|
|
/**
|
|
|
|
*@brief Allow widget touch events to propagate to its parents. Set false will disable propagation
|
|
|
|
*/
|
|
|
|
void setPropagateTouchEvents(bool isPropagate);
|
|
|
|
bool isPropagateTouchEvents()const;
|
|
|
|
/**
|
|
|
|
*@brief Specify widget to swallow touches or not
|
|
|
|
*/
|
|
|
|
void setSwallowTouches(bool swallow);
|
|
|
|
bool isSwallowTouches()const;
|
|
|
|
|
2014-05-04 11:23:20 +08:00
|
|
|
/**
|
|
|
|
*@return whether the widget is focused or not
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
bool isFocused()const;
|
2014-05-04 11:23:20 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*@param focus pass true to let the widget get focus or pass false to let the widget lose focus
|
|
|
|
*@return void
|
|
|
|
*/
|
|
|
|
void setFocused(bool focus);
|
|
|
|
|
|
|
|
/**
|
|
|
|
*@return true represent the widget could accept focus, false represent the widget couldn't accept focus
|
|
|
|
*/
|
2014-05-27 10:19:05 +08:00
|
|
|
bool isFocusEnabled()const;
|
2014-05-04 11:23:20 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*@param enable pass true/false to enable/disable the focus ability of a widget
|
|
|
|
*@return void
|
|
|
|
*/
|
|
|
|
void setFocusEnabled(bool enable);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* When a widget is in a layout, you could call this method to get the next focused widget within a specified direction.
|
|
|
|
* If the widget is not in a layout, it will return itself
|
|
|
|
*@param dir the direction to look for the next focused widget in a layout
|
|
|
|
*@param current the current focused widget
|
|
|
|
*@return the next focused widget in a layout
|
|
|
|
*/
|
2014-05-07 14:26:41 +08:00
|
|
|
virtual Widget* findNextFocusedWidget(FocusDirection direction, Widget* current);
|
2014-05-04 11:23:20 +08:00
|
|
|
|
2014-05-07 10:23:57 +08:00
|
|
|
/**
|
|
|
|
* when a widget calls this method, it will get focus immediately.
|
|
|
|
*/
|
|
|
|
void requestFocus();
|
2014-05-26 22:57:50 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* no matter what widget object you call this method on , it will return you the exact one focused widget
|
|
|
|
* @param isWidget if your set isWidget to true, it will return the _realFocusedWidget which is always a widget
|
|
|
|
* otherwise, it will return a widget or a layout
|
|
|
|
*/
|
|
|
|
CC_DEPRECATED_ATTRIBUTE Widget* getCurrentFocusedWidget(bool isWidget){
|
|
|
|
CC_UNUSED_PARAM(isWidget);
|
|
|
|
return getCurrentFocusedWidget();
|
|
|
|
}
|
|
|
|
|
2014-05-27 10:19:05 +08:00
|
|
|
Widget* getCurrentFocusedWidget()const;
|
2014-05-27 13:49:00 +08:00
|
|
|
/*
|
|
|
|
* call this method with parameter true to enable the Android Dpad focus navigation feature
|
|
|
|
*@param enable set true to enable dpad focus navigation, otherwise disenable dpad focus navigation
|
|
|
|
*/
|
2014-05-26 22:57:50 +08:00
|
|
|
static void enableDpadNavigation(bool enable);
|
|
|
|
|
2014-06-06 16:48:49 +08:00
|
|
|
/**
|
|
|
|
* When a widget lose/get focus, this method will be called. Be Caution when you provide your own version,
|
|
|
|
* you must call widget->setFocused(true/false) to change the focus state of the current focused widget;
|
|
|
|
*/
|
2014-05-26 22:57:50 +08:00
|
|
|
std::function<void(Widget*,Widget*)> onFocusChanged;
|
2014-06-06 16:48:49 +08:00
|
|
|
/**
|
|
|
|
* use this function to manually specify the next focused widget regards to each direction
|
|
|
|
*/
|
2014-05-26 22:57:50 +08:00
|
|
|
std::function<Widget*(FocusDirection)> onNextFocusedWidget;
|
|
|
|
|
2014-03-21 13:44:29 +08:00
|
|
|
CC_CONSTRUCTOR_ACCESS:
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-03-21 13:44:29 +08:00
|
|
|
//initializes state of widget.
|
|
|
|
virtual bool init() override;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
|
|
|
/*
|
2014-08-15 15:28:28 +08:00
|
|
|
* @brief Sends the touch event to widget's parent, if a widget wants to handle touch event under another widget,
|
|
|
|
* it must overide this function.
|
2014-06-06 16:48:49 +08:00
|
|
|
* @param event the touch event type, it could be BEGAN/MOVED/CANCELED/ENDED
|
|
|
|
* @param parent
|
|
|
|
* @param point
|
|
|
|
*/
|
|
|
|
virtual void interceptTouchEvent(TouchEventType event, Widget* sender, Touch *touch);
|
2014-08-15 15:28:28 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
*@brief Propagate touch events to its parents
|
|
|
|
*/
|
|
|
|
void propagateTouchEvent(TouchEventType event, Widget* sender, Touch *touch);
|
|
|
|
|
2014-06-06 16:48:49 +08:00
|
|
|
friend class PageView;
|
2014-05-04 11:23:20 +08:00
|
|
|
/**
|
|
|
|
* This method is called when a focus change event happens
|
|
|
|
*@param widgetLostFocus The widget which lose its focus
|
|
|
|
*@param widgetGetFocus The widget whihc get its focus
|
|
|
|
*@return void
|
|
|
|
*/
|
|
|
|
void onFocusChange(Widget* widgetLostFocus, Widget* widgetGetFocus);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Dispatch a EventFocus through a EventDispatcher
|
|
|
|
*@param widgetLoseFocus The widget which lose its focus
|
|
|
|
*@param widgetGetFocus he widget whihc get its focus
|
|
|
|
*@return void
|
|
|
|
*/
|
|
|
|
void dispatchFocusEvent(Widget* widgetLoseFocus, Widget* widgetGetFocus);
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
protected:
|
|
|
|
//call back function called when size changed.
|
|
|
|
virtual void onSizeChanged();
|
|
|
|
|
|
|
|
//initializes renderer of widget.
|
|
|
|
virtual void initRenderer();
|
|
|
|
|
|
|
|
//call back function called widget's state changed to normal.
|
|
|
|
virtual void onPressStateChangedToNormal();
|
|
|
|
//call back function called widget's state changed to selected.
|
|
|
|
virtual void onPressStateChangedToPressed();
|
|
|
|
//call back function called widget's state changed to dark.
|
|
|
|
virtual void onPressStateChangedToDisabled();
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
void pushDownEvent();
|
|
|
|
void moveEvent();
|
2014-05-26 14:44:28 +08:00
|
|
|
|
|
|
|
virtual void releaseUpEvent();
|
|
|
|
virtual void cancelUpEvent();
|
2014-06-06 16:14:35 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
virtual void updateFlippedX(){};
|
|
|
|
virtual void updateFlippedY(){};
|
2014-05-22 15:23:13 +08:00
|
|
|
virtual void adaptRenderers(){};
|
2014-08-11 15:04:00 +08:00
|
|
|
void updateChildrenDisplayedRGBA();
|
2014-05-22 15:23:13 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
void copyProperties(Widget* model);
|
|
|
|
virtual Widget* createCloneInstance();
|
|
|
|
virtual void copySpecialProperties(Widget* model);
|
|
|
|
virtual void copyClonedWidgetChildren(Widget* model);
|
2014-05-22 15:23:13 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
Widget* getWidgetParent();
|
2014-04-17 14:08:25 +08:00
|
|
|
void updateContentSizeWithTextureSize(const Size& size);
|
2014-05-22 15:23:13 +08:00
|
|
|
|
2014-05-14 09:23:56 +08:00
|
|
|
bool isAncestorsEnabled();
|
2014-05-13 16:37:41 +08:00
|
|
|
Widget* getAncensterWidget(Node* node);
|
|
|
|
bool isAncestorsVisible(Node* node);
|
|
|
|
|
2014-05-26 22:57:50 +08:00
|
|
|
void cleanupWidget();
|
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
protected:
|
2014-07-16 10:08:23 +08:00
|
|
|
bool _enabled;
|
|
|
|
bool _bright;
|
|
|
|
bool _touchEnabled;
|
|
|
|
bool _highlight;
|
2014-06-06 16:48:49 +08:00
|
|
|
bool _affectByClipping;
|
|
|
|
bool _ignoreSize;
|
2014-08-15 15:28:28 +08:00
|
|
|
bool _propagateTouchEvents;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-07-16 10:08:23 +08:00
|
|
|
BrightStyle _brightStyle;
|
2014-06-06 16:48:49 +08:00
|
|
|
SizeType _sizeType;
|
|
|
|
PositionType _positionType;
|
|
|
|
|
2014-07-16 10:08:23 +08:00
|
|
|
//used for search widget by action tag in UIHelper class
|
2014-05-13 10:15:29 +08:00
|
|
|
int _actionTag;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
Size _customSize;
|
2014-05-19 17:43:27 +08:00
|
|
|
|
2014-05-15 01:07:09 +08:00
|
|
|
Vec2 _sizePercent;
|
|
|
|
Vec2 _positionPercent;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
bool _hitted;
|
|
|
|
EventListenerTouchOneByOne* _touchListener;
|
2014-07-16 10:08:23 +08:00
|
|
|
Vec2 _touchBeganPosition;
|
|
|
|
Vec2 _touchMovePosition;
|
|
|
|
Vec2 _touchEndPosition;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-03-11 17:13:54 +08:00
|
|
|
bool _flippedX;
|
|
|
|
bool _flippedY;
|
2014-06-06 16:48:49 +08:00
|
|
|
|
2014-05-16 10:33:28 +08:00
|
|
|
//use map to enble switch back and forth for user layout parameters
|
2014-05-16 10:22:53 +08:00
|
|
|
Map<int,LayoutParameter*> _layoutParameterDictionary;
|
2014-05-16 10:33:28 +08:00
|
|
|
LayoutParameter::Type _layoutParameterType;
|
|
|
|
|
2014-05-04 11:23:20 +08:00
|
|
|
bool _focused;
|
|
|
|
bool _focusEnabled;
|
|
|
|
/**
|
|
|
|
* store the only one focued widget
|
|
|
|
*/
|
2014-05-07 18:27:05 +08:00
|
|
|
static Widget *_focusedWidget; //both layout & widget will be stored in this variable
|
2014-05-26 18:17:47 +08:00
|
|
|
|
2014-06-06 16:48:49 +08:00
|
|
|
Ref* _touchEventListener;
|
|
|
|
#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
|
|
|
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
|
|
#elif _MSC_VER >= 1400 //vs 2005 or higher
|
|
|
|
#pragma warning (push)
|
|
|
|
#pragma warning (disable: 4996)
|
|
|
|
#endif
|
|
|
|
SEL_TouchEvent _touchEventSelector;
|
|
|
|
#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
|
|
|
|
#pragma GCC diagnostic warning "-Wdeprecated-declarations"
|
|
|
|
#elif _MSC_VER >= 1400 //vs 2005 or higher
|
|
|
|
#pragma warning (pop)
|
|
|
|
#endif
|
|
|
|
ccWidgetTouchCallback _touchEventCallback;
|
2014-08-21 10:21:07 +08:00
|
|
|
ccWidgetClickCallback _clickEventListener;
|
2014-05-26 18:17:47 +08:00
|
|
|
private:
|
|
|
|
class FocusNavigationController;
|
2014-05-26 22:57:50 +08:00
|
|
|
static FocusNavigationController* _focusNavigationController;
|
2014-03-11 17:13:54 +08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_CC_END
|
|
|
|
|
|
|
|
#endif /* defined(__Widget__) */
|