2010-08-10 12:49:16 +08:00
|
|
|
/****************************************************************************
|
2011-03-19 14:45:51 +08:00
|
|
|
Copyright (c) 2010-2011 cocos2d-x.org
|
2011-07-04 14:47:32 +08:00
|
|
|
Copyright (c) 2008-2011 Ricardo Quesada
|
|
|
|
Copyright (c) 2011 Zynga Inc.
|
2010-08-10 12:49:16 +08:00
|
|
|
|
|
|
|
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.
|
|
|
|
****************************************************************************/
|
|
|
|
#include <cstring>
|
|
|
|
#include "CCMenuItem.h"
|
2011-03-07 17:11:57 +08:00
|
|
|
#include "CCPointExtension.h"
|
2010-12-22 15:15:04 +08:00
|
|
|
#include "CCActionInterval.h"
|
2010-08-10 12:49:16 +08:00
|
|
|
#include "CCSprite.h"
|
2010-08-13 17:15:50 +08:00
|
|
|
#include "CCLabelAtlas.h"
|
2010-12-24 14:00:49 +08:00
|
|
|
#include "CCLabelTTF.h"
|
2011-06-20 17:31:38 +08:00
|
|
|
#include "CCScriptSupport.h"
|
|
|
|
|
2010-08-25 14:14:31 +08:00
|
|
|
#include <stdarg.h>
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
namespace cocos2d{
|
|
|
|
|
|
|
|
static int _fontSize = kItemSize;
|
|
|
|
static std::string _fontName = "Marker Felt";
|
|
|
|
static bool _fontNameRelease = false;
|
|
|
|
|
|
|
|
enum {
|
|
|
|
kCurrentItem = 0xc0c05001,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum {
|
|
|
|
kZoomActionTag = 0xc0c05002,
|
|
|
|
};
|
|
|
|
//
|
|
|
|
// CCMenuItem
|
|
|
|
//
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItem * CCMenuItem::itemWithTarget(SelectorProtocol *rec, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItem *pRet = new CCMenuItem();
|
|
|
|
pRet->initWithTarget(rec, selector);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItem::initWithTarget(SelectorProtocol *rec, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
m_tAnchorPoint = ccp(0.5f, 0.5f);
|
|
|
|
m_pListener = rec;
|
|
|
|
m_pfnSelector = selector;
|
|
|
|
m_bIsEnabled = true;
|
|
|
|
m_bIsSelected = false;
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
void CCMenuItem::selected()
|
|
|
|
{
|
|
|
|
m_bIsSelected = true;
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
void CCMenuItem::unselected()
|
|
|
|
{
|
|
|
|
m_bIsSelected = false;
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
|
|
|
void CCMenuItem::registerScriptHandler(const char* pszFunctionName)
|
|
|
|
{
|
|
|
|
if (pszFunctionName)
|
|
|
|
{
|
|
|
|
this->m_functionName = string(pszFunctionName);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this->m_functionName.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
void CCMenuItem::activate()
|
|
|
|
{
|
2011-05-31 14:04:14 +08:00
|
|
|
if (m_bIsEnabled)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2011-05-31 14:04:14 +08:00
|
|
|
if (m_pListener)
|
|
|
|
{
|
|
|
|
(m_pListener->*m_pfnSelector)(this);
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2011-06-21 16:59:17 +08:00
|
|
|
if (m_functionName.size() && CCScriptEngineManager::sharedScriptEngineManager()->getScriptEngine())
|
2011-05-31 14:04:14 +08:00
|
|
|
{
|
2011-06-21 10:18:43 +08:00
|
|
|
CCScriptEngineManager::sharedScriptEngineManager()->getScriptEngine()->executeCallFunc(m_functionName.c_str());
|
2011-05-31 14:04:14 +08:00
|
|
|
}
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
void CCMenuItem::setIsEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
m_bIsEnabled = enabled;
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
bool CCMenuItem::getIsEnabled()
|
|
|
|
{
|
|
|
|
return m_bIsEnabled;
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2011-03-07 17:11:57 +08:00
|
|
|
CCRect CCMenuItem::rect()
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
return CCRectMake( m_tPosition.x - m_tContentSize.width * m_tAnchorPoint.x,
|
2010-08-10 12:49:16 +08:00
|
|
|
m_tPosition.y - m_tContentSize.height * m_tAnchorPoint.y,
|
|
|
|
m_tContentSize.width, m_tContentSize.height);
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
bool CCMenuItem::getIsSelected()
|
|
|
|
{
|
|
|
|
return m_bIsSelected;
|
|
|
|
}
|
2011-06-20 17:31:38 +08:00
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
//
|
|
|
|
//CCMenuItemLabel
|
|
|
|
//
|
|
|
|
ccColor3B CCMenuItemLabel::getDisabledColor()
|
|
|
|
{
|
|
|
|
return m_tDisabledColor;
|
|
|
|
}
|
|
|
|
void CCMenuItemLabel::setDisabledColor(ccColor3B var)
|
|
|
|
{
|
|
|
|
m_tDisabledColor = var;
|
|
|
|
}
|
2010-09-01 16:23:30 +08:00
|
|
|
CCNode *CCMenuItemLabel::getLabel()
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
return m_pLabel;
|
|
|
|
}
|
2010-09-01 16:23:30 +08:00
|
|
|
void CCMenuItemLabel::setLabel(CCNode* var)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2010-12-25 11:15:19 +08:00
|
|
|
if (var)
|
|
|
|
{
|
|
|
|
addChild(var);
|
|
|
|
var->setAnchorPoint(ccp(0, 0));
|
|
|
|
setContentSize(var->getContentSize());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pLabel)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
removeChild(m_pLabel, true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
m_pLabel = var;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemLabel * CCMenuItemLabel::itemWithLabel(CCNode*label, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItemLabel *pRet = new CCMenuItemLabel();
|
|
|
|
pRet->initWithLabel(label, target, selector);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2011-07-04 14:47:32 +08:00
|
|
|
CCMenuItemLabel* CCMenuItemLabel::itemWithLabel(CCNode *label)
|
|
|
|
{
|
|
|
|
CCMenuItemLabel *pRet = new CCMenuItemLabel();
|
|
|
|
pRet->initWithLabel(label, NULL, NULL);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemLabel::initWithLabel(CCNode* label, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::initWithTarget(target, selector);
|
2010-08-10 12:49:16 +08:00
|
|
|
m_fOriginalScale = 1.0f;
|
|
|
|
m_tColorBackup = ccWHITE;
|
|
|
|
m_tDisabledColor = ccc3(126,126,126);
|
2010-09-01 16:23:30 +08:00
|
|
|
this->setLabel(label);
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
CCMenuItemLabel::~CCMenuItemLabel()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
void CCMenuItemLabel::setString(const char * label)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
m_pLabel->convertToLabelProtocol()->setString(label);
|
2011-07-04 14:47:32 +08:00
|
|
|
this->setContentSize(m_pLabel->getContentSize());
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
void CCMenuItemLabel::activate()
|
|
|
|
{
|
|
|
|
if(m_bIsEnabled)
|
|
|
|
{
|
|
|
|
this->stopAllActions();
|
2010-08-19 15:29:38 +08:00
|
|
|
this->setScale( m_fOriginalScale );
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::activate();
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
void CCMenuItemLabel::selected()
|
|
|
|
{
|
|
|
|
// subclass to change the default action
|
|
|
|
if(m_bIsEnabled)
|
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::selected();
|
2011-07-04 14:47:32 +08:00
|
|
|
|
|
|
|
CCAction *action = getActionByTag(kZoomActionTag);
|
|
|
|
if (action)
|
|
|
|
{
|
|
|
|
this->stopAction(action);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_fOriginalScale = this->getScale();
|
|
|
|
}
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
CCAction *zoomAction = CCScaleTo::actionWithDuration(0.1f, m_fOriginalScale * 1.2f);
|
|
|
|
zoomAction->setTag(kZoomActionTag);
|
|
|
|
this->runAction(zoomAction);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void CCMenuItemLabel::unselected()
|
|
|
|
{
|
|
|
|
// subclass to change the default action
|
|
|
|
if(m_bIsEnabled)
|
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::unselected();
|
2010-08-10 12:49:16 +08:00
|
|
|
this->stopActionByTag(kZoomActionTag);
|
|
|
|
CCAction *zoomAction = CCScaleTo::actionWithDuration(0.1f, m_fOriginalScale);
|
|
|
|
zoomAction->setTag(kZoomActionTag);
|
|
|
|
this->runAction(zoomAction);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void CCMenuItemLabel::setIsEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
if( m_bIsEnabled != enabled )
|
|
|
|
{
|
|
|
|
if(enabled == false)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
m_tColorBackup = m_pLabel->convertToRGBAProtocol()->getColor();
|
|
|
|
m_pLabel->convertToRGBAProtocol()->setColor(m_tDisabledColor);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
m_pLabel->convertToRGBAProtocol()->setColor(m_tColorBackup);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::setIsEnabled(enabled);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
void CCMenuItemLabel::setOpacity(GLubyte opacity)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
m_pLabel->convertToRGBAProtocol()->setOpacity(opacity);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
GLubyte CCMenuItemLabel::getOpacity()
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
return m_pLabel->convertToRGBAProtocol()->getOpacity();
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
void CCMenuItemLabel::setColor(ccColor3B color)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
m_pLabel->convertToRGBAProtocol()->setColor(color);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
ccColor3B CCMenuItemLabel::getColor()
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
return m_pLabel->convertToRGBAProtocol()->getColor();
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
//CCMenuItemAtlasFont
|
|
|
|
//
|
|
|
|
CCMenuItemAtlasFont * CCMenuItemAtlasFont::itemFromString(const char *value, const char *charMapFile, int itemWidth, int itemHeight, char startCharMap)
|
|
|
|
{
|
|
|
|
return CCMenuItemAtlasFont::itemFromString(value, charMapFile, itemWidth, itemHeight, startCharMap, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemAtlasFont * CCMenuItemAtlasFont::itemFromString(const char *value, const char *charMapFile, int itemWidth, int itemHeight, char startCharMap, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItemAtlasFont *pRet = new CCMenuItemAtlasFont();
|
|
|
|
pRet->initFromString(value, charMapFile, itemWidth, itemHeight, startCharMap, target, selector);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemAtlasFont::initFromString(const char *value, const char *charMapFile, int itemWidth, int itemHeight, char startCharMap, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CCAssert( value != NULL && strlen(value) != 0, "value length must be greater than 0");
|
2010-08-13 16:55:46 +08:00
|
|
|
CCLabelAtlas *label = new CCLabelAtlas();
|
|
|
|
label->initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap);
|
|
|
|
label->autorelease();
|
2010-09-02 14:54:42 +08:00
|
|
|
if (CCMenuItemLabel::initWithLabel(label, target, selector))
|
2010-08-13 16:55:46 +08:00
|
|
|
{
|
|
|
|
// do something ?
|
|
|
|
}
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
//
|
|
|
|
//CCMenuItemFont
|
|
|
|
//
|
|
|
|
void CCMenuItemFont::setFontSize(int s)
|
|
|
|
{
|
|
|
|
_fontSize = s;
|
|
|
|
}
|
|
|
|
int CCMenuItemFont::fontSize()
|
|
|
|
{
|
|
|
|
return _fontSize;
|
|
|
|
}
|
|
|
|
void CCMenuItemFont::setFontName(const char *name)
|
|
|
|
{
|
|
|
|
if( _fontNameRelease )
|
2010-08-13 16:55:46 +08:00
|
|
|
{
|
2010-08-10 12:49:16 +08:00
|
|
|
_fontName.clear();
|
2010-08-13 16:55:46 +08:00
|
|
|
}
|
2010-08-10 12:49:16 +08:00
|
|
|
_fontName = name;
|
|
|
|
_fontNameRelease = true;
|
|
|
|
}
|
|
|
|
const char * CCMenuItemFont::fontName()
|
|
|
|
{
|
|
|
|
return _fontName.c_str();
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemFont * CCMenuItemFont::itemFromString(const char *value, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItemFont *pRet = new CCMenuItemFont();
|
|
|
|
pRet->initFromString(value, target, selector);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
CCMenuItemFont * CCMenuItemFont::itemFromString(const char *value)
|
|
|
|
{
|
|
|
|
CCMenuItemFont *pRet = new CCMenuItemFont();
|
|
|
|
pRet->initFromString(value, NULL, NULL);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemFont::initFromString(const char *value, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CCAssert( value != NULL && strlen(value) != 0, "Value length must be greater than 0");
|
2010-12-24 17:07:31 +08:00
|
|
|
CCLabelTTF *label = CCLabelTTF::labelWithString(value, _fontName.c_str(), (float)_fontSize);
|
2010-09-02 14:54:42 +08:00
|
|
|
if (CCMenuItemLabel::initWithLabel(label, target, selector))
|
2010-08-13 16:55:46 +08:00
|
|
|
{
|
|
|
|
// do something ?
|
|
|
|
}
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
//
|
|
|
|
//CCMenuItemSprite
|
|
|
|
//
|
|
|
|
CCNode * CCMenuItemSprite::getNormalImage()
|
|
|
|
{
|
|
|
|
return m_pNormalImage;
|
|
|
|
}
|
|
|
|
void CCMenuItemSprite::setNormalImage(CCNode* var)
|
|
|
|
{
|
2010-12-25 11:15:19 +08:00
|
|
|
if (var)
|
|
|
|
{
|
|
|
|
addChild(var);
|
|
|
|
var->setAnchorPoint(ccp(0, 0));
|
2010-12-31 17:56:46 +08:00
|
|
|
var->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pNormalImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
removeChild(m_pNormalImage, true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
m_pNormalImage = var;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
CCNode * CCMenuItemSprite::getSelectedImage()
|
|
|
|
{
|
|
|
|
return m_pSelectedImage;
|
|
|
|
}
|
|
|
|
void CCMenuItemSprite::setSelectedImage(CCNode* var)
|
|
|
|
{
|
2010-12-25 11:15:19 +08:00
|
|
|
if (var)
|
|
|
|
{
|
|
|
|
addChild(var);
|
|
|
|
var->setAnchorPoint(ccp(0, 0));
|
2010-12-31 17:56:46 +08:00
|
|
|
var->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pSelectedImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
removeChild(m_pSelectedImage, true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
m_pSelectedImage = var;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
CCNode * CCMenuItemSprite::getDisabledImage()
|
|
|
|
{
|
|
|
|
return m_pDisabledImage;
|
|
|
|
}
|
|
|
|
void CCMenuItemSprite::setDisabledImage(CCNode* var)
|
|
|
|
{
|
2010-12-25 11:15:19 +08:00
|
|
|
if (var)
|
|
|
|
{
|
|
|
|
addChild(var);
|
|
|
|
var->setAnchorPoint(ccp(0, 0));
|
2010-12-31 17:56:46 +08:00
|
|
|
var->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
removeChild(m_pDisabledImage, true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
m_pDisabledImage = var;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
2011-05-19 17:00:13 +08:00
|
|
|
//
|
|
|
|
//CCMenuItemSprite - CCRGBAProtocol protocol
|
|
|
|
//
|
|
|
|
void CCMenuItemSprite::setOpacity(GLubyte opacity)
|
|
|
|
{
|
|
|
|
m_pNormalImage->convertToRGBAProtocol()->setOpacity(opacity);
|
|
|
|
m_pSelectedImage->convertToRGBAProtocol()->setOpacity(opacity);
|
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
|
|
|
m_pDisabledImage->convertToRGBAProtocol()->setOpacity(opacity);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void CCMenuItemSprite::setColor(ccColor3B color)
|
|
|
|
{
|
|
|
|
m_pNormalImage->convertToRGBAProtocol()->setColor(color);
|
|
|
|
m_pSelectedImage->convertToRGBAProtocol()->setColor(color);
|
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
|
|
|
m_pDisabledImage->convertToRGBAProtocol()->setColor(color);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
GLubyte CCMenuItemSprite::getOpacity()
|
|
|
|
{
|
|
|
|
return m_pNormalImage->convertToRGBAProtocol()->getOpacity();
|
|
|
|
}
|
|
|
|
ccColor3B CCMenuItemSprite::getColor()
|
|
|
|
{
|
|
|
|
return m_pNormalImage->convertToRGBAProtocol()->getColor();
|
|
|
|
}
|
2010-08-10 12:49:16 +08:00
|
|
|
CCMenuItemSprite * CCMenuItemSprite::itemFromNormalSprite(CCNode* normalSprite, CCNode* selectedSprite)
|
|
|
|
{
|
|
|
|
return CCMenuItemSprite::itemFromNormalSprite(normalSprite, selectedSprite, NULL, NULL, NULL);
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemSprite * CCMenuItemSprite::itemFromNormalSprite(CCNode* normalSprite, CCNode* selectedSprite, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
return CCMenuItemSprite::itemFromNormalSprite(normalSprite, selectedSprite, NULL, target, selector);
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemSprite * CCMenuItemSprite::itemFromNormalSprite(CCNode *normalSprite, CCNode *selectedSprite, CCNode *disabledSprite, SelectorProtocol *target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItemSprite *pRet = new CCMenuItemSprite();
|
|
|
|
pRet->initFromNormalSprite(normalSprite, selectedSprite, disabledSprite, target, selector);
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemSprite::initFromNormalSprite(CCNode* normalSprite, CCNode* selectedSprite, CCNode* disabledSprite, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2010-09-04 12:02:52 +08:00
|
|
|
assert(normalSprite != NULL);
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::initWithTarget(target, selector);
|
2011-01-05 11:24:52 +08:00
|
|
|
setNormalImage(normalSprite);
|
|
|
|
setSelectedImage(selectedSprite);
|
|
|
|
setDisabledImage(disabledSprite);
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
this->setContentSize(m_pNormalImage->getContentSize());
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
2010-12-25 11:15:19 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
@since v0.99.5
|
|
|
|
*/
|
|
|
|
void CCMenuItemSprite::selected()
|
|
|
|
{
|
|
|
|
CCMenuItem::selected();
|
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pDisabledImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pSelectedImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pNormalImage->setIsVisible(false);
|
|
|
|
m_pSelectedImage->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pNormalImage->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCMenuItemSprite::unselected()
|
|
|
|
{
|
|
|
|
CCMenuItem::unselected();
|
|
|
|
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pNormalImage->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
|
|
|
|
if (m_pSelectedImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pSelectedImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pDisabledImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCMenuItemSprite::setIsEnabled(bool bEnabled)
|
|
|
|
{
|
|
|
|
CCMenuItem::setIsEnabled(bEnabled);
|
|
|
|
|
|
|
|
if (m_pSelectedImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pSelectedImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bEnabled)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pNormalImage->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pDisabledImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (m_pDisabledImage)
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pDisabledImage->setIsVisible(true);
|
|
|
|
m_pNormalImage->setIsVisible(false);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-12-31 17:56:46 +08:00
|
|
|
m_pNormalImage->setIsVisible(true);
|
2010-12-25 11:15:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
CCMenuItemImage * CCMenuItemImage::itemFromNormalImage(const char *normalImage, const char *selectedImage)
|
|
|
|
{
|
|
|
|
return CCMenuItemImage::itemFromNormalImage(normalImage, selectedImage, NULL, NULL, NULL);
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemImage * CCMenuItemImage::itemFromNormalImage(const char *normalImage, const char *selectedImage, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
return CCMenuItemImage::itemFromNormalImage(normalImage, selectedImage, NULL, target, selector);
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemImage * CCMenuItemImage::itemFromNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCMenuItemImage *pRet = new CCMenuItemImage();
|
2010-09-04 12:02:52 +08:00
|
|
|
if (pRet && pRet->initFromNormalImage(normalImage, selectedImage, disabledImage, target, selector))
|
|
|
|
{
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2011-03-07 17:11:57 +08:00
|
|
|
CC_SAFE_DELETE(pRet);
|
2010-09-04 12:02:52 +08:00
|
|
|
return NULL;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
CCMenuItemImage * CCMenuItemImage::itemFromNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage)
|
|
|
|
{
|
|
|
|
CCMenuItemImage *pRet = new CCMenuItemImage();
|
2010-09-04 12:02:52 +08:00
|
|
|
if (pRet && pRet->initFromNormalImage(normalImage, selectedImage, disabledImage, NULL, NULL))
|
|
|
|
{
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
2011-03-07 17:11:57 +08:00
|
|
|
CC_SAFE_DELETE(pRet);
|
2010-09-04 12:02:52 +08:00
|
|
|
return NULL;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemImage::initFromNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage, SelectorProtocol* target, SEL_MenuHandler selector)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
CCNode *normalSprite = CCSprite::spriteWithFile(normalImage);
|
2010-12-25 11:15:19 +08:00
|
|
|
CCNode *selectedSprite = NULL;
|
2010-08-10 12:49:16 +08:00
|
|
|
CCNode *disabledSprite = NULL;
|
|
|
|
|
2010-12-25 11:15:19 +08:00
|
|
|
if (selectedImage)
|
|
|
|
{
|
|
|
|
selectedSprite = CCSprite::spriteWithFile(selectedImage);
|
|
|
|
}
|
|
|
|
|
2010-08-10 12:49:16 +08:00
|
|
|
if(disabledImage)
|
2010-09-04 12:02:52 +08:00
|
|
|
{
|
2010-08-10 12:49:16 +08:00
|
|
|
disabledSprite = CCSprite::spriteWithFile(disabledImage);
|
2010-09-04 12:02:52 +08:00
|
|
|
}
|
|
|
|
return initFromNormalSprite(normalSprite, selectedSprite, disabledSprite, target, selector);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
//
|
|
|
|
// MenuItemToggle
|
|
|
|
//
|
2011-03-07 17:11:57 +08:00
|
|
|
void CCMenuItemToggle::setSubItems(CCMutableArray<CCMenuItem*>* var)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CC_SAFE_RETAIN(var);
|
|
|
|
CC_SAFE_RELEASE(m_pSubItems);
|
2010-08-10 12:49:16 +08:00
|
|
|
m_pSubItems = var;
|
|
|
|
}
|
2011-03-07 17:11:57 +08:00
|
|
|
CCMutableArray<CCMenuItem*> *CCMenuItemToggle::getSubItems()
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
return m_pSubItems;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
CCMenuItemToggle * CCMenuItemToggle::itemWithTarget(SelectorProtocol* target, SEL_MenuHandler selector, CCMenuItem* item, ...)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, item);
|
|
|
|
CCMenuItemToggle *pRet = new CCMenuItemToggle();
|
|
|
|
pRet->initWithTarget(target, selector, item, args);
|
|
|
|
pRet->autorelease();
|
|
|
|
va_end(args);
|
|
|
|
return pRet;
|
|
|
|
}
|
2010-11-17 16:31:48 +08:00
|
|
|
bool CCMenuItemToggle::initWithTarget(SelectorProtocol* target, SEL_MenuHandler selector, CCMenuItem* item, va_list args)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::initWithTarget(target, selector);
|
2011-03-07 17:11:57 +08:00
|
|
|
this->m_pSubItems = new CCMutableArray<CCMenuItem*>();
|
2010-08-10 12:49:16 +08:00
|
|
|
int z = 0;
|
|
|
|
CCMenuItem *i = item;
|
|
|
|
while(i)
|
|
|
|
{
|
|
|
|
z++;
|
|
|
|
m_pSubItems->addObject(i);
|
|
|
|
i = va_arg(args, CCMenuItem*);
|
|
|
|
}
|
|
|
|
m_uSelectedIndex = UINT_MAX;
|
|
|
|
this->setSelectedIndex(0);
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
CCMenuItemToggle::~CCMenuItemToggle()
|
|
|
|
{
|
2011-04-01 16:06:53 +08:00
|
|
|
CC_SAFE_RELEASE(m_pSubItems);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
2010-08-25 14:14:31 +08:00
|
|
|
void CCMenuItemToggle::setSelectedIndex(unsigned int index)
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
if( index != m_uSelectedIndex )
|
|
|
|
{
|
|
|
|
m_uSelectedIndex = index;
|
|
|
|
this->removeChildByTag(kCurrentItem, false);
|
|
|
|
CCMenuItem *item = m_pSubItems->getObjectAtIndex(m_uSelectedIndex);
|
|
|
|
this->addChild(item, 0, kCurrentItem);
|
2011-03-07 17:11:57 +08:00
|
|
|
CCSize s = item->getContentSize();
|
2010-08-10 12:49:16 +08:00
|
|
|
this->setContentSize(s);
|
|
|
|
item->setPosition( ccp( s.width/2, s.height/2 ) );
|
|
|
|
}
|
|
|
|
}
|
2010-08-25 14:14:31 +08:00
|
|
|
unsigned int CCMenuItemToggle::getSelectedIndex()
|
2010-08-10 12:49:16 +08:00
|
|
|
{
|
|
|
|
return m_uSelectedIndex;
|
|
|
|
}
|
|
|
|
void CCMenuItemToggle::selected()
|
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::selected();
|
2010-08-10 12:49:16 +08:00
|
|
|
m_pSubItems->getObjectAtIndex(m_uSelectedIndex)->selected();
|
|
|
|
}
|
|
|
|
void CCMenuItemToggle::unselected()
|
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::unselected();
|
2010-08-10 12:49:16 +08:00
|
|
|
m_pSubItems->getObjectAtIndex(m_uSelectedIndex)->unselected();
|
|
|
|
}
|
|
|
|
void CCMenuItemToggle::activate()
|
|
|
|
{
|
|
|
|
// update index
|
|
|
|
if( m_bIsEnabled )
|
|
|
|
{
|
2010-08-25 14:14:31 +08:00
|
|
|
unsigned int newIndex = (m_uSelectedIndex + 1) % m_pSubItems->count();
|
2010-08-10 12:49:16 +08:00
|
|
|
this->setSelectedIndex(newIndex);
|
|
|
|
}
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::activate();
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
void CCMenuItemToggle::setIsEnabled(bool enabled)
|
|
|
|
{
|
2010-09-02 14:54:42 +08:00
|
|
|
CCMenuItem::setIsEnabled(enabled);
|
2010-08-10 12:49:16 +08:00
|
|
|
|
|
|
|
if(m_pSubItems && m_pSubItems->count() > 0)
|
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CCMutableArray<CCMenuItem*>::CCMutableArrayIterator it;
|
2010-08-10 12:49:16 +08:00
|
|
|
for( it = m_pSubItems->begin(); it != m_pSubItems->end(); ++it)
|
|
|
|
{
|
|
|
|
(*it)->setIsEnabled(enabled);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CCMenuItem * CCMenuItemToggle::selectedItem()
|
|
|
|
{
|
|
|
|
return m_pSubItems->getObjectAtIndex(m_uSelectedIndex);
|
|
|
|
}
|
|
|
|
//
|
|
|
|
//CCMenuItemToggle - CCRGBAProtocol protocol
|
|
|
|
//
|
|
|
|
GLubyte CCMenuItemToggle::getOpacity()
|
|
|
|
{
|
|
|
|
return m_cOpacity;
|
|
|
|
}
|
|
|
|
void CCMenuItemToggle::setOpacity(GLubyte opacity)
|
|
|
|
{
|
|
|
|
m_cOpacity = opacity;
|
|
|
|
if(m_pSubItems && m_pSubItems->count() > 0)
|
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CCMutableArray<CCMenuItem*>::CCMutableArrayIterator it;
|
2010-08-10 12:49:16 +08:00
|
|
|
for( it = m_pSubItems->begin(); it != m_pSubItems->end(); ++it)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
(*it)->convertToRGBAProtocol()->setOpacity(opacity);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ccColor3B CCMenuItemToggle::getColor()
|
|
|
|
{
|
|
|
|
return m_tColor;
|
|
|
|
}
|
|
|
|
void CCMenuItemToggle::setColor(ccColor3B color)
|
|
|
|
{
|
|
|
|
m_tColor = color;
|
|
|
|
if(m_pSubItems && m_pSubItems->count() > 0)
|
|
|
|
{
|
2011-03-07 17:11:57 +08:00
|
|
|
CCMutableArray<CCMenuItem*>::CCMutableArrayIterator it;
|
2010-08-10 12:49:16 +08:00
|
|
|
for( it = m_pSubItems->begin(); it != m_pSubItems->end(); ++it)
|
|
|
|
{
|
2010-08-31 11:20:37 +08:00
|
|
|
(*it)->convertToRGBAProtocol()->setColor(color);
|
2010-08-10 12:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace cocos2d
|