2012-04-19 14:35:52 +08:00
/*
2012-09-25 17:26:09 +08:00
* Copyright ( c ) 2012 cocos2d - x . org
* http : //www.cocos2d-x.org
2012-04-19 14:35:52 +08:00
*
* Copyright 2011 Yannick Loriot .
* http : //yannickloriot.com
*
2018-01-29 16:25:32 +08:00
* Copyright ( c ) 2017 - 2018 Xiamen Yaji Software Co . , Ltd .
*
2012-04-19 14:35:52 +08:00
* 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 .
*
* Converted to c + + / cocos2d - x by Angus C
*/
# ifndef __CCCONTROL_H__
# define __CCCONTROL_H__
# include "CCControlUtils.h"
2014-04-27 01:11:22 +08:00
# include "2d/CCLayer.h"
2014-07-21 17:45:56 +08:00
# include "extensions/ExtensionExport.h"
2012-04-19 14:35:52 +08:00
2012-04-27 18:47:49 +08:00
NS_CC_EXT_BEGIN
2012-04-19 14:35:52 +08:00
2013-07-26 14:37:26 +08:00
2013-06-20 14:15:53 +08:00
class Invocation ;
2012-04-19 14:35:52 +08:00
2012-06-20 18:09:11 +08:00
/**
* @ addtogroup GUI
* @ {
* @ addtogroup control_extension
* @ {
*/
2012-04-19 14:35:52 +08:00
/** Number of kinds of control event. */
2012-09-25 16:57:51 +08:00
# define kControlEventTotalNumber 9
2012-04-19 14:35:52 +08:00
2012-09-25 17:26:09 +08:00
/*
* @ class
2013-06-20 14:15:53 +08:00
* Control is inspired by the UIControl API class from the UIKit library of
* CocoaTouch . It provides a base class for control Sprites such as Button
* or Slider that convey user intent to the application .
2012-09-25 17:26:09 +08:00
*
2013-06-20 14:15:53 +08:00
* The goal of Control is to define an interface and base implementation for
2012-09-25 17:26:09 +08:00
* preparing action messages and initially dispatching them to their targets when
* certain events occur .
*
2013-06-20 14:15:53 +08:00
* To use the Control you have to subclass it .
2012-04-19 14:35:52 +08:00
*/
2014-07-21 17:45:56 +08:00
class CC_EX_DLL Control : public Layer
2012-04-19 14:35:52 +08:00
{
2013-07-19 07:30:19 +08:00
public :
2013-07-26 14:37:26 +08:00
/** Kinds of possible events for the control objects. */
2014-07-21 17:45:56 +08:00
enum class CC_EX_DLL EventType
2013-07-26 14:37:26 +08:00
{
TOUCH_DOWN = 1 < < 0 , // A touch-down event in the control.
DRAG_INSIDE = 1 < < 1 , // An event where a finger is dragged inside the bounds of the control.
DRAG_OUTSIDE = 1 < < 2 , // An event where a finger is dragged just outside the bounds of the control.
DRAG_ENTER = 1 < < 3 , // An event where a finger is dragged into the bounds of the control.
DRAG_EXIT = 1 < < 4 , // An event where a finger is dragged from within a control to outside its bounds.
TOUCH_UP_INSIDE = 1 < < 5 , // A touch-up event in the control where the finger is inside the bounds of the control.
TOUCH_UP_OUTSIDE = 1 < < 6 , // A touch-up event in the control where the finger is outside the bounds of the control.
TOUCH_CANCEL = 1 < < 7 , // A system event canceling the current touches for the control.
VALUE_CHANGED = 1 < < 8 // A touch dragging or otherwise manipulating a control, causing it to emit a series of different values.
} ;
2014-02-20 10:53:49 +08:00
typedef void ( Ref : : * Handler ) ( Ref * , EventType ) ;
2013-07-26 14:37:26 +08:00
/** The possible state for a control. */
enum class State
{
2015-12-11 23:43:19 +08:00
NORMAL = 1 < < 0 , // The normal, or default state of a control that is, enabled but neither selected nor highlighted.
2013-07-26 14:37:26 +08:00
HIGH_LIGHTED = 1 < < 1 , // Highlighted state of a control. A control enters this state when a touch down, drag inside or drag enter is performed. You can retrieve and set this value through the highlighted property.
DISABLED = 1 < < 2 , // Disabled state of a control. This state indicates that the control is currently disabled. You can retrieve and set this value through the enabled property.
SELECTED = 1 < < 3 // Selected state of a control. This state indicates that the control is currently selected. You can retrieve and set this value through the selected property.
} ;
2013-11-22 05:43:59 +08:00
/** Creates a Control object */
2013-07-19 07:30:19 +08:00
static Control * create ( ) ;
2012-06-15 16:47:30 +08:00
2012-04-19 14:35:52 +08:00
/** Tells whether the control is enabled. */
2012-06-15 16:47:30 +08:00
virtual void setEnabled ( bool bEnabled ) ;
2013-07-19 07:30:19 +08:00
virtual bool isEnabled ( ) const ;
2012-06-15 16:47:30 +08:00
/** A Boolean value that determines the control selected state. */
virtual void setSelected ( bool bSelected ) ;
2013-07-19 07:30:19 +08:00
virtual bool isSelected ( ) const ;
2012-04-19 14:35:52 +08:00
/** A Boolean value that determines whether the control is highlighted. */
2012-06-15 16:47:30 +08:00
virtual void setHighlighted ( bool bHighlighted ) ;
2013-07-19 07:30:19 +08:00
virtual bool isHighlighted ( ) const ;
bool hasVisibleParents ( ) const ;
2012-09-25 17:26:09 +08:00
/**
* Updates the control layout using its current internal state .
*/
2012-09-25 16:57:51 +08:00
virtual void needsLayout ( ) ;
2012-04-19 14:35:52 +08:00
/**
2013-07-19 07:30:19 +08:00
* Sends action messages for the given control events .
*
* @ param controlEvents A bitmask whose set flags specify the control events for
* which action messages are sent . See " CCControlEvent " for bitmask constants .
*/
2013-07-26 14:37:26 +08:00
virtual void sendActionsForControlEvents ( EventType controlEvents ) ;
2012-04-19 14:35:52 +08:00
/**
2013-07-19 07:30:19 +08:00
* Adds a target and action for a particular event ( or events ) to an internal
* dispatch table .
2015-12-11 23:37:58 +08:00
* The action message may optionally include the sender and the event as
2013-07-19 07:30:19 +08:00
* parameters , in that order .
* When you call this method , target is not retained .
*
* @ param target The target object that is , the object to which the action
* message is sent . It cannot be nil . The target is not retained .
* @ param action A selector identifying an action message . It cannot be NULL .
* @ param controlEvents A bitmask specifying the control events for which the
* action message is sent . See " CCControlEvent " for bitmask constants .
*/
2014-02-20 10:53:49 +08:00
virtual void addTargetWithActionForControlEvents ( Ref * target , Handler action , EventType controlEvents ) ;
2012-04-19 14:35:52 +08:00
/**
2013-07-19 07:30:19 +08:00
* Removes a target and action for a particular event ( or events ) from an
* internal dispatch table .
*
2015-12-11 23:43:19 +08:00
* @ param target The target object that is , the object to which the action
2013-07-19 07:30:19 +08:00
* message is sent . Pass nil to remove all targets paired with action and the
* specified control events .
* @ param action A selector identifying an action message . Pass NULL to remove
* all action messages paired with target .
* @ param controlEvents A bitmask specifying the control events associated with
* target and action . See " CCControlEvent " for bitmask constants .
*/
2014-02-20 10:53:49 +08:00
virtual void removeTargetWithActionForControlEvents ( Ref * target , Handler action , EventType controlEvents ) ;
2012-04-19 14:35:52 +08:00
/**
2015-12-11 23:37:58 +08:00
* Returns a point corresponding to the touch location converted into the
2013-07-19 07:30:19 +08:00
* control space coordinates .
* @ param touch A Touch object that represents a touch .
*/
2014-05-15 01:07:09 +08:00
virtual Vec2 getTouchLocation ( Touch * touch ) ;
2012-04-19 14:35:52 +08:00
2016-11-16 09:48:37 +08:00
virtual bool onTouchBegan ( Touch * touch , Event * event ) override ;
virtual void onTouchMoved ( Touch * touch , Event * event ) override ;
virtual void onTouchEnded ( Touch * touch , Event * event ) override ;
virtual void onTouchCancelled ( Touch * touch , Event * event ) override ;
2013-09-03 18:22:03 +08:00
2012-04-19 14:35:52 +08:00
/**
2013-07-19 07:30:19 +08:00
* Returns a boolean value that indicates whether a touch is inside the bounds
* of the receiver . The given touch must be relative to the world .
*
* @ param touch A Touch object that represents a touch .
*
2013-08-05 20:46:57 +08:00
* @ return Whether a touch is inside the receiver ' s rect .
2013-07-19 07:30:19 +08:00
*/
2013-06-20 14:15:53 +08:00
virtual bool isTouchInside ( Touch * touch ) ;
2012-04-19 14:35:52 +08:00
2013-07-19 07:30:19 +08:00
// Overrides
virtual bool isOpacityModifyRGB ( ) const override ;
virtual void setOpacityModifyRGB ( bool bOpacityModifyRGB ) override ;
2014-03-21 13:44:29 +08:00
CC_CONSTRUCTOR_ACCESS :
2013-11-22 05:43:59 +08:00
/**
* @ js ctor
*/
Control ( ) ;
/**
* @ js NA
* @ lua NA
*/
virtual ~ Control ( ) ;
2014-03-21 13:44:29 +08:00
virtual bool init ( void ) override ;
protected :
2012-04-19 14:35:52 +08:00
/**
2013-06-20 14:15:53 +08:00
* Returns an Invocation object able to construct messages using a given
2015-12-11 23:37:58 +08:00
* target - action pair . ( The invocation may optionally include the sender and
2012-09-25 16:57:51 +08:00
* the event as parameters , in that order )
*
* @ param target The target object .
* @ param action A selector identifying an action message .
* @ param controlEvent A control events for which the action message is sent .
* See " CCControlEvent " for constants .
*
2013-06-20 14:15:53 +08:00
* @ return an Invocation object able to construct messages using a given
2012-09-25 16:57:51 +08:00
* target - action pair .
*/
2014-02-20 10:53:49 +08:00
Invocation * invocationWithTargetAndActionForControlEvent ( Ref * target , Handler action , EventType controlEvent ) ;
2012-04-19 14:35:52 +08:00
/**
2013-06-20 14:15:53 +08:00
* Returns the Invocation list for the given control event . If the list does
2012-04-19 14:35:52 +08:00
* not exist , it ' ll create an empty array before returning it .
*
* @ param controlEvent A control events for which the action message is sent .
* See " CCControlEvent " for constants .
*
2013-06-20 14:15:53 +08:00
* @ return the Invocation list for the given control event .
2012-04-19 14:35:52 +08:00
*/
2013-12-07 14:36:07 +08:00
Vector < Invocation * > & dispatchListforControlEvent ( EventType controlEvent ) ;
2013-07-19 07:30:19 +08:00
2012-09-25 17:26:09 +08:00
/**
* Adds a target and action for a particular event to an internal dispatch
* table .
2015-12-11 23:37:58 +08:00
* The action message may optionally include the sender and the event as
2012-09-25 17:26:09 +08:00
* parameters , in that order .
* When you call this method , target is not retained .
*
2015-12-11 23:43:19 +08:00
* @ param target The target object that is , the object to which the action
2012-09-25 17:26:09 +08:00
* message is sent . It cannot be nil . The target is not retained .
* @ param action A selector identifying an action message . It cannot be NULL .
* @ param controlEvent A control event for which the action message is sent .
* See " CCControlEvent " for constants .
2012-09-25 16:57:51 +08:00
*/
2014-02-20 10:53:49 +08:00
void addTargetWithActionForControlEvent ( Ref * target , Handler action , EventType controlEvent ) ;
2012-09-25 16:57:51 +08:00
2012-09-25 17:26:09 +08:00
/**
* Removes a target and action for a particular event from an internal dispatch
* table .
*
2015-12-11 23:43:19 +08:00
* @ param target The target object that is , the object to which the action
2012-09-25 17:26:09 +08:00
* message is sent . Pass nil to remove all targets paired with action and the
* specified control events .
* @ param action A selector identifying an action message . Pass NULL to remove
* all action messages paired with target .
* @ param controlEvent A control event for which the action message is sent .
* See " CCControlEvent " for constants .
2012-09-25 16:57:51 +08:00
*/
2014-02-20 10:53:49 +08:00
void removeTargetWithActionForControlEvent ( Ref * target , Handler action , EventType controlEvent ) ;
2012-04-19 14:35:52 +08:00
2013-07-19 07:30:19 +08:00
bool _enabled ;
bool _selected ;
bool _highlighted ;
/** True if all of the controls parents are visible */
bool _hasVisibleParents ;
/**
* Table of connection between the ControlEvents and their associated
* target - actions pairs . For each ButtonEvents a list of NSInvocation
* ( which contains the target - action pair ) is linked .
*/
2013-12-07 14:36:07 +08:00
std : : unordered_map < int , Vector < Invocation * > * > _dispatchTable ;
2013-07-19 07:30:19 +08:00
//CCRGBAProtocol
bool _isOpacityModifyRGB ;
/** The current control state constant. */
2013-07-26 14:37:26 +08:00
CC_SYNTHESIZE_READONLY ( State , _state , State ) ;
2013-11-22 05:43:59 +08:00
private :
CC_DISALLOW_COPY_AND_ASSIGN ( Control ) ;
2012-04-19 14:35:52 +08:00
} ;
2014-07-21 17:45:56 +08:00
CC_EX_DLL Control : : EventType operator | ( Control : : EventType a , Control : : EventType b ) ;
2013-11-06 10:55:24 +08:00
2012-06-20 18:09:11 +08:00
// end of GUI group
/// @}
/// @}
2012-04-27 18:47:49 +08:00
NS_CC_EXT_END
2012-04-19 14:35:52 +08:00
2013-08-05 20:46:57 +08:00
# endif